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().getNextAvailableSequenceNumber(KimConstants.SequenceNames.KRIM_PERM_ID_S).toString();
086        ((GenericPermissionBo)document.getNewMaintainableObject().getDataObject()).setId(newId);
087    }
088
089        /**
090         * This overridden method ...
091         * 
092         * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#getBoClass()
093         */
094        @Override
095        public Class<? extends PersistableBusinessObject> getBoClass() {
096                return GenericPermissionBo.class;
097        }
098        
099        /**
100         * This overridden method ...
101         * 
102         * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#isExternalBusinessObject()
103         */
104        @Override
105        public boolean isExternalBusinessObject() {
106                return true;
107        }
108        
109        /**
110         * This overridden method ...
111         * 
112         * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#prepareBusinessObject(org.kuali.rice.krad.bo.BusinessObject)
113         */
114        @Override
115        public void prepareBusinessObject(BusinessObject businessObject) {
116                try {
117                        if ( businessObject == null ) {
118                                throw new RuntimeException( "Configuration ERROR: GenericPermissionMaintainable.prepareBusinessObject passed a null object." );
119                        }
120                        if ( businessObject instanceof PermissionBo ) {
121                                PermissionBo perm = getBusinessObjectService().findBySinglePrimaryKey(PermissionBo.class, ((PermissionBo)businessObject).getId() );
122                                businessObject = new GenericPermissionBo(perm);
123                        } else if ( businessObject instanceof GenericPermissionBo ) {
124                                // lookup the PermissionBo and convert to a GenericPermissionBo
125                                PermissionBo perm = getBusinessObjectService().findBySinglePrimaryKey(PermissionBo.class, ((GenericPermissionBo)businessObject).getId() );
126                                ((GenericPermissionBo)businessObject).loadFromPermission(perm);
127                        } else {
128                                throw new RuntimeException( "Configuration ERROR: GenericPermissionMaintainable passed an unsupported object type: " + businessObject.getClass() );
129                        }
130                        if ( businessObject instanceof PersistableBusinessObject ) {
131                                setBusinessObject( (PersistableBusinessObject)businessObject );
132                        }
133                        super.prepareBusinessObject(businessObject);
134                } catch ( RuntimeException ex ) {
135                        LOG.error( "Exception in prepareBusinessObject()", ex );
136                        throw ex;
137                }
138        }
139
140    protected SequenceAccessorService getSequenceAccessorService(){
141        if(this.sequenceAccessorService==null){
142            this.sequenceAccessorService = KRADServiceLocator.getSequenceAccessorService();
143        }
144        return this.sequenceAccessorService;
145    }
146
147}