001    /**
002     * Copyright 2005-2014 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.ken.api.notification;
017    
018    import java.io.Serializable;
019    import java.util.ArrayList;
020    import java.util.Collection;
021    import java.util.List;
022    import javax.xml.bind.annotation.XmlAccessType;
023    import javax.xml.bind.annotation.XmlAccessorType;
024    import javax.xml.bind.annotation.XmlAnyElement;
025    import javax.xml.bind.annotation.XmlElement;
026    import javax.xml.bind.annotation.XmlElementWrapper;
027    import javax.xml.bind.annotation.XmlRootElement;
028    import javax.xml.bind.annotation.XmlType;
029    
030    import org.apache.commons.collections.CollectionUtils;
031    import org.kuali.rice.core.api.CoreConstants;
032    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
033    import org.kuali.rice.core.api.mo.ModelBuilder;
034    import org.w3c.dom.Element;
035    
036    @XmlRootElement(name = NotificationChannel.Constants.ROOT_ELEMENT_NAME)
037    @XmlAccessorType(XmlAccessType.NONE)
038    @XmlType(name = NotificationChannel.Constants.TYPE_NAME, propOrder = {
039            NotificationChannel.Elements.NAME,
040            NotificationChannel.Elements.DESCRIPTION,
041            NotificationChannel.Elements.SUBSCRIBABLE,
042            NotificationChannel.Elements.RECIPIENT_LISTS,
043            NotificationChannel.Elements.PRODUCERS,
044            NotificationChannel.Elements.REVIEWERS,
045            NotificationChannel.Elements.SUBSCRIPTIONS,
046            NotificationChannel.Elements.ID,
047            CoreConstants.CommonElements.VERSION_NUMBER,
048            CoreConstants.CommonElements.OBJECT_ID,
049            CoreConstants.CommonElements.FUTURE_ELEMENTS
050    })
051    public final class NotificationChannel
052            extends AbstractDataTransferObject
053            implements NotificationChannelContract
054    {
055    
056        @XmlElement(name = Elements.NAME, required = false)
057        private final String name;
058        @XmlElement(name = Elements.DESCRIPTION, required = false)
059        private final String description;
060        @XmlElement(name = Elements.SUBSCRIBABLE, required = false)
061        private final boolean subscribable;
062        @XmlElementWrapper(name = Elements.RECIPIENT_LISTS, required = false)
063        @XmlElement(name = Elements.RECIPIENT_LIST, required = false)
064        private final List<NotificationListRecipient> recipientLists;
065        @XmlElementWrapper(name = Elements.PRODUCERS, required = false)
066        @XmlElement(name = Elements.PRODUCER, required = false)
067        private final List<NotificationProducer> producers;
068        @XmlElementWrapper(name = Elements.REVIEWERS, required = false)
069        @XmlElement(name = Elements.REVIEWER, required = false)
070        private final List<NotificationChannelReviewer> reviewers;
071        @XmlElementWrapper(name = Elements.SUBSCRIPTIONS, required = false)
072        @XmlElement(name = Elements.SUBSCRIPTION, required = false)
073        private final List<UserChannelSubscription> subscriptions;
074        @XmlElement(name = Elements.ID, required = false)
075        private final Long id;
076        @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
077        private final Long versionNumber;
078        @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false)
079        private final String objectId;
080        @SuppressWarnings("unused")
081        @XmlAnyElement
082        private final Collection<Element> _futureElements = null;
083    
084        /**
085         * Private constructor used only by JAXB.
086         *
087         */
088        private NotificationChannel() {
089            this.name = null;
090            this.description = null;
091            this.subscribable = false;
092            this.recipientLists = null;
093            this.producers = null;
094            this.reviewers = null;
095            this.subscriptions = null;
096            this.id = null;
097            this.versionNumber = null;
098            this.objectId = null;
099        }
100    
101        private NotificationChannel(Builder builder) {
102            this.name = builder.getName();
103            this.description = builder.getDescription();
104            this.subscribable = builder.isSubscribable();
105    
106            this.recipientLists = new ArrayList<NotificationListRecipient>();
107            if (CollectionUtils.isNotEmpty(builder.getRecipientLists())) {
108                for (NotificationListRecipient.Builder listRecipient : builder.getRecipientLists()) {
109                    this.recipientLists.add(listRecipient.build());
110                }
111            }
112    
113            this.producers = new ArrayList<NotificationProducer>();
114            if (CollectionUtils.isNotEmpty(builder.getProducers())) {
115                for (NotificationProducer.Builder producer : builder.getProducers()) {
116                    this.producers.add(producer.build());
117                }
118            }
119    
120            this.reviewers = new ArrayList<NotificationChannelReviewer>();
121            if (CollectionUtils.isNotEmpty(builder.getReviewers())) {
122                for (NotificationChannelReviewer.Builder reviewer : builder.getReviewers()) {
123                    this.reviewers.add(reviewer.build());
124                }
125            }
126    
127            this.subscriptions = new ArrayList<UserChannelSubscription>();
128            if (CollectionUtils.isNotEmpty(builder.getSubscriptions())) {
129                for (UserChannelSubscription.Builder subscription : builder.getSubscriptions()) {
130                    this.subscriptions.add(subscription.build());
131                }
132            }
133    
134            this.id = builder.getId();
135            this.versionNumber = builder.getVersionNumber();
136            this.objectId = builder.getObjectId();
137        }
138    
139        @Override
140        public String getName() {
141            return this.name;
142        }
143    
144        @Override
145        public String getDescription() {
146            return this.description;
147        }
148    
149        @Override
150        public boolean isSubscribable() {
151            return this.subscribable;
152        }
153    
154        @Override
155        public List<NotificationListRecipient> getRecipientLists() {
156            return this.recipientLists;
157        }
158    
159        @Override
160        public List<NotificationProducer> getProducers() {
161            return this.producers;
162        }
163    
164        @Override
165        public List<NotificationChannelReviewer> getReviewers() {
166            return this.reviewers;
167        }
168    
169        @Override
170        public List<UserChannelSubscription> getSubscriptions() {
171            return this.subscriptions;
172        }
173    
174        @Override
175        public Long getId() {
176            return this.id;
177        }
178    
179        @Override
180        public Long getVersionNumber() {
181            return this.versionNumber;
182        }
183    
184        @Override
185        public String getObjectId() {
186            return this.objectId;
187        }
188    
189    
190        /**
191         * A builder which can be used to construct {@link NotificationChannel} instances.  Enforces the constraints of the {@link NotificationChannelContract}.
192         *
193         */
194        public final static class Builder
195                implements Serializable, ModelBuilder, NotificationChannelContract
196        {
197    
198            private String name;
199            private String description;
200            private boolean subscribable;
201            private List<NotificationListRecipient.Builder> recipientLists;
202            private List<NotificationProducer.Builder> producers;
203            private List<NotificationChannelReviewer.Builder> reviewers;
204            private List<UserChannelSubscription.Builder> subscriptions;
205            private Long id;
206            private Long versionNumber;
207            private String objectId;
208    
209            private Builder() {
210            }
211    
212            public static Builder create() {
213                return new Builder();
214            }
215    
216            public static Builder create(NotificationChannelContract contract) {
217                if (contract == null) {
218                    throw new IllegalArgumentException("contract was null");
219                }
220                Builder builder = create();
221                builder.setName(contract.getName());
222                builder.setDescription(contract.getDescription());
223                builder.setSubscribable(contract.isSubscribable());
224                if (contract.getRecipientLists() != null) {
225                    List<NotificationListRecipient.Builder> tempListRecipient = new ArrayList<NotificationListRecipient.Builder>();
226                    for (NotificationListRecipientContract listRecipient : contract.getRecipientLists()) {
227                        tempListRecipient.add(NotificationListRecipient.Builder.create(listRecipient));
228                    }
229                    builder.setRecipientLists(tempListRecipient);
230                }
231                if (contract.getProducers() != null) {
232                    List<NotificationProducer.Builder> tempProducers = new ArrayList<NotificationProducer.Builder>();
233                    for (NotificationProducerContract producer : contract.getProducers()) {
234                        tempProducers.add(NotificationProducer.Builder.create(producer));
235                    }
236                    builder.setProducers(tempProducers);
237                }
238                if (contract.getReviewers() != null) {
239                    List<NotificationChannelReviewer.Builder> tempReviewers = new ArrayList<NotificationChannelReviewer.Builder>();
240                    for (NotificationChannelReviewerContract reviewer : contract.getReviewers()) {
241                        tempReviewers.add(NotificationChannelReviewer.Builder.create(reviewer));
242                    }
243                    builder.setReviewers(tempReviewers);
244                }
245                if (contract.getSubscriptions() != null) {
246                    List<UserChannelSubscription.Builder> tempSubscriptions = new ArrayList<UserChannelSubscription.Builder>();
247                    for (UserChannelSubscriptionContract subscription : contract.getSubscriptions()) {
248                        tempSubscriptions.add(UserChannelSubscription.Builder.create(subscription));
249                    }
250                    builder.setSubscriptions(tempSubscriptions);
251                }
252                builder.setId(contract.getId());
253                builder.setVersionNumber(contract.getVersionNumber());
254                builder.setObjectId(contract.getObjectId());
255                return builder;
256            }
257    
258            public NotificationChannel build() {
259                return new NotificationChannel(this);
260            }
261    
262            @Override
263            public String getName() {
264                return this.name;
265            }
266    
267            @Override
268            public String getDescription() {
269                return this.description;
270            }
271    
272            @Override
273            public boolean isSubscribable() {
274                return this.subscribable;
275            }
276    
277            @Override
278            public List<NotificationListRecipient.Builder> getRecipientLists() {
279                return this.recipientLists;
280            }
281    
282            @Override
283            public List<NotificationProducer.Builder> getProducers() {
284                return this.producers;
285            }
286    
287            @Override
288            public List<NotificationChannelReviewer.Builder> getReviewers() {
289                return this.reviewers;
290            }
291    
292            @Override
293            public List<UserChannelSubscription.Builder> getSubscriptions() {
294                return this.subscriptions;
295            }
296    
297            @Override
298            public Long getId() {
299                return this.id;
300            }
301    
302            @Override
303            public Long getVersionNumber() {
304                return this.versionNumber;
305            }
306    
307            @Override
308            public String getObjectId() {
309                return this.objectId;
310            }
311    
312            public void setName(String name) {
313                this.name = name;
314            }
315    
316            public void setDescription(String description) {
317                this.description = description;
318            }
319    
320            public void setSubscribable(boolean subscribable) {
321                this.subscribable = subscribable;
322            }
323    
324            public void setRecipientLists(List<NotificationListRecipient.Builder> recipientLists) {
325                this.recipientLists = recipientLists;
326            }
327    
328            public void setProducers(List<NotificationProducer.Builder> producers) {
329                this.producers = producers;
330            }
331    
332            public void setReviewers(List<NotificationChannelReviewer.Builder> reviewers) {
333                this.reviewers = reviewers;
334            }
335    
336            public void setSubscriptions(List<UserChannelSubscription.Builder> subscriptions) {
337                this.subscriptions = subscriptions;
338            }
339    
340            public void setId(Long id) {
341                this.id = id;
342            }
343    
344            public void setVersionNumber(Long versionNumber) {
345                this.versionNumber = versionNumber;
346            }
347    
348            public void setObjectId(String objectId) {
349                this.objectId = objectId;
350            }
351    
352        }
353    
354    
355        /**
356         * Defines some internal constants used on this class.
357         *
358         */
359        static class Constants {
360    
361            final static String ROOT_ELEMENT_NAME = "notificationChannel";
362            final static String TYPE_NAME = "NotificationChannelType";
363    
364        }
365    
366    
367        /**
368         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
369         *
370         */
371        static class Elements {
372    
373            final static String NAME = "name";
374            final static String DESCRIPTION = "description";
375            final static String SUBSCRIBABLE = "subscribable";
376            final static String RECIPIENT_LISTS = "recipientLists";
377            final static String RECIPIENT_LIST = "recipientList";
378            final static String PRODUCERS = "producers";
379            final static String PRODUCER = "producer";
380            final static String REVIEWERS = "reviewers";
381            final static String REVIEWER = "reviewer";
382            final static String SUBSCRIPTIONS = "subscriptions";
383            final static String SUBSCRIPTION = "subscription";
384            final static String ID = "id";
385    
386        }
387    
388    }