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.kew.api.preferences;
017    
018    import java.io.Serializable;
019    import java.util.Collection;
020    import java.util.Collections;
021    import java.util.HashMap;
022    import java.util.Map;
023    
024    import javax.xml.bind.annotation.XmlAccessType;
025    import javax.xml.bind.annotation.XmlAccessorType;
026    import javax.xml.bind.annotation.XmlAnyElement;
027    import javax.xml.bind.annotation.XmlElement;
028    import javax.xml.bind.annotation.XmlRootElement;
029    import javax.xml.bind.annotation.XmlType;
030    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
031    
032    import org.apache.commons.lang.StringUtils;
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.MapStringStringAdapter;
037    import org.kuali.rice.core.api.util.jaxb.MultiValuedStringMapAdapter;
038    import org.kuali.rice.kew.api.KewApiConstants;
039    import org.w3c.dom.Element;
040    
041    /**
042     * An immutable data transfer object implementing {@link PreferencesContract}.
043     *
044     * p>When loaded, Preferences could be in a state where they require being saved to the database.
045     * If this is the case then {{@link #requiresSave} will evaluate to true.
046     *
047     * @see PreferencesContract
048     *
049     * @author Kuali Rice Team (rice.collab@kuali.org)
050     */
051    @XmlRootElement(name = Preferences.Constants.ROOT_ELEMENT_NAME)
052    @XmlAccessorType(XmlAccessType.NONE)
053    @XmlType(name = Preferences.Constants.TYPE_NAME, propOrder = {
054            Preferences.Elements.REQUIRES_SAVE,
055            Preferences.Elements.EMAIL_NOTIFICATION,
056            Preferences.Elements.NOTIFY_PRIMARY_DELEGATION,
057            Preferences.Elements.NOTIFY_SECONDARY_DELEGATION,
058            Preferences.Elements.OPEN_NEW_WINDOW,
059            Preferences.Elements.SHOW_ACTION_REQUESTED,
060            Preferences.Elements.SHOW_DATE_CREATED,
061            Preferences.Elements.SHOW_DOCUMENT_STATUS,
062            Preferences.Elements.SHOW_APP_DOC_STATUS,
063            Preferences.Elements.SHOW_DOC_TYPE,
064            Preferences.Elements.SHOW_INITIATOR,
065            Preferences.Elements.SHOW_DOC_TITLE,
066            Preferences.Elements.SHOW_WORKGROUP_REQUEST,
067            Preferences.Elements.SHOW_DELEGATOR,
068            Preferences.Elements.SHOW_CLEAR_FYI,
069            Preferences.Elements.PAGE_SIZE,
070            Preferences.Elements.REFRESH_RATE,
071            Preferences.Elements.COLOR_SAVED,
072            Preferences.Elements.COLOR_INITIATED,
073            Preferences.Elements.COLOR_DISAPPROVED,
074            Preferences.Elements.COLOR_ENROUTE,
075            Preferences.Elements.COLOR_APPROVED,
076            Preferences.Elements.COLOR_FINAL,
077            Preferences.Elements.COLOR_DISAPPROVE_CANCEL,
078            Preferences.Elements.COLOR_PROCESSED,
079            Preferences.Elements.COLOR_EXCEPTION,
080            Preferences.Elements.COLOR_CANCELED,
081            Preferences.Elements.DELEGATOR_FILTER,
082            Preferences.Elements.USE_OUTBOX,
083            Preferences.Elements.SHOW_DATE_APPROVED,
084            Preferences.Elements.SHOW_CURRENT_NODE,
085            Preferences.Elements.PRIMARY_DELEGATE_FILTER,
086            Preferences.Elements.NOTIFY_ACKNOWLEDGE,
087            Preferences.Elements.NOTIFY_APPROVE,
088            Preferences.Elements.NOTIFY_COMPLETE,
089            Preferences.Elements.NOTIFY_FYI,
090            Preferences.Elements.DOCUMENT_TYPE_NOTIFICATION_PREFERENCES,
091            Preferences.Elements.DOCUMENT_TYPE_NOTIFICATION_PREFERENCE_MAP,
092            CoreConstants.CommonElements.FUTURE_ELEMENTS
093    })
094    public final class Preferences extends AbstractDataTransferObject implements PreferencesContract {
095    
096        private static final long serialVersionUID = 642820621349964439L;
097    
098        @XmlElement(name = Elements.REQUIRES_SAVE)
099        private final boolean requiresSave;
100        @XmlElement(name = Elements.EMAIL_NOTIFICATION)
101        private final String emailNotification;
102        @XmlElement(name = Elements.NOTIFY_PRIMARY_DELEGATION)
103        private final String notifyPrimaryDelegation;
104        @XmlElement(name = Elements.NOTIFY_SECONDARY_DELEGATION)
105        private final String notifySecondaryDelegation;
106        @XmlElement(name = Elements.OPEN_NEW_WINDOW)
107        private final String openNewWindow;
108        @XmlElement(name = Elements.SHOW_ACTION_REQUESTED)
109        private final String showActionRequested;
110        @XmlElement(name = Elements.SHOW_DATE_CREATED)
111        private final String showDateCreated;
112        @XmlElement(name = Elements.SHOW_DOCUMENT_STATUS)
113        private final String showDocumentStatus;
114        @XmlElement(name = Elements.SHOW_APP_DOC_STATUS)
115        private final String showAppDocStatus;
116        @XmlElement(name = Elements.SHOW_DOC_TYPE)
117        private final String showDocType;
118        @XmlElement(name = Elements.SHOW_INITIATOR)
119        private final String showInitiator;
120        @XmlElement(name = Elements.SHOW_DOC_TITLE)
121        private final String showDocTitle;
122        @XmlElement(name = Elements.SHOW_WORKGROUP_REQUEST)
123        private final String showWorkgroupRequest;
124        @XmlElement(name = Elements.SHOW_DELEGATOR)
125        private final String showDelegator;
126        @XmlElement(name = Elements.SHOW_CLEAR_FYI)
127        private final String showClearFyi;
128        @XmlElement(name = Elements.PAGE_SIZE)
129        private final String pageSize;
130        @XmlElement(name = Elements.REFRESH_RATE)
131        private final String refreshRate;
132        @XmlElement(name = Elements.COLOR_SAVED)
133        private final String colorSaved;
134        @XmlElement(name = Elements.COLOR_INITIATED)
135        private final String colorInitiated;
136        @XmlElement(name = Elements.COLOR_DISAPPROVED)
137        private final String colorDisapproved;
138        @XmlElement(name = Elements.COLOR_ENROUTE)
139        private final String colorEnroute;
140        @XmlElement(name = Elements.COLOR_APPROVED)
141        private final String colorApproved;
142        @XmlElement(name = Elements.COLOR_FINAL)
143        private final String colorFinal;
144        @XmlElement(name = Elements.COLOR_DISAPPROVE_CANCEL)
145        private final String colorDisapproveCancel;
146        @XmlElement(name = Elements.COLOR_PROCESSED)
147        private final String colorProcessed;
148        @XmlElement(name = Elements.COLOR_EXCEPTION)
149        private final String colorException;
150        @XmlElement(name = Elements.COLOR_CANCELED)
151        private final String colorCanceled;
152        @XmlElement(name = Elements.DELEGATOR_FILTER)
153        private final String delegatorFilter;
154        @XmlElement(name = Elements.USE_OUTBOX)
155        private final String useOutbox;
156        @XmlElement(name = Elements.SHOW_DATE_APPROVED)
157        private final String showDateApproved;
158        @XmlElement(name = Elements.SHOW_CURRENT_NODE)
159        private final String showCurrentNode;
160        @XmlElement(name = Elements.PRIMARY_DELEGATE_FILTER)
161        private final String primaryDelegateFilter;
162        @XmlElement(name = Elements.NOTIFY_ACKNOWLEDGE)
163        private final String notifyAcknowledge;
164        @XmlElement(name = Elements.NOTIFY_APPROVE)
165        private final String notifyApprove;
166    
167        //TODO: fix this type in Rice 3.0
168        @XmlElement(name = Elements.NOTIFY_COMPLETE)
169        private final String notifyCompelte;
170        @XmlElement(name = Elements.NOTIFY_FYI)
171        private final String notifyFYI;
172    
173        /*
174         * @Deprecated for 2.1.1.  Invalid @XmlJavaTypeAdapter.  Use documentTypeNotitificationPreferenceMap instead.
175         */
176        @XmlElement(name = Elements.DOCUMENT_TYPE_NOTIFICATION_PREFERENCES)
177        @XmlJavaTypeAdapter(MultiValuedStringMapAdapter.class)
178        @Deprecated
179        private Map<String, String> documentTypeNotificationPreferences;
180    
181        @XmlElement(name = Elements.DOCUMENT_TYPE_NOTIFICATION_PREFERENCE_MAP)
182        @XmlJavaTypeAdapter(MapStringStringAdapter.class)
183        private Map<String, String> documentTypeNotificationPreferenceMap;
184    
185        @SuppressWarnings("unused")
186        @XmlAnyElement
187        private final Collection<Element> _futureElements = null;
188    
189        private Preferences() {
190            this.emailNotification = null;
191            this.notifyPrimaryDelegation = null;
192            this.notifySecondaryDelegation = null;
193            this.openNewWindow = null;
194            this.showActionRequested = null;
195            this.showDateCreated = null;
196            this.showDocumentStatus = null;
197            this.showAppDocStatus = null;
198            this.showDocType = null;
199            this.showInitiator = null;
200            this.showDocTitle = null;
201            this.showWorkgroupRequest = null;
202            this.showDelegator = null;
203            this.showClearFyi = null;
204            this.pageSize = null;
205            this.refreshRate = null;
206            this.colorSaved = null;
207            this.colorInitiated = null;
208            this.colorDisapproved = null;
209            this.colorEnroute = null;
210            this.colorApproved = null;
211            this.colorFinal = null;
212            this.colorDisapproveCancel = null;
213            this.colorProcessed = null;
214            this.colorException = null;
215            this.colorCanceled = null;
216            this.delegatorFilter = null;
217            this.useOutbox = null;
218            this.showDateApproved = null;
219            this.showCurrentNode = null;
220            this.primaryDelegateFilter = null;
221            this.notifyAcknowledge = null;
222            this.notifyApprove =  null;
223            this.notifyCompelte = null;
224            this.notifyFYI = null;
225            this.documentTypeNotificationPreferences = null;
226            this.documentTypeNotificationPreferenceMap = Collections.emptyMap();
227    
228            this.requiresSave = false;
229        }
230    
231        public Preferences(Builder builder) {
232            this.emailNotification = builder.getEmailNotification();
233            this.notifyPrimaryDelegation = builder.getNotifyPrimaryDelegation();
234            this.notifySecondaryDelegation = builder.getNotifySecondaryDelegation();
235            this.openNewWindow = builder.getOpenNewWindow();
236            this.showActionRequested = builder.getShowActionRequested();
237            this.showDateCreated = builder.getShowDateCreated();
238            this.showDocumentStatus = builder.getShowDocumentStatus();
239            this.showAppDocStatus = builder.getShowAppDocStatus();
240            this.showDocType = builder.getShowDocType();
241            this.showInitiator = builder.getShowInitiator();
242            this.showDocTitle = builder.getShowDocTitle();
243            this.showWorkgroupRequest = builder.getShowWorkgroupRequest();
244            this.showDelegator = builder.getShowDelegator();
245            this.showClearFyi = builder.getShowClearFyi();
246            this.pageSize = builder.getPageSize();
247            this.refreshRate = builder.getRefreshRate();
248            this.colorSaved = builder.getColorSaved();
249            this.colorInitiated = builder.getColorInitiated();
250            this.colorDisapproved = builder.getColorDisapproved();
251            this.colorEnroute = builder.getColorEnroute();
252            this.colorApproved = builder.getColorApproved();
253            this.colorFinal = builder.getColorFinal();
254            this.colorDisapproveCancel = builder.getColorDisapproveCancel();
255            this.colorProcessed = builder.getColorProcessed();
256            this.colorException = builder.getColorException();
257            this.colorCanceled = builder.getColorCanceled();
258            this.delegatorFilter = builder.getDelegatorFilter();
259            this.useOutbox = builder.getUseOutbox();
260            this.showDateApproved = builder.getShowDateApproved();
261            this.showCurrentNode = builder.getShowCurrentNode();
262            this.primaryDelegateFilter = builder.getPrimaryDelegateFilter();
263            this.requiresSave = builder.isRequiresSave();
264            this.notifyAcknowledge = builder.getNotifyAcknowledge();
265            this.notifyApprove = builder.getNotifyApprove();
266            this.notifyCompelte = builder.getNotifyComplete();
267            this.notifyFYI = builder.getNotifyFYI();
268            this.documentTypeNotificationPreferences = null;
269            this.documentTypeNotificationPreferenceMap = builder.getDocumentTypeNotificationPreferences();
270        }
271    
272        @Override
273        public boolean isRequiresSave() {
274            return requiresSave;
275        }
276    
277        @Override
278        public String getEmailNotification() {
279            return emailNotification;
280        }
281    
282        @Override
283        public String getNotifyPrimaryDelegation() {
284            return notifyPrimaryDelegation;
285        }
286    
287        @Override
288        public String getNotifySecondaryDelegation() {
289            return notifySecondaryDelegation;
290        }
291    
292        @Override
293        public String getOpenNewWindow() {
294            return openNewWindow;
295        }
296    
297        @Override
298        public String getShowActionRequested() {
299            return showActionRequested;
300        }
301    
302        @Override
303        public String getShowDateCreated() {
304            return showDateCreated;
305        }
306    
307        @Override
308        public String getShowDocumentStatus() {
309            return showDocumentStatus;
310        }
311    
312        @Override
313        public String getShowAppDocStatus() {
314            return showAppDocStatus;
315        }
316    
317        @Override
318        public String getShowDocType() {
319            return showDocType;
320        }
321    
322        @Override
323        public String getShowInitiator() {
324            return showInitiator;
325        }
326    
327        @Override
328        public String getShowDocTitle() {
329            return showDocTitle;
330        }
331    
332        @Override
333        public String getShowWorkgroupRequest() {
334            return showWorkgroupRequest;
335        }
336    
337        @Override
338        public String getShowDelegator() {
339            return showDelegator;
340        }
341    
342        @Override
343        public String getShowClearFyi() {
344            return showClearFyi;
345        }
346    
347        @Override
348        public String getPageSize() {
349            return pageSize;
350        }
351    
352        @Override
353        public String getRefreshRate() {
354            return refreshRate;
355        }
356    
357        @Override
358        public String getColorSaved() {
359            return colorSaved;
360        }
361    
362        @Override
363        public String getColorInitiated() {
364            return colorInitiated;
365        }
366    
367        @Override
368        public String getColorDisapproved() {
369            return colorDisapproved;
370        }
371    
372        @Override
373        public String getColorEnroute() {
374            return colorEnroute;
375        }
376    
377        @Override
378        public String getColorApproved() {
379            return colorApproved;
380        }
381    
382        @Override
383        public String getColorFinal() {
384            return colorFinal;
385        }
386    
387        @Override
388        public String getColorDisapproveCancel() {
389            return colorDisapproveCancel;
390        }
391    
392        @Override
393        public String getColorProcessed() {
394            return colorProcessed;
395        }
396    
397        @Override
398        public String getColorException() {
399            return colorException;
400        }
401    
402        @Override
403        public String getColorCanceled() {
404            return colorCanceled;
405        }
406    
407        @Override
408        public String getDelegatorFilter() {
409            return delegatorFilter;
410        }
411    
412        @Override
413        public String getUseOutbox() {
414            return useOutbox;
415        }
416    
417        @Override
418        public String getShowDateApproved() {
419            return showDateApproved;
420        }
421    
422        @Override
423        public String getShowCurrentNode() {
424            return showCurrentNode;
425        }
426    
427        @Override
428        public String getPrimaryDelegateFilter() {
429            return primaryDelegateFilter;
430        }
431    
432        @Override
433        public String getNotifyComplete() {
434            return this.notifyCompelte;
435        }
436    
437        @Override
438        public String getNotifyApprove() {
439            return this.notifyApprove;
440        }
441    
442        @Override
443        public String getNotifyAcknowledge() {
444            return this.notifyAcknowledge;
445        }
446    
447        @Override
448        public String getNotifyFYI() {
449            return this.notifyFYI;
450        }
451        
452        public String getDocumentTypeNotificationPreference(String documentType) {
453            String preferenceName = documentType.replace(KewApiConstants.DOCUMENT_TYPE_NOTIFICATION_DELIMITER, ".");
454            String preferenceValue = this.getDocumentTypeNotificationPreferences().get(preferenceName);
455            if(StringUtils.isNotBlank(preferenceValue)) {
456                return preferenceValue;
457            }
458            return null;
459        }
460    
461        @Override
462        public Map<String, String> getDocumentTypeNotificationPreferences() {
463            return this.documentTypeNotificationPreferenceMap == null ? this.documentTypeNotificationPreferences : this.documentTypeNotificationPreferenceMap ;
464        }
465    
466        public boolean isUsingOutbox() {
467            if (this.getUseOutbox() != null && this.getUseOutbox().equals(Constants.PREFERENCES_YES_VAL)) {
468                return true;
469            }
470            return false;
471        }
472    
473        public final static class Builder
474                implements Serializable, ModelBuilder, PreferencesContract
475        {
476    
477            private boolean requiresSave = false;
478    
479            private String emailNotification;
480            private String notifyPrimaryDelegation;
481            private String notifySecondaryDelegation;
482            private String openNewWindow;
483            private String showActionRequested;
484            private String showDateCreated;
485            private String showDocumentStatus;
486            private String showAppDocStatus;
487            private String showDocType;
488            private String showInitiator;
489            private String showDocTitle;
490            private String showWorkgroupRequest;
491            private String showDelegator;
492            private String showClearFyi;
493            private String pageSize;
494            private String refreshRate;
495            private String colorSaved;
496            private String colorInitiated;
497            private String colorDisapproved;
498            private String colorEnroute;
499            private String colorApproved;
500            private String colorFinal;
501            private String colorDissapproveCancel;
502            private String colorProcessed;
503            private String colorException;
504            private String colorCanceled;
505            private String delegatorFilter;
506            private String useOutbox;
507            private String showDateApproved;
508            private String showCurrentNode;
509            private String primaryDelegateFilter;
510            private String notifyAcknowledge;
511            private String notifyApprove;
512            private String notifyComplete;
513            private String notifyFYI;
514            private Map<String, String> documentTypeNotificationPreferences;
515    
516            private Builder() {
517                this.documentTypeNotificationPreferences = new HashMap<String, String>();
518            }
519    
520            private Builder(String emailNotification, String notifyPrimaryDelegation, String notifySecondaryDelegation,
521                    String openNewWindow, String showActionRequested, String showDateCreated, String showDocumentStatus,
522                    String showAppDocStatus, String showDocType, String showInitiator, String showDocTitle,
523                    String showWorkgroupRequest, String showDelegator, String showClearFyi, String pageSize, String refreshRate,
524                    String colorSaved, String colorInitiated, String colorDisapproved, String colorEnroute,
525                    String colorApproved, String colorFinal, String colorDissapproveCancel, String colorProcessed,
526                    String colorException, String colorCanceled, String delegatorFilter, String useOutbox,
527                    String showDateApproved, String showCurrentNode, String primaryDelegateFilter, String notifyAcknowledge,
528                    String notifyApprove, String notifyComplete, String notifyFYI, Map<String, String> documentTypeNotificationPreferences,
529                    boolean requiresSave) {
530                this.emailNotification = emailNotification;
531                this.notifyPrimaryDelegation = notifyPrimaryDelegation;
532                this.notifySecondaryDelegation = notifySecondaryDelegation;
533                this.openNewWindow = openNewWindow;
534                this.showActionRequested = showActionRequested;
535                this.showDateCreated = showDateCreated;
536                this.showDocumentStatus = showDocumentStatus;
537                this.showAppDocStatus = showAppDocStatus;
538                this.showDocType = showDocType;
539                this.showInitiator = showInitiator;
540                this.showDocTitle = showDocTitle;
541                this.showWorkgroupRequest = showWorkgroupRequest;
542                this.showDelegator = showDelegator;
543                this.showClearFyi = showClearFyi;
544                this.pageSize = pageSize;
545                this.refreshRate = refreshRate;
546                this.colorSaved = colorSaved;
547                this.colorInitiated = colorInitiated;
548                this.colorDisapproved = colorDisapproved;
549                this.colorEnroute = colorEnroute;
550                this.colorApproved = colorApproved;
551                this.colorFinal = colorFinal;
552                this.colorDissapproveCancel = colorDissapproveCancel;
553                this.colorProcessed = colorProcessed;
554                this.colorException = colorException;
555                this.colorCanceled = colorCanceled;
556                this.delegatorFilter = delegatorFilter;
557                this.useOutbox = useOutbox;
558                this.showDateApproved = showDateApproved;
559                this.showCurrentNode = showCurrentNode;
560                this.primaryDelegateFilter = primaryDelegateFilter;
561                this.requiresSave = requiresSave;
562                this.notifyAcknowledge = notifyAcknowledge;
563                this.notifyApprove = notifyApprove;
564                this.notifyComplete = notifyComplete;
565                this.notifyFYI = notifyFYI;
566                this.documentTypeNotificationPreferences = documentTypeNotificationPreferences;
567            }
568    
569            public Preferences build() {
570                return new Preferences(this);
571            }
572    
573            public static Builder create() {
574                return new Builder();
575            }
576    
577            public static Builder create(String emailNotification, String notifyPrimaryDelegation, String notifySecondaryDelegation,
578                    String openNewWindow, String showActionRequested, String showDateCreated, String showDocumentStatus,
579                    String showAppDocStatus, String showDocType, String showInitiator, String showDocTitle,
580                    String showWorkgroupRequest, String showDelegator, String showClearFyi, String pageSize, String refreshRate,
581                    String colorSaved, String colorInitiated, String colorDisapproved, String colorEnroute,
582                    String colorApproved, String colorFinal, String colorDissapproveCancel, String colorProcessed,
583                    String colorException, String colorCanceled, String delegatorFilter, String useOutbox,
584                    String showDateApproved, String showCurrentNode, String primaryDelegateFilter, String notifyAcknowledge,
585                    String notifyApprove, String notifyComplete, String notifyFYI, Map<String, String> documentTypeNotificationPreferences,
586                    boolean requiresSave) {
587                return new Builder(emailNotification, notifyPrimaryDelegation, notifySecondaryDelegation, openNewWindow, showActionRequested, showDateCreated,
588                        showDocumentStatus, showAppDocStatus, showDocType, showInitiator, showDocTitle, showWorkgroupRequest,  showDelegator, showClearFyi,
589                        pageSize, refreshRate, colorSaved, colorInitiated, colorDisapproved, colorEnroute, colorApproved, colorFinal, colorDissapproveCancel,
590                        colorProcessed, colorException, colorCanceled, delegatorFilter, useOutbox, showDateApproved, showCurrentNode, primaryDelegateFilter,
591                        notifyAcknowledge, notifyApprove, notifyComplete, notifyFYI, documentTypeNotificationPreferences, requiresSave);
592            }
593    
594            public static Builder create(PreferencesContract contract) {
595                if (contract == null) {
596                    throw new IllegalArgumentException("contract was null");
597                }
598                Builder builder = create(contract.getEmailNotification(), contract.getNotifyPrimaryDelegation(), contract.getNotifySecondaryDelegation(), contract.getOpenNewWindow(),
599                        contract.getShowActionRequested(), contract.getShowDateCreated(), contract.getShowDocumentStatus(), contract.getShowAppDocStatus(), contract.getShowDocType(),
600                        contract.getShowInitiator(), contract.getShowDocTitle(), contract.getShowWorkgroupRequest(), contract.getShowDelegator(), contract.getShowClearFyi(),
601                        contract.getPageSize(), contract.getRefreshRate(), contract.getColorSaved(), contract.getColorInitiated(), contract.getColorDisapproved(),
602                        contract.getColorEnroute(), contract.getColorApproved(), contract.getColorFinal(), contract.getColorDisapproveCancel(), contract.getColorProcessed(),
603                        contract.getColorException(), contract.getColorCanceled(), contract.getDelegatorFilter(), contract.getUseOutbox(), contract.getShowDateApproved(),
604                        contract.getShowCurrentNode(), contract.getPrimaryDelegateFilter(), contract.getNotifyAcknowledge(), contract.getNotifyApprove(), contract.getNotifyComplete(),
605                        contract.getNotifyFYI(), contract.getDocumentTypeNotificationPreferences(), contract.isRequiresSave());
606                return builder;
607            }
608    
609            public static Builder create(Map<String, String> map, Map<String, String> documentTypeNotificationPreferences, boolean requiresSave) {
610                Builder builder = create(map.get(KEYS.EMAIL_NOTIFICATION), map.get(KEYS.NOTIFY_PRIMARY_DELEGATION), map.get(KEYS.NOTIFY_SECONDARY_DELEGATION), map.get(KEYS.OPEN_NEW_WINDOW),
611                        map.get(KEYS.SHOW_ACTION_REQUESTED), map.get(KEYS.SHOW_DATE_CREATED), map.get(KEYS.SHOW_DOCUMENT_STATUS), map.get(KEYS.SHOW_APP_DOC_STATUS), map.get(KEYS.SHOW_DOC_TYPE),
612                        map.get(KEYS.SHOW_INITIATOR), map.get(KEYS.SHOW_DOC_TITLE), map.get(KEYS.SHOW_GROUP_REQUEST), map.get(KEYS.SHOW_DELEGATOR), map.get(KEYS.SHOW_CLEAR_FYI),
613                        map.get(KEYS.PAGE_SIZE), map.get(KEYS.REFRESH_RATE), map.get(KEYS.COLOR_SAVED), map.get(KEYS.COLOR_INITIATED), map.get(KEYS.COLOR_DISAPPROVED),
614                        map.get(KEYS.COLOR_ENROUTE), map.get(KEYS.COLOR_APPROVED), map.get(KEYS.COLOR_FINAL), map.get(KEYS.COLOR_DISAPPROVE_CANCEL), map.get(KEYS.COLOR_PROCESSED),
615                        map.get(KEYS.COLOR_EXCEPTION), map.get(KEYS.COLOR_CANCELED), map.get(KEYS.DELEGATOR_FILTER), map.get(KEYS.USE_OUT_BOX), map.get(KEYS.SHOW_DATE_APPROVED),
616                        map.get(KEYS.SHOW_CURRENT_NODE), map.get(KEYS.PRIMARY_DELEGATE_FILTER), map.get(KEYS.NOTIFY_ACKNOWLEDGE), map.get(KEYS.NOTIFY_APPROVE), map.get(KEYS.NOTIFY_COMPLETE),
617                        map.get(KEYS.NOTIFY_FYI), documentTypeNotificationPreferences, requiresSave);
618                return builder;
619            }
620    
621            public synchronized boolean isRequiresSave() {
622                return requiresSave;
623            }
624    
625            public synchronized void setRequiresSave(boolean requiresSave) {
626                this.requiresSave = requiresSave;
627            }
628    
629            public synchronized String getEmailNotification() {
630                return emailNotification;
631            }
632    
633            public synchronized void setEmailNotification(String emailNotification) {
634                this.emailNotification = emailNotification;
635            }
636    
637            public synchronized String getNotifyPrimaryDelegation() {
638                return notifyPrimaryDelegation;
639            }
640    
641            public synchronized void setNotifyPrimaryDelegation(String notifyPrimaryDelegation) {
642                this.notifyPrimaryDelegation = notifyPrimaryDelegation;
643            }
644    
645            public synchronized String getNotifySecondaryDelegation() {
646                return notifySecondaryDelegation;
647            }
648    
649            public synchronized void setNotifySecondaryDelegation(String notifySecondaryDelegation) {
650                this.notifySecondaryDelegation = notifySecondaryDelegation;
651            }
652    
653            public synchronized String getOpenNewWindow() {
654                return openNewWindow;
655            }
656    
657            public synchronized void setOpenNewWindow(String openNewWindow) {
658                this.openNewWindow = openNewWindow;
659            }
660    
661            public synchronized String getShowActionRequested() {
662                return showActionRequested;
663            }
664    
665            public synchronized void setShowActionRequested(String showActionRequested) {
666                this.showActionRequested = showActionRequested;
667            }
668    
669            public synchronized String getShowDateCreated() {
670                return showDateCreated;
671            }
672    
673            public synchronized void setShowDateCreated(String showDateCreated) {
674                this.showDateCreated = showDateCreated;
675            }
676    
677            public synchronized String getShowDocumentStatus() {
678                return showDocumentStatus;
679            }
680    
681            public synchronized void setShowDocumentStatus(String showDocumentStatus) {
682                this.showDocumentStatus = showDocumentStatus;
683            }
684    
685            public synchronized  String getShowAppDocStatus() {
686                return showAppDocStatus;
687            }
688    
689            public synchronized void setShowAppDocStatus(String showAppDocStatus) {
690                this.showAppDocStatus = showAppDocStatus;
691            }
692    
693            public synchronized String getShowDocType() {
694                return showDocType;
695            }
696    
697            public synchronized void setShowDocType(String showDocType) {
698                this.showDocType = showDocType;
699            }
700    
701            public synchronized String getShowInitiator() {
702                return showInitiator;
703            }
704    
705            public synchronized void setShowInitiator(String showInitiator) {
706                this.showInitiator = showInitiator;
707            }
708    
709            public synchronized String getShowDocTitle() {
710                return showDocTitle;
711            }
712    
713            public synchronized void setShowDocTitle(String showDocTitle) {
714                this.showDocTitle = showDocTitle;
715            }
716    
717            public synchronized String getShowWorkgroupRequest() {
718                return showWorkgroupRequest;
719            }
720    
721            public synchronized void setShowWorkgroupRequest(String showWorkgroupRequest) {
722                this.showWorkgroupRequest = showWorkgroupRequest;
723            }
724    
725            public synchronized String getShowDelegator() {
726                return showDelegator;
727            }
728    
729            public synchronized void setShowDelegator(String showDelegator) {
730                this.showDelegator = showDelegator;
731            }
732    
733            public synchronized String getShowClearFyi() {
734                return showClearFyi;
735            }
736    
737            public synchronized void setShowClearFyi(String showClearFyi) {
738                this.showClearFyi = showClearFyi;
739            }
740    
741            public synchronized String getPageSize() {
742                return pageSize;
743            }
744    
745            public synchronized void setPageSize(String pageSize) {
746                this.pageSize = pageSize;
747            }
748    
749            public synchronized String getRefreshRate() {
750                return refreshRate;
751            }
752    
753            public synchronized void setRefreshRate(String refreshRate) {
754                this.refreshRate = refreshRate;
755            }
756    
757            public synchronized String getColorSaved() {
758                return colorSaved;
759            }
760    
761            public synchronized void setColorSaved(String colorSaved) {
762                this.colorSaved = colorSaved;
763            }
764    
765            public synchronized String getColorInitiated() {
766                return colorInitiated;
767            }
768    
769            public synchronized void setColorInitiated(String colorInitiated) {
770                this.colorInitiated = colorInitiated;
771            }
772    
773            public synchronized String getColorDisapproved() {
774                return colorDisapproved;
775            }
776    
777            public synchronized void setColorDisapproved(String colorDisapproved) {
778                this.colorDisapproved = colorDisapproved;
779            }
780    
781            public synchronized String getColorEnroute() {
782                return colorEnroute;
783            }
784    
785            public synchronized void setColorEnroute(String colorEnroute) {
786                this.colorEnroute = colorEnroute;
787            }
788    
789            public synchronized String getColorApproved() {
790                return colorApproved;
791            }
792    
793            public synchronized void setColorApproved(String colorApproved) {
794                this.colorApproved = colorApproved;
795            }
796    
797            public synchronized String getColorFinal() {
798                return colorFinal;
799            }
800    
801            public synchronized void setColorFinal(String colorFinal) {
802                this.colorFinal = colorFinal;
803            }
804    
805            public synchronized String getColorDisapproveCancel() {
806                return colorDissapproveCancel;
807            }
808    
809            public synchronized void setColorDissapproveCancel(String colorDissapproveCancel) {
810                this.colorDissapproveCancel = colorDissapproveCancel;
811            }
812    
813            public synchronized String getColorProcessed() {
814                return colorProcessed;
815            }
816    
817            public synchronized void setColorProcessed(String colorProcessed) {
818                this.colorProcessed = colorProcessed;
819            }
820    
821            public synchronized String getColorException() {
822                return colorException;
823            }
824    
825            public synchronized void setColorException(String colorException) {
826                this.colorException = colorException;
827            }
828    
829            public synchronized String getColorCanceled() {
830                return colorCanceled;
831            }
832    
833            public synchronized void setColorCanceled(String colorCanceled) {
834                this.colorCanceled = colorCanceled;
835            }
836    
837            public synchronized String getDelegatorFilter() {
838                return delegatorFilter;
839            }
840    
841            public synchronized void setDelegatorFilter(String delegatorFilter) {
842                this.delegatorFilter = delegatorFilter;
843            }
844    
845            public synchronized String getUseOutbox() {
846                return useOutbox;
847            }
848    
849            public synchronized void setUseOutbox(String useOutbox) {
850                this.useOutbox = useOutbox;
851            }
852    
853            public synchronized String getShowDateApproved() {
854                return showDateApproved;
855            }
856    
857            public synchronized void setShowDateApproved(String showDateApproved) {
858                this.showDateApproved = showDateApproved;
859            }
860    
861            public synchronized String getShowCurrentNode() {
862                return showCurrentNode;
863            }
864    
865            public synchronized void setShowCurrentNode(String showCurrentNode) {
866                this.showCurrentNode = showCurrentNode;
867            }
868    
869            public synchronized String getPrimaryDelegateFilter() {
870                return primaryDelegateFilter;
871            }
872    
873            public synchronized void setPrimaryDelegateFilter(String primaryDelegateFilter) {
874                this.primaryDelegateFilter = primaryDelegateFilter;
875            }
876    
877            public synchronized String getNotifyAcknowledge() {
878                return this.notifyAcknowledge;
879            }
880    
881            public synchronized void setNotifyAcknowledge(String notifyAcknowledge) {
882                this.notifyAcknowledge = notifyAcknowledge;
883            }
884    
885            public synchronized String getNotifyApprove() {
886                return this.notifyApprove;
887            }
888    
889            public synchronized void setNotifyApprove(String notifyApprove) {
890                this.notifyApprove = notifyApprove;
891            }
892    
893            public synchronized String getNotifyComplete() {
894                return this.notifyComplete;
895            }
896    
897            public synchronized void setNotifyComplete(String notifyComplete) {
898                this.notifyComplete = notifyComplete;
899            }
900    
901            public synchronized String getNotifyFYI() {
902                return this.notifyFYI;
903            }
904    
905            public synchronized void setNotifyFYI(String notifyFYI) {
906                this.notifyFYI = notifyFYI;
907            }
908            
909            public synchronized String getDocumentTypeNotificationPreference(String documentType) {
910                String preferenceName = documentType.replace(KewApiConstants.DOCUMENT_TYPE_NOTIFICATION_DELIMITER, ".");
911                String preferenceValue = this.documentTypeNotificationPreferences.get(preferenceName);
912                if(StringUtils.isNotBlank(preferenceValue)) {
913                    return preferenceValue;
914                }
915                return null;
916            }
917            
918            public synchronized void setDocumentTypeNotificationPreference(String documentType, String preference) {   
919                documentType = documentType.replace(KewApiConstants.DOCUMENT_TYPE_NOTIFICATION_DELIMITER, ".");
920                this.documentTypeNotificationPreferences.put(documentType, preference);
921            }
922    
923            public synchronized Map<String, String> getDocumentTypeNotificationPreferences() {
924                if(this.documentTypeNotificationPreferences == null) {
925                    this.documentTypeNotificationPreferences = new HashMap<String, String>();
926                }
927                return this.documentTypeNotificationPreferences;
928            }
929    
930            public synchronized void setDocumentTypeNotificationPreferences(Map<String, String> documentTypeNotificationPreferences) {
931                this.documentTypeNotificationPreferences = documentTypeNotificationPreferences;
932            }
933            
934            public synchronized void addDocumentTypeNotificationPreference(String documentType, String preference) {
935                this.getDocumentTypeNotificationPreferences().put(documentType, preference);
936            }
937            
938            public synchronized void removeDocumentTypeNotificationPreference(String documentType) {
939                this.getDocumentTypeNotificationPreferences().remove(documentType);
940            }
941        }
942    
943        static class Constants {
944            static final String ROOT_ELEMENT_NAME = "preferences";
945            static final String TYPE_NAME = "PreferencesType";
946            static final String PREFERENCES_YES_VAL = "yes";
947        }
948    
949        /**
950         * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML.
951         *
952         */
953        static class Elements {
954    
955            static final String REQUIRES_SAVE = "requiresSave";
956            static final String EMAIL_NOTIFICATION = "emailNotification";
957            static final String NOTIFY_PRIMARY_DELEGATION = "notifyPrimaryDelegation";
958            static final String NOTIFY_SECONDARY_DELEGATION = "notifySecondaryDelegation";
959            static final String OPEN_NEW_WINDOW = "openNewWindow";
960            static final String SHOW_ACTION_REQUESTED = "showActionRequested";
961            static final String SHOW_DATE_CREATED = "showDateCreated";
962            static final String SHOW_DOCUMENT_STATUS = "showDocumentStatus";
963            static final String SHOW_APP_DOC_STATUS = "showAppDocStatus";
964            static final String SHOW_DOC_TYPE = "showDocType";
965            static final String SHOW_INITIATOR = "showInitiator";
966            static final String SHOW_DOC_TITLE = "showDocTitle";
967            static final String SHOW_WORKGROUP_REQUEST = "showWorkgroupRequest";
968            static final String SHOW_DELEGATOR = "showDelegator";
969            static final String SHOW_CLEAR_FYI = "showClearFyi";
970            static final String PAGE_SIZE = "pageSize";
971            static final String REFRESH_RATE = "refreshRate";
972            static final String COLOR_SAVED = "colorSaved";
973            static final String COLOR_INITIATED = "colorInitiated";
974            static final String COLOR_DISAPPROVED = "colorDisapproved";
975            static final String COLOR_ENROUTE = "colorEnroute";
976            static final String COLOR_APPROVED = "colorApproved";
977            static final String COLOR_FINAL = "colorFinal";
978            static final String COLOR_DISAPPROVE_CANCEL = "colorDisapproveCancel";
979            static final String COLOR_PROCESSED = "colorProcessed";
980            static final String COLOR_EXCEPTION = "colorException";
981            static final String COLOR_CANCELED = "colorCanceled";
982            static final String DELEGATOR_FILTER = "delegatorFilter";
983            static final String USE_OUTBOX = "useOutbox";
984            static final String SHOW_DATE_APPROVED = "showDateApproved";
985            static final String SHOW_CURRENT_NODE = "showCurrentNode";
986            static final String PRIMARY_DELEGATE_FILTER = "primaryDelegateFilter";
987            static final String NOTIFY_ACKNOWLEDGE = "notifyAcknowledge";
988            static final String NOTIFY_APPROVE = "notifyApprove";
989            static final String NOTIFY_COMPLETE = "notifyCompelte";
990            static final String NOTIFY_FYI = "notifyFYI";
991            static final String DOCUMENT_TYPE_NOTIFICATION_PREFERENCES = "documentTypeNotificationPreferences";
992            static final String DOCUMENT_TYPE_NOTIFICATION_PREFERENCE_MAP = "documentTypeNotificationPreferenceMap";
993        }
994    
995        public static class KEYS {
996            public static final String COLOR_DISAPPROVED = "DOCUMENT_STATUS_COLOR_D";
997            public static final String COLOR_DISAPPROVE_CANCEL = "DOCUMENT_STATUS_COLOR_C";
998            public static final String COLOR_APPROVED = "DOCUMENT_STATUS_COLOR_A";
999            public static final String COLOR_CANCELED = "DOCUMENT_STATUS_COLOR_X";
1000            public static final String COLOR_SAVED = "DOCUMENT_STATUS_COLOR_S";
1001            public static final String COLOR_ENROUTE = "DOCUMENT_STATUS_COLOR_R";
1002            public static final String COLOR_PROCESSED = "DOCUMENT_STATUS_COLOR_P";
1003            public static final String COLOR_INITIATED = "DOCUMENT_STATUS_COLOR_I";
1004            public static final String COLOR_FINAL = "DOCUMENT_STATUS_COLOR_F";
1005            public static final String COLOR_EXCEPTION = "DOCUMENT_STATUS_COLOR_E";
1006            public static final String REFRESH_RATE = "REFRESH_RATE";
1007            public static final String OPEN_NEW_WINDOW = "OPEN_ITEMS_NEW_WINDOW";
1008            public static final String SHOW_DOC_TYPE = "DOC_TYPE_COL_SHOW_NEW";
1009            public static final String SHOW_DOC_TITLE = "TITLE_COL_SHOW_NEW";
1010            public static final String SHOW_ACTION_REQUESTED = "ACTION_REQUESTED_COL_SHOW_NEW";
1011            public static final String SHOW_INITIATOR = "INITIATOR_COL_SHOW_NEW";
1012            public static final String SHOW_DELEGATOR = "DELEGATOR_COL_SHOW_NEW";
1013            public static final String SHOW_DATE_CREATED = "DATE_CREATED_COL_SHOW_NEW";
1014            public static final String SHOW_DOCUMENT_STATUS = "DOCUMENT_STATUS_COL_SHOW_NEW";
1015            public static final String SHOW_APP_DOC_STATUS = "APP_DOC_STATUS_COL_SHOW_NEW";
1016            public static final String SHOW_GROUP_REQUEST = "WORKGROUP_REQUEST_COL_SHOW_NEW";
1017            public static final String SHOW_CLEAR_FYI = "CLEAR_FYI_COL_SHOW_NEW";
1018            public static final String PAGE_SIZE = "ACTION_LIST_SIZE_NEW";
1019            public static final String EMAIL_NOTIFICATION = "EMAIL_NOTIFICATION";
1020            public static final String NOTIFY_PRIMARY_DELEGATION = "EMAIL_NOTIFY_PRIMARY";
1021            public static final String NOTIFY_SECONDARY_DELEGATION = "EMAIL_NOTIFY_SECONDARY";
1022            public static final String DEFAULT_COLOR = "white";
1023            public static final String DEFAULT_ACTION_LIST_SIZE = "10";
1024            public static final String DEFAULT_REFRESH_RATE = "15";
1025            public static final String ERR_KEY_REFRESH_RATE_WHOLE_NUM = "preferences.refreshRate";
1026            public static final String ERR_KEY_ACTION_LIST_PAGE_SIZE_WHOLE_NUM = "preferences.pageSize";
1027            public static final String DELEGATOR_FILTER = "DELEGATOR_FILTER";
1028            public static final String PRIMARY_DELEGATE_FILTER = "PRIMARY_DELEGATE_FILTER";
1029            public static final String USE_OUT_BOX = "USE_OUT_BOX";
1030            public static final String SHOW_DATE_APPROVED = "LAST_APPROVED_DATE_COL_SHOW_NEW";
1031            public static final String SHOW_CURRENT_NODE = "CURRENT_NODE_COL_SHOW_NEW";
1032            public static final String NOTIFY_ACKNOWLEDGE = "NOTIFY_ACKNOWLEDGE";
1033            public static final String NOTIFY_APPROVE = "NOTIFY_APPROVE";
1034            public static final String NOTIFY_COMPLETE = "NOTIFY_COMPLETE";
1035            public static final String NOTIFY_FYI = "NOTIFY_FYI";
1036            public static final String DOCUMENT_TYPE_NOTIFICATION_PREFERENCES = "DOCUMENT_TYPE_NOTIFICATION_PREFERENCES";
1037        }
1038    
1039        public static class Cache {
1040            public static final String NAME = KewApiConstants.Namespaces.KEW_NAMESPACE_2_0 + "/" + Preferences.Constants.TYPE_NAME;
1041        }
1042    
1043    }