1 /**
2 * Copyright 2005-2012 The Kuali Foundation
3 *
4 * Licensed under the Educational Community License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.opensource.org/licenses/ecl2.php
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 package org.kuali.rice.kew.api.document.attribute;
17
18 import org.joda.time.DateTime;
19
20 import java.math.BigDecimal;
21 import java.math.BigInteger;
22 import java.util.Calendar;
23 import java.util.Date;
24
25 /**
26 * A factory that helps with creation of new {@link DocumentAttribute} instances as well as translation to concrete
27 * instances from a {@link DocumentAttributeContract}
28 *
29 * @author Kuali Rice Team (rice.collab@kuali.org)
30 */
31 public class DocumentAttributeFactory {
32
33 /**
34 * Constructs a document attribute containing character data from the given attribute name and {@link String} value.
35 *
36 * @param name the name of the attribute to construct, must not be a null or blank value
37 * @param value the value of the attribute as a {@code String}
38 *
39 * @return a constructed {@code DocumentAttributeString} representing the document attribute
40 *
41 * @throws IllegalArgumentException if name is a null or blank value
42 */
43 public static DocumentAttributeString createStringAttribute(String name, String value) {
44 DocumentAttributeString.Builder builder = DocumentAttributeString.Builder.create(name);
45 builder.setValue(value);
46 return builder.build();
47 }
48
49 /**
50 * Constructs a document attribute containing date/time data from the given attribute name and {@link DateTime}
51 * object.
52 *
53 * @param name the name of the attribute to construct, must not be a null or blank value
54 * @param value the value of the attribute as a {@code DateTime}
55 *
56 * @return a constructed {@code DocumentAttributeDateTime} representing the document attribute
57 *
58 * @throws IllegalArgumentException if name is a null or blank value
59 */
60 public static DocumentAttributeDateTime createDateTimeAttribute(String name, DateTime value) {
61 DocumentAttributeDateTime.Builder builder = DocumentAttributeDateTime.Builder.create(name);
62 builder.setValue(value);
63 return builder.build();
64 }
65
66 /**
67 * Constructs a document attribute containing date/time data from the given attribute name and {@link Date} object.
68 *
69 * @param name the name of the attribute to construct, must not be a null or blank value
70 * @param value the value of the attribute as a {@code Date}
71 *
72 * @return a constructed {@code DocumentAttributeDateTime} representing the document attribute
73 *
74 * @throws IllegalArgumentException if name is a null or blank value
75 */
76 public static DocumentAttributeDateTime createDateTimeAttribute(String name, Date value) {
77 return createDateTimeAttribute(name, new DateTime(value));
78 }
79
80 /**
81 * Constructs a document attribute containing date/time data from the given attribute name and a numeric long
82 * representing the number of milliseconds from 1970-01-01T00:00:00Z in the default time zone.
83 *
84 * @param name the name of the attribute to construct, must not be a null or blank value
85 * @param instant the instant value represented as milliseconds from 1970-01-01T00:00:00Z
86 *
87 * @return a constructed {@code DocumentAttributeDateTime} representing the document attribute
88 *
89 * @throws IllegalArgumentException if name is a null or blank value
90 */
91 public static DocumentAttributeDateTime createDateTimeAttribute(String name, long instant) {
92 return createDateTimeAttribute(name, new DateTime(instant));
93 }
94
95 /**
96 * Constructs a document attribute containing date/time data from the given attribute name and {@link Calendar}
97 * object.
98 *
99 * @param name the name of the attribute to construct, must not be a null or blank value
100 * @param value the value of the attribute as a {@code Calendar}
101 *
102 * @return a constructed {@code DocumentAttributeDateTime} representing the document attribute
103 *
104 * @throws IllegalArgumentException if name is a null or blank value
105 */
106 public static DocumentAttributeDateTime createDateTimeAttribute(String name, Calendar value) {
107 return createDateTimeAttribute(name, new DateTime(value));
108 }
109
110 /**
111 * Constructs a document attribute containing real number data from the given attribute name and {@link BigDecimal}
112 * object.
113 *
114 * @param name the name of the attribute to construct, must not be a null or blank value
115 * @param value the value of the attribute as a {@code BigDecimal}
116 *
117 * @return a constructed {@code DocumentAttributeDecimal} representing the document attribute
118 *
119 * @throws IllegalArgumentException if name is a null or blank value
120 */
121 public static DocumentAttributeDecimal createDecimalAttribute(String name, BigDecimal value) {
122 DocumentAttributeDecimal.Builder builder = DocumentAttributeDecimal.Builder.create(name);
123 builder.setValue(value);
124 return builder.build();
125 }
126
127 /**
128 * Constructs a document attribute containing real number data from the given attribute name and {@link Number}
129 * object. The given number is first translated to a {@code BigDecimal} using {@link Number#doubleValue()}.
130 *
131 * @param name the name of the attribute to construct, must not be a null or blank value
132 * @param value the value of the attribute as a {@code Number}
133 *
134 * @return a constructed {@code DocumentAttributeDecimal} representing the document attribute
135 *
136 * @throws IllegalArgumentException if name is a null or blank value
137 */
138 public static DocumentAttributeDecimal createDecimalAttribute(String name, Number value) {
139 return createDecimalAttribute(name, BigDecimal.valueOf(value.doubleValue()));
140 }
141
142 /**
143 * Constructs a document attribute containing integer number data from the given attribute name and
144 * {@link BigInteger} object.
145 *
146 * @param name the name of the attribute to construct, must not be a null or blank value
147 * @param value the value of the attribute as a {@code BigInteger}
148 *
149 * @return a constructed {@code DocumentAttributeInteger} representing the document attribute
150 *
151 * @throws IllegalArgumentException if name is a null or blank value
152 */
153 public static DocumentAttributeInteger createIntegerAttribute(String name, BigInteger value) {
154 DocumentAttributeInteger.Builder builder = DocumentAttributeInteger.Builder.create(name);
155 builder.setValue(value);
156 return builder.build();
157 }
158
159 /**
160 * Constructs a document attribute containing integer number data from the given attribute name and {@link Number}
161 * object. The given number is first translated to a {@code BigInteger} using {@link Number#longValue()}.
162 *
163 * @param name the name of the attribute to construct, must not be a null or blank value
164 * @param value the value of the attribute as a {@code Number}
165 *
166 * @return a constructed {@code DocumentAttributeInteger} representing the document attribute
167 *
168 * @throws IllegalArgumentException if name is a null or blank value
169 */
170 public static DocumentAttributeInteger createIntegerAttribute(String name, Number value) {
171 return createIntegerAttribute(name, BigInteger.valueOf(value.longValue()));
172 }
173
174 /**
175 * Loads the given {@link DocumentAttributeContract} into the appropriate builder instance based on the type of the
176 * given contract implementation.
177 *
178 * @param contract the contract to load into a builder
179 * @return an implementation of {@link DocumentAttribute.AbstractBuilder} which handles instance of the given
180 * contract
181 *
182 * @throws IllegalArgumentException if the given contract is null
183 * @throws IllegalArgumentException if a builder implementation could not be determined into which to load the given
184 * contract implementation
185 */
186 public static DocumentAttribute.AbstractBuilder<?> loadContractIntoBuilder(DocumentAttributeContract contract) {
187 if (contract == null) {
188 throw new IllegalArgumentException("contract was null");
189 }
190 if (contract instanceof DocumentAttributeString) {
191 DocumentAttributeString attribute = (DocumentAttributeString)contract;
192 DocumentAttributeString.Builder builder = DocumentAttributeString.Builder.create(attribute.getName());
193 builder.setValue(attribute.getValue());
194 return builder;
195 } else if (contract instanceof DocumentAttributeDateTime) {
196 DocumentAttributeDateTime attribute = (DocumentAttributeDateTime)contract;
197 DocumentAttributeDateTime.Builder builder = DocumentAttributeDateTime.Builder.create(attribute.getName());
198 builder.setValue(attribute.getValue());
199 return builder;
200 } else if (contract instanceof DocumentAttributeInteger) {
201 DocumentAttributeInteger attribute = (DocumentAttributeInteger)contract;
202 DocumentAttributeInteger.Builder builder = DocumentAttributeInteger.Builder.create(attribute.getName());
203 builder.setValue(attribute.getValue());
204 return builder;
205 } else if (contract instanceof DocumentAttributeDecimal) {
206 DocumentAttributeDecimal attribute = (DocumentAttributeDecimal)contract;
207 DocumentAttributeDecimal.Builder builder = DocumentAttributeDecimal.Builder.create(attribute.getName());
208 builder.setValue(attribute.getValue());
209 return builder;
210 }
211 throw new IllegalArgumentException("Given document attribute class could not be converted: " + contract.getClass());
212 }
213
214
215 }