1
2
3
4
5
6
7
8
9
10
11 package org.mule.transformer.simple;
12
13 import org.mule.api.transformer.DataType;
14 import org.mule.api.transformer.DiscoverableTransformer;
15 import org.mule.api.transformer.TransformerException;
16 import org.mule.transformer.AbstractTransformer;
17 import org.mule.transformer.types.DataTypeFactory;
18 import org.mule.transformer.types.SimpleDataType;
19 import org.mule.util.NumberUtils;
20
21 import java.text.NumberFormat;
22
23
24
25
26
27 public class StringToNumber extends AbstractTransformer implements DiscoverableTransformer
28 {
29
30 private NumberFormat numberFormat;
31
32
33
34
35 private int priorityWeighting = DiscoverableTransformer.DEFAULT_PRIORITY_WEIGHTING + 1;
36
37 public StringToNumber()
38 {
39 registerSourceType(new SimpleDataType<Object>(String.class));
40 setReturnDataType(DataTypeFactory.create(Number.class));
41 }
42
43 public StringToNumber(NumberFormat numberFormat)
44 {
45 this();
46 this.numberFormat = numberFormat;
47 }
48
49 @Override
50 public Object doTransform(Object src, String outputEncoding) throws TransformerException
51 {
52 if (src == null)
53 {
54 return null;
55 }
56 else
57 {
58 if (numberFormat != null)
59 {
60 try
61 {
62 return NumberUtils.convertNumberToTargetClass(numberFormat.parse((String) src),
63 getReturnClass());
64 }
65 catch (Exception e)
66 {
67 throw new TransformerException(this, e);
68 }
69 }
70 else
71 {
72 return NumberUtils.parseNumber((String) src, getReturnClass());
73 }
74 }
75 }
76
77 @SuppressWarnings({"unchecked"})
78 @Override
79 public Class<? extends Number> getReturnClass()
80 {
81 return (Class<Number>) super.getReturnDataType().getType();
82 }
83
84 @Override
85 public void setReturnDataType(DataType<?> type)
86 {
87 if (!Number.class.isAssignableFrom(type.getType()))
88 {
89 throw new IllegalArgumentException("This transformer only supports Number return types.");
90 }
91 else
92 {
93 super.setReturnDataType(type);
94 }
95 }
96
97 @Override
98 public int getPriorityWeighting()
99 {
100 return priorityWeighting;
101 }
102
103 @Override
104 public void setPriorityWeighting(int priorityWeighting)
105 {
106 this.priorityWeighting = priorityWeighting;
107 }
108
109 }