View Javadoc
1   /*
2    * Copyright 2008 Lukas Lang
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   */
17  package org.castor.core.nature;
18  
19  import java.util.HashMap;
20  import java.util.LinkedList;
21  import java.util.List;
22  import java.util.Map;
23  
24  /**
25   * Adds property handle methods and a constructor including a health check. See
26   * constructor comments for more details.
27   * 
28   * @author Lukas Lang
29   * @since 1.2.1
30   * 
31   */
32  public abstract class BaseNature implements Nature {
33  
34      /**
35       * The PropertyHolder in focus.
36       */
37      private PropertyHolder _holder = null;
38  
39      /**
40       * Constructor taking a {@link PropertyHolder}. Must be called from
41       * subclasses. Does a health check on the given PropertyHolder, whether the
42       * extending Nature exists.
43       * 
44       * @param holder
45       *            a PropertyHolder.
46       */
47      protected BaseNature(final PropertyHolder holder) {
48          if (holder == null) {
49              throw new NullPointerException("Holder must be set");
50          }
51          // Health check
52          if (holder.hasNature(getId())) {
53              _holder = holder;
54          } else {
55              throw new IllegalStateException(getId()
56                      + " Nature must be set before");
57          }
58      }
59  
60      /**
61       * Returns the property mapped to the key or null if not set before.
62       * 
63       * @param key
64       *            to look up.
65       * @return value or null if not found.
66       */
67      protected final Object getProperty(final String key) {
68          return _holder.getProperty(addPrefix(key));
69      }
70  
71      /**
72       * Sets the property for a given. Key must NOT be null, but can be an empty
73       * String.
74       * 
75       * @param property
76       *            to set.
77       * @param key
78       *            to insert.
79       */
80      protected final void setProperty(final String key, final Object property) {
81          if (key != null) {
82              _holder.setProperty(addPrefix(key), property);
83          }
84      }
85  
86      /**
87       * Generates a Key by adding a prefix.
88       * 
89       * @param key
90       *            to use.
91       * @return prefix + given key.
92       */
93      private String addPrefix(final String key) {
94          StringBuffer buf = new StringBuffer();
95          buf.append(getId());
96          buf.append(key);
97          return buf.toString();
98      }
99  
100     /**
101      * Returns boolean value of the property or false if property value is null.
102      * Make sure, not to request a property, which does not have a boolean
103      * value!
104      * 
105      * @param propertyName
106      *            name of the property.
107      * @return false if null or false.
108      */
109     protected final boolean getBooleanPropertyDefaultFalse(
110             final String propertyName) {
111         Boolean b = (Boolean) this.getProperty(propertyName);
112         if (b == null) {
113             return false;
114         }
115         return b.booleanValue();
116     }
117 
118     /**
119      * Returns the {@link PropertyHolder}.
120      * @return the holder
121      */
122     protected final PropertyHolder getHolder() {
123         return _holder;
124     }
125 
126     /**
127      * Returns value of the property as a List. If the property was not set
128      * before, a new List will be returned. Make sure, not to request a
129      * property, which is not a List!
130      * 
131      * @param propertyName
132      *            name of the property.
133      * @return A List.
134      */
135     protected List getPropertyAsList(String property) {
136         List list = (List) getProperty(property);
137         if (list == null) {
138             list = new LinkedList();
139             this.setProperty(property, list);
140         }
141         return list;
142     }
143     
144     /**
145      * Returns value of the property as a List. If the property was not set
146      * before, a new List will be returned. Make sure, not to request a
147      * property, which is not a List!
148      * 
149      * @param propertyName
150      *            name of the property.
151      * @return A List.
152      */
153     protected Map getPropertyAsMap(String property) {
154         Map map = (Map) getProperty(property);
155         if (map == null) {
156             map = new HashMap();
157             this.setProperty(property, map);
158         }
159         return map;
160     }
161     
162 }