1
2
3
4 package net.sourceforge.pmd.lang.rule.properties;
5
6 import net.sourceforge.pmd.PropertyDescriptor;
7 import net.sourceforge.pmd.util.StringUtil;
8
9 public class PropertyDescriptorFactory {
10
11
12
13
14
15 public static String getPropertyDescriptorType(PropertyDescriptor<?> propertyDescriptor) {
16 Class<?> type = propertyDescriptor.type();
17 String typeName = null;
18 if (propertyDescriptor instanceof EnumeratedProperty
19 || propertyDescriptor instanceof MethodProperty
20
21
22 || propertyDescriptor instanceof TypeProperty) {
23
24 } else if ("java.lang".equals(type.getPackage().getName())) {
25 typeName = type.getSimpleName();
26 }
27 if (typeName == null) {
28 throw new IllegalArgumentException("Cannot encode type for PropertyDescriptor class: " + type.getName());
29 }
30 return typeName;
31 }
32
33 public static PropertyDescriptor<?> createPropertyDescriptor(String name, String description, String type, String delimiter, String min, String max, String value) {
34 return new PropertyDescriptorWrapper(createRawPropertyDescriptor(name, description, type, delimiter, min, max, value));
35 }
36
37 private static PropertyDescriptor<?> createRawPropertyDescriptor(String name, String description, String type, String delimiter, String min, String max, String value) {
38 if ("Boolean".equals(type)) {
39 return new BooleanProperty(name, description, value, 0.0f);
40 } else if ("Boolean[]".equals(type)) {
41 BooleanMultiProperty property = new BooleanMultiProperty(name, description, null, 0.0f);
42 return new BooleanMultiProperty(name, description, property.valueFrom(value), 0.0f);
43 } else if ("Character".equals(type)) {
44 return new CharacterProperty(name, description, CharacterProperty.charFrom(value), 0.0f);
45 } else if ("Character[]".equals(type)) {
46 checkDelimiter(name, type, delimiter);
47 char delim = delimiter.charAt(0);
48 CharacterMultiProperty property = new CharacterMultiProperty(name, description, null, 0.0f, delim);
49 return new CharacterMultiProperty(name, description, property.valueFrom(value), 0.0f, delim);
50 } else if ("Double".equals(type)) {
51 checkMinMax(name, type, min, max);
52 return new DoubleProperty(name, description, min, max, value, 0.0f);
53 } else if ("Double[]".equals(type)) {
54 checkMinMax(name, type, min, max);
55 DoubleMultiProperty property = new DoubleMultiProperty(name, description, 0d, 0d, null, 0.0f);
56 return new DoubleMultiProperty(name, description, DoubleProperty.doubleFrom(min), DoubleProperty.doubleFrom(max), property.valueFrom(value), 0.0f);
57 } else if ("Float".equals(type)) {
58 checkMinMax(name, type, min, max);
59 return new FloatProperty(name, description, min, max, value, 0.0f);
60 } else if ("Float[]".equals(type)) {
61 checkMinMax(name, type, min, max);
62 FloatMultiProperty property = new FloatMultiProperty(name, description, 0f, 0f, null, 0.0f);
63 return new FloatMultiProperty(name, description, FloatProperty.floatFrom(min), FloatProperty.floatFrom(max), property.valueFrom(value), 0.0f);
64 } else if ("Integer".equals(type)) {
65 checkMinMax(name, type, min, max);
66 return new IntegerProperty(name, description, min, max, value, 0.0f);
67 } else if ("Integer[]".equals(type)) {
68 checkMinMax(name, type, min, max);
69 IntegerMultiProperty property = new IntegerMultiProperty(name, description, 0, 0, null, 0.0f);
70 return new IntegerMultiProperty(name, description, IntegerProperty.intFrom(min), IntegerProperty.intFrom(max), property.valueFrom(value), 0.0f);
71 } else if ("Long".equals(type)) {
72 checkMinMax(name, type, min, max);
73 return new LongProperty(name, description, min, max, value, 0.0f);
74 } else if ("Long[]".equals(type)) {
75 checkMinMax(name, type, min, max);
76 LongMultiProperty property = new LongMultiProperty(name, description, 0L, 0L, null, 0.0f);
77 return new LongMultiProperty(name, description, LongProperty.longFrom(min), LongProperty.longFrom(max), property.valueFrom(value), 0.0f);
78
79
80 } else if ("Type".equals(type)) {
81 return new TypeProperty(name, description, value, (String[]) null, 0.0f);
82 } else if ("Type[]".equals(type)) {
83 return new TypeMultiProperty(name, description, value, (String[]) null, 0.0f);
84 } else if ("Method".equals(type)) {
85 return new MethodProperty(name, description, value, (String[]) null, 0.0f);
86 } else if ("Method[]".equals(type)) {
87 return new MethodMultiProperty(name, description, value, (String[]) null, 0.0f);
88
89 } else if ("String".equals(type)) {
90 return new StringProperty(name, description, value, 0.0f);
91 } else if ("String[]".equals(type)) {
92 checkDelimiter(name, type, delimiter);
93 char delim = delimiter.charAt(0);
94 StringMultiProperty property = new StringMultiProperty(name, description, null, 0.0f, delim);
95 return new StringMultiProperty(name, description, property.valueFrom(value), 0.0f, delim);
96 } else {
97 throw new IllegalArgumentException("Cannot define property type '" + type + "'.");
98 }
99 }
100
101 private static void checkDelimiter(String name, String type, String delimiter) {
102 if (delimiter == null || delimiter.length() == 0) {
103 throw new IllegalArgumentException("Delimiter must be provided to create PropertyDescriptor for " + name + " of type " + type + ".");
104 }
105 }
106
107 private static void checkMinMax(String name, String type, String min, String max) {
108 if (StringUtil.isEmpty(min)) {
109 throw new IllegalArgumentException("Min must be provided to create PropertyDescriptor for " + name + " of type " + type + ".");
110 }
111 if (StringUtil.isEmpty(max)) {
112 throw new IllegalArgumentException("Max must be provided to create PropertyDescriptor for " + name + " of type " + type + ".");
113 }
114 }
115 }