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.krad.datadictionary;
017
018import org.apache.commons.lang.StringUtils;
019import org.kuali.rice.krad.datadictionary.exception.AttributeValidationException;
020import org.kuali.rice.krad.datadictionary.validation.capability.CollectionSizeConstrainable;
021
022/**
023 * A single Collection attribute definition in the DataDictionary, which contains information relating to the display, validation,
024 * and general maintenance of a specific Collection attribute of an entry.
025 * 
026 * 
027 */
028public class CollectionDefinition extends DataDictionaryDefinitionBase implements CollectionSizeConstrainable{
029    private static final long serialVersionUID = -2644072136271281041L;
030    
031    protected String dataObjectClass;
032    protected String name;
033    protected String label;
034    protected String shortLabel;
035    protected String elementLabel;
036    
037    protected String summary;
038
039        protected String description;
040    
041        protected Integer minOccurs;
042        protected Integer maxOccurs;
043
044    public CollectionDefinition() {
045        //empty
046    }
047
048    public String getName() {
049        return name;
050    }
051
052    public void setName(String name) {
053        if (StringUtils.isBlank(name)) {
054            throw new IllegalArgumentException("invalid (blank) name");
055        }
056        this.name = name;
057    }
058
059    public String getLabel() {
060        return label;
061    }
062
063    public void setLabel(String label) {
064        if (StringUtils.isBlank(label)) {
065            throw new IllegalArgumentException("invalid (blank) label");
066        }
067        this.label = label;
068    }
069
070    /**
071     * @return the shortLabel, or the label if no shortLabel has been set
072     */
073    public String getShortLabel() {
074        return (shortLabel != null) ? shortLabel : label;
075    }
076
077    public void setShortLabel(String shortLabel) {
078        if (StringUtils.isBlank(shortLabel)) {
079            throw new IllegalArgumentException("invalid (blank) shortLabel");
080        }
081        this.shortLabel = shortLabel;
082    }
083
084    /**
085     * Gets the elementLabel attribute. 
086     * @return Returns the elementLabel.
087     */
088    public String getElementLabel() {
089        return elementLabel;
090    }
091
092    /**
093         * The elementLabel defines the name to be used for a single object
094     * within the collection.  For example: "Address" may be the name
095     * of one object within the "Addresses" collection.
096     */
097    public void setElementLabel(String elementLabel) {
098        this.elementLabel = elementLabel;
099    }
100
101    public String getSummary() {
102        return summary;
103    }
104
105    /**
106         * The summary element is used to provide a short description of the
107     * attribute or collection.  This is designed to be used for help purposes.
108     */
109    public void setSummary(String summary) {
110        this.summary = summary;
111    }
112
113    public String getDescription() {
114        return description;
115    }
116
117    /**
118         * The description element is used to provide a long description of the
119         * attribute or collection.  This is designed to be used for help purposes.
120     */
121    public void setDescription(String description) {
122        this.description = description;
123    }
124    
125           
126    /**
127         * @return the dataObjectClass
128         */
129        public String getDataObjectClass() {
130                return this.dataObjectClass;
131        }
132
133        /**
134         * @param objectClass the dataObjectClass to set
135         */
136        public void setDataObjectClass(String dataObjectClass) {
137                this.dataObjectClass = dataObjectClass;
138        }
139
140        /**
141     * Directly validate simple fields, call completeValidation on Definition fields.
142     * 
143     * @see org.kuali.rice.krad.datadictionary.DataDictionaryEntry#completeValidation()
144     */
145    public void completeValidation(Class rootBusinessObjectClass, Class otherBusinessObjectClass) {
146        if (!DataDictionary.isCollectionPropertyOf(rootBusinessObjectClass, name)) {
147            throw new AttributeValidationException("property '" + name + "' is not a collection property of class '" + rootBusinessObjectClass + "' (" + "" + ")");
148        }
149    }
150
151
152    /**
153     * @see java.lang.Object#toString()
154     */
155    @Override
156    public String toString() {
157        return "CollectionDefinition for collection " + getName();
158    }
159
160        /**
161         * @see org.kuali.rice.krad.datadictionary.validation.constraint.CollectionSizeConstraint#getMaximumNumberOfElements()
162         */
163        @Override
164        public Integer getMaximumNumberOfElements() {
165                return this.maxOccurs;
166        }
167
168        /**
169         * @see org.kuali.rice.krad.datadictionary.validation.constraint.CollectionSizeConstraint#getMinimumNumberOfElements()
170         */
171        @Override
172        public Integer getMinimumNumberOfElements() {
173                return this.minOccurs;
174        }
175
176    /**
177         * @return the minOccurs
178         */
179        public Integer getMinOccurs() {
180                return this.minOccurs;
181        }
182
183        /**
184         * @param minOccurs the minOccurs to set
185         */
186        public void setMinOccurs(Integer minOccurs) {
187                this.minOccurs = minOccurs;
188        }
189
190        /**
191         * @return the maxOccurs
192         */
193        public Integer getMaxOccurs() {
194                return this.maxOccurs;
195        }
196
197        /**
198         * @param maxOccurs the maxOccurs to set
199         */
200        public void setMaxOccurs(Integer maxOccurs) {
201                this.maxOccurs = maxOccurs;
202        }
203
204}