001    /*
002     * JBoss, Home of Professional Open Source.
003     * Copyright 2008, Red Hat Middleware LLC, and individual contributors
004     * as indicated by the @author tags. See the copyright.txt file in the
005     * distribution for a full listing of individual contributors. 
006     *
007     * This is free software; you can redistribute it and/or modify it
008     * under the terms of the GNU Lesser General Public License as
009     * published by the Free Software Foundation; either version 2.1 of
010     * the License, or (at your option) any later version.
011     *
012     * This software is distributed in the hope that it will be useful,
013     * but WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015     * Lesser General Public License for more details.
016     *
017     * You should have received a copy of the GNU Lesser General Public
018     * License along with this software; if not, write to the Free
019     * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020     * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021     */
022    package org.jboss.dna.graph.properties.basic;
023    
024    import java.io.IOException;
025    import java.io.InputStream;
026    import java.io.Reader;
027    import java.io.UnsupportedEncodingException;
028    import java.math.BigDecimal;
029    import java.net.URI;
030    import java.util.Calendar;
031    import java.util.Date;
032    import java.util.UUID;
033    import net.jcip.annotations.Immutable;
034    import org.jboss.dna.common.text.TextDecoder;
035    import org.jboss.dna.common.util.IoUtil;
036    import org.jboss.dna.graph.GraphI18n;
037    import org.jboss.dna.graph.properties.Binary;
038    import org.jboss.dna.graph.properties.DateTime;
039    import org.jboss.dna.graph.properties.IoException;
040    import org.jboss.dna.graph.properties.Name;
041    import org.jboss.dna.graph.properties.Path;
042    import org.jboss.dna.graph.properties.PropertyType;
043    import org.jboss.dna.graph.properties.Reference;
044    import org.jboss.dna.graph.properties.ValueFactory;
045    import org.jboss.dna.graph.properties.ValueFormatException;
046    
047    /**
048     * Teh standard {@link ValueFactory} for {@link PropertyType#BINARY} values.
049     * 
050     * @author Randall Hauch
051     * @author John Verhaeg
052     */
053    @Immutable
054    public class InMemoryBinaryValueFactory extends AbstractValueFactory<Binary> {
055    
056        private static final String CHAR_SET_NAME = "UTF-8";
057    
058        public InMemoryBinaryValueFactory( TextDecoder decoder,
059                                           ValueFactory<String> stringValueFactory ) {
060            super(PropertyType.BINARY, decoder, stringValueFactory);
061        }
062    
063        /**
064         * {@inheritDoc}
065         */
066        public Binary create( String value ) {
067            if (value == null) return null;
068            try {
069                return create(value.getBytes(CHAR_SET_NAME));
070            } catch (UnsupportedEncodingException err) {
071                throw new ValueFormatException(value, getPropertyType(),
072                                               GraphI18n.errorConvertingType.text(String.class.getSimpleName(),
073                                                                                Binary.class.getSimpleName(),
074                                                                                value), err);
075            }
076        }
077    
078        /**
079         * {@inheritDoc}
080         */
081        public Binary create( String value,
082                              TextDecoder decoder ) {
083            if (value == null) return null;
084            return create(getDecoder(decoder).decode(value));
085        }
086    
087        /**
088         * {@inheritDoc}
089         */
090        public Binary create( int value ) {
091            // Convert the value to a string, then to a binary ...
092            return create(this.getStringValueFactory().create(value));
093        }
094    
095        /**
096         * {@inheritDoc}
097         */
098        public Binary create( long value ) {
099            // Convert the value to a string, then to a binary ...
100            return create(this.getStringValueFactory().create(value));
101        }
102    
103        /**
104         * {@inheritDoc}
105         */
106        public Binary create( boolean value ) {
107            // Convert the value to a string, then to a binary ...
108            return create(this.getStringValueFactory().create(value));
109        }
110    
111        /**
112         * {@inheritDoc}
113         */
114        public Binary create( float value ) {
115            // Convert the value to a string, then to a binary ...
116            return create(this.getStringValueFactory().create(value));
117        }
118    
119        /**
120         * {@inheritDoc}
121         */
122        public Binary create( double value ) {
123            // Convert the value to a string, then to a binary ...
124            return create(this.getStringValueFactory().create(value));
125        }
126    
127        /**
128         * {@inheritDoc}
129         */
130        public Binary create( BigDecimal value ) {
131            // Convert the value to a string, then to a binary ...
132            return create(this.getStringValueFactory().create(value));
133        }
134    
135        /**
136         * {@inheritDoc}
137         */
138        public Binary create( Calendar value ) {
139            // Convert the value to a string, then to a binary ...
140            return create(this.getStringValueFactory().create(value));
141        }
142    
143        /**
144         * {@inheritDoc}
145         */
146        public Binary create( Date value ) {
147            // Convert the value to a string, then to a binary ...
148            return create(this.getStringValueFactory().create(value));
149        }
150    
151        /**
152         * {@inheritDoc}
153         * 
154         * @see org.jboss.dna.graph.properties.ValueFactory#create(org.jboss.dna.graph.properties.DateTime)
155         */
156        public Binary create( DateTime value ) throws ValueFormatException {
157            // Convert the value to a string, then to a binary ...
158            return create(this.getStringValueFactory().create(value));
159        }
160    
161        /**
162         * {@inheritDoc}
163         */
164        public Binary create( Name value ) {
165            // Convert the value to a string, then to a binary ...
166            return create(this.getStringValueFactory().create(value));
167        }
168    
169        /**
170         * {@inheritDoc}
171         */
172        public Binary create( Path value ) {
173            // Convert the value to a string, then to a binary ...
174            return create(this.getStringValueFactory().create(value));
175        }
176    
177        /**
178         * {@inheritDoc}
179         */
180        public Binary create( Reference value ) {
181            // Convert the value to a string, then to a binary ...
182            return create(this.getStringValueFactory().create(value));
183        }
184    
185        /**
186         * {@inheritDoc}
187         */
188        public Binary create( URI value ) {
189            // Convert the value to a string, then to a binary ...
190            return create(this.getStringValueFactory().create(value));
191        }
192    
193        /**
194         * {@inheritDoc}
195         * 
196         * @see org.jboss.dna.graph.properties.ValueFactory#create(java.util.UUID)
197         */
198        public Binary create( UUID value ) {
199            // Convert the value to a string, then to a binary ...
200            return create(this.getStringValueFactory().create(value));
201        }
202    
203        /**
204         * {@inheritDoc}
205         */
206        public Binary create( byte[] value ) {
207            return new InMemoryBinary(value);
208        }
209    
210        /**
211         * {@inheritDoc}
212         * 
213         * @see org.jboss.dna.graph.properties.ValueFactory#create(org.jboss.dna.graph.properties.Binary)
214         */
215        public Binary create( Binary value ) throws ValueFormatException, IoException {
216            return value;
217        }
218    
219        /**
220         * {@inheritDoc}
221         */
222        public Binary create( InputStream stream,
223                              long approximateLength ) throws IoException {
224            if (stream == null) return null;
225            try {
226                byte[] value = IoUtil.readBytes(stream);
227                return create(value);
228            } catch (IOException err) {
229                throw new IoException(
230                                      GraphI18n.errorConvertingIo.text(InputStream.class.getSimpleName(), Binary.class.getSimpleName()),
231                                      err);
232            }
233        }
234    
235        /**
236         * {@inheritDoc}
237         */
238        public Binary create( Reader reader,
239                              long approximateLength ) throws IoException {
240            if (reader == null) return null;
241            // Convert the value to a string, then to a binary ...
242            try {
243                String value = IoUtil.read(reader);
244                return create(this.getStringValueFactory().create(value));
245            } catch (IOException err) {
246                throw new IoException(GraphI18n.errorConvertingIo.text(Reader.class.getSimpleName(), Binary.class.getSimpleName()), err);
247            }
248        }
249    
250        /**
251         * {@inheritDoc}
252         */
253        @Override
254        protected Binary[] createEmptyArray( int length ) {
255            return new Binary[length];
256        }
257    }