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    }