001    /*
002     * Copyright 2011 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 1.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/ecl1.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.kim.api.group;
017    
018    import org.apache.commons.lang.builder.EqualsBuilder;
019    import org.apache.commons.lang.builder.HashCodeBuilder;
020    import org.apache.commons.lang.builder.ToStringBuilder;
021    import org.kuali.rice.core.api.CoreConstants;
022    import org.kuali.rice.core.api.criteria.QueryResults;
023    import org.kuali.rice.core.api.mo.ModelBuilder;
024    import org.kuali.rice.core.api.mo.ModelObjectComplete;
025    import org.w3c.dom.Element;
026    
027    import javax.xml.bind.annotation.XmlAccessType;
028    import javax.xml.bind.annotation.XmlAccessorType;
029    import javax.xml.bind.annotation.XmlAnyElement;
030    import javax.xml.bind.annotation.XmlElement;
031    import javax.xml.bind.annotation.XmlElementWrapper;
032    import javax.xml.bind.annotation.XmlRootElement;
033    import javax.xml.bind.annotation.XmlType;
034    import java.util.ArrayList;
035    import java.util.Collection;
036    import java.util.Collections;
037    import java.util.List;
038    
039    /**
040     * @author Kuali Rice Team (rice.collab@kuali.org)
041     */
042    @XmlRootElement(name = GroupMemberQueryResults.Constants.ROOT_ELEMENT_NAME)
043    @XmlAccessorType(XmlAccessType.NONE)
044    @XmlType(name = GroupMemberQueryResults.Constants.TYPE_NAME, propOrder = {
045                    GroupMemberQueryResults.Elements.RESULTS,
046                    GroupMemberQueryResults.Elements.TOTAL_ROW_COUNT,
047                    GroupMemberQueryResults.Elements.MORE_RESULTS_AVAILALBE,
048                    CoreConstants.CommonElements.FUTURE_ELEMENTS })
049    public class GroupMemberQueryResults implements QueryResults<GroupMember>, ModelObjectComplete {
050    
051            @XmlElementWrapper(name = Elements.RESULTS, required = false)
052            @XmlElement(name = Elements.RESULT_ELEM, required = false)
053            private final List<GroupMember> results;
054    
055            @XmlElement(name = Elements.TOTAL_ROW_COUNT, required = false)
056            private final Integer totalRowCount;
057    
058            @XmlElement(name = Elements.MORE_RESULTS_AVAILALBE, required = true)
059            private final boolean moreResultsAvailable;
060    
061            @SuppressWarnings("unused")
062        @XmlAnyElement
063        private final Collection<Element> _futureElements = null;
064    
065            private GroupMemberQueryResults() {
066                    this.results = null;
067                    this.totalRowCount = null;
068                    this.moreResultsAvailable = false;
069            }
070    
071            private GroupMemberQueryResults(Builder builder) {
072                    final List<GroupMember> temp = new ArrayList<GroupMember>();
073            for (GroupMember.Builder b : builder.getResults()) {
074                if (b != null) {
075                    temp.add(b.build());
076                }
077            }
078    
079            this.results = Collections.unmodifiableList(temp);
080                    this.totalRowCount = builder.getTotalRowCount();
081                    this.moreResultsAvailable = builder.isMoreResultsAvailable();
082            }
083    
084            @Override
085            public List<GroupMember> getResults() {
086                    return results;
087            }
088            
089            @Override
090            public Integer getTotalRowCount() {
091                    return totalRowCount;
092            }
093    
094            @Override
095            public boolean isMoreResultsAvailable() {
096                    return moreResultsAvailable;
097            }
098    
099        @Override
100        public int hashCode() {
101            return HashCodeBuilder.reflectionHashCode(this);
102        }
103    
104        @Override
105        public boolean equals(Object obj) {
106            return EqualsBuilder.reflectionEquals(obj, this);
107        }
108    
109        @Override
110        public String toString() {
111            return ToStringBuilder.reflectionToString(this);
112        }
113    
114            public static class Builder implements ModelBuilder, QueryResults<GroupMember.Builder> {
115    
116                    private List<GroupMember.Builder> results;
117                    private Integer totalRowCount;
118                    private boolean moreResultsAvailable;
119    
120            public static Builder create() {
121                return new Builder();
122            }
123    
124                    private Builder() {
125                            this.results = new ArrayList<GroupMember.Builder>();
126                            this.moreResultsAvailable = false;
127                    }
128    
129            @Override
130                    public GroupMemberQueryResults build() {
131                            return new GroupMemberQueryResults(this);
132                    }
133    
134            @Override
135                    public List<GroupMember.Builder> getResults() {
136                            return Collections.unmodifiableList(this.results);
137                    }
138    
139                    public void setResults(List<GroupMember.Builder> results) {
140                            this.results = new ArrayList<GroupMember.Builder>(results);
141                    }
142    
143            @Override
144                    public Integer getTotalRowCount() {
145                            return this.totalRowCount;
146                    }
147    
148                    public void setTotalRowCount(Integer totalRowCount) {
149                            this.totalRowCount = totalRowCount;
150                    }
151    
152            @Override
153                    public boolean isMoreResultsAvailable() {
154                            return this.moreResultsAvailable;
155                    }
156    
157                    public void setMoreResultsAvailable(boolean moreResultsAvailable) {
158                            this.moreResultsAvailable = moreResultsAvailable;
159                    }
160                    
161            }
162            
163            /**
164             * Defines some internal constants used on this class.
165             */
166            public static class Constants {
167                    public final static String ROOT_ELEMENT_NAME = "GroupMemberQueryResults";
168                    public final static String TYPE_NAME = "GroupMemberQueryResultsType";
169                    public final static String[] HASH_CODE_EQUALS_EXCLUDE = { CoreConstants.CommonElements.FUTURE_ELEMENTS };
170            }
171    
172            /**
173             * A private class which exposes constants which define the XML element
174             * names to use when this object is marshaled to XML.
175             */
176            public static class Elements {
177                    public final static String RESULTS = "results";
178                    public final static String RESULT_ELEM = "GroupMember";
179                    public final static String TOTAL_ROW_COUNT = "totalRowCount";
180                    public final static String MORE_RESULTS_AVAILALBE = "moreResultsAvailable";
181            }
182            
183    }