001 /* 002 * JBoss DNA (http://www.jboss.org/dna) 003 * See the COPYRIGHT.txt file distributed with this work for information 004 * regarding copyright ownership. Some portions may be licensed 005 * to Red Hat, Inc. under one or more contributor license agreements. 006 * See the AUTHORS.txt file in the distribution for a full listing of 007 * individual contributors. 008 * 009 * JBoss DNA is free software. Unless otherwise indicated, all code in JBoss DNA 010 * is licensed to you under the terms of the GNU Lesser General Public License as 011 * published by the Free Software Foundation; either version 2.1 of 012 * the License, or (at your option) any later version. 013 * 014 * JBoss DNA is distributed in the hope that it will be useful, 015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 017 * Lesser General Public License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this software; if not, write to the Free 021 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 022 * 02110-1301 USA, or see the FSF site: http://www.fsf.org. 023 */ 024 package org.jboss.dna.graph.property.basic; 025 026 import java.io.File; 027 import java.io.IOException; 028 import java.io.InputStream; 029 import java.io.Reader; 030 import java.io.UnsupportedEncodingException; 031 import java.math.BigDecimal; 032 import java.net.URI; 033 import java.util.Calendar; 034 import java.util.Date; 035 import java.util.UUID; 036 import net.jcip.annotations.Immutable; 037 import org.jboss.dna.common.text.TextDecoder; 038 import org.jboss.dna.common.util.IoUtil; 039 import org.jboss.dna.graph.GraphI18n; 040 import org.jboss.dna.graph.property.Binary; 041 import org.jboss.dna.graph.property.BinaryFactory; 042 import org.jboss.dna.graph.property.DateTime; 043 import org.jboss.dna.graph.property.IoException; 044 import org.jboss.dna.graph.property.Name; 045 import org.jboss.dna.graph.property.Path; 046 import org.jboss.dna.graph.property.PropertyType; 047 import org.jboss.dna.graph.property.Reference; 048 import org.jboss.dna.graph.property.ValueFactory; 049 import org.jboss.dna.graph.property.ValueFormatException; 050 051 /** 052 * An abstract {@link BinaryFactory} implementation that contains many general methods that are likely to be appropriate for many 053 * concrete implementations. 054 * 055 * @author Randall Hauch 056 * @author John Verhaeg 057 */ 058 @Immutable 059 public abstract class AbstractBinaryValueFactory extends AbstractValueFactory<Binary> implements BinaryFactory { 060 061 private static final String CHAR_SET_NAME = "UTF-8"; 062 063 protected AbstractBinaryValueFactory( TextDecoder decoder, 064 ValueFactory<String> stringValueFactory ) { 065 super(PropertyType.BINARY, decoder, stringValueFactory); 066 } 067 068 /** 069 * {@inheritDoc} 070 */ 071 public Binary create( String value ) { 072 if (value == null) return null; 073 try { 074 return create(value.getBytes(CHAR_SET_NAME)); 075 } catch (UnsupportedEncodingException err) { 076 throw new ValueFormatException(value, getPropertyType(), 077 GraphI18n.errorConvertingType.text(String.class.getSimpleName(), 078 Binary.class.getSimpleName(), 079 value), err); 080 } 081 } 082 083 /** 084 * {@inheritDoc} 085 */ 086 public Binary create( String value, 087 TextDecoder decoder ) { 088 if (value == null) return null; 089 return create(getDecoder(decoder).decode(value)); 090 } 091 092 /** 093 * {@inheritDoc} 094 */ 095 public Binary create( int value ) { 096 // Convert the value to a string, then to a binary ... 097 return create(this.getStringValueFactory().create(value)); 098 } 099 100 /** 101 * {@inheritDoc} 102 */ 103 public Binary create( long value ) { 104 // Convert the value to a string, then to a binary ... 105 return create(this.getStringValueFactory().create(value)); 106 } 107 108 /** 109 * {@inheritDoc} 110 */ 111 public Binary create( boolean value ) { 112 // Convert the value to a string, then to a binary ... 113 return create(this.getStringValueFactory().create(value)); 114 } 115 116 /** 117 * {@inheritDoc} 118 */ 119 public Binary create( float value ) { 120 // Convert the value to a string, then to a binary ... 121 return create(this.getStringValueFactory().create(value)); 122 } 123 124 /** 125 * {@inheritDoc} 126 */ 127 public Binary create( double value ) { 128 // Convert the value to a string, then to a binary ... 129 return create(this.getStringValueFactory().create(value)); 130 } 131 132 /** 133 * {@inheritDoc} 134 */ 135 public Binary create( BigDecimal value ) { 136 // Convert the value to a string, then to a binary ... 137 return create(this.getStringValueFactory().create(value)); 138 } 139 140 /** 141 * {@inheritDoc} 142 */ 143 public Binary create( Calendar value ) { 144 // Convert the value to a string, then to a binary ... 145 return create(this.getStringValueFactory().create(value)); 146 } 147 148 /** 149 * {@inheritDoc} 150 */ 151 public Binary create( Date value ) { 152 // Convert the value to a string, then to a binary ... 153 return create(this.getStringValueFactory().create(value)); 154 } 155 156 /** 157 * {@inheritDoc} 158 * 159 * @see org.jboss.dna.graph.property.ValueFactory#create(org.jboss.dna.graph.property.DateTime) 160 */ 161 public Binary create( DateTime value ) throws ValueFormatException { 162 // Convert the value to a string, then to a binary ... 163 return create(this.getStringValueFactory().create(value)); 164 } 165 166 /** 167 * {@inheritDoc} 168 */ 169 public Binary create( Name value ) { 170 // Convert the value to a string, then to a binary ... 171 return create(this.getStringValueFactory().create(value)); 172 } 173 174 /** 175 * {@inheritDoc} 176 */ 177 public Binary create( Path value ) { 178 // Convert the value to a string, then to a binary ... 179 return create(this.getStringValueFactory().create(value)); 180 } 181 182 /** 183 * {@inheritDoc} 184 */ 185 public Binary create( Reference value ) { 186 // Convert the value to a string, then to a binary ... 187 return create(this.getStringValueFactory().create(value)); 188 } 189 190 /** 191 * {@inheritDoc} 192 */ 193 public Binary create( URI value ) { 194 // Convert the value to a string, then to a binary ... 195 return create(this.getStringValueFactory().create(value)); 196 } 197 198 /** 199 * {@inheritDoc} 200 * 201 * @see org.jboss.dna.graph.property.ValueFactory#create(java.util.UUID) 202 */ 203 public Binary create( UUID value ) { 204 // Convert the value to a string, then to a binary ... 205 return create(this.getStringValueFactory().create(value)); 206 } 207 208 /** 209 * {@inheritDoc} 210 * 211 * @see org.jboss.dna.graph.property.ValueFactory#create(org.jboss.dna.graph.property.Binary) 212 */ 213 public Binary create( Binary value ) throws ValueFormatException, IoException { 214 return value; 215 } 216 217 /** 218 * {@inheritDoc} 219 */ 220 public Binary create( InputStream stream, 221 long approximateLength ) throws IoException { 222 if (stream == null) return null; 223 try { 224 byte[] value = IoUtil.readBytes(stream); 225 return create(value); 226 } catch (IOException err) { 227 throw new IoException(GraphI18n.errorConvertingIo.text(InputStream.class.getSimpleName(), 228 Binary.class.getSimpleName()), err); 229 } 230 } 231 232 /** 233 * {@inheritDoc} 234 */ 235 public Binary create( Reader reader, 236 long approximateLength ) throws IoException { 237 if (reader == null) return null; 238 // Convert the value to a string, then to a binary ... 239 try { 240 String value = IoUtil.read(reader); 241 return create(this.getStringValueFactory().create(value)); 242 } catch (IOException err) { 243 throw new IoException(GraphI18n.errorConvertingIo.text(Reader.class.getSimpleName(), Binary.class.getSimpleName()), 244 err); 245 } 246 } 247 248 /** 249 * {@inheritDoc} 250 * 251 * @see org.jboss.dna.graph.property.BinaryFactory#create(java.io.File) 252 */ 253 public Binary create( File file ) throws ValueFormatException, IoException { 254 if (file == null) return null; 255 if (!file.canRead()) return null; 256 if (!file.isFile()) return null; 257 try { 258 byte[] value = IoUtil.readBytes(file); 259 return create(value); 260 } catch (IOException err) { 261 throw new IoException(GraphI18n.errorConvertingIo.text(file, Binary.class.getSimpleName()), err); 262 } 263 } 264 265 /** 266 * {@inheritDoc} 267 * <p> 268 * This implementation does not manage or share the in-memory binary values, so this implementation is identical to calling 269 * {@link #create(Reader, long)}. 270 * </p> 271 * 272 * @see org.jboss.dna.graph.property.BinaryFactory#create(java.io.Reader, long, byte[]) 273 */ 274 public Binary create( Reader reader, 275 long approximateLength, 276 byte[] secureHash ) throws ValueFormatException, IoException { 277 return create(reader, approximateLength); 278 } 279 280 /** 281 * {@inheritDoc} 282 * <p> 283 * This implementation does not manage or share the in-memory binary values, so this implementation is identical to calling 284 * {@link #create(InputStream, long)}. 285 * </p> 286 * 287 * @see org.jboss.dna.graph.property.BinaryFactory#create(java.io.InputStream, long, byte[]) 288 */ 289 public Binary create( InputStream stream, 290 long approximateLength, 291 byte[] secureHash ) throws ValueFormatException, IoException { 292 return create(stream, approximateLength); 293 } 294 295 /** 296 * {@inheritDoc} 297 * <p> 298 * This method always returns null, since the in-memory binary values are not managed or shared. 299 * </p> 300 * 301 * @see org.jboss.dna.graph.property.BinaryFactory#find(byte[]) 302 */ 303 public Binary find( byte[] secureHash ) { 304 return null; 305 } 306 307 /** 308 * {@inheritDoc} 309 */ 310 @Override 311 protected Binary[] createEmptyArray( int length ) { 312 return new Binary[length]; 313 } 314 }