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.util.Arrays;
027 import java.util.Iterator;
028 import java.util.List;
029 import net.jcip.annotations.Immutable;
030 import org.jboss.dna.common.util.CheckArg;
031 import org.jboss.dna.graph.property.Name;
032
033 /**
034 * An immutable version of a property that has 2 or more values. This is done for efficiency of the in-memory representation,
035 * since many properties will have just a single value, while others will have multiple values.
036 *
037 * @author Randall Hauch
038 */
039 @Immutable
040 public class BasicMultiValueProperty extends BasicProperty {
041
042 private final List<Object> values;
043
044 /**
045 * Create a property with 2 or more values. Note that the supplied list may be modifiable, as this object does not expose any
046 * means for modifying the contents.
047 *
048 * @param name the property name
049 * @param values the property values
050 * @throws IllegalArgumentException if the values is null or does not have at least 2 values
051 */
052 public BasicMultiValueProperty( Name name,
053 List<Object> values ) {
054 super(name);
055 CheckArg.isNotNull(values, "values");
056 CheckArg.hasSizeOfAtLeast(values, 2, "values");
057 this.values = values;
058 }
059
060 /**
061 * Create a property with 2 or more values.
062 *
063 * @param name the property name
064 * @param values the property values
065 * @throws IllegalArgumentException if the values is null or does not have at least 2 values
066 */
067 public BasicMultiValueProperty( Name name,
068 Object... values ) {
069 super(name);
070 CheckArg.isNotNull(values, "values");
071 CheckArg.hasSizeOfAtLeast(values, 2, "values");
072 this.values = Arrays.asList(values);
073 }
074
075 /**
076 * {@inheritDoc}
077 */
078 public boolean isEmpty() {
079 return false;
080 }
081
082 /**
083 * {@inheritDoc}
084 */
085 public boolean isMultiple() {
086 return true;
087 }
088
089 /**
090 * {@inheritDoc}
091 */
092 public boolean isSingle() {
093 return false;
094 }
095
096 /**
097 * {@inheritDoc}
098 */
099 public int size() {
100 return values.size();
101 }
102
103 /**
104 * {@inheritDoc}
105 *
106 * @see org.jboss.dna.graph.property.Property#getFirstValue()
107 */
108 public Object getFirstValue() {
109 return values.get(0);
110 }
111
112 /**
113 * {@inheritDoc}
114 */
115 public Iterator<Object> iterator() {
116 return new ReadOnlyIterator(values.iterator());
117 }
118
119 protected class ReadOnlyIterator implements Iterator<Object> {
120
121 private final Iterator<Object> values;
122
123 protected ReadOnlyIterator( Iterator<Object> values ) {
124 assert values != null;
125 this.values = values;
126 }
127
128 /**
129 * {@inheritDoc}
130 */
131 public boolean hasNext() {
132 return values.hasNext();
133 }
134
135 /**
136 * {@inheritDoc}
137 */
138 public Object next() {
139 return values.next();
140 }
141
142 /**
143 * {@inheritDoc}
144 */
145 public void remove() {
146 throw new UnsupportedOperationException();
147 }
148
149 }
150 }