View Javadoc

1   /*
2    *  Copyright 2001-2013 Stephen Colebourne
3    *
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
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
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.
15   */
16  package org.joda.beans.gen;
17  
18  import java.util.ArrayList;
19  import java.util.Collections;
20  import java.util.HashMap;
21  import java.util.List;
22  import java.util.Map;
23  
24  /**
25   * A generator of get methods.
26   * 
27   * @author Stephen Colebourne
28   */
29  abstract class GetterGen {
30  
31      /** The known getter generators. */
32      static final Map<String, GetterGen> GETTERS = new HashMap<String, GetterGen>();
33      static {
34          GETTERS.put("", NoGetterGen.INSTANCE);
35          GETTERS.put("smart", SmartGetterGen.INSTANCE);
36          GETTERS.put("get", GetGetterGen.INSTANCE);
37          GETTERS.put("is", IsGetterGen.INSTANCE);
38          GETTERS.put("manual", ManualGetterGen.INSTANCE);
39      }
40  
41      /**
42       * Generates the getter method.
43       * @param prop  the property data, not null
44       * @return the generated code, not null
45       */
46      static GetterGen of(GeneratableProperty prop) {
47          GetterGen gen = GETTERS.get(prop.getGetStyle());
48          if (gen == null) {
49              throw new RuntimeException("Unable to locate getter generator '" + prop.getGetStyle() + "'");
50          }
51          return gen;
52      }
53  
54      //-----------------------------------------------------------------------
55      /**
56       * Generates the getter method.
57       * @param prop  the property data, not null
58       * @return the generated code, not null
59       */
60      abstract List<String> generateGetter(GeneratableProperty prop);
61  
62      /**
63       * Generates the getter method invocation.
64       * This is just the method name.
65       * @param prop  the property data, not null
66       * @return the generated code, not null
67       */
68      String generateGetInvoke(GeneratableProperty prop) {
69          return "get" + prop.getUpperName() + "()";
70      }
71  
72      //-----------------------------------------------------------------------
73      static class SmartGetterGen extends GetterGen {
74          static final GetterGen INSTANCE = new SmartGetterGen();
75          @Override
76          List<String> generateGetter(GeneratableProperty prop) {
77              if (prop.getType().equals("boolean")) {
78                  return IsGetterGen.INSTANCE.generateGetter(prop);
79              } else {
80                  return GetGetterGen.INSTANCE.generateGetter(prop);
81              }
82          }
83          @Override
84          String generateGetInvoke(GeneratableProperty prop) {
85              if (prop.getType().equals("boolean")) {
86                  return IsGetterGen.INSTANCE.generateGetInvoke(prop);
87              } else {
88                  return GetGetterGen.INSTANCE.generateGetInvoke(prop);
89              }
90          }
91      }
92  
93      static class GetGetterGen extends GetterGen {
94          static final GetterGen INSTANCE = new GetGetterGen();
95          @Override
96          List<String> generateGetter(GeneratableProperty prop) {
97              return doGenerateGetter(prop, "get");
98          }
99      }
100 
101     static class IsGetterGen extends GetterGen {
102         static final GetterGen INSTANCE = new IsGetterGen();
103         @Override
104         List<String> generateGetter(GeneratableProperty prop) {
105             return doGenerateGetter(prop, "is");
106         }
107         @Override
108         String generateGetInvoke(GeneratableProperty prop) {
109             return "is" + prop.getUpperName() + "()";
110         }
111     }
112 
113     static class ManualGetterGen extends GetterGen {
114         static final GetterGen INSTANCE = new ManualGetterGen();
115         @Override
116         List<String> generateGetter(GeneratableProperty prop) {
117             return Collections.emptyList();
118         }
119     }
120 
121     static class NoGetterGen extends GetterGen {
122         static final GetterGen INSTANCE = new NoGetterGen();
123         @Override
124         List<String> generateGetter(GeneratableProperty prop) {
125             return Collections.emptyList();
126         }
127         @Override
128         String generateGetInvoke(GeneratableProperty prop) {
129             return prop.getFieldName();
130         }
131     }
132 
133     private static List<String> doGenerateGetter(GeneratableProperty prop, String prefix) {
134         List<String> list = new ArrayList<String>();
135         list.add("\t/**");
136         list.add("\t * Gets " + prop.getFirstComment());
137         for (String comment : prop.getComments()) {
138             list.add("\t * " + comment);
139         }
140         list.add("\t * @return the value of the property" + (prop.isNotNull() ? ", not null" : ""));
141         list.add("\t */");
142         if (prop.isDeprecated()) {
143             list.add("\t@Deprecated");
144         }
145         list.add("\tpublic " + prop.getType() + " " + prefix + prop.getUpperName() + "() {");
146         list.add("\t\treturn " + prop.getFieldName() + ";");
147         list.add("\t}");
148         list.add("");
149         return list;
150     }
151 
152 }