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.util.Iterator;
025 import org.jboss.dna.common.util.CheckArg;
026 import org.jboss.dna.graph.properties.PropertyType;
027 import org.jboss.dna.graph.properties.ValueFactories;
028 import org.jboss.dna.graph.properties.ValueFactory;
029
030 /**
031 * Abstract implementation of {@link ValueFactories} that implements all the methods other than the <code>get*Factory()</code>
032 * methods. Subclasses can simply implement these methods and inherit the {@link #iterator()}, {@link #getValueFactory(Object)}
033 * and {@link #getValueFactory(PropertyType)} method implementations.
034 *
035 * @author Randall Hauch
036 */
037 public abstract class AbstractValueFactories implements ValueFactories {
038
039 /**
040 * <p>
041 * {@inheritDoc}
042 * </p>
043 * <p>
044 * This implementation always iterates over the instances return by the <code>get*Factory()</code> methods.
045 * </p>
046 */
047 public Iterator<ValueFactory<?>> iterator() {
048 return new ValueFactoryIterator();
049 }
050
051 /**
052 * {@inheritDoc}
053 */
054 public ValueFactory<?> getValueFactory( PropertyType type ) {
055 CheckArg.isNotNull(type, "type");
056 switch (type) {
057 case BINARY:
058 return getBinaryFactory();
059 case BOOLEAN:
060 return getBooleanFactory();
061 case DATE:
062 return getDateFactory();
063 case DECIMAL:
064 return getDecimalFactory();
065 case DOUBLE:
066 return getDoubleFactory();
067 case LONG:
068 return getLongFactory();
069 case NAME:
070 return getNameFactory();
071 case PATH:
072 return getPathFactory();
073 case REFERENCE:
074 return getReferenceFactory();
075 case STRING:
076 return getStringFactory();
077 case URI:
078 return getUriFactory();
079 case UUID:
080 return getUuidFactory();
081 case OBJECT:
082 return getObjectFactory();
083 }
084 return getObjectFactory();
085 }
086
087 /**
088 * {@inheritDoc}
089 */
090 public ValueFactory<?> getValueFactory( Object prototype ) {
091 CheckArg.isNotNull(prototype, "prototype");
092 PropertyType inferredType = PropertyType.discoverType(prototype);
093 assert inferredType != null;
094 return getValueFactory(inferredType);
095 }
096
097 protected class ValueFactoryIterator implements Iterator<ValueFactory<?>> {
098 private final Iterator<PropertyType> propertyTypeIter = PropertyType.iterator();
099
100 protected ValueFactoryIterator() {
101 }
102
103 /**
104 * {@inheritDoc}
105 *
106 * @see java.util.Iterator#hasNext()
107 */
108 public boolean hasNext() {
109 return propertyTypeIter.hasNext();
110 }
111
112 /**
113 * {@inheritDoc}
114 *
115 * @see java.util.Iterator#next()
116 */
117 public ValueFactory<?> next() {
118 PropertyType nextType = propertyTypeIter.next();
119 return getValueFactory(nextType);
120 }
121
122 /**
123 * {@inheritDoc}
124 *
125 * @see java.util.Iterator#remove()
126 */
127 public void remove() {
128 throw new UnsupportedOperationException();
129 }
130 }
131
132 }