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.kns.service.impl;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.kns.datadictionary.KNSDocumentEntry;
020import org.kuali.rice.kns.datadictionary.MaintenanceDocumentEntry;
021import org.kuali.rice.kns.datadictionary.TransactionalDocumentEntry;
022import org.kuali.rice.kns.document.authorization.DocumentAuthorizer;
023import org.kuali.rice.kns.document.authorization.DocumentAuthorizerBase;
024import org.kuali.rice.kns.document.authorization.DocumentPresentationController;
025import org.kuali.rice.kns.document.authorization.DocumentPresentationControllerBase;
026import org.kuali.rice.kns.document.authorization.MaintenanceDocumentPresentationControllerBase;
027import org.kuali.rice.kns.document.authorization.TransactionalDocumentAuthorizerBase;
028import org.kuali.rice.kns.document.authorization.TransactionalDocumentPresentationControllerBase;
029import org.kuali.rice.kns.service.DocumentHelperService;
030import org.kuali.rice.krad.datadictionary.DataDictionary;
031import org.kuali.rice.krad.document.Document;
032import org.kuali.rice.kns.document.authorization.MaintenanceDocumentAuthorizerBase;
033import org.kuali.rice.krad.service.DataDictionaryService;
034import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
035
036/**
037 * This class is a utility service intended to help retrieve objects related to particular documents.
038 * 
039 * @author Kuali Rice Team (rice.collab@kuali.org)
040 *
041 */
042public class DocumentHelperServiceImpl implements DocumentHelperService {
043    
044    private DataDictionaryService dataDictionaryService;
045
046    /**
047     * @see org.kuali.rice.kns.service.DocumentHelperService#getDocumentAuthorizer(java.lang.String)
048     * // TODO: in krad documents could have multiple views and multiple authorizer classes
049     */
050    public DocumentAuthorizer getDocumentAuthorizer(String documentType) {
051        DataDictionary dataDictionary = getDataDictionaryService().getDataDictionary();
052
053        if (StringUtils.isBlank(documentType)) {
054            throw new IllegalArgumentException("invalid (blank) documentType");
055        }
056
057        KNSDocumentEntry documentEntry = (KNSDocumentEntry) dataDictionary.getDocumentEntry(documentType);
058        if (documentEntry == null) {
059            throw new IllegalArgumentException("unknown documentType '" + documentType + "'");
060        }
061
062        Class<? extends DocumentAuthorizer> documentAuthorizerClass = documentEntry.getDocumentAuthorizerClass();
063
064        DocumentAuthorizer documentAuthorizer = null;
065        try {
066            if (documentAuthorizerClass != null) {
067                documentAuthorizer = documentAuthorizerClass.newInstance();
068            }
069            else if (documentEntry instanceof MaintenanceDocumentEntry) {
070                documentAuthorizer = new MaintenanceDocumentAuthorizerBase();
071            }
072            else if (documentEntry instanceof TransactionalDocumentEntry) {
073                documentAuthorizer = new TransactionalDocumentAuthorizerBase();
074            }
075            else {
076                documentAuthorizer = new DocumentAuthorizerBase();
077            }
078        }
079        catch (Exception e) {
080            throw new RuntimeException("unable to instantiate documentAuthorizer '" + documentAuthorizerClass.getName() + "' for doctype '" + documentType + "'", e);
081        }
082
083        return documentAuthorizer;
084    }
085
086    /**
087     * @see org.kuali.rice.kns.service.DocumentHelperService#getDocumentAuthorizer(org.kuali.rice.krad.document.Document)
088     */
089    public DocumentAuthorizer getDocumentAuthorizer(Document document) {
090        if (document == null) {
091            throw new IllegalArgumentException("invalid (null) document");
092        } else if (document.getDocumentHeader() == null) {
093            throw new IllegalArgumentException(
094                    "invalid (null) document.documentHeader");
095        } else if (!document.getDocumentHeader().hasWorkflowDocument()) {
096            throw new IllegalArgumentException(
097                    "invalid (null) document.documentHeader.workflowDocument");
098        }
099
100        String documentType = document.getDocumentHeader().getWorkflowDocument().getDocumentTypeName();
101
102        DocumentAuthorizer documentAuthorizer = getDocumentAuthorizer(documentType);
103        return documentAuthorizer;
104    }
105
106    /**
107     * @see org.kuali.rice.kns.service.DocumentHelperService#getDocumentPresentationController(java.lang.String)
108     * // TODO: in krad documents could have multiple views and multiple presentation controller
109     */
110    public DocumentPresentationController getDocumentPresentationController(String documentType) {
111        DataDictionary dataDictionary = getDataDictionaryService().getDataDictionary();
112        DocumentPresentationController documentPresentationController = null;
113        
114        if (StringUtils.isBlank(documentType)) {
115            throw new IllegalArgumentException("invalid (blank) documentType");
116        }
117
118        KNSDocumentEntry documentEntry = (KNSDocumentEntry) dataDictionary.getDocumentEntry(documentType);
119        if (documentEntry == null) {
120            throw new IllegalArgumentException("unknown documentType '" + documentType + "'");
121        }
122        Class<? extends DocumentPresentationController> documentPresentationControllerClass = null;
123        try{
124            documentPresentationControllerClass = documentEntry.getDocumentPresentationControllerClass();
125            if(documentPresentationControllerClass != null){
126                documentPresentationController = documentPresentationControllerClass.newInstance();
127            } else {
128                KNSDocumentEntry doc = (KNSDocumentEntry) dataDictionary.getDocumentEntry(documentType);
129                if ( doc instanceof TransactionalDocumentEntry) {
130                    documentPresentationController = new TransactionalDocumentPresentationControllerBase();
131                } else if(doc instanceof MaintenanceDocumentEntry) {
132                    documentPresentationController = new MaintenanceDocumentPresentationControllerBase();
133                } else {
134                    documentPresentationController = new DocumentPresentationControllerBase();
135                }
136            }
137        }
138        catch (Exception e) {
139            throw new RuntimeException("unable to instantiate documentPresentationController '" + documentPresentationControllerClass.getName() + "' for doctype '" + documentType + "'", e);
140        }
141
142        return documentPresentationController;
143    }
144
145    /**
146     * @see org.kuali.rice.kns.service.DocumentHelperService#getDocumentPresentationController(org.kuali.rice.krad.document.Document)
147     */
148    public DocumentPresentationController getDocumentPresentationController(Document document) {
149        if (document == null) {
150            throw new IllegalArgumentException("invalid (null) document");
151        }
152        else if (document.getDocumentHeader() == null) {
153            throw new IllegalArgumentException("invalid (null) document.documentHeader");
154        }
155        else if (!document.getDocumentHeader().hasWorkflowDocument()) {
156            throw new IllegalArgumentException("invalid (null) document.documentHeader.workflowDocument");
157        }
158
159        String documentType = document.getDocumentHeader().getWorkflowDocument().getDocumentTypeName();
160
161        DocumentPresentationController documentPresentationController = getDocumentPresentationController(documentType);
162        return documentPresentationController;
163    }
164
165    /**
166     * @return the dataDictionaryService
167     */
168    public DataDictionaryService getDataDictionaryService() {
169        if (dataDictionaryService == null) {
170            this.dataDictionaryService = KRADServiceLocatorWeb.getDataDictionaryService();
171        }
172        return this.dataDictionaryService;
173    }
174
175    /**
176     * @param dataDictionaryService the dataDictionaryService to set
177     */
178    public void setDataDictionaryService(DataDictionaryService dataDictionaryService) {
179        this.dataDictionaryService = dataDictionaryService;
180    }
181
182}