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.krms.api.repository.term;
017    
018    import org.apache.commons.lang.StringUtils;
019    import org.kuali.rice.core.api.CoreConstants;
020    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
021    import org.kuali.rice.core.api.mo.ModelBuilder;
022    import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter;
023    import org.kuali.rice.krms.api.KrmsConstants;
024    import org.kuali.rice.krms.api.repository.BuilderUtils;
025    
026    import javax.xml.bind.annotation.XmlAccessType;
027    import javax.xml.bind.annotation.XmlAccessorType;
028    import javax.xml.bind.annotation.XmlAnyElement;
029    import javax.xml.bind.annotation.XmlElement;
030    import javax.xml.bind.annotation.XmlElementWrapper;
031    import javax.xml.bind.annotation.XmlRootElement;
032    import javax.xml.bind.annotation.XmlType;
033    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
034    import java.io.Serializable;
035    import java.util.Collection;
036    import java.util.Collections;
037    import java.util.Map;
038    import java.util.Set;
039    
040    /**
041     * This is a description of what this class does - gilesp don't forget to fill this in. 
042     * 
043     * @author Kuali Rice Team (rice.collab@kuali.org)
044     *
045     */
046    @XmlRootElement(name = TermResolverDefinition.Constants.ROOT_ELEMENT_NAME)
047    @XmlAccessorType(XmlAccessType.NONE)
048    @XmlType(name = TermResolverDefinition.Constants.TYPE_NAME, propOrder = {
049                    TermResolverDefinition.Elements.ID,
050                    TermResolverDefinition.Elements.NAME,
051            TermResolverDefinition.Elements.NAMESPACE,
052                    TermResolverDefinition.Elements.TYPE_ID,
053            TermResolverDefinition.Elements.ACTIVE,
054                    TermResolverDefinition.Elements.OUTPUT,
055                    TermResolverDefinition.Elements.PREREQUISITES,
056                    TermResolverDefinition.Elements.ATTRIBUTES,
057                    TermResolverDefinition.Elements.PARAMETER_NAMES,
058            CoreConstants.CommonElements.VERSION_NUMBER,
059                    CoreConstants.CommonElements.FUTURE_ELEMENTS
060    })
061    public final class TermResolverDefinition extends AbstractDataTransferObject implements TermResolverDefinitionContract {
062            
063        private static final long serialVersionUID = 1L;
064            
065            @XmlElement(name = Elements.ID, required=false)
066            private final String id;
067            @XmlElement(name = Elements.NAMESPACE, required=true)
068            private final String namespace;
069            @XmlElement(name = Elements.NAME, required=true)
070            private final String name;
071        @XmlElement(name = Elements.TYPE_ID, required=true)
072        private final String typeId;
073            @XmlElement(name = Elements.OUTPUT, required=false)
074            private final TermSpecificationDefinition output;
075        @XmlElement(name = Elements.ACTIVE, required = false)
076        private final boolean active;
077    
078            @XmlElement(name = "termSpecificationDefinition", required=false)
079            @XmlElementWrapper(name = Elements.PREREQUISITES, required=false)
080            private final Set<TermSpecificationDefinition> prerequisites;
081    
082            @XmlElement(name = Elements.ATTRIBUTES, required = false)
083            @XmlJavaTypeAdapter(value = MapStringStringAdapter.class)
084            private final Map<String, String> attributes;
085    
086            @XmlElementWrapper(name = Elements.PARAMETER_NAMES, required=false)
087            @XmlElement(name = "parameterName")
088            private final Set<String> parameterNames;
089    
090            @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
091        private final Long versionNumber;   
092            
093        @SuppressWarnings("unused")
094            @XmlAnyElement
095            private final Collection<org.w3c.dom.Element> _futureElements = null;
096        
097            /**
098             * This private constructor is for JAXB use only, don't invoke directly.
099             */
100            private TermResolverDefinition() {
101                    id = null;
102                    namespace = null;
103                    name = null;
104                    typeId = null;
105            active = true;
106                    output = null;
107                    prerequisites = null;
108                    attributes = null;
109                    parameterNames = null;
110            versionNumber = null;
111            }
112            
113            private TermResolverDefinition(Builder builder) {
114                    this.id = builder.getId();
115                    this.namespace = builder.getNamespace();
116                    this.name = builder.getName();
117                    this.typeId = builder.getTypeId();
118            this.active = builder.isActive();
119                    this.output = builder.getOutput().build();
120                    this.prerequisites = BuilderUtils.convertFromBuilderSet(builder.getPrerequisites());
121                    this.parameterNames = Collections.unmodifiableSet(builder.getParameterNames());
122                    this.versionNumber = builder.getVersionNumber();
123            if (builder.attributes != null){
124                    this.attributes = Collections.unmodifiableMap(builder.getAttributes());
125            } else {
126                    this.attributes = null;
127            }
128            }
129            
130            public static class Builder implements TermResolverDefinitionContract, ModelBuilder, 
131                    Serializable {
132                    
133                    private static final long serialVersionUID = 1L;
134                    
135                    private String id;
136                    private String namespace;
137                    private String name;
138            private String typeId;
139            private boolean active;
140                    private TermSpecificationDefinition.Builder output;
141                    private Set<TermSpecificationDefinition.Builder> prerequisites;
142            private Map<String, String> attributes;
143                    private Set<String> parameterNames;
144            private Long versionNumber;
145                    
146                    private Builder(String id, String namespaceCode, String name, String typeId, TermSpecificationDefinition.Builder output,
147                    Set<TermSpecificationDefinition.Builder> prerequisites, Map<String, String> attributes, Set<String> parameterNames) {
148                            setId(id);
149                            setNamespace(namespaceCode);
150                            setName(name);
151                            setTypeId(typeId);
152                setActive(true);
153                            setOutput(output);
154                            setPrerequisites(prerequisites);
155                            setAttributes(attributes);
156                            setParameterNames(parameterNames);
157                    }
158                    
159                    
160                    
161                    private Builder(TermResolverDefinitionContract termResolver) {
162                            setId(termResolver.getId());
163                            setNamespace(termResolver.getNamespace());
164                            setName(termResolver.getName());
165                            setTypeId(termResolver.getTypeId());
166                setActive(termResolver.isActive());
167                            setOutput(TermSpecificationDefinition.Builder.create(termResolver.getOutput()));
168                            setPrerequisites(BuilderUtils.transform(termResolver.getPrerequisites(), TermSpecificationDefinition.Builder.toBuilder));
169                            setAttributes(termResolver.getAttributes());
170                            this.setParameterNames(termResolver.getParameterNames());
171                            this.setVersionNumber(termResolver.getVersionNumber());
172                    }
173                    
174                    public static Builder create(TermResolverDefinitionContract termResolver) {
175                            return new Builder(termResolver);
176                    }
177                    
178                    public static Builder create(String id, String namespaceCode, String name, String typeId,
179                    TermSpecificationDefinition.Builder output, Set<TermSpecificationDefinition.Builder> prerequisites, Map<String, String> attributes,
180                    Set<String> parameterNames) {
181                            return new Builder(id, namespaceCode, name, typeId, output, prerequisites, attributes, parameterNames);
182                    }
183    
184                    // Builder setters:
185                    // TODO: proper validation & javadocs
186                    
187                    /**
188                     * @param id the id to set
189                     */
190                    public void setId(String id) {
191                            if (id != null && StringUtils.isBlank(id)) {
192                                    throw new IllegalArgumentException(/* TODO */);
193                            }
194                            this.id = id;
195                    }
196    
197                    /**
198                     * @param namespace the namespace to set
199                     */
200                    public void setNamespace(String namespace) {
201                            if (StringUtils.isBlank(namespace)) {
202                                    throw new IllegalArgumentException(/* TODO */);
203                            }
204                            this.namespace = namespace;
205                    }
206    
207                    /**
208                     * @param name the name to set
209                     */
210                    public void setName(String name) {
211                            if (StringUtils.isBlank(name)) {
212                                    throw new IllegalArgumentException(/* TODO */);
213                            }
214                            this.name = name;
215                    }
216    
217                    /**
218                     * @param typeId the typeId to set
219                     */
220                    public void setTypeId(String typeId) {
221                            if (StringUtils.isBlank(typeId)) {
222                                    throw new IllegalArgumentException(/* TODO */);
223                            }
224                            this.typeId = typeId;
225                    }
226    
227            /**
228             * @param active the active indicator
229             */
230            public void setActive(boolean active) {
231                this.active = active;
232            }
233    
234                    /**
235                     * @param output the output to set
236                     */
237                    public void setOutput(TermSpecificationDefinition.Builder output) {
238                            if (output == null) {
239                                    throw new IllegalArgumentException(/* TODO */);
240                            }
241                            this.output = output;
242                    }
243    
244                    /**
245                     * @param prerequisites the prerequisites to set
246                     */
247                    public void setPrerequisites(
248                                    Set<TermSpecificationDefinition.Builder> prerequisites) {
249                            this.prerequisites = prerequisites;
250                    }
251    
252                    /**
253                     * @param attributes the attributes to set
254                     */
255                    public void setAttributes(Map<String, String> attributes){
256                            if (attributes == null){
257                                    this.attributes = Collections.emptyMap();
258                            } else {
259                                    this.attributes = Collections.unmodifiableMap(attributes);
260                            }
261                    }
262    
263                    /**
264                     * @param parameterNames the parameterNames to set
265                     */
266                    public void setParameterNames(Set<String> parameterNames) {
267                            this.parameterNames = parameterNames;
268                    }               
269                    
270                    /**
271                     * @param versionNumber the versionNumber to set.  May be null.
272                     */
273            public void setVersionNumber(Long versionNumber){
274                this.versionNumber = versionNumber;
275            }
276            
277                    // Builder getters:
278    
279                    /**
280                     * @return the id
281                     */
282                    public String getId() {
283                            return this.id;
284                    }
285                    
286                    /**
287                     * @return the namespace
288                     */
289                    public String getNamespace() {
290                            return this.namespace;
291                    }
292                    /**
293                     * @return the name
294                     */
295                    public String getName() {
296                            return this.name;
297                    }
298                    /**
299                     * @return the typeId
300                     */
301                    public String getTypeId() {
302                            return this.typeId;
303                    }
304            /**
305             * @return the active indicator
306             */
307            public boolean isActive() {
308                return this.active;
309            }
310                    /**
311                     * @return the output
312                     */
313                    public TermSpecificationDefinition.Builder getOutput() {
314                            return this.output;
315                    }
316                    /**
317                     * @return the prerequisites
318                     */
319                    public Set<TermSpecificationDefinition.Builder> getPrerequisites() {
320                            return this.prerequisites;
321                    }
322                    /**
323                     * @return the attributes
324                     */
325                    public Map<String, String> getAttributes() {
326                            return this.attributes;
327                    }
328                    /**
329                     * @return the parameterNames
330                     */
331                    public Set<String> getParameterNames() {
332                            return (parameterNames == null) ? Collections.<String>emptySet() : parameterNames;
333                    }
334                    
335                    /**
336                     * @return the version number
337                     */
338            @Override
339            public Long getVersionNumber() {
340                return this.versionNumber;
341            }
342    
343                    /**
344                     * This overridden method ...
345                     * 
346                     * @see org.kuali.rice.core.api.mo.ModelBuilder#build()
347                     */
348                    @Override
349                    public TermResolverDefinition build() {
350                            return new TermResolverDefinition(this);
351                    }
352                    
353            }
354            
355            /**
356             * @return the id
357             */
358            @Override
359            public String getId() {
360                    return this.id;
361            }
362            
363            /**
364             * @return the namespace
365             */
366            @Override
367            public String getNamespace() {
368                    return this.namespace;
369            }
370            
371            /**
372             * @return the name
373             */
374            @Override
375            public String getName() {
376                    return this.name;
377            }
378            
379            /**
380             * @return the typeId
381             */
382            @Override
383            public String getTypeId() {
384                    return this.typeId;
385            }
386    
387        /**
388         * @return the active indicator
389         */
390        @Override
391        public boolean isActive() {
392            return active;
393        }
394    
395            /**
396             * @return the specification
397             */
398            @Override
399            public TermSpecificationDefinition getOutput() {
400                    return this.output;
401            }
402            
403            /**
404             * @return the prerequisites
405             */
406            @Override
407            public Set<TermSpecificationDefinition> getPrerequisites() {
408                    return this.prerequisites;
409            }
410            /**
411             * @return the attributes
412             */
413            @Override
414            public Map<String, String> getAttributes() {
415                    return this.attributes;
416            }
417    
418            /**
419             * @return the parameterNames
420             */
421            @Override
422            public Set<String> getParameterNames() {
423                    return this.parameterNames;
424            }
425            
426            /**
427             * @see org.kuali.rice.core.api.mo.common.Versioned#getVersionNumber()
428             */
429        @Override
430        public Long getVersionNumber() {
431            return versionNumber;
432        }
433            
434            /**
435             * Defines some internal constants used on this class.
436             */
437            static class Constants {
438                    final static String ROOT_ELEMENT_NAME = "termResolverDefinition";
439                    final static String TYPE_NAME = "termResolverDefinitionType";
440            }
441            
442            static class Elements {
443                    public static final String ID = "id";
444                    public static final String NAMESPACE = "namespace";
445                    public static final String NAME = "name";
446            public static final String TYPE_ID = "typeId";
447                    public static final String OUTPUT = "output";
448                    public static final String PREREQUISITES = "prerequisites";
449                    public static final String ATTRIBUTES = "attributes";
450                    public static final String PARAMETER_NAMES = "parameterNames";
451            public static final String ACTIVE = "active";
452            }
453    
454        public static class Cache {
455            public static final String NAME = KrmsConstants.Namespaces.KRMS_NAMESPACE_2_0 + "/" + TermResolverDefinition.Constants.TYPE_NAME;
456        }
457    }