1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 package org.modeshape.graph.property.basic;
25
26 import java.util.ArrayList;
27 import java.util.Collection;
28 import java.util.Iterator;
29 import java.util.List;
30 import net.jcip.annotations.Immutable;
31 import org.modeshape.common.util.CheckArg;
32 import org.modeshape.graph.property.Name;
33 import org.modeshape.graph.property.Property;
34 import org.modeshape.graph.property.PropertyFactory;
35 import org.modeshape.graph.property.PropertyType;
36 import org.modeshape.graph.property.ValueFactories;
37 import org.modeshape.graph.property.ValueFactory;
38
39
40
41
42 @Immutable
43 public class BasicPropertyFactory implements PropertyFactory {
44
45 private final ValueFactories factories;
46
47
48
49
50
51 public BasicPropertyFactory( ValueFactories valueFactories ) {
52 CheckArg.isNotNull(valueFactories, "value factories");
53 this.factories = valueFactories;
54 }
55
56
57
58
59 public Property create( Name name,
60 Iterable<?> values ) {
61 return create(name, PropertyType.OBJECT, values);
62 }
63
64
65
66
67 public Property create( Name name,
68 Iterator<?> values ) {
69 return create(name, PropertyType.OBJECT, values);
70 }
71
72
73
74
75 public Property create( Name name,
76 Object... values ) {
77 return create(name, PropertyType.OBJECT, values);
78 }
79
80
81
82
83 public Property create( Name name,
84 PropertyType desiredType,
85 Object... values ) {
86 CheckArg.isNotNull(name, "name");
87 if (values == null || values.length == 0) {
88 return new BasicEmptyProperty(name);
89 }
90 final int len = values.length;
91 if (desiredType == null) desiredType = PropertyType.OBJECT;
92 final ValueFactory<?> factory = factories.getValueFactory(desiredType);
93 if (values.length == 1) {
94 Object value = values[0];
95
96 if (value instanceof Collection<?>) {
97
98 return create(name, (Collection<?>)value);
99 }
100 value = factory.create(values[0]);
101 return new BasicSingleValueProperty(name, value);
102 }
103 List<Object> valueList = new ArrayList<Object>(len);
104 for (int i = 0; i != len; ++i) {
105 Object value = factory.create(values[i]);
106 valueList.add(value);
107 }
108 return new BasicMultiValueProperty(name, valueList);
109 }
110
111
112
113
114 @SuppressWarnings( "unchecked" )
115 public Property create( Name name,
116 PropertyType desiredType,
117 Iterable<?> values ) {
118 CheckArg.isNotNull(name, "name");
119 List<Object> valueList = null;
120 if (values instanceof Collection) {
121 Collection<Object> originalValues = (Collection<Object>)values;
122 if (originalValues.isEmpty()) {
123 return new BasicEmptyProperty(name);
124 }
125 valueList = new ArrayList<Object>(originalValues.size());
126 } else {
127
128 valueList = new ArrayList<Object>();
129 }
130
131 if (desiredType == null) desiredType = PropertyType.OBJECT;
132 final ValueFactory<?> factory = factories.getValueFactory(desiredType);
133 for (Object value : values) {
134 valueList.add(factory.create(value));
135 }
136 if (valueList.isEmpty()) {
137 return new BasicEmptyProperty(name);
138 }
139 if (valueList.size() == 1) {
140 return new BasicSingleValueProperty(name, valueList.get(0));
141 }
142 return new BasicMultiValueProperty(name, valueList);
143 }
144
145
146
147
148 public Property create( Name name,
149 PropertyType desiredType,
150 Iterator<?> values ) {
151 CheckArg.isNotNull(name, "name");
152 final List<Object> valueList = new ArrayList<Object>();
153 if (desiredType == null) desiredType = PropertyType.OBJECT;
154 final ValueFactory<?> factory = factories.getValueFactory(desiredType);
155 while (values.hasNext()) {
156 Object value = values.next();
157 value = factory.create(value);
158 valueList.add(value);
159 }
160 if (valueList.isEmpty()) {
161 return new BasicEmptyProperty(name);
162 }
163 if (valueList.size() == 1) {
164 return new BasicSingleValueProperty(name, valueList.get(0));
165 }
166 return new BasicMultiValueProperty(name, valueList);
167 }
168
169 }