2 * Copyright 2015 Samsung Electronics All Rights Reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package oic.simulator.serviceprovider.utils;
19 import java.util.Vector;
21 import org.oic.simulator.AttributeValue;
23 public class AttributeValueBuilder {
24 public static AttributeValue build(String valueString,
25 AttributeValue.ValueType valueType) throws Exception {
26 int depth = findDepth(valueString);
28 return handleDepth0(valueString, valueType);
29 } else if (1 == depth) {
30 return handleDepth1(valueString, valueType);
31 } else if (2 == depth) {
32 return handleDepth2(valueString, valueType);
33 } else if (3 == depth) {
34 return handleDepth3(valueString, valueType);
40 private static int findDepth(String value) {
42 for (char ch : value.toCharArray()) {
52 private static boolean isValidSyntax(String value) {
54 for (char ch : value.toCharArray()) {
67 private static AttributeValue handleDepth0(String valueString,
68 AttributeValue.ValueType valueType) {
69 valueString = valueString.trim();
70 if (0 != findDepth(valueString))
74 if (valueType == AttributeValue.ValueType.INTEGER)
75 return new AttributeValue(Integer.parseInt(valueString));
76 else if (valueType == AttributeValue.ValueType.DOUBLE) {
77 Double value = Double.parseDouble(valueString);
78 if (!value.isInfinite()) {
79 return new AttributeValue(value);
81 } else if (valueType == AttributeValue.ValueType.BOOLEAN) {
82 if (valueString.equalsIgnoreCase("true")
83 || valueString.equalsIgnoreCase("false"))
84 return new AttributeValue(Boolean.parseBoolean(valueString));
85 } else if (valueType == AttributeValue.ValueType.STRING)
86 return new AttributeValue(valueString);
87 } catch (Exception e) {
93 private static String[] splitIntoArrays(String value) {
94 Vector<String> values = new Vector<String>();
95 String valueString = new String(value);
96 valueString = valueString.substring(valueString.indexOf('[') + 1,
97 valueString.lastIndexOf(']'));
101 char[] charArray = valueString.toCharArray();
102 for (int index = 0; index < charArray.length; index++) {
103 if (charArray[index] == '[' && 0 == count++) {
107 if (charArray[index] == ']' && 0 == --count) {
108 values.add(valueString.substring(startPos, index + 1));
112 String[] result = new String[values.size()];
113 values.toArray(result);
117 private static AttributeValue handleDepth1(String valueString,
118 AttributeValue.ValueType valueType) {
119 valueString = valueString.trim();
120 if (1 != findDepth(valueString) || false == isValidSyntax(valueString))
123 valueString = valueString.substring(valueString.indexOf('[') + 1,
124 valueString.lastIndexOf(']'));
125 String[] valuesString = valueString.split(",");
126 if (null == valuesString || 0 == valuesString.length)
129 if (valueType == AttributeValue.ValueType.INTEGER) {
130 if (1 == valuesString.length && valuesString[0].isEmpty()) {
131 return new AttributeValue(new Integer[0]);
134 Integer[] result = new Integer[valuesString.length];
135 for (int index = 0; index < valuesString.length; index++) {
136 if (null != valuesString[index]
137 && !valuesString[index].isEmpty()) {
138 Integer value = (Integer) handleDepth0(valuesString[index],
142 result[index] = value;
145 return new AttributeValue(result);
146 } else if (valueType == AttributeValue.ValueType.DOUBLE) {
147 if (1 == valuesString.length && valuesString[0].isEmpty()) {
148 return new AttributeValue(new Double[0]);
151 Double[] result = new Double[valuesString.length];
152 for (int index = 0; index < valuesString.length; index++) {
153 if (null != valuesString[index]
154 && !valuesString[index].isEmpty()) {
155 Double value = (Double) handleDepth0(valuesString[index],
159 result[index] = value;
162 return new AttributeValue(result);
163 } else if (valueType == AttributeValue.ValueType.BOOLEAN) {
164 if (1 == valuesString.length && valuesString[0].isEmpty()) {
165 return new AttributeValue(new Boolean[0]);
168 Boolean[] result = new Boolean[valuesString.length];
169 for (int index = 0; index < valuesString.length; index++) {
170 if (null != valuesString[index]
171 && !valuesString[index].isEmpty()) {
172 Boolean value = (Boolean) handleDepth0(valuesString[index],
176 result[index] = value;
179 return new AttributeValue(result);
180 } else if (valueType == AttributeValue.ValueType.STRING) {
181 if (1 == valuesString.length && valuesString[0].isEmpty()) {
182 return new AttributeValue(new String[0]);
185 for (int index = 0; index < valuesString.length; index++) {
186 if (null != valuesString[index]
187 && !valuesString[index].isEmpty()) {
188 valuesString[index] = valuesString[index].trim();
191 return new AttributeValue(valuesString);
197 private static AttributeValue handleDepth2(String valueString,
198 AttributeValue.ValueType valueType) {
199 valueString = valueString.trim();
200 if (2 != findDepth(valueString) || false == isValidSyntax(valueString))
203 String[] valuesString = splitIntoArrays(valueString);
204 if (null == valuesString || 0 == valuesString.length)
207 if (valueType == AttributeValue.ValueType.INTEGER) {
208 Integer[][] result = new Integer[valuesString.length][];
209 for (int index = 0; index < valuesString.length; index++) {
210 Integer[] value = (Integer[]) handleDepth1(valuesString[index],
214 result[index] = value;
216 return new AttributeValue(result);
217 } else if (valueType == AttributeValue.ValueType.DOUBLE) {
218 Double[][] result = new Double[valuesString.length][];
219 for (int index = 0; index < valuesString.length; index++) {
220 Double[] value = (Double[]) handleDepth1(valuesString[index],
224 result[index] = value;
226 return new AttributeValue(result);
227 } else if (valueType == AttributeValue.ValueType.BOOLEAN) {
228 Boolean[][] result = new Boolean[valuesString.length][];
229 for (int index = 0; index < valuesString.length; index++) {
230 Boolean[] value = (Boolean[]) handleDepth1(valuesString[index],
234 result[index] = value;
236 return new AttributeValue(result);
237 } else if (valueType == AttributeValue.ValueType.STRING) {
238 String[][] result = new String[valuesString.length][];
239 for (int index = 0; index < valuesString.length; index++) {
240 String[] value = (String[]) handleDepth1(valuesString[index],
244 result[index] = value;
246 return new AttributeValue(result);
252 public static AttributeValue handleDepth3(String valueString,
253 AttributeValue.ValueType valueType) {
254 valueString = valueString.trim();
255 if (3 != findDepth(valueString) || false == isValidSyntax(valueString))
258 String[] valuesString = splitIntoArrays(valueString);
259 if (null == valuesString || 0 == valuesString.length)
262 if (valueType == AttributeValue.ValueType.INTEGER) {
263 Integer[][][] result = new Integer[valuesString.length][][];
264 for (int index = 0; index < valuesString.length; index++) {
265 Integer[][] value = (Integer[][]) handleDepth2(
266 valuesString[index], valueType).get();
269 result[index] = value;
271 return new AttributeValue(result);
272 } else if (valueType == AttributeValue.ValueType.DOUBLE) {
273 Double[][][] result = new Double[valuesString.length][][];
274 for (int index = 0; index < valuesString.length; index++) {
275 Double[][] value = (Double[][]) handleDepth2(
276 valuesString[index], valueType).get();
279 result[index] = value;
281 return new AttributeValue(result);
282 } else if (valueType == AttributeValue.ValueType.BOOLEAN) {
283 Boolean[][][] result = new Boolean[valuesString.length][][];
284 for (int index = 0; index < valuesString.length; index++) {
285 Boolean[][] value = (Boolean[][]) handleDepth2(
286 valuesString[index], valueType).get();
289 result[index] = value;
291 return new AttributeValue(result);
292 } else if (valueType == AttributeValue.ValueType.STRING) {
293 String[][][] result = new String[valuesString.length][][];
294 for (int index = 0; index < valuesString.length; index++) {
295 String[][] value = (String[][]) handleDepth2(
296 valuesString[index], valueType).get();
299 result[index] = value;
301 return new AttributeValue(result);