1 /** 2 * Copyright 2005-2011 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 }