View Javadoc
1   /*
2    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
3    * The software in this package is published under the terms of the CPAL v1.0
4    * license, a copy of which has been included with this distribution in the
5    * LICENSE.txt file.
6    */
7   package org.mule.transformer.simple;
8   
9   import org.mule.api.transformer.DataType;
10  import org.mule.api.transformer.DiscoverableTransformer;
11  import org.mule.api.transformer.TransformerException;
12  import org.mule.transformer.AbstractTransformer;
13  import org.mule.transformer.types.DataTypeFactory;
14  import org.mule.transformer.types.SimpleDataType;
15  import org.mule.util.NumberUtils;
16  
17  import java.text.NumberFormat;
18  
19  /**
20   * <code>StringToNumber</code> converts a String to a Number. A NumberFormat is used
21   * if one is provided.
22   */
23  public class StringToNumber extends AbstractTransformer implements DiscoverableTransformer
24  {
25  
26      private NumberFormat numberFormat;
27  
28      /**
29       * Give core transformers a slighty higher priority
30       */
31      private int priorityWeighting = DiscoverableTransformer.DEFAULT_PRIORITY_WEIGHTING + 1;
32  
33      public StringToNumber()
34      {
35          registerSourceType(new SimpleDataType<Object>(String.class));
36          setReturnDataType(DataTypeFactory.create(Number.class));
37      }
38  
39      public StringToNumber(NumberFormat numberFormat)
40      {
41          this();
42          this.numberFormat = numberFormat;
43      }
44  
45      @SuppressWarnings("unchecked")
46      @Override
47      public Object doTransform(Object src, String encoding) throws TransformerException
48      {
49          if (src == null)
50          {
51              return null;
52          }
53          else
54          {
55              if (numberFormat != null)
56              {
57                  try
58                  {
59                      return NumberUtils.convertNumberToTargetClass(numberFormat.parse((String) src),
60                          getReturnClass());
61                  }
62                  catch (Exception e)
63                  {
64                      throw new TransformerException(this, e);
65                  }
66              }
67              else
68              {
69                  return NumberUtils.parseNumber((String) src, getReturnClass());
70              }
71          }
72      }
73  
74      @SuppressWarnings({"unchecked"})
75      @Override
76      public Class<? extends Number> getReturnClass()
77      {
78          return (Class<Number>) super.getReturnDataType().getType();
79      }
80  
81      @Override
82      public void setReturnDataType(DataType<?> type)
83      {
84          if (!Number.class.isAssignableFrom(type.getType()))
85          {
86              throw new IllegalArgumentException("This transformer only supports Number return types.");
87          }
88          else
89          {
90              super.setReturnDataType(type);
91          }
92      }
93  
94      public int getPriorityWeighting()
95      {
96          return priorityWeighting;
97      }
98  
99      public void setPriorityWeighting(int priorityWeighting)
100     {
101         this.priorityWeighting = priorityWeighting;
102     }
103 
104 }