001 /**
002 * Copyright 2005-2014 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.util.documentserializer;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.rice.krad.datadictionary.DataDictionary;
020 import org.kuali.rice.krad.datadictionary.DocumentEntry;
021 import org.kuali.rice.krad.datadictionary.WorkflowProperties;
022 import org.kuali.rice.krad.datadictionary.WorkflowProperty;
023 import org.kuali.rice.krad.datadictionary.WorkflowPropertyGroup;
024 import org.kuali.rice.krad.document.Document;
025 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
026
027 import java.util.List;
028
029 /**
030 * This implementation of {@link PropertySerializabilityEvaluator} uses the <workflowProperties> defined within the data dictionary
031 * for a document. If the property being serialized corresponds to one of the properties in the data dictionary, then it will be serialized.
032 * If a property specified in the data dictionary corresponds to a business object, then all primitives will be serialized of the business object.
033 * All primitives of a primitive that has already been serialized will be serialized as well. If a property specified in the data dictionary corresponds
034 * to a collection, then all primitives of all collection elements will be serialized.
035 *
036 */
037 public class BusinessObjectPropertySerializibilityEvaluator extends PropertySerializabilityEvaluatorBase implements PropertySerializabilityEvaluator {
038
039 /**
040 * Reads the data dictionary to determine which properties of the document should be serialized.
041 *
042 * @see org.kuali.rice.krad.util.documentserializer.PropertySerializabilityEvaluator#initializeEvaluator(org.kuali.rice.krad.document.Document)
043 */
044 @Override
045 public void initializeEvaluatorForDocument(Document document) {
046 DataDictionary dictionary = KRADServiceLocatorWeb.getDataDictionaryService().getDataDictionary();
047 DocumentEntry docEntry = dictionary.getDocumentEntry(document.getDocumentHeader().getWorkflowDocument().getDocumentTypeName());
048 WorkflowProperties workflowProperties = docEntry.getWorkflowProperties();
049 List<WorkflowPropertyGroup> groups = workflowProperties.getWorkflowPropertyGroups();
050
051 serializableProperties = new PropertySerializerTrie();
052
053 for (WorkflowPropertyGroup group : groups) {
054 // the basepath of each workflow property group is serializable
055 if (StringUtils.isEmpty(group.getBasePath())) {
056 // automatically serialize all primitives of document when the base path is null or empty string
057 serializableProperties.addSerializablePropertyName(document.getBasePathToDocumentDuringSerialization(), false);
058 }
059 else {
060 serializableProperties.addSerializablePropertyName(group.getBasePath(), false);
061 }
062
063 for (WorkflowProperty property : group.getWorkflowProperties()) {
064 String fullPath;
065 if (StringUtils.isEmpty(group.getBasePath())) {
066 fullPath = document.getBasePathToDocumentDuringSerialization() + "." + property.getPath();
067 }
068 else {
069 fullPath = group.getBasePath() + "." + property.getPath();
070 }
071 serializableProperties.addSerializablePropertyName(fullPath, false);
072 }
073 }
074 }
075
076 }