001 /** 002 * Copyright 2005-2011 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.document; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.kuali.rice.core.api.CoreConstants; 020 import org.kuali.rice.core.api.mo.AbstractDataTransferObject; 021 import org.kuali.rice.core.api.mo.ModelBuilder; 022 import org.kuali.rice.core.api.util.jaxb.MapStringStringAdapter; 023 import org.kuali.rice.kew.api.KewApiConstants; 024 import org.w3c.dom.Element; 025 026 import javax.xml.bind.annotation.XmlAccessType; 027 import javax.xml.bind.annotation.XmlAccessorType; 028 import javax.xml.bind.annotation.XmlAnyElement; 029 import javax.xml.bind.annotation.XmlElement; 030 import javax.xml.bind.annotation.XmlRootElement; 031 import javax.xml.bind.annotation.XmlType; 032 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 033 import java.io.Serializable; 034 import java.util.Collection; 035 import java.util.Collections; 036 import java.util.HashMap; 037 import java.util.Map; 038 039 /** 040 * Defines an update to document content on a particular workflow document. 041 * Contains general application content as well as a list of attribute 042 * definitions and searchable definitions. When passed to the appropriate 043 * workflow services to perform an update on document content, if any of the 044 * internal content or definitions on this object have not been set then they 045 * will not be updated. This allows for this data structure to be used to only 046 * update the portion of the document content that is desired to be updated. 047 * 048 * @author Kuali Rice Team (rice.collab@kuali.org) 049 * 050 */ 051 @XmlRootElement(name = DocumentUpdate.Constants.ROOT_ELEMENT_NAME) 052 @XmlAccessorType(XmlAccessType.NONE) 053 @XmlType(name = DocumentUpdate.Constants.TYPE_NAME, propOrder = { 054 DocumentUpdate.Elements.TITLE, 055 DocumentUpdate.Elements.APPLICATION_DOCUMENT_ID, 056 DocumentUpdate.Elements.APPLICATION_DOCUMENT_STATUS, 057 DocumentUpdate.Elements.VARIABLES, 058 CoreConstants.CommonElements.FUTURE_ELEMENTS 059 }) 060 public final class DocumentUpdate extends AbstractDataTransferObject { 061 062 private static final long serialVersionUID = 608839901744771499L; 063 064 @XmlElement(name = Elements.TITLE, required = false) 065 private final String title; 066 067 @XmlElement(name = Elements.APPLICATION_DOCUMENT_ID, required = false) 068 private final String applicationDocumentId; 069 070 @XmlElement(name = Elements.APPLICATION_DOCUMENT_STATUS, required = false) 071 private final String applicationDocumentStatus; 072 073 @XmlElement(name = Elements.VARIABLES, required = false) 074 @XmlJavaTypeAdapter(MapStringStringAdapter.class) 075 private final Map<String, String> variables; 076 077 @SuppressWarnings("unused") 078 @XmlAnyElement 079 private final Collection<Element> _futureElements = null; 080 081 private DocumentUpdate() { 082 this.title = null; 083 this.applicationDocumentId = null; 084 this.applicationDocumentStatus = null; 085 this.variables = null; 086 } 087 088 private DocumentUpdate(Builder builder) { 089 this.title = builder.getTitle(); 090 this.applicationDocumentId = builder.getApplicationDocumentId(); 091 this.applicationDocumentStatus = builder.getApplicationDocumentStatus(); 092 this.variables = builder.getVariables(); 093 } 094 095 public String getTitle() { 096 return title; 097 } 098 099 public String getApplicationDocumentId() { 100 return applicationDocumentId; 101 } 102 103 public String getApplicationDocumentStatus() { 104 return applicationDocumentStatus; 105 } 106 107 public Map<String, String> getVariables() { 108 if (variables == null) { 109 return Collections.emptyMap(); 110 } 111 return Collections.unmodifiableMap(variables); 112 } 113 114 /** 115 * A builder which can be used to construct {@link DocumentUpdate} instances. 116 */ 117 public final static class Builder implements Serializable, ModelBuilder { 118 119 private static final long serialVersionUID = 2220000561051177421L; 120 121 private String title; 122 private String applicationDocumentId; 123 private String applicationDocumentStatus; 124 private Map<String, String> variables; 125 126 127 private Builder() { 128 this.title = ""; 129 this.variables = new HashMap<String, String>(); 130 } 131 132 public static Builder create() { 133 return new Builder(); 134 } 135 136 public static Builder create(Document document) { 137 if (document == null) { 138 throw new IllegalArgumentException("document was null"); 139 } 140 Builder builder = create(); 141 builder.setTitle(document.getTitle()); 142 builder.setApplicationDocumentId(document.getApplicationDocumentId()); 143 builder.setApplicationDocumentStatus(document.getApplicationDocumentStatus()); 144 builder.setVariables(document.getVariables()); 145 return builder; 146 } 147 148 public DocumentUpdate build() { 149 return new DocumentUpdate(this); 150 } 151 152 public String getTitle() { 153 return title; 154 } 155 156 /** 157 * TODO: document the fact that this will auto-truncate the title... 158 */ 159 public void setTitle(String title) { 160 if (title == null) { 161 title = ""; 162 } 163 if (title.length() > KewApiConstants.TITLE_MAX_LENGTH) { 164 title = title.substring(0, KewApiConstants.TITLE_MAX_LENGTH); 165 } 166 this.title = title; 167 } 168 169 public String getApplicationDocumentId() { 170 return applicationDocumentId; 171 } 172 173 public void setApplicationDocumentId(String applicationDocumentId) { 174 this.applicationDocumentId = applicationDocumentId; 175 } 176 177 public String getApplicationDocumentStatus() { 178 return applicationDocumentStatus; 179 } 180 181 public void setApplicationDocumentStatus(String applicationDocumentStatus) { 182 this.applicationDocumentStatus = applicationDocumentStatus; 183 } 184 185 public void setVariables(Map<String, String> variables) { 186 if (variables == null) { 187 this.variables = new HashMap<String, String>(); 188 } else { 189 this.variables = new HashMap<String, String>(variables); 190 } 191 } 192 193 public Map<String, String> getVariables() { 194 return variables; 195 } 196 197 public String getVariableValue(String name) { 198 return variables.get(name); 199 } 200 201 public void setVariable(String name, String value) { 202 if (StringUtils.isBlank(name)) { 203 throw new IllegalArgumentException("name was null or blank"); 204 } 205 variables.put(name, value); 206 } 207 208 } 209 210 /** 211 * Defines some internal constants used on this class. 212 */ 213 static class Constants { 214 final static String ROOT_ELEMENT_NAME = "documentUpdate"; 215 final static String TYPE_NAME = "DocumentUpdateType"; 216 } 217 218 /** 219 * A private class which exposes constants which define the XML element names to use when this object is marshalled to XML. 220 */ 221 static class Elements { 222 final static String TITLE = "title"; 223 final static String APPLICATION_DOCUMENT_ID = "applicationDocumentId"; 224 final static String APPLICATION_DOCUMENT_STATUS = "applicationDocumentStatus"; 225 final static String VARIABLES = "variables"; 226 } 227 228 }