001 /**
002 * Copyright 2005-2013 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.kew.framework.document.search;
017
018 import org.kuali.rice.core.api.CoreConstants;
019 import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
020 import org.kuali.rice.core.api.mo.ModelBuilder;
021 import org.kuali.rice.core.api.uif.RemotableAttributeField;
022 import org.w3c.dom.Element;
023
024 import javax.xml.bind.annotation.XmlAccessType;
025 import javax.xml.bind.annotation.XmlAccessorType;
026 import javax.xml.bind.annotation.XmlAnyElement;
027 import javax.xml.bind.annotation.XmlElement;
028 import javax.xml.bind.annotation.XmlElementWrapper;
029 import javax.xml.bind.annotation.XmlRootElement;
030 import javax.xml.bind.annotation.XmlType;
031 import java.io.Serializable;
032 import java.util.ArrayList;
033 import java.util.Collection;
034 import java.util.Collections;
035 import java.util.List;
036
037 /**
038 * An immutable data transfer object implementation of the {@link DocumentSearchCriteriaConfigurationContract}.
039 * Instances of this class should be constructed using the nested {@link Builder} class.
040 *
041 * @author Kuali Rice Team (rice.collab@kuali.org)
042 */
043 @XmlRootElement(name = DocumentSearchCriteriaConfiguration.Constants.ROOT_ELEMENT_NAME)
044 @XmlAccessorType(XmlAccessType.NONE)
045 @XmlType(name = DocumentSearchCriteriaConfiguration.Constants.TYPE_NAME, propOrder = {
046 DocumentSearchCriteriaConfiguration.Elements.SEARCH_ATTRIBUTE_FIELDS,
047 CoreConstants.CommonElements.FUTURE_ELEMENTS
048 })
049 public final class DocumentSearchCriteriaConfiguration extends AbstractDataTransferObject implements DocumentSearchCriteriaConfigurationContract {
050
051 private static final long serialVersionUID = -5764134034667636217L;
052
053 @XmlElementWrapper(name = Elements.SEARCH_ATTRIBUTE_FIELDS, required = false)
054 @XmlElement(name = Elements.ATTRIBUTE_FIELDS, required = false)
055 private final List<AttributeFields> searchAttributeFields;
056
057 @SuppressWarnings("unused")
058 @XmlAnyElement
059 private final Collection<Element> _futureElements = null;
060
061 /**
062 * Private constructor used only by JAXB.
063 */
064 @SuppressWarnings("unused")
065 private DocumentSearchCriteriaConfiguration() {
066 this.searchAttributeFields = null;
067 }
068
069 private DocumentSearchCriteriaConfiguration(Builder builder) {
070 if (builder.getSearchAttributeFields() == null) {
071 this.searchAttributeFields = Collections.emptyList();
072 } else {
073 this.searchAttributeFields = Collections.unmodifiableList(new ArrayList<AttributeFields>(builder.getSearchAttributeFields()));
074 }
075 }
076
077 @Override
078 public List<AttributeFields> getSearchAttributeFields() {
079 return this.searchAttributeFields;
080 }
081
082 public List<RemotableAttributeField> getFlattenedSearchAttributeFields() {
083 List<RemotableAttributeField> searchAttributeFields = new ArrayList<RemotableAttributeField>();
084 for (AttributeFields attributeFields : getSearchAttributeFields()) {
085 searchAttributeFields.addAll(attributeFields.getRemotableAttributeFields());
086 }
087 return searchAttributeFields;
088 }
089
090 /**
091 * A builder which can be used to construct {@link DocumentSearchCriteriaConfiguration} instances. Enforces the
092 * constraints of the {@link DocumentSearchCriteriaConfigurationContract}.
093 */
094 public final static class Builder implements Serializable, ModelBuilder, DocumentSearchCriteriaConfigurationContract {
095
096 private List<AttributeFields> searchAttributeFields;
097
098 private Builder() {
099 setSearchAttributeFields(new ArrayList<AttributeFields>());
100 }
101
102 /**
103 * Creates new empty builder instance. The list of search attributes on this builder is intialized to an empty
104 * list.
105 *
106 * @return a new empty builder instance
107 */
108 public static Builder create() {
109 return new Builder();
110 }
111
112 /**
113 * Creates a new builder instance initialized with copies of the properties from the given contract.
114 *
115 * @param contract the contract from which to copy properties
116 *
117 * @return a builder instance initialized with properties from the given contract
118 *
119 * @throws IllegalArgumentException if the given contract is null
120 */
121 public static Builder create(DocumentSearchCriteriaConfigurationContract contract) {
122 if (contract == null) {
123 throw new IllegalArgumentException("contract was null");
124 }
125 Builder builder = create();
126 builder.setSearchAttributeFields(contract.getSearchAttributeFields());
127 return builder;
128 }
129
130 @Override
131 public DocumentSearchCriteriaConfiguration build() {
132 return new DocumentSearchCriteriaConfiguration(this);
133 }
134
135 @Override
136 public List<AttributeFields> getSearchAttributeFields() {
137 return this.searchAttributeFields;
138 }
139
140 /**
141 * Sets the search attribute fields on this builder to the given list of attribute fields.
142 *
143 * @param searchAttributeFields the list of search attribute fields to set
144 */
145 public void setSearchAttributeFields(List<AttributeFields> searchAttributeFields) {
146 this.searchAttributeFields = searchAttributeFields;
147 }
148
149 }
150
151 /**
152 * Defines some internal constants used on this class.
153 */
154 static class Constants {
155 final static String ROOT_ELEMENT_NAME = "documentSearchCriteriaConfiguration";
156 final static String TYPE_NAME = "DocumentSearchCriteriaConfigurationType";
157 }
158
159 /**
160 * A private class which exposes constants which define the XML element names to use when this object is marshalled
161 * to XML.
162 */
163 static class Elements {
164 final static String SEARCH_ATTRIBUTE_FIELDS = "searchAttributeFields";
165 final static String ATTRIBUTE_FIELDS = "attributeFields";
166 }
167
168 }