001    /*
002     * Copyright 2011 The Kuali Foundation Licensed under the Educational Community
003     * License, Version 1.0 (the "License"); you may not use this file except in
004     * compliance with the License. You may obtain a copy of the License at
005     * http://www.opensource.org/licenses/ecl1.php Unless required by applicable law
006     * or agreed to in writing, software distributed under the License is
007     * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
008     * KIND, either express or implied. See the License for the specific language
009     * governing permissions and limitations under the License.
010     */
011    package org.kuali.rice.krad.uif.container;
012    
013    import org.apache.commons.lang.StringUtils;
014    import org.kuali.rice.krad.datadictionary.MaintenanceDocumentEntry;
015    import org.kuali.rice.krad.service.DocumentDictionaryService;
016    import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
017    import org.kuali.rice.krad.uif.UifConstants;
018    import org.kuali.rice.krad.uif.UifConstants.ViewType;
019    import org.kuali.rice.krad.uif.core.RequestParameter;
020    
021    /**
022     * View type for Maintenance documents
023     *
024     * <p>
025     * Supports primary display for a new maintenance record, in which case the
026     * fields are display for populating the new record, and an edit maintenance
027     * record, which is a comparison view with the old record read-only on the left
028     * side and the new record (changed record) on the right side
029     * </p>
030     *
031     * <p>
032     * The <code>MaintenanceView</code> provides the interface for the maintenance
033     * framework. It works with the <code>Maintainable</code> service and
034     * maintenance controller.
035     * </p>
036     *
037     * <p>
038     * Maintenance views are primarily configured by the object class they are
039     * associated with. This provides the default dictionary information for the
040     * fields. If more than one maintenance view is needed for the same object
041     * class, the view name can be used to further identify an unique view
042     * </p>
043     *
044     * @author Kuali Rice Team (rice.collab@kuali.org)
045     */
046    public class MaintenanceView extends DocumentView {
047        private static final long serialVersionUID = -3382802967703882341L;
048    
049        private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(MaintenanceView.class);
050    
051        private Class<?> dataObjectClassName;
052    
053        private String oldObjectBindingPath;
054    
055        @RequestParameter
056        private String maintenanceAction;
057    
058        public MaintenanceView() {
059            super();
060    
061            setViewTypeName(ViewType.MAINTENANCE);
062        }
063    
064        /**
065         * The following initialization is performed:
066         *
067         * <ul>
068         * <li>Retrieve the maintenance document entry for defaults and context</li>
069         * <li>Set the abstractTypeClasses map for the maintenance object path</li>
070         * </ul>
071         *
072         * @see org.kuali.rice.krad.uif.container.ContainerBase#performInitialization(org.kuali.rice.krad.uif.container.View)
073         */
074        @Override
075        public void performInitialization(View view) {
076            super.performInitialization(view);
077    
078            // get maintenance document entry
079            MaintenanceDocumentEntry documentEntry = null;
080            String docTypeName = KRADServiceLocatorWeb.getDocumentDictionaryService()
081                    .getMaintenanceDocumentTypeName(getDataObjectClassName());
082            if (StringUtils.isNotBlank(docTypeName)) {
083                documentEntry =
084                        KRADServiceLocatorWeb.getDocumentDictionaryService().getMaintenanceDocumentEntry(docTypeName);
085            }
086    
087            if (documentEntry != null) {
088                pushObjectToContext(UifConstants.ContextVariableNames.DOCUMENT_ENTRY, documentEntry);
089            } else {
090                LOG.error("Unable to find maintenance document entry for data object class: " +
091                        getDataObjectClassName().getName());
092                throw new RuntimeException("Unable to find maintenance document entry for data object class: " +
093                        getDataObjectClassName().getName());
094            }
095    
096            getAbstractTypeClasses().put(getDefaultBindingObjectPath(), getDataObjectClassName());
097            getAbstractTypeClasses().put(getOldObjectBindingPath(), getDataObjectClassName());
098        }
099    
100        /**
101         * Class name for the object the maintenance document applies to
102         *
103         * <p>
104         * The object class name is used to pick up a dictionary entry which will
105         * feed the attribute field definitions and other configuration. In addition
106         * it is used to configure the <code>Maintainable</code> which will carry
107         * out the maintenance action
108         * </p>
109         *
110         * @return Class<?> maintenance object class
111         */
112        public Class<?> getDataObjectClassName() {
113            return this.dataObjectClassName;
114        }
115    
116        /**
117         * Setter for the object class name
118         *
119         * @param dataObjectClassName
120         */
121        public void setDataObjectClassName(Class<?> dataObjectClassName) {
122            this.dataObjectClassName = dataObjectClassName;
123        }
124    
125        /**
126         * Gives the binding path to the old object (record being edited) to display
127         * for comparison
128         *
129         * @return String old object binding path
130         */
131        public String getOldObjectBindingPath() {
132            return this.oldObjectBindingPath;
133        }
134    
135        /**
136         * Setter for the old object binding path
137         *
138         * @param oldObjectBindingPath
139         */
140        public void setOldObjectBindingPath(String oldObjectBindingPath) {
141            this.oldObjectBindingPath = oldObjectBindingPath;
142        }
143    
144        /**
145         * Indicates what maintenance action (new, edit, copy) was
146         * requested
147         *
148         * @return String maintenance action
149         */
150        public String getMaintenanceAction() {
151            return maintenanceAction;
152        }
153    
154        /**
155         * Setter for the maintenance action
156         *
157         * @param maintenanceAction
158         */
159        public void setMaintenanceAction(String maintenanceAction) {
160            this.maintenanceAction = maintenanceAction;
161        }
162    
163    }