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}