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 org.apache.log4j.Logger;
019import org.kuali.rice.kim.api.KimConstants;
020import org.kuali.rice.kim.api.services.KimApiServiceLocator;
021import org.kuali.rice.kim.impl.permission.GenericPermissionBo;
022import org.kuali.rice.kim.impl.permission.PermissionBo;
023import org.kuali.rice.kim.impl.permission.PermissionTemplateBo;
024import org.kuali.rice.kns.document.MaintenanceDocument;
025import org.kuali.rice.kns.maintenance.KualiMaintainableImpl;
026import org.kuali.rice.krad.bo.BusinessObject;
027import org.kuali.rice.krad.bo.PersistableBusinessObject;
028import org.kuali.rice.krad.service.KRADServiceLocator;
029import org.kuali.rice.krad.service.SequenceAccessorService;
030
031import java.util.Map;
032
033/**
034 * This is a description of what this class does - jonathan don't forget to fill this in. 
035 * 
036 * @author Kuali Rice Team (rice.collab@kuali.org)
037 *
038 */
039public class GenericPermissionMaintainable extends KualiMaintainableImpl {
040
041        private static final Logger LOG = Logger.getLogger( GenericPermissionMaintainable.class );      
042        private static final long serialVersionUID = -8102504656976243468L;
043    protected transient SequenceAccessorService sequenceAccessorService;
044
045    /**
046     * Saves the responsibility via the responsibility update service
047     *
048     * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#saveBusinessObject()
049     */
050    @Override
051    public void saveDataObject() {
052        if (getDataObject() instanceof PersistableBusinessObject) {
053            GenericPermissionBo genericPermissionBo = (GenericPermissionBo)getDataObject();
054            boolean permissionExists = false;
055            if (genericPermissionBo.getId() != null) {
056                permissionExists = KimApiServiceLocator.getPermissionService().getPermission(genericPermissionBo.getId()) != null;
057            }
058
059            if (genericPermissionBo.getTemplateId() != null) {
060                genericPermissionBo.setTemplate(
061                        PermissionTemplateBo.from(
062                                KimApiServiceLocator.getPermissionService().getPermissionTemplate(genericPermissionBo.getTemplateId())));
063            }
064            PermissionBo perm = GenericPermissionBo.toPermissionBo(genericPermissionBo);
065            if (permissionExists) {
066                KimApiServiceLocator.getPermissionService().updatePermission(PermissionBo.to(perm));
067            } else {
068                KimApiServiceLocator.getPermissionService().createPermission(PermissionBo.to(perm));
069            }
070        } else {
071            throw new RuntimeException(
072                    "Cannot save object of type: " + getDataObjectClass() + " with permission service");
073        }
074    }
075        
076    /**
077     * Pre-populates the ID field of the new PermissionBo to be created.
078     *
079     * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#saveBusinessObject()
080     */
081    @Override
082    public void processAfterCopy(MaintenanceDocument document, Map<String, String[]> parameters) {
083        super.processAfterCopy(document,parameters);
084        // get id for new permission
085        String newId = getSequenceAccessorService()
086                .getNextAvailableSequenceNumber(KimConstants.SequenceNames.KRIM_PERM_ID_S, PermissionBo.class).toString();
087        ((GenericPermissionBo)document.getNewMaintainableObject().getDataObject()).setId(newId);
088    }
089
090        /**
091         * This overridden method ...
092         * 
093         * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#getBoClass()
094         */
095        @Override
096        public Class<? extends PersistableBusinessObject> getBoClass() {
097                return GenericPermissionBo.class;
098        }
099        
100        /**
101         * This overridden method ...
102         * 
103         * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#isExternalBusinessObject()
104         */
105        @Override
106        public boolean isExternalBusinessObject() {
107                return true;
108        }
109        
110        /**
111         * This overridden method ...
112         * 
113         * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#prepareBusinessObject(org.kuali.rice.krad.bo.BusinessObject)
114         */
115        @Override
116        public void prepareBusinessObject(BusinessObject businessObject) {
117                try {
118                        if ( businessObject == null ) {
119                                throw new RuntimeException( "Configuration ERROR: GenericPermissionMaintainable.prepareBusinessObject passed a null object." );
120                        }
121                        if ( businessObject instanceof PermissionBo ) {
122                                PermissionBo perm = getBusinessObjectService().findBySinglePrimaryKey(PermissionBo.class, ((PermissionBo)businessObject).getId() );
123                                businessObject = new GenericPermissionBo(perm);
124                        } else if ( businessObject instanceof GenericPermissionBo ) {
125                                // lookup the PermissionBo and convert to a GenericPermissionBo
126                                PermissionBo perm = getBusinessObjectService().findBySinglePrimaryKey(PermissionBo.class, ((GenericPermissionBo)businessObject).getId() );
127                                ((GenericPermissionBo)businessObject).loadFromPermission(perm);
128                        } else {
129                                throw new RuntimeException( "Configuration ERROR: GenericPermissionMaintainable passed an unsupported object type: " + businessObject.getClass() );
130                        }
131                        if ( businessObject instanceof PersistableBusinessObject ) {
132                                setBusinessObject( (PersistableBusinessObject)businessObject );
133                        }
134                        super.prepareBusinessObject(businessObject);
135                } catch ( RuntimeException ex ) {
136                        LOG.error( "Exception in prepareBusinessObject()", ex );
137                        throw ex;
138                }
139        }
140
141    protected SequenceAccessorService getSequenceAccessorService(){
142        if(this.sequenceAccessorService==null){
143            this.sequenceAccessorService = KRADServiceLocator.getSequenceAccessorService();
144        }
145        return this.sequenceAccessorService;
146    }
147
148}