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.responsibility.ResponsibilityContract;
025import org.kuali.rice.kim.api.services.KimApiServiceLocator;
026import org.kuali.rice.kim.impl.common.attribute.KimAttributeDataBo;
027import org.kuali.rice.kim.impl.permission.PermissionTemplateBo;
028import org.kuali.rice.kim.impl.services.KimImplServiceLocator;
029import org.kuali.rice.kns.document.MaintenanceDocument;
030import org.kuali.rice.kns.maintenance.KualiMaintainableImpl;
031import org.kuali.rice.kns.maintenance.Maintainable;
032import org.kuali.rice.kns.service.KNSServiceLocator;
033import org.kuali.rice.kns.web.ui.Field;
034import org.kuali.rice.kns.web.ui.Row;
035import org.kuali.rice.kns.web.ui.Section;
036import org.kuali.rice.krad.bo.BusinessObject;
037import org.kuali.rice.krad.bo.PersistableBusinessObject;
038import org.kuali.rice.krad.data.KradDataServiceLocator;
039import org.kuali.rice.krad.data.platform.MaxValueIncrementerFactory;
040import org.kuali.rice.krad.util.KRADConstants;
041import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
042
043import java.util.HashMap;
044import java.util.List;
045import java.util.Map;
046
047public class ReviewResponsibilityMaintainable extends KualiMaintainableImpl {
048
049        private static final Logger LOG = Logger.getLogger( ReviewResponsibilityMaintainable.class );
050        private static final long serialVersionUID = -8102504656976243468L;
051
052    protected static final String DOCUMENT_TYPE_NAME = "documentTypeName";
053    protected static final String ROUTE_NODE_NAME = "routeNodeName";
054
055        private static Template REVIEW_TEMPLATE;
056
057    public List getSections(MaintenanceDocument document, Maintainable oldMaintainable) {
058        List<Section> sections = super.getSections(document, oldMaintainable);
059        if(document.isEdit()){
060                for (Section section : sections) {
061                for (Row row : section.getRows()) {
062                    for (Field field : row.getFields()) {
063                        if(ReviewResponsibilityBo.ACTION_DETAILS_AT_ROLE_MEMBER_LEVEL_FIELD_NAME.equals(field.getPropertyName())){
064                                field.setReadOnly(true);
065                        }
066                    }
067                }
068                }
069        }
070        return sections;
071    }
072                
073        /**
074         * Saves the responsibility via the responsibility service
075         * 
076         * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#saveDataObject()
077         */
078        @Override
079        public void saveDataObject() {
080        if ( LOG.isInfoEnabled() ) {
081            LOG.info( "Attempting to save ReviewResponsibilityBo BO via ResponsibilityService:" + getBusinessObject() );
082        }
083        populateReviewTemplateInfo();
084
085        ReviewResponsibilityBo resp = (ReviewResponsibilityBo)getDataObject();
086        // build the Map<String, String> with the details
087        Map<String, String> details = new HashMap<String, String>();
088        details.put( KimConstants.AttributeConstants.DOCUMENT_TYPE_NAME, resp.getDocumentTypeName() );
089        details.put( KimConstants.AttributeConstants.ROUTE_NODE_NAME, resp.getRouteNodeName() );
090        details.put( KimConstants.AttributeConstants.REQUIRED, resp.isRequired()?"true":"false" );
091        details.put( KimConstants.AttributeConstants.ACTION_DETAILS_AT_ROLE_MEMBER_LEVEL, resp.isActionDetailsAtRoleMemberLevel()?"true":"false" );
092        if ( StringUtils.isNotBlank(resp.getQualifierResolverProvidedIdentifier()) ) {
093            details.put( KimConstants.AttributeConstants.QUALIFIER_RESOLVER_PROVIDED_IDENTIFIER, resp.getQualifierResolverProvidedIdentifier() );
094        }
095
096        //ResponsibilityBo bo = ReviewResponsibilityBo.toResponsibilityBo(resp);
097        if (resp.getTemplateId() == null) {
098            resp.setTemplateId(REVIEW_TEMPLATE.getId());
099            resp.setTemplate(ResponsibilityTemplateBo.from(REVIEW_TEMPLATE));
100        }
101
102        else {
103                resp.setTemplate(
104                        ResponsibilityTemplateBo.from(KimApiServiceLocator.getResponsibilityService().getResponsibilityTemplate(
105                                resp.getTemplateId())));
106        }
107        //set attributes
108        resp.setAttributes(details);
109        resp.setAttributeDetails(KimAttributeDataBo.createFrom(ResponsibilityAttributeBo.class, details, resp.getTemplate().getKimTypeId()));
110
111        boolean responsibilityExists = false;
112        if (resp.getId() != null) {
113            responsibilityExists = KimApiServiceLocator.getResponsibilityService().getResponsibility(resp.getId()) != null;
114        }
115
116        if (responsibilityExists) {
117            KimApiServiceLocator.getResponsibilityService().updateResponsibility(ResponsibilityBo.to(resp));
118        } else {
119            //if its a copy action the objectId should be  empty and versionNumber should be null.
120            if(getMaintenanceAction().equals(KRADConstants.MAINTENANCE_COPY_ACTION)){
121                if(org.apache.commons.lang.StringUtils.isNotBlank(resp.getObjectId())){
122                    resp.setObjectId("");
123                }
124                if(null!= resp.getVersionNumber()){
125                    resp.setVersionNumber(null);
126                }
127            }
128            KimApiServiceLocator.getResponsibilityService().createResponsibility(ResponsibilityBo.to(resp));
129        }
130        }
131        
132        private static synchronized void populateReviewTemplateInfo() {
133                if ( REVIEW_TEMPLATE == null ) {
134                    REVIEW_TEMPLATE = KimApiServiceLocator.getResponsibilityService().findRespTemplateByNamespaceCodeAndName(KewApiConstants.KEW_NAMESPACE, KewApiConstants.DEFAULT_RESPONSIBILITY_TEMPLATE_NAME);
135        }
136        }
137
138        @Override
139        public Class<? extends BusinessObject> getBoClass() {
140                return ReviewResponsibilityBo.class;
141        }
142        
143        @Override
144        public Class<?> getDataObjectClass() {
145        return ReviewResponsibilityBo.class;
146        }
147
148        @Override
149        public void prepareBusinessObject(BusinessObject businessObject) {
150        if ( businessObject == null ) {
151            throw new RuntimeException( "Configuration ERROR: ReviewResponsibilityBoMaintainable.prepareBusinessObject passed a null object." );
152        }
153        if ( businessObject instanceof ResponsibilityContract ) {
154            ResponsibilityBo resp = KradDataServiceLocator.getDataObjectService().find(ResponsibilityBo.class, ((ResponsibilityContract)businessObject).getId() );
155            businessObject = new ReviewResponsibilityBo( resp );
156            setDataObject(businessObject);
157        } else {
158            throw new RuntimeException( "Configuration ERROR: ReviewResponsibilityBoMaintainable passed an unsupported object type: " + businessObject.getClass() );
159        }
160        super.prepareBusinessObject(businessObject);
161        }
162
163        @Override
164        public boolean isExternalBusinessObject() {
165                return true;
166        }
167
168    @Override
169    public void processAfterNew(MaintenanceDocument document, Map<String, String[]> requestParameters) {
170        super.processAfterNew(document, requestParameters);
171
172        initializeResponsibilityId(document.getDocumentBusinessObject());
173    }
174
175    @Override
176    public void processAfterCopy(MaintenanceDocument document, Map<String, String[]> parameters) {
177        super.processAfterCopy(document, parameters);
178
179        initializeResponsibilityId(document.getNewMaintainableObject().getDataObject());
180    }
181
182    private void initializeResponsibilityId(Object dataObject) {
183        if (dataObject instanceof ReviewResponsibilityBo) {
184            ReviewResponsibilityBo responsibilityBo = (ReviewResponsibilityBo) dataObject;
185
186            if (StringUtils.isBlank(responsibilityBo.getId())) {
187                DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(
188                        KimImplServiceLocator.getDataSource(), KimConstants.SequenceNames.KRIM_RSP_ID_S);
189                responsibilityBo.setId(incrementer.nextStringValue());
190            }
191        }
192    }
193
194    @Override
195    public void setupNewFromExisting(MaintenanceDocument document, Map<String, String[]> parameters) {
196        String docTypeName = "";
197        String routeNodeName = "";
198
199        ReviewResponsibilityBo reviewResponsibilityBo = (ReviewResponsibilityBo) document.getNewMaintainableObject().getDataObject();
200        initializeResponsibilityId(document.getDocumentBusinessObject());
201        reviewResponsibilityBo.setActive(true);
202
203        for (String paramName : parameters.keySet()) {
204            String[] parameterValues = parameters.get(paramName);
205
206            if (paramName.equals(DOCUMENT_TYPE_NAME)) {
207                if (parameterValues.length > 0) {
208                    docTypeName = parameterValues[0];
209                }
210            }
211
212            if (paramName.equals(ROUTE_NODE_NAME)) {
213                if (parameterValues.length > 0) {
214                    routeNodeName = parameterValues[0];
215                }
216            }
217        }
218
219        if (StringUtils.isNotEmpty(docTypeName) && StringUtils.isNotEmpty(routeNodeName)) {
220            reviewResponsibilityBo.setDocumentTypeName(docTypeName);
221            reviewResponsibilityBo.setRouteNodeName(routeNodeName);
222        }
223
224        document.getNewMaintainableObject().setDataObject(reviewResponsibilityBo);
225    }
226
227}