001/** 002 * Copyright 2005-2017 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 */ 016package org.kuali.rice.kim.api.common.delegate; 017 018import org.apache.commons.collections.CollectionUtils; 019import org.apache.commons.lang.StringUtils; 020import org.apache.commons.lang.builder.EqualsBuilder; 021import org.apache.commons.lang.builder.HashCodeBuilder; 022import org.apache.commons.lang.builder.ToStringBuilder; 023import org.kuali.rice.core.api.CoreConstants; 024import org.kuali.rice.core.api.delegation.DelegationType; 025import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 026import org.kuali.rice.core.api.mo.ModelBuilder; 027import org.kuali.rice.core.api.mo.ModelObjectComplete; 028import org.kuali.rice.kim.api.KimConstants; 029import org.w3c.dom.Element; 030 031import javax.xml.bind.annotation.XmlAccessType; 032import javax.xml.bind.annotation.XmlAccessorType; 033import javax.xml.bind.annotation.XmlAnyElement; 034import javax.xml.bind.annotation.XmlElement; 035import javax.xml.bind.annotation.XmlElementWrapper; 036import javax.xml.bind.annotation.XmlRootElement; 037import javax.xml.bind.annotation.XmlType; 038import java.util.ArrayList; 039import java.util.Collection; 040import java.util.Collections; 041import java.util.List; 042 043 044@XmlRootElement(name = DelegateType.Constants.ROOT_ELEMENT_NAME) 045@XmlAccessorType(XmlAccessType.NONE) 046@XmlType(name = DelegateType.Constants.TYPE_NAME, propOrder = { 047 DelegateType.Elements.ROLE_ID, 048 DelegateType.Elements.DELEGATION_ID, 049 DelegateType.Elements.DELEGATION_TYPE_CODE, 050 DelegateType.Elements.KIM_TYPE_ID, 051 DelegateType.Elements.MEMBERS, 052 DelegateType.Elements.ACTIVE, 053 CoreConstants.CommonElements.FUTURE_ELEMENTS 054}) 055public final class DelegateType extends AbstractDataTransferObject implements DelegateTypeContract { 056 057 private static final long serialVersionUID = 1L; 058 059 @XmlElement(name = Elements.ROLE_ID) 060 private final String roleId; 061 062 @XmlElement(name = Elements.DELEGATION_ID, required = false) 063 private final String delegationId; 064 065 @XmlElement(name = Elements.DELEGATION_TYPE_CODE) 066 private final String delegationTypeCode; 067 068 @XmlElement(name = Elements.KIM_TYPE_ID) 069 private final String kimTypeId; 070 071 @XmlElementWrapper(name = Elements.MEMBERS, required = false) 072 @XmlElement(name = Elements.MEMBER) 073 private final List<DelegateMember> members; 074 075 @XmlElement(name = Elements.ACTIVE) 076 private final boolean active; 077 078 @SuppressWarnings("unused") 079 @XmlAnyElement 080 private final Collection<Element> _futureElements = null; 081 082 /** 083 * Default constructor invoked by JAXB only 084 */ 085 @SuppressWarnings("unused") 086 private DelegateType() { 087 roleId = null; 088 delegationId = null; 089 delegationTypeCode = null; 090 kimTypeId = null; 091 members = null; 092 active = false; 093 } 094 095 private DelegateType(Builder b) { 096 roleId = b.getRoleId(); 097 delegationId = b.getDelegationId(); 098 delegationTypeCode = b.getDelegationType() != null ? b.getDelegationType().getCode() : null; 099 kimTypeId = b.getKimTypeId(); 100 active = b.isActive(); 101 102 List<DelegateMember> delegateMembers = new ArrayList<DelegateMember>(); 103 if (!CollectionUtils.isEmpty(b.getMembers())) { 104 for (DelegateMember.Builder delgateBuilder : b.getMembers()) { 105 delegateMembers.add(delgateBuilder.build()); 106 } 107 } 108 members = delegateMembers; 109 } 110 111 @Override 112 public String getKimTypeId() { 113 return this.kimTypeId; 114 } 115 116 @Override 117 public boolean isActive() { 118 return this.active; 119 } 120 121 @Override 122 public DelegationType getDelegationType() { 123 return DelegationType.fromCode(this.delegationTypeCode); 124 } 125 126 @Override 127 public String getDelegationId() { 128 return this.delegationId; 129 } 130 131 @Override 132 public String getRoleId() { 133 return this.roleId; 134 } 135 136 @Override 137 public List<DelegateMember> getMembers() { 138 return Collections.unmodifiableList(this.members); 139 } 140 141 public static final class Builder implements DelegateTypeContract, ModelBuilder, ModelObjectComplete { 142 private String roleId; 143 private String delegationId; 144 private DelegationType delegationType; 145 private String kimTypeId; 146 private List<DelegateMember.Builder> members; 147 private boolean active; 148 149 public static Builder create(DelegateTypeContract dtc) { 150 Builder b = new Builder(); 151 b.setRoleId(dtc.getRoleId()); 152 b.setDelegationId(dtc.getDelegationId()); 153 b.setDelegationType(dtc.getDelegationType()); 154 b.setActive(dtc.isActive()); 155 b.setKimTypeId(dtc.getKimTypeId()); 156 157 ArrayList<DelegateMember.Builder> delegateBuilders = new ArrayList<DelegateMember.Builder>(); 158 for (DelegateMemberContract delegate : dtc.getMembers()) { 159 delegateBuilders.add(DelegateMember.Builder.create(delegate)); 160 } 161 b.setMembers(delegateBuilders); 162 163 return b; 164 } 165 166 public static Builder create(String roleId, DelegationType delegationType, List<DelegateMember.Builder> members) { 167 Builder b = new Builder(); 168 b.setRoleId(roleId); 169 b.setDelegationType(delegationType); 170 b.setMembers(members); 171 b.setActive(true); 172 173 return b; 174 } 175 176 @Override 177 public DelegateType build() { 178 return new DelegateType(this); 179 } 180 181 @Override 182 public String getRoleId() { 183 return roleId; 184 } 185 186 public void setRoleId(String roleId) { 187 if (StringUtils.isBlank(roleId)) { 188 throw new IllegalArgumentException("roleId cannot be null or blank"); 189 } 190 this.roleId = roleId; 191 } 192 193 @Override 194 public String getDelegationId() { 195 return delegationId; 196 } 197 198 public void setDelegationId(String delegationId) { 199 this.delegationId = delegationId; 200 } 201 202 @Override 203 public DelegationType getDelegationType() { 204 return delegationType; 205 } 206 207 public void setDelegationType(DelegationType delegationType) { 208 if (delegationType == null) { 209 throw new IllegalArgumentException("delegationTypeCode cannot be null"); 210 } 211 this.delegationType = delegationType; 212 } 213 214 @Override 215 public String getKimTypeId() { 216 return kimTypeId; 217 } 218 219 public void setKimTypeId(String kimTypeId) { 220 this.kimTypeId = kimTypeId; 221 } 222 223 @Override 224 public List<DelegateMember.Builder> getMembers() { 225 return members; 226 } 227 228 public void setMembers(List<DelegateMember.Builder> members) { 229 this.members = members; 230 } 231 232 @Override 233 public boolean isActive() { 234 return active; 235 } 236 237 public void setActive(Boolean active) { 238 this.active = active; 239 } 240 241 @Override 242 public int hashCode() { 243 return HashCodeBuilder.reflectionHashCode(this); 244 } 245 246 @Override 247 public boolean equals(Object obj) { 248 return EqualsBuilder.reflectionEquals(obj, this); 249 } 250 251 @Override 252 public String toString() { 253 return ToStringBuilder.reflectionToString(this); 254 } 255 } 256 257 258 /** 259 * A private class which exposes constants which define the XML element names to use 260 * when this object is marshalled to XML. 261 */ 262 static class Elements { 263 static final String ROLE_ID = "roleId"; 264 static final String DELEGATION_ID = "delegationId"; 265 static final String DELEGATION_TYPE_CODE = "delegationTypeCode"; 266 static final String KIM_TYPE_ID = "kimTypeId"; 267 static final String MEMBERS = "members"; 268 static final String MEMBER = "member"; 269 static final String ACTIVE = "active"; 270 } 271 272 /** 273 * Defines some internal constants used on this class. 274 */ 275 static class Constants { 276 final static String ROOT_ELEMENT_NAME = "delegateType"; 277 final static String TYPE_NAME = "DelegateTypeType"; 278 } 279 280 public static class Cache { 281 public static final String NAME = KimConstants.Namespaces.KIM_NAMESPACE_2_0 + "/" + DelegateType.Constants.TYPE_NAME; 282 } 283}