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.kim.api.role; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.apache.commons.lang.builder.EqualsBuilder; 020 import org.apache.commons.lang.builder.HashCodeBuilder; 021 import org.apache.commons.lang.builder.ToStringBuilder; 022 import org.kuali.rice.core.api.CoreConstants; 023 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 024 import org.kuali.rice.core.api.mo.ModelBuilder; 025 import org.kuali.rice.core.api.mo.ModelObjectComplete; 026 import org.kuali.rice.kim.api.KimConstants; 027 import org.w3c.dom.Element; 028 029 import javax.xml.bind.annotation.XmlAccessType; 030 import javax.xml.bind.annotation.XmlAccessorType; 031 import javax.xml.bind.annotation.XmlAnyElement; 032 import javax.xml.bind.annotation.XmlElement; 033 import javax.xml.bind.annotation.XmlRootElement; 034 import javax.xml.bind.annotation.XmlType; 035 import java.util.Collection; 036 037 038 /** 039 * This is a description of what this class does - shyu don't forget to fill this in. 040 * 041 * @author Kuali Rice Team (rice.collab@kuali.org) 042 */ 043 @XmlRootElement(name = Role.Constants.ROOT_ELEMENT_NAME) 044 @XmlAccessorType(XmlAccessType.NONE) 045 @XmlType(name = Role.Constants.TYPE_NAME, propOrder = { 046 Role.Elements.ID, 047 Role.Elements.NAME, 048 Role.Elements.NAMESPACE_CODE, 049 Role.Elements.DESCRIPTION, 050 Role.Elements.KIM_TYPE_ID, 051 Role.Elements.ACTIVE, 052 CoreConstants.CommonElements.VERSION_NUMBER, 053 CoreConstants.CommonElements.OBJECT_ID, 054 CoreConstants.CommonElements.FUTURE_ELEMENTS 055 }) 056 public final class Role extends AbstractDataTransferObject implements RoleContract { 057 private static final long serialVersionUID = 1L; 058 059 @XmlElement(name = Role.Elements.ID, required = true) 060 private final String id; 061 062 @XmlElement(name = Role.Elements.NAME, required = true) 063 private final String name; 064 065 @XmlElement(name = Role.Elements.NAMESPACE_CODE, required = true) 066 private final String namespaceCode; 067 068 @XmlElement(name = Role.Elements.DESCRIPTION) 069 private final String description; 070 071 @XmlElement(name = Role.Elements.KIM_TYPE_ID, required = true) 072 private final String kimTypeId; 073 074 @XmlElement(name = CoreConstants.CommonElements.ACTIVE, required = true) 075 private final boolean active; 076 077 @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER) 078 private final Long versionNumber; 079 080 @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false) 081 private final String objectId; 082 083 @SuppressWarnings("unused") 084 @XmlAnyElement 085 private final Collection<Element> _futureElements = null; 086 087 088 /** 089 * This constructor should never be called except during JAXB unmarshalling. 090 */ 091 @SuppressWarnings("unused") 092 private Role() { 093 id = null; 094 name = null; 095 namespaceCode = null; 096 description = null; 097 kimTypeId = null; 098 active = false; 099 objectId = null; 100 versionNumber = null; 101 } 102 103 private Role(Builder builder) { 104 id = builder.getId(); 105 name = builder.getName(); 106 namespaceCode = builder.getNamespaceCode(); 107 description = builder.getDescription(); 108 kimTypeId = builder.getKimTypeId(); 109 active = builder.isActive(); 110 versionNumber = builder.getVersionNumber(); 111 objectId = builder.getObjectId(); 112 } 113 114 115 /** 116 * Unique identifier for this role. 117 */ 118 @Override 119 public String getId() { 120 return id; 121 } 122 123 /** 124 * Namespace for this role - identifies the system/module to which this role applies 125 */ 126 @Override 127 public String getNamespaceCode() { 128 return namespaceCode; 129 } 130 131 /** 132 * Name for this role. This value will be seen by the users. 133 */ 134 @Override 135 public String getName() { 136 return name; 137 } 138 139 /** 140 * Verbose description of the role and functionally what permissions it implies. 141 */ 142 @Override 143 public String getDescription() { 144 return description; 145 } 146 147 /** 148 * Type identifier for this role. This will control what additional attributes are available 149 */ 150 @Override 151 public String getKimTypeId() { 152 return kimTypeId; 153 } 154 155 @Override 156 public Long getVersionNumber() { 157 return versionNumber; 158 } 159 160 @Override 161 public String getObjectId() { 162 return objectId; 163 } 164 165 @Override 166 public boolean isActive() { 167 return active; 168 } 169 170 public static final class Builder implements RoleContract, ModelBuilder, ModelObjectComplete { 171 172 private String id; 173 private String name; 174 private String namespaceCode; 175 private String description; 176 private String kimTypeId; 177 private boolean active; 178 private Long versionNumber; 179 private String objectId; 180 181 private Builder() { 182 } 183 184 public static Builder create() { 185 return new Builder(); 186 } 187 188 public static Builder create(String id, String name, String namespaceCode, String description, String kimTypeId) { 189 Builder b = new Builder(); 190 b.setId(id); 191 b.setName(name); 192 b.setNamespaceCode(namespaceCode); 193 b.setDescription(description); 194 b.setKimTypeId(kimTypeId); 195 b.setActive(true); 196 197 return b; 198 } 199 200 public static Builder create(RoleContract roleContract) { 201 Builder b = new Builder(); 202 b.setId(roleContract.getId()); 203 b.setName(roleContract.getName()); 204 b.setNamespaceCode(roleContract.getNamespaceCode()); 205 b.setDescription(roleContract.getDescription()); 206 b.setKimTypeId(roleContract.getKimTypeId()); 207 b.setActive(roleContract.isActive()); 208 b.setVersionNumber(roleContract.getVersionNumber()); 209 b.setObjectId(roleContract.getObjectId()); 210 return b; 211 } 212 213 @Override 214 public Role build() { 215 return new Role(this); 216 } 217 218 public void setId(String id) { 219 if (StringUtils.isWhitespace(id)) { 220 throw new IllegalArgumentException("id cannot be blank"); 221 } 222 this.id = id; 223 } 224 225 @Override 226 public String getId() { 227 return id; 228 } 229 230 public void setNamespaceCode(String namespaceCode) { 231 if (StringUtils.isBlank(namespaceCode)) { 232 throw new IllegalArgumentException("namespaceCode cannot be blank or null"); 233 } 234 this.namespaceCode = namespaceCode; 235 } 236 237 @Override 238 public String getNamespaceCode() { 239 return namespaceCode; 240 } 241 242 public void setName(String name) { 243 if (StringUtils.isBlank(name)) { 244 throw new IllegalArgumentException("name cannot be blank or null"); 245 } 246 this.name = name; 247 } 248 249 @Override 250 public String getName() { 251 return name; 252 } 253 254 public void setDescription(String description) { 255 this.description = description; 256 } 257 258 @Override 259 public String getDescription() { 260 return description; 261 } 262 263 public void setKimTypeId(String kimTypeId) { 264 if (StringUtils.isBlank(kimTypeId)) { 265 throw new IllegalArgumentException("kimTypeId cannot be blank or null"); 266 } 267 this.kimTypeId = kimTypeId; 268 } 269 270 @Override 271 public String getKimTypeId() { 272 return kimTypeId; 273 } 274 275 public void setActive(boolean active) { 276 this.active = active; 277 } 278 279 @Override 280 public boolean isActive() { 281 return active; 282 } 283 284 public void setVersionNumber(Long versionNumber) { 285 this.versionNumber = versionNumber; 286 } 287 288 @Override 289 public Long getVersionNumber() { 290 return versionNumber; 291 } 292 293 public void setObjectId(String objectId) { 294 this.objectId = objectId; 295 } 296 297 @Override 298 public String getObjectId() { 299 return objectId; 300 } 301 302 @Override 303 public int hashCode() { 304 return HashCodeBuilder.reflectionHashCode(this); 305 } 306 307 @Override 308 public boolean equals(Object obj) { 309 return EqualsBuilder.reflectionEquals(obj, this); 310 } 311 312 @Override 313 public String toString() { 314 return ToStringBuilder.reflectionToString(this); 315 } 316 } 317 318 /** 319 * A private class which exposes constants which define the XML element names to use 320 * when this object is marshalled to XML. 321 */ 322 static class Elements { 323 final static String ID = "id"; 324 final static String NAME = "name"; 325 final static String DESCRIPTION = "description"; 326 final static String KIM_TYPE_ID = "kimTypeId"; 327 final static String NAMESPACE_CODE = "namespaceCode"; 328 final static String ACTIVE = "active"; 329 } 330 331 /** 332 * Defines some internal constants used on this class. 333 */ 334 static class Constants { 335 final static String ROOT_ELEMENT_NAME = "role"; 336 final static String TYPE_NAME = "RoleType"; 337 } 338 339 public static class Cache { 340 public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + Role.Constants.TYPE_NAME; 341 } 342 }