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.kew.api.rule;
017
018 import java.io.Serializable;
019 import java.util.Collection;
020 import javax.xml.bind.annotation.XmlAccessType;
021 import javax.xml.bind.annotation.XmlAccessorType;
022 import javax.xml.bind.annotation.XmlAnyElement;
023 import javax.xml.bind.annotation.XmlElement;
024 import javax.xml.bind.annotation.XmlRootElement;
025 import javax.xml.bind.annotation.XmlType;
026
027 import org.apache.commons.lang.StringUtils;
028 import org.kuali.rice.core.api.CoreConstants;
029 import org.kuali.rice.core.api.exception.RiceIllegalArgumentException;
030 import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
031 import org.kuali.rice.core.api.mo.ModelBuilder;
032 import org.w3c.dom.Element;
033
034 @XmlRootElement(name = RoleName.Constants.ROOT_ELEMENT_NAME)
035 @XmlAccessorType(XmlAccessType.NONE)
036 @XmlType(name = RoleName.Constants.TYPE_NAME, propOrder = {
037 RoleName.Elements.NAME,
038 RoleName.Elements.BASE_NAME,
039 RoleName.Elements.RETURN_URL,
040 RoleName.Elements.LABEL,
041 CoreConstants.CommonElements.FUTURE_ELEMENTS
042 })
043 public final class RoleName
044 extends AbstractDataTransferObject
045 implements RoleNameContract
046 {
047
048 @XmlElement(name = Elements.NAME, required = true)
049 private final String name;
050 @XmlElement(name = Elements.BASE_NAME, required = true)
051 private final String baseName;
052 @XmlElement(name = Elements.RETURN_URL, required = false)
053 private final String returnUrl;
054 @XmlElement(name = Elements.LABEL, required = true)
055 private final String label;
056 @SuppressWarnings("unused")
057 @XmlAnyElement
058 private final Collection<Element> _futureElements = null;
059
060 /**
061 * Private constructor used only by JAXB.
062 *
063 */
064 private RoleName() {
065 this.name = null;
066 this.baseName = null;
067 this.returnUrl = null;
068 this.label = null;
069 }
070
071 private RoleName(Builder builder) {
072 this.name = builder.getName();
073 this.baseName = builder.getBaseName();
074 this.returnUrl = builder.getReturnUrl();
075 this.label = builder.getLabel();
076 }
077
078 public RoleName(String attributeClassName, String baseName, String label) {
079 this(RoleName.Builder.createWithClassName(attributeClassName, baseName, label));
080 }
081
082 @Override
083 public String getName() {
084 return this.name;
085 }
086
087 @Override
088 public String getBaseName() {
089 return this.baseName;
090 }
091
092 @Override
093 public String getReturnUrl() {
094 return this.returnUrl;
095 }
096
097 @Override
098 public String getLabel() {
099 return this.label;
100 }
101
102 public static String constructRoleValue(String attributeClassName, String roleName) {
103 return attributeClassName + "!" + roleName;
104 }
105
106
107 /**
108 * A builder which can be used to construct {@link RoleName} instances. Enforces the constraints of the {@link RoleNameContract}.
109 *
110 */
111 public final static class Builder
112 implements Serializable, ModelBuilder, RoleNameContract
113 {
114
115 private String name;
116 private String baseName;
117 private String returnUrl;
118 private String label;
119
120 private Builder(String name, String baseName, String label) {
121 setName(name);
122 setBaseName(baseName);
123 setLabel(label);
124 }
125
126 public static Builder createWithClassName(String attributeClassName, String baseName, String label) {
127 return new Builder(constructRoleValue(attributeClassName, baseName), baseName, label);
128 }
129
130 public static Builder create(String name, String baseName, String label) {
131 return new Builder(name, baseName, label);
132 }
133
134 public static Builder create(RoleNameContract contract) {
135 if (contract == null) {
136 throw new IllegalArgumentException("contract was null");
137 }
138 Builder builder = create(contract.getName(), contract.getBaseName(), contract.getLabel());
139 builder.setReturnUrl(contract.getReturnUrl());
140 return builder;
141 }
142
143 public RoleName build() {
144 return new RoleName(this);
145 }
146
147 @Override
148 public String getName() {
149 return this.name;
150 }
151
152 @Override
153 public String getBaseName() {
154 return this.baseName;
155 }
156
157 @Override
158 public String getReturnUrl() {
159 return this.returnUrl;
160 }
161
162 @Override
163 public String getLabel() {
164 return this.label;
165 }
166
167 public void setName(String name) {
168 if (StringUtils.isBlank(name)) {
169 throw new RiceIllegalArgumentException("name is blank");
170 }
171 this.name = name;
172 }
173
174 public void setBaseName(String baseName) {
175 if (StringUtils.isBlank(baseName)) {
176 throw new RiceIllegalArgumentException("baseName is blank");
177 }
178 this.baseName = baseName;
179 }
180
181 public void setReturnUrl(String returnUrl) {
182 this.returnUrl = returnUrl;
183 }
184
185 public void setLabel(String label) {
186 if (StringUtils.isBlank(label)) {
187 throw new RiceIllegalArgumentException("label is blank");
188 }
189 this.label = label;
190 }
191
192 }
193
194
195 /**
196 * Defines some internal constants used on this class.
197 *
198 */
199 static class Constants {
200
201 final static String ROOT_ELEMENT_NAME = "roleName";
202 final static String TYPE_NAME = "RoleNameType";
203
204 }
205
206
207 /**
208 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
209 *
210 */
211 static class Elements {
212
213 final static String NAME = "name";
214 final static String BASE_NAME = "baseName";
215 final static String RETURN_URL = "returnUrl";
216 final static String LABEL = "label";
217
218 }
219
220 }