001    /**
002     * Copyright 2005-2013 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     */
016    package org.kuali.rice.kim.impl.responsibility;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.apache.log4j.Logger;
020    import org.kuali.rice.kew.api.KewApiConstants;
021    import org.kuali.rice.kim.api.KimConstants;
022    import org.kuali.rice.kim.api.common.template.Template;
023    import org.kuali.rice.kim.api.responsibility.Responsibility;
024    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
025    import org.kuali.rice.kim.impl.common.attribute.KimAttributeDataBo;
026    import org.kuali.rice.kim.impl.permission.PermissionTemplateBo;
027    import org.kuali.rice.kns.document.MaintenanceDocument;
028    import org.kuali.rice.kns.maintenance.KualiMaintainableImpl;
029    import org.kuali.rice.kns.maintenance.Maintainable;
030    import org.kuali.rice.kns.web.ui.Field;
031    import org.kuali.rice.kns.web.ui.Row;
032    import org.kuali.rice.kns.web.ui.Section;
033    import org.kuali.rice.krad.bo.BusinessObject;
034    import org.kuali.rice.krad.bo.PersistableBusinessObject;
035    import org.kuali.rice.krad.util.KRADConstants;
036    
037    import java.util.HashMap;
038    import java.util.List;
039    import java.util.Map;
040    
041    public 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    }