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 }