001/**
002 * Copyright 2005-2017 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}