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.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    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
030    
031    import org.apache.commons.collections.CollectionUtils;
032    import org.joda.time.DateTime;
033    import org.kuali.rice.core.api.CoreConstants;
034    import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
035    import org.kuali.rice.core.api.mo.ModelBuilder;
036    import org.kuali.rice.core.api.util.jaxb.DateTimeAdapter;
037    import org.w3c.dom.Element;
038    
039    @XmlRootElement(name = Notification.Constants.ROOT_ELEMENT_NAME)
040    @XmlAccessorType(XmlAccessType.NONE)
041    @XmlType(name = Notification.Constants.TYPE_NAME, propOrder = {
042            Notification.Elements.PRIORITY,
043            Notification.Elements.CONTENT,
044            Notification.Elements.CHANNEL,
045            Notification.Elements.CONTENT_TYPE,
046            Notification.Elements.CREATION_DATE_TIME,
047            Notification.Elements.RECIPIENTS,
048            Notification.Elements.SENDERS,
049            Notification.Elements.AUTO_REMOVE_DATE_TIME,
050            Notification.Elements.DELIVERY_TYPE,
051            Notification.Elements.PRODUCER,
052            Notification.Elements.SEND_DATE_TIME,
053            Notification.Elements.PROCESSING_FLAG,
054            Notification.Elements.LOCKED_DATE,
055            Notification.Elements.TITLE,
056            Notification.Elements.CONTENT_MESSAGE,
057            Notification.Elements.ID,
058            CoreConstants.CommonElements.VERSION_NUMBER,
059            CoreConstants.CommonElements.OBJECT_ID,
060            CoreConstants.CommonElements.FUTURE_ELEMENTS
061    })
062    public final class Notification
063            extends AbstractDataTransferObject
064            implements NotificationContract
065    {
066    
067        @XmlElement(name = Elements.PRIORITY, required = false)
068        private final NotificationPriority priority;
069        @XmlElement(name = Elements.CONTENT, required = false)
070        private final String content;
071        @XmlElement(name = Elements.CHANNEL, required = false)
072        private final NotificationChannel channel;
073        @XmlElement(name = Elements.CONTENT_TYPE, required = false)
074        private final NotificationContentType contentType;
075        @XmlElement(name = Elements.CREATION_DATE_TIME, required = false)
076        @XmlJavaTypeAdapter(DateTimeAdapter.class)
077        private final DateTime creationDateTime;
078        @XmlElementWrapper(name = Elements.RECIPIENTS, required = false)
079        @XmlElement(name = Elements.RECIPIENT, required = false)
080        private final List<NotificationRecipient> recipients;
081        @XmlElementWrapper(name = Elements.SENDERS, required = false)
082        @XmlElement(name = Elements.SENDER, required = false)
083        private final List<NotificationSender> senders;
084        @XmlElement(name = Elements.AUTO_REMOVE_DATE_TIME, required = false)
085        @XmlJavaTypeAdapter(DateTimeAdapter.class)
086        private final DateTime autoRemoveDateTime;
087        @XmlElement(name = Elements.DELIVERY_TYPE, required = false)
088        private final String deliveryType;
089        @XmlElement(name = Elements.PRODUCER, required = false)
090        private final NotificationProducer producer;
091        @XmlElement(name = Elements.SEND_DATE_TIME, required = false)
092        @XmlJavaTypeAdapter(DateTimeAdapter.class)
093        private final DateTime sendDateTime;
094        @XmlElement(name = Elements.PROCESSING_FLAG, required = false)
095        private final String processingFlag;
096        @XmlElement(name = Elements.LOCKED_DATE, required = false)
097        @XmlJavaTypeAdapter(DateTimeAdapter.class)
098        private final DateTime lockedDate;
099        @XmlElement(name = Elements.TITLE, required = false)
100        private final String title;
101        @XmlElement(name = Elements.CONTENT_MESSAGE, required = false)
102        private final String contentMessage;
103        @XmlElement(name = Elements.ID, required = false)
104        private final Long id;
105        @XmlElement(name = CoreConstants.CommonElements.VERSION_NUMBER, required = false)
106        private final Long versionNumber;
107        @XmlElement(name = CoreConstants.CommonElements.OBJECT_ID, required = false)
108        private final String objectId;
109        @SuppressWarnings("unused")
110        @XmlAnyElement
111        private final Collection<Element> _futureElements = null;
112    
113        /**
114         * Private constructor used only by JAXB.
115         *
116         */
117        private Notification() {
118            this.priority = null;
119            this.content = null;
120            this.channel = null;
121            this.contentType = null;
122            this.creationDateTime = null;
123            this.recipients = null;
124            this.senders = null;
125            this.autoRemoveDateTime = null;
126            this.deliveryType = null;
127            this.producer = null;
128            this.sendDateTime = null;
129            this.processingFlag = null;
130            this.lockedDate = null;
131            this.title = null;
132            this.contentMessage = null;
133            this.id = null;
134            this.versionNumber = null;
135            this.objectId = null;
136        }
137    
138        private Notification(Builder builder) {
139            this.priority = builder.getPriority() == null ? null : builder.getPriority().build();
140            this.content = builder.getContent();
141            this.channel = builder.getChannel() == null ? null : builder.getChannel().build();
142            this.contentType = builder.getContentType() == null ? null : builder.getContentType().build();
143            this.creationDateTime = builder.getCreationDateTime();
144            this.recipients = new ArrayList<NotificationRecipient>();
145            if (CollectionUtils.isNotEmpty(builder.getRecipients())) {
146                for (NotificationRecipient.Builder recipient : builder.getRecipients()) {
147                    this.recipients.add(recipient.build());
148                }
149            }
150            this.senders = new ArrayList<NotificationSender>();
151            if (CollectionUtils.isNotEmpty(builder.getSenders())) {
152                for (NotificationSender.Builder sender : builder.getSenders()) {
153                    this.senders.add(sender.build());
154                }
155            }
156            this.autoRemoveDateTime = builder.getAutoRemoveDateTime();
157            this.deliveryType = builder.getDeliveryType();
158            this.producer = builder.getProducer() == null ? null : builder.getProducer().build();
159            this.sendDateTime = builder.getSendDateTime();
160            this.processingFlag = builder.getProcessingFlag();
161            this.lockedDate = builder.getLockedDate();
162            this.title = builder.getTitle();
163            this.contentMessage = builder.getContentMessage();
164            this.id = builder.getId();
165            this.versionNumber = builder.getVersionNumber();
166            this.objectId = builder.getObjectId();
167        }
168    
169        @Override
170        public NotificationPriority getPriority() {
171            return this.priority;
172        }
173    
174        @Override
175        public String getContent() {
176            return this.content;
177        }
178    
179        @Override
180        public NotificationChannel getChannel() {
181            return this.channel;
182        }
183    
184        @Override
185        public NotificationContentType getContentType() {
186            return this.contentType;
187        }
188    
189        @Override
190        public DateTime getCreationDateTime() {
191            return this.creationDateTime;
192        }
193    
194        @Override
195        public List<NotificationRecipient> getRecipients() {
196            return this.recipients;
197        }
198    
199        @Override
200        public List<NotificationSender> getSenders() {
201            return this.senders;
202        }
203    
204        @Override
205        public DateTime getAutoRemoveDateTime() {
206            return this.autoRemoveDateTime;
207        }
208    
209        @Override
210        public String getDeliveryType() {
211            return this.deliveryType;
212        }
213    
214        @Override
215        public NotificationProducer getProducer() {
216            return this.producer;
217        }
218    
219        @Override
220        public DateTime getSendDateTime() {
221            return this.sendDateTime;
222        }
223    
224        @Override
225        public String getProcessingFlag() {
226            return this.processingFlag;
227        }
228    
229        @Override
230        public DateTime getLockedDate() {
231            return this.lockedDate;
232        }
233    
234        @Override
235        public String getTitle() {
236            return this.title;
237        }
238    
239        @Override
240        public String getContentMessage() {
241            return this.contentMessage;
242        }
243    
244        @Override
245        public Long getId() {
246            return this.id;
247        }
248    
249        @Override
250        public Long getVersionNumber() {
251            return this.versionNumber;
252        }
253    
254        @Override
255        public String getObjectId() {
256            return this.objectId;
257        }
258    
259    
260        /**
261         * A builder which can be used to construct {@link Notification} instances.  Enforces the constraints of the {@link NotificationContract}.
262         *
263         */
264        public final static class Builder
265                implements Serializable, ModelBuilder, NotificationContract
266        {
267    
268            private NotificationPriority.Builder priority;
269            private String content;
270            private NotificationChannel.Builder channel;
271            private NotificationContentType.Builder contentType;
272            private DateTime creationDateTime;
273            private List<NotificationRecipient.Builder> recipients;
274            private List<NotificationSender.Builder> senders;
275            private DateTime autoRemoveDateTime;
276            private String deliveryType;
277            private NotificationProducer.Builder producer;
278            private DateTime sendDateTime;
279            private String processingFlag;
280            private DateTime lockedDate;
281            private String title;
282            private String contentMessage;
283            private Long id;
284            private Long versionNumber;
285            private String objectId;
286    
287            private Builder() {
288                // TODO modify this constructor as needed to pass any required values and invoke the appropriate 'setter' methods
289            }
290    
291            public static Builder create() {
292                // TODO modify as needed to pass any required values and add them to the signature of the 'create' method
293                return new Builder();
294            }
295    
296            public static Builder create(NotificationContract contract) {
297                if (contract == null) {
298                    throw new IllegalArgumentException("contract was null");
299                }
300                // TODO if create() is modified to accept required parameters, this will need to be modified
301                Builder builder = create();
302                builder.setPriority(contract.getPriority() == null ? null : NotificationPriority.Builder.create(contract.getPriority()));
303                builder.setContent(contract.getContent());
304                builder.setChannel(contract.getChannel() == null ? null : NotificationChannel.Builder.create(contract.getChannel()));
305                builder.setContentType(contract.getContentType() == null ? null : NotificationContentType.Builder.create(contract.getContentType()));
306                builder.setCreationDateTime(contract.getCreationDateTime());
307                if (contract.getRecipients() != null) {
308                    List<NotificationRecipient.Builder> tempRecipients = new ArrayList<NotificationRecipient.Builder>();
309                    for (NotificationRecipientContract recipient : contract.getRecipients()) {
310                        tempRecipients.add(NotificationRecipient.Builder.create(recipient));
311                    }
312                    builder.setRecipients(tempRecipients);
313                }
314                if (contract.getSenders() != null) {
315                    List<NotificationSender.Builder> tempSenders = new ArrayList<NotificationSender.Builder>();
316                    for (NotificationSenderContract sender : contract.getSenders()) {
317                        tempSenders.add(NotificationSender.Builder.create(sender));
318                    }
319                    builder.setSenders(tempSenders);
320                }
321                builder.setAutoRemoveDateTime(contract.getAutoRemoveDateTime());
322                builder.setDeliveryType(contract.getDeliveryType());
323                builder.setProducer(contract.getProducer() == null ? null : NotificationProducer.Builder.create(contract.getProducer()));
324                builder.setSendDateTime(contract.getSendDateTime());
325                builder.setProcessingFlag(contract.getProcessingFlag());
326                builder.setLockedDate(contract.getLockedDate());
327                builder.setTitle(contract.getTitle());
328                builder.setContentMessage(contract.getContentMessage());
329                builder.setId(contract.getId());
330                builder.setVersionNumber(contract.getVersionNumber());
331                builder.setObjectId(contract.getObjectId());
332                return builder;
333            }
334    
335            public Notification build() {
336                return new Notification(this);
337            }
338    
339            @Override
340            public NotificationPriority.Builder getPriority() {
341                return this.priority;
342            }
343    
344            @Override
345            public String getContent() {
346                return this.content;
347            }
348    
349            @Override
350            public NotificationChannel.Builder getChannel() {
351                return this.channel;
352            }
353    
354            @Override
355            public NotificationContentType.Builder getContentType() {
356                return this.contentType;
357            }
358    
359            @Override
360            public DateTime getCreationDateTime() {
361                return this.creationDateTime;
362            }
363    
364            @Override
365            public List<NotificationRecipient.Builder> getRecipients() {
366                return this.recipients;
367            }
368    
369            @Override
370            public List<NotificationSender.Builder> getSenders() {
371                return this.senders;
372            }
373    
374            @Override
375            public DateTime getAutoRemoveDateTime() {
376                return this.autoRemoveDateTime;
377            }
378    
379            @Override
380            public String getDeliveryType() {
381                return this.deliveryType;
382            }
383    
384            @Override
385            public NotificationProducer.Builder getProducer() {
386                return this.producer;
387            }
388    
389            @Override
390            public DateTime getSendDateTime() {
391                return this.sendDateTime;
392            }
393    
394            @Override
395            public String getProcessingFlag() {
396                return this.processingFlag;
397            }
398    
399            @Override
400            public DateTime getLockedDate() {
401                return this.lockedDate;
402            }
403    
404            @Override
405            public String getTitle() {
406                return this.title;
407            }
408    
409            @Override
410            public String getContentMessage() {
411                return this.contentMessage;
412            }
413    
414            @Override
415            public Long getId() {
416                return this.id;
417            }
418    
419            @Override
420            public Long getVersionNumber() {
421                return this.versionNumber;
422            }
423    
424            @Override
425            public String getObjectId() {
426                return this.objectId;
427            }
428    
429            public void setPriority(NotificationPriority.Builder priority) {
430                this.priority = priority;
431            }
432    
433            public void setContent(String content) {
434                this.content = content;
435            }
436    
437            public void setChannel(NotificationChannel.Builder channel) {
438                this.channel = channel;
439            }
440    
441            public void setContentType(NotificationContentType.Builder contentType) {
442                this.contentType = contentType;
443            }
444    
445            public void setCreationDateTime(DateTime creationDateTime) {
446                this.creationDateTime = creationDateTime;
447            }
448    
449            public void setRecipients(List<NotificationRecipient.Builder> recipients) {
450                this.recipients = recipients;
451            }
452    
453            public void setSenders(List<NotificationSender.Builder> senders) {
454                this.senders = senders;
455            }
456    
457            public void setAutoRemoveDateTime(DateTime autoRemoveDateTime) {
458                this.autoRemoveDateTime = autoRemoveDateTime;
459            }
460    
461            public void setDeliveryType(String deliveryType) {
462                this.deliveryType = deliveryType;
463            }
464    
465            public void setProducer(NotificationProducer.Builder producer) {
466                this.producer = producer;
467            }
468    
469            public void setSendDateTime(DateTime sendDateTime) {
470                this.sendDateTime = sendDateTime;
471            }
472    
473            public void setProcessingFlag(String processingFlag) {
474                this.processingFlag = processingFlag;
475            }
476    
477            public void setLockedDate(DateTime lockedDate) {
478                this.lockedDate = lockedDate;
479            }
480    
481            public void setTitle(String title) {
482                this.title = title;
483            }
484    
485            public void setContentMessage(String contentMessage) {
486                this.contentMessage = contentMessage;
487            }
488    
489            public void setId(Long id) {
490                this.id = id;
491            }
492    
493            public void setVersionNumber(Long versionNumber) {
494                this.versionNumber = versionNumber;
495            }
496    
497            public void setObjectId(String objectId) {
498                this.objectId = objectId;
499            }
500    
501        }
502    
503    
504        /**
505         * Defines some internal constants used on this class.
506         *
507         */
508        static class Constants {
509    
510            final static String ROOT_ELEMENT_NAME = "notification";
511            final static String TYPE_NAME = "NotificationType";
512    
513        }
514    
515    
516        /**
517         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
518         *
519         */
520        static class Elements {
521    
522            final static String PRIORITY = "priority";
523            final static String CONTENT = "content";
524            final static String CHANNEL = "channel";
525            final static String CONTENT_TYPE = "contentType";
526            final static String CREATION_DATE_TIME = "creationDateTime";
527            final static String LOCK_VER_NBR = "lockVerNbr";
528            final static String RECIPIENTS = "recipients";
529            final static String RECIPIENT = "recipient";
530            final static String SENDERS = "senders";
531            final static String SENDER = "sender";
532            final static String AUTO_REMOVE_DATE_TIME = "autoRemoveDateTime";
533            final static String DELIVERY_TYPE = "deliveryType";
534            final static String PRODUCER = "producer";
535            final static String SEND_DATE_TIME = "sendDateTime";
536            final static String PROCESSING_FLAG = "processingFlag";
537            final static String LOCKED_DATE = "lockedDate";
538            final static String TITLE = "title";
539            final static String CONTENT_MESSAGE = "contentMessage";
540            final static String ID = "id";
541    
542        }
543    
544    }