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.krad.datadictionary;
017
018 import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException;
019 import org.kuali.rice.krad.datadictionary.exception.ClassValidationException;
020 import org.kuali.rice.krad.document.Document;
021 import org.kuali.rice.krad.maintenance.MaintenanceDocumentAuthorizer;
022 import org.kuali.rice.krad.maintenance.MaintenanceDocumentAuthorizerBase;
023 import org.kuali.rice.krad.maintenance.MaintenanceDocumentBase;
024 import org.kuali.rice.krad.maintenance.Maintainable;
025 import org.kuali.rice.krad.maintenance.MaintenanceDocumentPresentationControllerBase;
026
027 import java.util.ArrayList;
028 import java.util.List;
029
030 /**
031 * Data dictionary entry class for <code>MaintenanceDocument</code>
032 *
033 * @author Kuali Rice Team (rice.collab@kuali.org)
034 */
035 public class MaintenanceDocumentEntry extends DocumentEntry {
036 private static final long serialVersionUID = 4990040987835057251L;
037
038 protected Class<?> dataObjectClass;
039 protected Class<? extends Maintainable> maintainableClass;
040
041 protected List<String> lockingKeys = new ArrayList<String>();
042
043 protected boolean allowsNewOrCopy = true;
044 protected boolean preserveLockingKeysOnCopy = false;
045 protected boolean allowsRecordDeletion = false;
046
047 public MaintenanceDocumentEntry() {
048 super();
049
050 setDocumentClass(getStandardDocumentBaseClass());
051 documentAuthorizerClass = MaintenanceDocumentAuthorizerBase.class;
052 documentPresentationControllerClass = MaintenanceDocumentPresentationControllerBase.class;
053 }
054
055 public Class<? extends Document> getStandardDocumentBaseClass() {
056 return MaintenanceDocumentBase.class;
057 }
058
059 /*
060 This attribute is used in many contexts, for example, in maintenance docs, it's used to specify the classname
061 of the BO being maintained.
062 */
063 public void setDataObjectClass(Class<?> dataObjectClass) {
064 if (dataObjectClass == null) {
065 throw new IllegalArgumentException("invalid (null) dataObjectClass");
066 }
067
068 this.dataObjectClass = dataObjectClass;
069 }
070
071 public Class<?> getDataObjectClass() {
072 return dataObjectClass;
073 }
074
075 /**
076 * @see org.kuali.rice.krad.datadictionary.DocumentEntry#getEntryClass()
077 */
078 @SuppressWarnings("unchecked")
079 @Override
080 public Class getEntryClass() {
081 return dataObjectClass;
082 }
083
084 /*
085 The maintainableClass element specifies the name of the
086 java class which is responsible for implementing the
087 maintenance logic.
088 The normal one is KualiMaintainableImpl.java.
089 */
090 public void setMaintainableClass(Class<? extends Maintainable> maintainableClass) {
091 if (maintainableClass == null) {
092 throw new IllegalArgumentException("invalid (null) maintainableClass");
093 }
094 this.maintainableClass = maintainableClass;
095 }
096
097 public Class<? extends Maintainable> getMaintainableClass() {
098 return maintainableClass;
099 }
100
101 /**
102 * @return List of all lockingKey fieldNames associated with this LookupDefinition, in the order in which they were
103 * added
104 */
105 public List<String> getLockingKeyFieldNames() {
106 return lockingKeys;
107 }
108
109 /**
110 * Gets the allowsNewOrCopy attribute.
111 *
112 * @return Returns the allowsNewOrCopy.
113 */
114 public boolean getAllowsNewOrCopy() {
115 return allowsNewOrCopy;
116 }
117
118 /**
119 * The allowsNewOrCopy element contains a value of true or false.
120 * If true, this indicates the maintainable should allow the
121 * new and/or copy maintenance actions.
122 */
123 public void setAllowsNewOrCopy(boolean allowsNewOrCopy) {
124 this.allowsNewOrCopy = allowsNewOrCopy;
125 }
126
127 /**
128 * Directly validate simple fields, call completeValidation on Definition fields.
129 *
130 * @see org.kuali.rice.krad.datadictionary.DocumentEntry#completeValidation()
131 */
132 public void completeValidation() {
133 super.completeValidation();
134
135 for (String lockingKey : lockingKeys) {
136 if (!DataDictionary.isPropertyOf(dataObjectClass, lockingKey)) {
137 throw new AttributeValidationException(
138 "unable to find attribute '" + lockingKey + "' for lockingKey in dataObjectClass '" +
139 dataObjectClass.getName());
140 }
141 }
142
143 for (ReferenceDefinition reference : defaultExistenceChecks) {
144 reference.completeValidation(dataObjectClass, null);
145 }
146
147
148 if (documentAuthorizerClass != null &&
149 !MaintenanceDocumentAuthorizer.class.isAssignableFrom(documentAuthorizerClass)) {
150 throw new ClassValidationException(
151 "This maintenance document for '" + getDataObjectClass().getName() + "' has an invalid " +
152 "documentAuthorizerClass ('" + documentAuthorizerClass.getName() + "'). " +
153 "Maintenance Documents must use an implementation of MaintenanceDocumentAuthorizer.");
154 }
155 }
156
157 /**
158 * @see java.lang.Object#toString()
159 */
160 public String toString() {
161 return "MaintenanceDocumentEntry for documentType " + getDocumentTypeName();
162 }
163
164 public List<String> getLockingKeys() {
165 return lockingKeys;
166 }
167
168 /*
169 The lockingKeys element specifies a list of fields
170 that comprise a unique key. This is used for record locking
171 during the file maintenance process.
172 */
173 public void setLockingKeys(List<String> lockingKeys) {
174 for (String lockingKey : lockingKeys) {
175 if (lockingKey == null) {
176 throw new IllegalArgumentException("invalid (null) lockingKey");
177 }
178 }
179 this.lockingKeys = lockingKeys;
180 }
181
182 /**
183 * @return the preserveLockingKeysOnCopy
184 */
185 public boolean getPreserveLockingKeysOnCopy() {
186 return this.preserveLockingKeysOnCopy;
187 }
188
189 /**
190 * @param preserveLockingKeysOnCopy the preserveLockingKeysOnCopy to set
191 */
192 public void setPreserveLockingKeysOnCopy(boolean preserveLockingKeysOnCopy) {
193 this.preserveLockingKeysOnCopy = preserveLockingKeysOnCopy;
194 }
195
196 /**
197 * @return the allowRecordDeletion
198 */
199 public boolean getAllowsRecordDeletion() {
200 return this.allowsRecordDeletion;
201 }
202
203 /**
204 * @param allowsRecordDeletion the allowRecordDeletion to set
205 */
206 public void setAllowsRecordDeletion(boolean allowsRecordDeletion) {
207 this.allowsRecordDeletion = allowsRecordDeletion;
208 }
209
210 }