View Javadoc

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 }