001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.kim.impl.responsibility;
017
018import org.apache.commons.lang.StringUtils;
019import org.apache.log4j.Logger;
020import org.kuali.rice.kew.api.KewApiConstants;
021import org.kuali.rice.kim.api.KimConstants;
022import org.kuali.rice.kim.api.common.template.Template;
023import org.kuali.rice.kim.api.responsibility.Responsibility;
024import org.kuali.rice.kim.api.services.KimApiServiceLocator;
025import org.kuali.rice.kim.impl.common.attribute.KimAttributeDataBo;
026import org.kuali.rice.kim.impl.permission.PermissionTemplateBo;
027import org.kuali.rice.kns.document.MaintenanceDocument;
028import org.kuali.rice.kns.maintenance.KualiMaintainableImpl;
029import org.kuali.rice.kns.maintenance.Maintainable;
030import org.kuali.rice.kns.web.ui.Field;
031import org.kuali.rice.kns.web.ui.Row;
032import org.kuali.rice.kns.web.ui.Section;
033import org.kuali.rice.krad.bo.BusinessObject;
034import org.kuali.rice.krad.bo.PersistableBusinessObject;
035import org.kuali.rice.krad.util.KRADConstants;
036
037import java.util.HashMap;
038import java.util.List;
039import java.util.Map;
040
041public class ReviewResponsibilityMaintainable extends KualiMaintainableImpl {
042
043        private static final Logger LOG = Logger.getLogger( ReviewResponsibilityMaintainable.class );
044        private static final long serialVersionUID = -8102504656976243468L;
045
046        private static Template REVIEW_TEMPLATE;
047
048    public List getSections(MaintenanceDocument document, Maintainable oldMaintainable) {
049        List<Section> sections = super.getSections(document, oldMaintainable);
050        if(document.isEdit()){
051                for (Section section : sections) {
052                for (Row row : section.getRows()) {
053                    for (Field field : row.getFields()) {
054                        if(ReviewResponsibilityBo.ACTION_DETAILS_AT_ROLE_MEMBER_LEVEL_FIELD_NAME.equals(field.getPropertyName())){
055                                field.setReadOnly(true);
056                        }
057                    }
058                }
059                }
060        }
061        return sections;
062    }
063                
064        /**
065         * Saves the responsibility via the responsibility service
066         * 
067         * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#saveDataObject()
068         */
069        @Override
070        public void saveDataObject() {
071        if ( LOG.isInfoEnabled() ) {
072            LOG.info( "Attempting to save ReviewResponsibilityBo BO via ResponsibilityService:" + getBusinessObject() );
073        }
074        populateReviewTemplateInfo();
075
076        ReviewResponsibilityBo resp = (ReviewResponsibilityBo)getDataObject();
077        // build the Map<String, String> with the details
078        Map<String, String> details = new HashMap<String, String>();
079        details.put( KimConstants.AttributeConstants.DOCUMENT_TYPE_NAME, resp.getDocumentTypeName() );
080        details.put( KimConstants.AttributeConstants.ROUTE_NODE_NAME, resp.getRouteNodeName() );
081        details.put( KimConstants.AttributeConstants.REQUIRED, resp.isRequired()?"true":"false" );
082        details.put( KimConstants.AttributeConstants.ACTION_DETAILS_AT_ROLE_MEMBER_LEVEL, resp.isActionDetailsAtRoleMemberLevel()?"true":"false" );
083        if ( StringUtils.isNotBlank(resp.getQualifierResolverProvidedIdentifier()) ) {
084            details.put( KimConstants.AttributeConstants.QUALIFIER_RESOLVER_PROVIDED_IDENTIFIER, resp.getQualifierResolverProvidedIdentifier() );
085        }
086
087        //ResponsibilityBo bo = ReviewResponsibilityBo.toResponsibilityBo(resp);
088        if (resp.getTemplateId() == null) {
089            resp.setTemplateId(REVIEW_TEMPLATE.getId());
090            resp.setTemplate(ResponsibilityTemplateBo.from(REVIEW_TEMPLATE));
091        }
092
093        else {
094                resp.setTemplate(
095                        ResponsibilityTemplateBo.from(KimApiServiceLocator.getResponsibilityService().getResponsibilityTemplate(
096                                resp.getTemplateId())));
097        }
098        //set attributes
099        resp.setAttributes(details);
100        resp.setAttributeDetails(KimAttributeDataBo.createFrom(ResponsibilityAttributeBo.class, details, resp.getTemplate().getKimTypeId()));
101
102        boolean responsibilityExists = false;
103        if (resp.getId() != null) {
104            responsibilityExists = KimApiServiceLocator.getResponsibilityService().getResponsibility(resp.getId()) != null;
105        }
106
107        if (responsibilityExists) {
108            KimApiServiceLocator.getResponsibilityService().updateResponsibility(ResponsibilityBo.to(resp));
109        } else {
110            //if its a copy action the objectId should be  empty and versionNumber should be null.
111            if(getMaintenanceAction().equals(KRADConstants.MAINTENANCE_COPY_ACTION)){
112                if(org.apache.commons.lang.StringUtils.isNotBlank(resp.getObjectId())){
113                    resp.setObjectId("");
114                }
115                if(null!= resp.getVersionNumber()){
116                    resp.setVersionNumber(null);
117                }
118            }
119            KimApiServiceLocator.getResponsibilityService().createResponsibility(ResponsibilityBo.to(resp));
120        }
121        }
122        
123        private static synchronized void populateReviewTemplateInfo() {
124                if ( REVIEW_TEMPLATE == null ) {
125                    REVIEW_TEMPLATE = KimApiServiceLocator.getResponsibilityService().findRespTemplateByNamespaceCodeAndName(KewApiConstants.KEW_NAMESPACE, KewApiConstants.DEFAULT_RESPONSIBILITY_TEMPLATE_NAME);
126        }
127        }
128
129        @Override
130        public Class<? extends BusinessObject> getBoClass() {
131                return ReviewResponsibilityBo.class;
132        }
133
134        @Override
135        public void prepareBusinessObject(BusinessObject businessObject) {
136        if ( businessObject == null ) {
137            throw new RuntimeException( "Configuration ERROR: ReviewResponsibilityBoMaintainable.prepareBusinessObject passed a null object." );
138        }
139        if ( businessObject instanceof ResponsibilityBo ) {
140            ResponsibilityBo resp = getBusinessObjectService().findBySinglePrimaryKey(ResponsibilityBo.class, ((ResponsibilityBo)businessObject).getId() );
141            businessObject = new ReviewResponsibilityBo( resp );
142            setBusinessObject( (PersistableBusinessObject)businessObject );
143        } else {
144            throw new RuntimeException( "Configuration ERROR: ReviewResponsibilityBoMaintainable passed an unsupported object type: " + businessObject.getClass() );
145        }
146        super.prepareBusinessObject(businessObject);
147        }
148
149    /**
150         * This overridden method ...
151         *
152         * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#isExternalBusinessObject()
153         */
154        @Override
155        public boolean isExternalBusinessObject() {
156                return true;
157        }
158
159}