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.document; 017 018import java.util.HashMap; 019import java.util.Map; 020 021import org.apache.commons.lang.StringUtils; 022import org.apache.log4j.Logger; 023import org.kuali.rice.kim.api.KimConstants; 024import org.kuali.rice.kim.api.services.KimApiServiceLocator; 025import org.kuali.rice.kim.impl.permission.GenericPermissionBo; 026import org.kuali.rice.kim.impl.permission.PermissionBo; 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.krad.bo.BusinessObject; 032import org.kuali.rice.krad.bo.PersistableBusinessObject; 033import org.kuali.rice.krad.data.KradDataServiceLocator; 034import org.kuali.rice.krad.data.platform.MaxValueIncrementerFactory; 035import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer; 036 037/** 038 * 039 * @author Kuali Rice Team (rice.collab@kuali.org) 040 * 041 */ 042public class GenericPermissionMaintainable extends KualiMaintainableImpl { 043 044 private static final Logger LOG = Logger.getLogger( GenericPermissionMaintainable.class ); 045 private static final long serialVersionUID = -8102504656976243468L; 046 047 protected static final String DETAIL_OBJECTS_ATTRIBUTE_NAME = "attributeDetails.kimAttribute.attributeName"; 048 protected static final String DETAIL_OBJECTS_ATTRIBUTE_VALUE = "attributeDetails.attributeValue"; 049 050 /** 051 * Saves the responsibility via the responsibility update service 052 * 053 * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#saveBusinessObject() 054 */ 055 @Override 056 public void saveDataObject() { 057 if (getDataObject() instanceof GenericPermissionBo) { 058 GenericPermissionBo genericPermissionBo = (GenericPermissionBo)getDataObject(); 059 boolean permissionExists = false; 060 if (genericPermissionBo.getId() != null) { 061 permissionExists = KimApiServiceLocator.getPermissionService().getPermission(genericPermissionBo.getId()) != null; 062 } 063 064 if (genericPermissionBo.getTemplateId() != null) { 065 genericPermissionBo.setTemplate( 066 PermissionTemplateBo.from( 067 KimApiServiceLocator.getPermissionService().getPermissionTemplate(genericPermissionBo.getTemplateId()))); 068 } 069 PermissionBo perm = GenericPermissionBo.toPermissionBo(genericPermissionBo); 070 if (permissionExists) { 071 KimApiServiceLocator.getPermissionService().updatePermission(PermissionBo.to(perm)); 072 } else { 073 KimApiServiceLocator.getPermissionService().createPermission(PermissionBo.to(perm)); 074 } 075 } else { 076 throw new RuntimeException( 077 "Cannot save object of type: " + getDataObjectClass() + " with permission service"); 078 } 079 } 080 081 /** 082 * Pre-populates the ID field of the new PermissionBo to be created. 083 * 084 * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#saveBusinessObject() 085 */ 086 @Override 087 public void processAfterNew(MaintenanceDocument document, Map<String, String[]> parameters) { 088 super.processAfterNew(document,parameters); 089 090 GenericPermissionBo permissionBo = (GenericPermissionBo) document.getNewMaintainableObject().getDataObject(); 091 initializePermissionId(permissionBo); 092 } 093 094 /** 095 * Pre-populates the ID field of the new PermissionBo to be created. 096 * 097 * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#saveBusinessObject() 098 */ 099 @Override 100 public void processAfterCopy(MaintenanceDocument document, Map<String, String[]> parameters) { 101 super.processAfterCopy(document,parameters); 102 103 GenericPermissionBo permissionBo = (GenericPermissionBo) document.getNewMaintainableObject().getDataObject(); 104 initializePermissionId(permissionBo); 105 permissionBo.setVersionNumber(null); 106 } 107 108 private void initializePermissionId(Object dataObject) { 109 if (dataObject instanceof GenericPermissionBo) { 110 GenericPermissionBo permissionBo = (GenericPermissionBo) dataObject; 111 112 if (StringUtils.isBlank(permissionBo.getId())) { 113 DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer( 114 KimImplServiceLocator.getDataSource(), KimConstants.SequenceNames.KRIM_PERM_ID_S); 115 permissionBo.setId(incrementer.nextStringValue()); 116 } 117 } 118 } 119 120 @SuppressWarnings("rawtypes") 121 @Override 122 public Class getBoClass() { 123 return GenericPermissionBo.class; 124 } 125 126 @Override 127 public boolean isExternalBusinessObject() { 128 return true; 129 } 130 131 @Override 132 public void prepareBusinessObject(BusinessObject businessObject) { 133 try { 134 if ( businessObject == null ) { 135 throw new RuntimeException( "Configuration ERROR: GenericPermissionMaintainable.prepareBusinessObject passed a null object." ); 136 } 137 if ( businessObject instanceof PermissionBo ) { 138 PermissionBo perm = KradDataServiceLocator.getDataObjectService().find(PermissionBo.class, ((PermissionBo)businessObject).getId()); 139 businessObject = new GenericPermissionBo(perm); 140 } else if ( businessObject instanceof GenericPermissionBo ) { 141 // lookup the PermissionBo and convert to a GenericPermissionBo 142 PermissionBo perm = KradDataServiceLocator.getDataObjectService().find(PermissionBo.class, ((GenericPermissionBo)businessObject).getId()); 143 ((GenericPermissionBo)businessObject).loadFromPermission(perm); 144 } else { 145 throw new RuntimeException( "Configuration ERROR: GenericPermissionMaintainable passed an unsupported object type: " + businessObject.getClass() ); 146 } 147 setDataObject( businessObject ); 148 super.prepareBusinessObject(businessObject); 149 } catch ( RuntimeException ex ) { 150 LOG.error( "Exception in prepareBusinessObject()", ex ); 151 throw ex; 152 } 153 } 154 155 @Override 156 public void setupNewFromExisting(MaintenanceDocument document, Map<String, String[]> parameters) { 157 String attrName = ""; 158 String attrValue = ""; 159 160 GenericPermissionBo permissionBo = (GenericPermissionBo) document.getNewMaintainableObject().getDataObject(); 161 initializePermissionId(permissionBo); 162 permissionBo.setActive(true); 163 164 for (String paramName : parameters.keySet()) { 165 String[] parameterValues = parameters.get(paramName); 166 167 if (paramName.equals(DETAIL_OBJECTS_ATTRIBUTE_NAME)) { 168 if (parameterValues.length > 0) { 169 attrName = parameterValues[0]; 170 } 171 } 172 173 if (paramName.equals(DETAIL_OBJECTS_ATTRIBUTE_VALUE)) { 174 if (parameterValues.length > 0) { 175 attrValue = parameterValues[0]; 176 } 177 } 178 } 179 180 if (StringUtils.isNotEmpty(attrName) && StringUtils.isNotEmpty(attrValue)) { 181 Map<String, String> details = new HashMap<String, String>(); 182 details.put(attrName, attrValue); 183 permissionBo.setDetails(details); 184 } 185 186 document.getNewMaintainableObject().setDataObject(permissionBo); 187 } 188}