001    /**
002     * Copyright 2005-2012 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     */
016    package org.kuali.rice.kns.datadictionary;
017    
018    import org.kuali.rice.kns.document.authorization.DocumentAuthorizer;
019    import org.kuali.rice.kns.document.authorization.DocumentPresentationController;
020    import org.kuali.rice.kns.document.authorization.MaintenanceDocumentAuthorizerBase;
021    import org.kuali.rice.kns.document.authorization.MaintenanceDocumentPresentationControllerBase;
022    import org.kuali.rice.kns.rule.PromptBeforeValidation;
023    import org.kuali.rice.kns.web.derivedvaluesetter.DerivedValuesSetter;
024    import org.kuali.rice.krad.bo.BusinessObject;
025    import org.kuali.rice.krad.datadictionary.exception.DuplicateEntryException;
026    import org.kuali.rice.krad.document.Document;
027    import org.kuali.rice.kns.document.MaintenanceDocumentBase;
028    import org.kuali.rice.kns.maintenance.Maintainable;
029    
030    import java.util.ArrayList;
031    import java.util.LinkedHashMap;
032    import java.util.List;
033    import java.util.Map;
034    
035    /**
036     * @author Kuali Rice Team (rice.collab@kuali.org)
037     */
038    @Deprecated
039    public class MaintenanceDocumentEntry extends org.kuali.rice.krad.datadictionary.MaintenanceDocumentEntry implements KNSDocumentEntry {
040        protected List<MaintainableSectionDefinition> maintainableSections = new ArrayList<MaintainableSectionDefinition>();
041        protected List<String> lockingKeys = new ArrayList<String>();
042    
043        protected Map<String, MaintainableSectionDefinition> maintainableSectionMap =
044                new LinkedHashMap<String, MaintainableSectionDefinition>();
045    
046        protected boolean allowsNewOrCopy = true;
047        protected String additionalSectionsFile;
048    
049        //for issue KULRice3072, to enable PK field copy
050        protected boolean preserveLockingKeysOnCopy = false;
051    
052        // for issue KULRice3070, to enable deleting a db record using maintenance doc
053        protected boolean allowsRecordDeletion = false;
054    
055        protected boolean translateCodes = false;
056    
057        protected Class<? extends PromptBeforeValidation> promptBeforeValidationClass;
058        protected Class<? extends DerivedValuesSetter> derivedValuesSetterClass;
059        protected List<String> webScriptFiles = new ArrayList<String>(3);
060        protected List<HeaderNavigation> headerNavigationList = new ArrayList<HeaderNavigation>();
061    
062        protected boolean sessionDocument = false;
063    
064        public MaintenanceDocumentEntry() {
065            super();
066    
067            documentAuthorizerClass = MaintenanceDocumentAuthorizerBase.class;
068            documentPresentationControllerClass = MaintenanceDocumentPresentationControllerBase.class;
069        }
070    
071         /**
072         * @return Returns the preRulesCheckClass.
073         */
074        public Class<? extends PromptBeforeValidation> getPromptBeforeValidationClass() {
075            return promptBeforeValidationClass;
076        }
077    
078        /**
079         * The promptBeforeValidationClass element is the full class name of the java
080         * class which determines whether the user should be asked any questions prior to running validation.
081         *
082         * @see KualiDocumentActionBase#promptBeforeValidation(org.apache.struts.action.ActionMapping,
083         *      org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest,
084         *      javax.servlet.http.HttpServletResponse, String)
085         */
086        public void setPromptBeforeValidationClass(Class<? extends PromptBeforeValidation> preRulesCheckClass) {
087            this.promptBeforeValidationClass = preRulesCheckClass;
088        }
089    
090        @Override
091        public Class<? extends Document> getStandardDocumentBaseClass() {
092            return MaintenanceDocumentBase.class;
093        }
094    
095        /*
096               This attribute is used in many contexts, for example, in maintenance docs, it's used to specify the classname
097               of the BO being maintained.
098        */
099        public void setBusinessObjectClass(Class<? extends BusinessObject> businessObjectClass) {
100            if (businessObjectClass == null) {
101                throw new IllegalArgumentException("invalid (null) dataObjectClass");
102            }
103    
104            setDataObjectClass(businessObjectClass);
105        }
106    
107        public Class<? extends BusinessObject> getBusinessObjectClass() {
108            return (Class<? extends BusinessObject>) getDataObjectClass();
109        }
110    
111        /**
112         * @see org.kuali.rice.krad.datadictionary.DocumentEntry#getEntryClass()
113         */
114        @SuppressWarnings("unchecked")
115        @Override
116        public Class getEntryClass() {
117            return getDataObjectClass();
118        }
119    
120        public Class<? extends Maintainable> getMaintainableClass() {
121            return (Class<? extends Maintainable>) super.getMaintainableClass();
122        }
123    
124        /**
125         * @return List of MaintainableSectionDefinition objects contained in this document
126         */
127        public List<MaintainableSectionDefinition> getMaintainableSections() {
128            return maintainableSections;
129        }
130    
131        /**
132         * @return List of all lockingKey fieldNames associated with this LookupDefinition, in the order in which they were
133         *         added
134         */
135        public List<String> getLockingKeyFieldNames() {
136            return lockingKeys;
137        }
138    
139        /**
140         * Gets the allowsNewOrCopy attribute.
141         *
142         * @return Returns the allowsNewOrCopy.
143         */
144        public boolean getAllowsNewOrCopy() {
145            return allowsNewOrCopy;
146        }
147    
148        /**
149         * The allowsNewOrCopy element contains a value of true or false.
150         * If true, this indicates the maintainable should allow the
151         * new and/or copy maintenance actions.
152         */
153        public void setAllowsNewOrCopy(boolean allowsNewOrCopy) {
154            this.allowsNewOrCopy = allowsNewOrCopy;
155        }
156    
157        /**
158         * Directly validate simple fields, call completeValidation on Definition fields.
159         *
160         * @see org.kuali.rice.krad.datadictionary.DocumentEntry#completeValidation()
161         */
162        public void completeValidation() {
163            super.completeValidation();
164    
165            for (MaintainableSectionDefinition maintainableSectionDefinition : maintainableSections) {
166                maintainableSectionDefinition.completeValidation(getDataObjectClass(), null);
167            }
168        }
169    
170        /**
171         * @see java.lang.Object#toString()
172         */
173        public String toString() {
174            return "MaintenanceDocumentEntry for documentType " + getDocumentTypeName();
175        }
176    
177        @Deprecated
178        public String getAdditionalSectionsFile() {
179            return additionalSectionsFile;
180        }
181    
182        /*
183               The additionalSectionsFile element specifies the name of the location
184               of an additional JSP file to include in the maintenance document
185               after the generation sections but before the notes.
186               The location semantics are those of jsp:include.
187        */
188        @Deprecated
189        public void setAdditionalSectionsFile(String additionalSectionsFile) {
190            this.additionalSectionsFile = additionalSectionsFile;
191        }
192    
193        public List<String> getLockingKeys() {
194            return lockingKeys;
195        }
196    
197        /*
198               The lockingKeys element specifies a list of fields
199               that comprise a unique key.  This is used for record locking
200               during the file maintenance process.
201        */
202        public void setLockingKeys(List<String> lockingKeys) {
203            for (String lockingKey : lockingKeys) {
204                if (lockingKey == null) {
205                    throw new IllegalArgumentException("invalid (null) lockingKey");
206                }
207            }
208            this.lockingKeys = lockingKeys;
209        }
210    
211        /**
212         * The maintainableSections elements allows the maintenance document to
213         * be presented in sections.  Each section can have a different title.
214         *
215         * JSTL: maintainbleSections is a Map whichis accessed by a key
216         * of "maintainableSections".  This map contains entries with the
217         * following keys:
218         * "0"   (for first section)
219         * "1"   (for second section)
220         * etc.
221         * The corresponding value for each entry is a maintainableSection ExportMap.
222         * See MaintenanceDocumentEntryMapper.java.
223         */
224        @Deprecated
225        public void setMaintainableSections(List<MaintainableSectionDefinition> maintainableSections) {
226            maintainableSectionMap.clear();
227            for (MaintainableSectionDefinition maintainableSectionDefinition : maintainableSections) {
228                if (maintainableSectionDefinition == null) {
229                    throw new IllegalArgumentException("invalid (null) maintainableSectionDefinition");
230                }
231    
232                String sectionTitle = maintainableSectionDefinition.getTitle();
233                if (maintainableSectionMap.containsKey(sectionTitle)) {
234                    throw new DuplicateEntryException(
235                            "section '" + sectionTitle + "' already defined for maintenanceDocument '" +
236                                    getDocumentTypeName() + "'");
237                }
238    
239                maintainableSectionMap.put(sectionTitle, maintainableSectionDefinition);
240            }
241            this.maintainableSections = maintainableSections;
242        }
243    
244        /**
245         * @return the preserveLockingKeysOnCopy
246         */
247        public boolean getPreserveLockingKeysOnCopy() {
248            return this.preserveLockingKeysOnCopy;
249        }
250    
251        /**
252         * @param preserveLockingKeysOnCopy the preserveLockingKeysOnCopy to set
253         */
254        public void setPreserveLockingKeysOnCopy(boolean preserveLockingKeysOnCopy) {
255            this.preserveLockingKeysOnCopy = preserveLockingKeysOnCopy;
256        }
257    
258        /**
259         * @return the allowRecordDeletion
260         */
261        public boolean getAllowsRecordDeletion() {
262            return this.allowsRecordDeletion;
263        }
264    
265        /**
266         * @param allowsRecordDeletion the allowRecordDeletion to set
267         */
268        public void setAllowsRecordDeletion(boolean allowsRecordDeletion) {
269            this.allowsRecordDeletion = allowsRecordDeletion;
270        }
271    
272        @Deprecated
273        public boolean isTranslateCodes() {
274            return this.translateCodes;
275        }
276    
277        @Deprecated
278        public void setTranslateCodes(boolean translateCodes) {
279            this.translateCodes = translateCodes;
280        }
281    
282        /**
283         * Returns the document authorizer class for the document.  Only framework code should be calling this method.
284         * Client devs should use {@link DocumentTypeService#getDocumentAuthorizer(org.kuali.rice.krad.document.Document)}
285         * or
286         * {@link DocumentTypeService#getDocumentAuthorizer(String)}
287         *
288         * @return a document authorizer class
289         */
290        @Override
291        public Class<? extends DocumentAuthorizer> getDocumentAuthorizerClass() {
292            return (Class<? extends DocumentAuthorizer>) super.getDocumentAuthorizerClass();
293        }
294    
295        /**
296         * Returns the document presentation controller class for the document.  Only framework code should be calling this
297         * method.
298         * Client devs should use {@link DocumentTypeService#getDocumentPresentationController(org.kuali.rice.krad.document.Document)}
299         * or
300         * {@link DocumentTypeService#getDocumentPresentationController(String)}
301         *
302         * @return the documentPresentationControllerClass
303         */
304        @Override
305        public Class<? extends DocumentPresentationController> getDocumentPresentationControllerClass() {
306            return (Class<? extends DocumentPresentationController>)  super.getDocumentPresentationControllerClass();
307        }
308    
309        public List<HeaderNavigation> getHeaderNavigationList() {
310            return headerNavigationList;
311        }
312    
313        public List<String> getWebScriptFiles() {
314            return webScriptFiles;
315        }
316    
317        /**
318         * The webScriptFile element defines the name of javascript files
319         * that are necessary for processing the document.  The specified
320         * javascript files will be included in the generated html.
321         */
322        public void setWebScriptFiles(List<String> webScriptFiles) {
323            this.webScriptFiles = webScriptFiles;
324        }
325    
326        /**
327         * The headerNavigation element defines a set of additional
328         * tabs which will appear on the document.
329         */
330        public void setHeaderNavigationList(List<HeaderNavigation> headerNavigationList) {
331            this.headerNavigationList = headerNavigationList;
332        }
333    
334        public boolean isSessionDocument() {
335            return this.sessionDocument;
336        }
337    
338        public void setSessionDocument(boolean sessionDocument) {
339            this.sessionDocument = sessionDocument;
340        }
341    
342        /**
343         * @return the derivedValuesSetter
344         */
345        public Class<? extends DerivedValuesSetter> getDerivedValuesSetterClass() {
346            return this.derivedValuesSetterClass;
347        }
348    
349        /**
350         * @param derivedValuesSetter the derivedValuesSetter to set
351         */
352        public void setDerivedValuesSetterClass(Class<? extends DerivedValuesSetter> derivedValuesSetter) {
353            this.derivedValuesSetterClass = derivedValuesSetter;
354        }
355    }