001/**
002 * Copyright 2005-2016 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.rice.kew.api.preferences;
017
018import java.io.Serializable;
019import java.util.Collection;
020import java.util.Collections;
021import java.util.HashMap;
022import java.util.Map;
023
024import javax.xml.bind.annotation.XmlAccessType;
025import javax.xml.bind.annotation.XmlAccessorType;
026import javax.xml.bind.annotation.XmlAnyElement;
027import javax.xml.bind.annotation.XmlElement;
028import javax.xml.bind.annotation.XmlRootElement;
029import javax.xml.bind.annotation.XmlType;
030import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
031
032import org.apache.commons.lang.StringUtils;
033import org.kuali.rice.core.api.CoreConstants;
034import org.kuali.rice.core.api.mo.AbstractDataTransferObject;
035import org.kuali.rice.core.api.mo.ModelBuilder;
036import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter;
037import org.kuali.rice.core.api.util.jaxb.MultiValuedStringMapAdapter;
038import org.kuali.rice.kew.api.KewApiConstants;
039import 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})
094public 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}