1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.integration.beans;
21
22 import java.beans.PropertyEditor;
23 import java.lang.reflect.Array;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.regex.Matcher;
27
28
29
30
31
32
33
34
35 public class ArrayEditor extends AbstractPropertyEditor {
36 private final Class<?> componentType;
37
38 public ArrayEditor(Class<?> componentType) {
39 if (componentType == null) {
40 throw new NullPointerException("componentType");
41 }
42
43 this.componentType = componentType;
44 getComponentEditor();
45 setTrimText(false);
46 }
47
48 private PropertyEditor getComponentEditor() {
49 PropertyEditor e = PropertyEditorFactory.getInstance(componentType);
50 if (e == null) {
51 throw new IllegalArgumentException(
52 "No " + PropertyEditor.class.getSimpleName() +
53 " found for " + componentType.getSimpleName() + '.');
54 }
55 return e;
56 }
57
58 @Override
59 protected String toText(Object value) {
60 Class<?> componentType = value.getClass().getComponentType();
61 if (componentType == null) {
62 throw new IllegalArgumentException("not an array: " + value);
63 }
64
65 PropertyEditor e = PropertyEditorFactory.getInstance(componentType);
66 if (e == null) {
67 throw new IllegalArgumentException(
68 "No " + PropertyEditor.class.getSimpleName() +
69 " found for " + componentType.getSimpleName() + '.');
70 }
71
72 StringBuilder buf = new StringBuilder();
73 for (int i = 0; i < Array.getLength(value); i ++) {
74 e.setValue(Array.get(value, i));
75
76 String s = e.getAsText();
77 buf.append(s);
78 buf.append(", ");
79 }
80
81
82 if (buf.length() >= 2) {
83 buf.setLength(buf.length() - 2);
84 }
85 return buf.toString();
86 }
87
88 @Override
89 protected Object toValue(String text) throws IllegalArgumentException {
90 PropertyEditor e = getComponentEditor();
91 List<Object> values = new ArrayList<Object>();
92 Matcher m = CollectionEditor.ELEMENT.matcher(text);
93 boolean matchedDelimiter = true;
94
95 while (m.find()) {
96 if (m.group(1) != null) {
97 matchedDelimiter = true;
98 continue;
99 }
100
101 if (!matchedDelimiter) {
102 throw new IllegalArgumentException("No delimiter between elements: " + text);
103 }
104
105
106 e.setAsText(m.group());
107 values.add(e.getValue());
108
109 matchedDelimiter = false;
110 if (m.group(2) != null || m.group(3) != null) {
111
112 m.region(m.end() + 1, m.regionEnd());
113 }
114 }
115
116 Object answer = Array.newInstance(componentType, values.size());
117 for (int i = 0; i < Array.getLength(answer); i ++) {
118 Array.set(answer, i, values.get(i));
119 }
120 return answer;
121 }
122 }