001    /**
002     * Copyright 2005-2012 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.responsibility;
017    
018    import com.google.common.collect.Maps;
019    import org.apache.commons.lang.StringUtils;
020    import org.kuali.rice.core.api.CoreConstants;
021    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
022    import org.kuali.rice.core.api.mo.ModelBuilder;
023    import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter;
024    import org.kuali.rice.kim.api.common.delegate.DelegateType;
025    import org.kuali.rice.kim.api.common.delegate.DelegateTypeContract;
026    import org.w3c.dom.Element;
027    
028    import javax.xml.bind.annotation.XmlAccessType;
029    import javax.xml.bind.annotation.XmlAccessorType;
030    import javax.xml.bind.annotation.XmlAnyElement;
031    import javax.xml.bind.annotation.XmlElement;
032    import javax.xml.bind.annotation.XmlElementWrapper;
033    import javax.xml.bind.annotation.XmlRootElement;
034    import javax.xml.bind.annotation.XmlType;
035    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
036    import java.io.Serializable;
037    import java.util.ArrayList;
038    import java.util.Collection;
039    import java.util.Collections;
040    import java.util.List;
041    import java.util.Map;
042    
043    @XmlRootElement(name = ResponsibilityAction.Constants.ROOT_ELEMENT_NAME)
044    @XmlAccessorType(XmlAccessType.NONE)
045    @XmlType(name = ResponsibilityAction.Constants.TYPE_NAME, propOrder = {
046            ResponsibilityAction.Elements.PRINCIPAL_ID,
047            ResponsibilityAction.Elements.ROLE_RESPONSIBILITY_ACTION_ID,
048            ResponsibilityAction.Elements.PARALLEL_ROUTING_GROUPING_CODE,
049            ResponsibilityAction.Elements.ACTION_TYPE_CODE,
050            ResponsibilityAction.Elements.ACTION_POLICY_CODE,
051            ResponsibilityAction.Elements.PRIORITY_NUMBER,
052            ResponsibilityAction.Elements.GROUP_ID,
053            ResponsibilityAction.Elements.MEMBER_ROLE_ID,
054            ResponsibilityAction.Elements.RESPONSIBILITY_NAME,
055            ResponsibilityAction.Elements.RESPONSIBILITY_ID,
056            ResponsibilityAction.Elements.RESPONSIBILITY_NAMESPACE_CODE,
057            ResponsibilityAction.Elements.FORCE_ACTION,
058            ResponsibilityAction.Elements.QUALIFIER,
059            ResponsibilityAction.Elements.DELEGATES,
060            ResponsibilityAction.Elements.ROLE_ID,
061            CoreConstants.CommonElements.FUTURE_ELEMENTS
062    })
063    public final class ResponsibilityAction extends AbstractDataTransferObject
064            implements ResponsibilityActionContract {
065    
066        @XmlElement(name = Elements.PRINCIPAL_ID, required = false)
067        private final String principalId;
068    
069        @XmlElement(name = Elements.ROLE_RESPONSIBILITY_ACTION_ID, required = false)
070        private final String roleResponsibilityActionId;
071    
072        @XmlElement(name = Elements.PARALLEL_ROUTING_GROUPING_CODE, required = false)
073        private final String parallelRoutingGroupingCode;
074    
075        @XmlElement(name = Elements.ACTION_TYPE_CODE, required = false)
076        private final String actionTypeCode;
077    
078        @XmlElement(name = Elements.ACTION_POLICY_CODE, required = false)
079        private final String actionPolicyCode;
080    
081        @XmlElement(name = Elements.PRIORITY_NUMBER, required = false)
082        private final Integer priorityNumber;
083    
084        @XmlElement(name = Elements.GROUP_ID, required = true)
085        private final String groupId;
086    
087        @XmlElement(name = Elements.MEMBER_ROLE_ID, required = true)
088        private final String memberRoleId;
089    
090        @XmlElement(name = Elements.RESPONSIBILITY_NAME, required = true)
091        private final String responsibilityName;
092    
093        @XmlElement(name = Elements.RESPONSIBILITY_ID, required = true)
094        private final String responsibilityId;
095    
096        @XmlElement(name = Elements.RESPONSIBILITY_NAMESPACE_CODE, required = true)
097        private final String responsibilityNamespaceCode;
098    
099        @XmlElement(name = Elements.FORCE_ACTION, required = true)
100        private final boolean forceAction;
101    
102        @XmlElement(name = Elements.QUALIFIER, required = true)
103        @XmlJavaTypeAdapter(value = MapStringStringAdapter.class)
104        private final Map<String, String> qualifier;
105    
106        @XmlElementWrapper(name = Elements.DELEGATES, required = false)
107        @XmlElement(name = Elements.DELEGATE, required = true)
108        private final List<DelegateType> delegates;
109    
110        @XmlElement(name = Elements.ROLE_ID, required = true)
111        private final String roleId;
112    
113        @SuppressWarnings("unused")
114        @XmlAnyElement
115        private final Collection<Element> _futureElements = null;
116    
117        /**
118         * Private constructor used only by JAXB.
119         */
120        private ResponsibilityAction() {
121            this.principalId = null;
122            this.roleResponsibilityActionId = null;
123            this.parallelRoutingGroupingCode = null;
124            this.actionTypeCode = null;
125            this.actionPolicyCode = null;
126            this.priorityNumber = null;
127            this.groupId = null;
128            this.memberRoleId = null;
129            this.responsibilityName = null;
130            this.responsibilityId = null;
131            this.responsibilityNamespaceCode = null;
132            this.forceAction = false;
133            this.qualifier = null;
134            this.delegates = null;
135            this.roleId = null;
136        }
137    
138        private ResponsibilityAction(Builder builder) {
139            this.principalId = builder.getPrincipalId();
140            this.roleResponsibilityActionId = builder.getRoleResponsibilityActionId();
141            this.parallelRoutingGroupingCode = builder.getParallelRoutingGroupingCode();
142            this.actionTypeCode = builder.getActionTypeCode();
143            this.actionPolicyCode = builder.getActionPolicyCode();
144            this.priorityNumber = builder.getPriorityNumber();
145            this.groupId = builder.getGroupId();
146            this.memberRoleId = builder.getMemberRoleId();
147            this.responsibilityName = builder.getResponsibilityName();
148            this.responsibilityId = builder.getResponsibilityId();
149            this.responsibilityNamespaceCode = builder.getResponsibilityNamespaceCode();
150            this.forceAction = builder.isForceAction();
151            this.qualifier = builder.getQualifier();
152            final List<DelegateType> ds = new ArrayList<DelegateType>();
153            for (DelegateType.Builder d : builder.getDelegates()) {
154                if (d != null) {
155                    ds.add(d.build());
156                }
157            }
158            this.delegates = ds;
159            this.roleId = builder.getRoleId();
160        }
161    
162        @Override
163        public String getPrincipalId() {
164            return this.principalId;
165        }
166    
167        @Override
168        public String getRoleResponsibilityActionId() {
169            return this.roleResponsibilityActionId;
170        }
171    
172        @Override
173        public String getParallelRoutingGroupingCode() {
174            return this.parallelRoutingGroupingCode;
175        }
176    
177        @Override
178        public String getActionTypeCode() {
179            return this.actionTypeCode;
180        }
181    
182        @Override
183        public String getActionPolicyCode() {
184            return this.actionPolicyCode;
185        }
186    
187        @Override
188        public Integer getPriorityNumber() {
189            return this.priorityNumber;
190        }
191    
192        @Override
193        public String getGroupId() {
194            return this.groupId;
195        }
196    
197        @Override
198        public String getMemberRoleId() {
199            return this.memberRoleId;
200        }
201    
202        @Override
203        public String getResponsibilityName() {
204            return this.responsibilityName;
205        }
206    
207        @Override
208        public String getResponsibilityId() {
209            return this.responsibilityId;
210        }
211    
212        @Override
213        public String getResponsibilityNamespaceCode() {
214            return this.responsibilityNamespaceCode;
215        }
216    
217        @Override
218        public boolean isForceAction() {
219            return this.forceAction;
220        }
221    
222        @Override
223        public Map<String, String> getQualifier() {
224            return this.qualifier;
225        }
226    
227        @Override
228        public List<DelegateType> getDelegates() {
229            return Collections.unmodifiableList(this.delegates);
230        }
231    
232        @Override
233        public String getRoleId() {
234            return this.roleId;
235        }
236    
237    
238        /**
239         * A builder which can be used to construct {@link ResponsibilityAction} instances.  Enforces the constraints of the {@link ResponsibilityActionContract}.
240         */
241        public final static class Builder
242                implements Serializable, ModelBuilder, ResponsibilityActionContract {
243    
244            private String principalId;
245            private String roleResponsibilityActionId;
246            private String parallelRoutingGroupingCode;
247            private String actionTypeCode;
248            private String actionPolicyCode;
249            private Integer priorityNumber;
250            private String groupId;
251            private String memberRoleId;
252            private String responsibilityName;
253            private String responsibilityId;
254            private String responsibilityNamespaceCode;
255            private boolean forceAction;
256            private Map<String, String> qualifier;
257            private List<DelegateType.Builder> delegates;
258            private String roleId;
259    
260            private Builder() {
261            }
262    
263            /**
264             * All required fields are enforced in the {@link org.kuali.rice.kim.api.responsibility.ResponsibilityAction.Builder#build()}
265             * method.  Please see {@link ResponsibilityActionContract} to see what fields are required.
266             *
267             * @return a new builder, not yet in a valid state
268             */
269            public static Builder create() {
270                //there is a lot of required fields - require fields are enforced at build time
271                return new Builder();
272            }
273    
274            public static Builder create(ResponsibilityActionContract contract) {
275                if (contract == null) {
276                    throw new IllegalArgumentException("contract was null");
277                }
278                Builder builder = create();
279                builder.setPrincipalId(contract.getPrincipalId());
280                builder.setRoleResponsibilityActionId(contract.getRoleResponsibilityActionId());
281                builder.setParallelRoutingGroupingCode(contract.getParallelRoutingGroupingCode());
282                builder.setActionTypeCode(contract.getActionTypeCode());
283                builder.setActionPolicyCode(contract.getActionPolicyCode());
284                builder.setPriorityNumber(contract.getPriorityNumber());
285                builder.setGroupId(contract.getGroupId());
286                builder.setMemberRoleId(contract.getMemberRoleId());
287                builder.setResponsibilityName(contract.getResponsibilityName());
288                builder.setResponsibilityId(contract.getResponsibilityId());
289                builder.setResponsibilityNamespaceCode(contract.getResponsibilityNamespaceCode());
290                builder.setForceAction(contract.isForceAction());
291                builder.setQualifier(contract.getQualifier());
292                final List<DelegateType.Builder> dbs = new ArrayList<DelegateType.Builder>();
293                for (DelegateTypeContract d : contract.getDelegates()) {
294                    if (d != null) {
295                        dbs.add(DelegateType.Builder.create(d));
296                    }
297                }
298                builder.setDelegates(dbs);
299                builder.setRoleId(contract.getRoleId());
300                return builder;
301            }
302    
303            public ResponsibilityAction build() {
304                //validate required fields
305                final boolean requiredSet = (groupId != null ^ principalId != null) &&
306                                memberRoleId != null &&
307                                responsibilityName != null &&
308                                responsibilityId != null &&
309                                responsibilityNamespaceCode != null &&
310                                delegates != null &&
311                                roleId != null;
312    
313                if (!requiredSet) {
314                    throw new IllegalStateException("all the required fields are not set");
315                }
316                return new ResponsibilityAction(this);
317            }
318    
319            @Override
320            public String getPrincipalId() {
321                return this.principalId;
322            }
323    
324            @Override
325            public String getRoleResponsibilityActionId() {
326                return this.roleResponsibilityActionId;
327            }
328    
329            @Override
330            public String getParallelRoutingGroupingCode() {
331                return this.parallelRoutingGroupingCode;
332            }
333    
334            @Override
335            public String getActionTypeCode() {
336                return this.actionTypeCode;
337            }
338    
339            @Override
340            public String getActionPolicyCode() {
341                return this.actionPolicyCode;
342            }
343    
344            @Override
345            public Integer getPriorityNumber() {
346                return this.priorityNumber;
347            }
348    
349            @Override
350            public String getGroupId() {
351                return this.groupId;
352            }
353    
354            @Override
355            public String getMemberRoleId() {
356                return this.memberRoleId;
357            }
358    
359            @Override
360            public String getResponsibilityName() {
361                return this.responsibilityName;
362            }
363    
364            @Override
365            public String getResponsibilityId() {
366                return this.responsibilityId;
367            }
368    
369            @Override
370            public String getResponsibilityNamespaceCode() {
371                return this.responsibilityNamespaceCode;
372            }
373    
374            @Override
375            public boolean isForceAction() {
376                return this.forceAction;
377            }
378    
379            @Override
380            public Map<String, String> getQualifier() {
381                return this.qualifier;
382            }
383    
384            @Override
385            public List<DelegateType.Builder> getDelegates() {
386                return Collections.unmodifiableList(this.delegates);
387            }
388    
389            @Override
390            public String getRoleId() {
391                return this.roleId;
392            }
393    
394            public void setPrincipalId(String principalId) {
395                this.principalId = principalId;
396            }
397    
398            public void setRoleResponsibilityActionId(String roleResponsibilityActionId) {
399                this.roleResponsibilityActionId = roleResponsibilityActionId;
400            }
401    
402            public void setParallelRoutingGroupingCode(String parallelRoutingGroupingCode) {
403                this.parallelRoutingGroupingCode = parallelRoutingGroupingCode;
404            }
405    
406            public void setActionTypeCode(String actionTypeCode) {
407                this.actionTypeCode = actionTypeCode;
408            }
409    
410            public void setActionPolicyCode(String actionPolicyCode) {
411                this.actionPolicyCode = actionPolicyCode;
412            }
413    
414            public void setPriorityNumber(Integer priorityNumber) {
415                this.priorityNumber = priorityNumber;
416            }
417    
418            public void setGroupId(String groupId) {
419                this.groupId = groupId;
420            }
421    
422            public void setMemberRoleId(String memberRoleId) {
423                if (StringUtils.isBlank(memberRoleId)) {
424                    throw new IllegalArgumentException("memberRoleId is blank");
425                }
426    
427                this.memberRoleId = memberRoleId;
428            }
429    
430            public void setResponsibilityName(String responsibilityName) {
431                if (StringUtils.isBlank(responsibilityName)) {
432                    throw new IllegalArgumentException("responsibilityName is blank");
433                }
434    
435                this.responsibilityName = responsibilityName;
436            }
437    
438            public void setResponsibilityId(String responsibilityId) {
439                if (StringUtils.isBlank(responsibilityId)) {
440                    throw new IllegalArgumentException("responsibilityId is blank");
441                }
442    
443                this.responsibilityId = responsibilityId;
444            }
445    
446            public void setResponsibilityNamespaceCode(String responsibilityNamespaceCode) {
447                if (StringUtils.isBlank(responsibilityNamespaceCode)) {
448                    throw new IllegalArgumentException("responsibilityNamespaceCode is blank");
449                }
450                this.responsibilityNamespaceCode = responsibilityNamespaceCode;
451            }
452    
453            public void setForceAction(boolean forceAction) {
454                this.forceAction = forceAction;
455            }
456    
457            public void setQualifier(Map<String, String> qualifier) {
458                this.qualifier = (qualifier != null) ? Collections.unmodifiableMap(Maps.newHashMap(qualifier)) : qualifier;
459            }
460    
461            public void setDelegates(List<DelegateType.Builder> delegates) {
462                if (delegates == null) {
463                    throw new IllegalArgumentException("delegates is null");
464                }
465                this.delegates = new ArrayList<DelegateType.Builder>(delegates);
466            }
467    
468            public void setRoleId(String roleId) {
469                if (StringUtils.isBlank(roleId)) {
470                    throw new IllegalArgumentException("roleId is blank");
471                }
472                this.roleId = roleId;
473            }
474    
475        }
476    
477    
478        /**
479         * Defines some internal constants used on this class.
480         */
481        static class Constants {
482    
483            final static String ROOT_ELEMENT_NAME = "responsibilityAction";
484            final static String TYPE_NAME = "ResponsibilityActionType";
485        }
486    
487    
488        /**
489         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
490         */
491        static class Elements {
492    
493            final static String PRINCIPAL_ID = "principalId";
494            final static String ROLE_RESPONSIBILITY_ACTION_ID = "roleResponsibilityActionId";
495            final static String PARALLEL_ROUTING_GROUPING_CODE = "parallelRoutingGroupingCode";
496            final static String ACTION_TYPE_CODE = "actionTypeCode";
497            final static String ACTION_POLICY_CODE = "actionPolicyCode";
498            final static String PRIORITY_NUMBER = "priorityNumber";
499            final static String GROUP_ID = "groupId";
500            final static String MEMBER_ROLE_ID = "memberRoleId";
501            final static String RESPONSIBILITY_NAME = "responsibilityName";
502            final static String RESPONSIBILITY_ID = "responsibilityId";
503            final static String RESPONSIBILITY_NAMESPACE_CODE = "responsibilityNamespaceCode";
504            final static String FORCE_ACTION = "forceAction";
505            final static String QUALIFIER = "qualifier";
506            final static String DELEGATES = "delegates";
507            final static String DELEGATE = "delegate";
508            final static String ROLE_ID = "roleId";
509    
510        }
511    
512    }