001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.kew.framework.document.search;
017
018import org.kuali.rice.core.api.CoreConstants;
019import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
020import org.kuali.rice.core.api.mo.ModelBuilder;
021import org.kuali.rice.core.api.uif.RemotableAttributeField;
022import org.w3c.dom.Element;
023
024import javax.xml.bind.annotation.XmlAccessType;
025import javax.xml.bind.annotation.XmlAccessorType;
026import javax.xml.bind.annotation.XmlAnyElement;
027import javax.xml.bind.annotation.XmlElement;
028import javax.xml.bind.annotation.XmlElementWrapper;
029import javax.xml.bind.annotation.XmlRootElement;
030import javax.xml.bind.annotation.XmlType;
031import java.io.Serializable;
032import java.util.ArrayList;
033import java.util.Collection;
034import java.util.Collections;
035import 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})
049public 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}