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 /* 017 * To change this template, choose Tools | Templates 018 * and open the template in the editor. 019 */ 020 package org.kuali.rice.krms.api.repository; 021 022 import java.io.Serializable; 023 import java.util.ArrayList; 024 import java.util.Collection; 025 import java.util.Collections; 026 import java.util.List; 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.XmlRootElement; 032 import javax.xml.bind.annotation.XmlType; 033 import org.kuali.rice.core.api.CoreConstants; 034 import org.kuali.rice.core.api.mo.ModelBuilder; 035 import org.kuali.rice.krms.api.KrmsConstants; 036 037 /** 038 * Concrete model object implementation of a natural language tree immutable. 039 * Instances of natural language tree can be (un)marshalled to and from XML. 040 * 041 * @see NaturalLanguageTreeContract 042 */ 043 @XmlRootElement(name = NaturalLanguageTree.Constants.ROOT_ELEMENT_NAME) 044 @XmlAccessorType(XmlAccessType.NONE) 045 @XmlType(name = NaturalLanguageTree.Constants.TYPE_NAME, propOrder = { 046 NaturalLanguageTree.Elements.NATURAL_LANGUAGE, 047 NaturalLanguageTree.Elements.CHILDREN, 048 CoreConstants.CommonElements.FUTURE_ELEMENTS 049 }) 050 public class NaturalLanguageTree implements NaturalLanguageTreeContract { 051 052 private static final long serialVersionUID = 2783959459503209577L; 053 @XmlElement(name = NaturalLanguageTree.Elements.NATURAL_LANGUAGE, required = false) 054 private String naturalLanguage; 055 @XmlElement(name = NaturalLanguageTree.Elements.CHILDREN, required = false) 056 private List<NaturalLanguageTree> children; 057 @SuppressWarnings("unused") 058 @XmlAnyElement 059 private final Collection<org.w3c.dom.Element> _futureElements = null; 060 061 /** 062 * This constructor should never be called. It is only present for use 063 * during JAXB unmarshalling. 064 */ 065 public NaturalLanguageTree() { 066 this.naturalLanguage = null; 067 this.children = null; 068 } 069 070 @Override 071 public String getNaturalLanguage() { 072 return naturalLanguage; 073 } 074 075 @Override 076 public List<NaturalLanguageTree> getChildren() { 077 return children; 078 } 079 080 /** 081 * Constructs a KRMS Repository Agenda object from the given builder. This 082 * constructor is private and should only ever be invoked from the builder. 083 * 084 * @param builder the Builder from which to construct the Agenda 085 */ 086 private NaturalLanguageTree(Builder builder) { 087 this.naturalLanguage = builder.getNaturalLanguage(); 088 List<NaturalLanguageTree> list = null; 089 if (builder.getChildren() != null) { 090 list = new ArrayList<NaturalLanguageTree>(builder.getChildren().size()); 091 for (NaturalLanguageTreeContract nltree : builder.getChildren()) { 092 list.add(Builder.create(nltree).build()); 093 } 094 this.children = Collections.unmodifiableList(list); 095 } 096 } 097 098 /** 099 * This builder is used to construct instances of KRMS Repository Agenda. It 100 * enforces the constraints of the {@link NaturalLanguageTreeContract}. 101 */ 102 public static class Builder implements NaturalLanguageTreeContract, ModelBuilder, Serializable { 103 104 private static final long serialVersionUID = -8862851720709537839L; 105 private String naturalLanguage; 106 private List<? extends NaturalLanguageTreeContract> children; 107 108 /** 109 * Private constructor for creating a builder with all of it's required 110 * attributes. 111 */ 112 private Builder() { 113 } 114 115 /** 116 * Private constructor for creating a builder with all of it's required 117 * attributes. 118 */ 119 private Builder(String naturalLanguage, List<? extends NaturalLanguageTreeContract> children) { 120 setNaturalLanguage(naturalLanguage); 121 setChildren(children); 122 } 123 124 @Override 125 public String getNaturalLanguage() { 126 return naturalLanguage; 127 } 128 129 public void setNaturalLanguage(String naturalLanguage) { 130 this.naturalLanguage = naturalLanguage; 131 } 132 133 @Override 134 public List<? extends NaturalLanguageTreeContract> getChildren() { 135 return children; 136 } 137 138 public void setChildren(List<? extends NaturalLanguageTreeContract> children) { 139 this.children = children; 140 } 141 142 143 /** 144 * Creates a builder by populating it with data from the given 145 * {@link NaturalLanguageTreeContract}. 146 * 147 * @param contract the contract from which to populate this builder 148 * @return an instance of the builder populated with data from the 149 * contract 150 * @throws IllegalArgumentException if the contract is null 151 */ 152 public static NaturalLanguageTree.Builder create() { 153 NaturalLanguageTree.Builder builder = new NaturalLanguageTree.Builder(); 154 return builder; 155 } 156 /** 157 * Creates a builder by populating it with data from the given 158 * {@link NaturalLanguageTreeContract}. 159 * 160 * @param contract the contract from which to populate this builder 161 * @return an instance of the builder populated with data from the 162 * contract 163 * @throws IllegalArgumentException if the contract is null 164 */ 165 public static NaturalLanguageTree.Builder create(NaturalLanguageTreeContract contract) { 166 if (contract == null) { 167 throw new IllegalArgumentException("contract is null"); 168 } 169 NaturalLanguageTree.Builder builder = new NaturalLanguageTree.Builder(contract.getNaturalLanguage(), contract.getChildren()); 170 171 return builder; 172 } 173 174 /** 175 * Builds an instance of a Natural Language Tree based on the current state of the 176 * builder. 177 * 178 * @return the fully-constructed Agenda 179 */ 180 @Override 181 public NaturalLanguageTree build() { 182 return new NaturalLanguageTree(this); 183 } 184 } 185 186 /** 187 * Defines some constants used on this class. 188 */ 189 public static class Constants { 190 191 final static String ROOT_ELEMENT_NAME = "naturalLanguageTree"; 192 final static String TYPE_NAME = "NaturalLanguageTreeType"; 193 final static String[] HASH_CODE_EQUALS_EXCLUDE = {"_futureElements"}; 194 public final static String EVENT = "Event"; // key for event attribute 195 } 196 197 /** 198 * A private class which exposes constants which define the XML element 199 * names to use when this object is marshalled to XML. 200 */ 201 public static class Elements { 202 203 final static String NATURAL_LANGUAGE = "naturalLanguage"; 204 final static String CHILDREN = "children"; 205 } 206 207 public static class Cache { 208 209 public static final String NAME = KrmsConstants.Namespaces.KRMS_NAMESPACE_2_0 + "/" + NaturalLanguageTree.Constants.TYPE_NAME; 210 } 211 }