1 /* ***************************************************************************
2 * Copyright (c) 2008 Brabenetz Harald, Austria.
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.settings4j.helper.spring;
18
19 import org.settings4j.Settings4j;
20 import org.springframework.beans.factory.FactoryBean;
21 import org.springframework.beans.factory.InitializingBean;
22
23
24 /**
25 * BeanFactory which gets the Object from {@link Settings4j#getObject(String)}.<br />
26 * This can also be used for DataSource-Objects with the JNDI-Name as Key.
27 *
28 * <p>
29 * <h2>Simple SpringBean Example:</h2> The following Example can be configured with the settings4j-Key "env/MyVariable".
30 * <br />
31 * e.g.: System.setProperty("env/MyVariable", "Hallo World");<br />
32 * OR with JNDI-Context OR in a Classpath-File under "classpath:env/MyVariable" Or with a custom
33 * {@link org.settings4j.Connector}-Implementation.
34 *
35 * <pre>
36 * <bean id="MyConfigurableValue" class="org.settings4j.helper.spring.Settings4jFactoryBean">
37 * <property name="key"><value><b>env/MyVariable</b></value></property>
38 * </bean>
39 * </pre>
40 *
41 * <h2>More complex SpringBean Example:</h2> This Example shows how a Hibernate SessionFactory can optional customized
42 * with additional HibernateProperties.
43 *
44 * <pre>
45 * <bean id="hibernateProperties"
46 * class="org.springframework.beans.factory.config.PropertiesFactoryBean">
47 * <property name="locations">
48 * <list>
49 * <value>classpath:org/settings4j/helper/spring/DefaultHibernate.properties</value>
50 * <bean class="org.settings4j.helper.spring.Settings4jFactoryBean">
51 * <property name="key">
52 * <value><b>env/MyCustomProprtiesLocationKey</b></value>
53 * </property>
54 * <property name="defaultObject">
55 * <!-- This could also be an empty Property-File But it must Exist. -->
56 * <!-- PropertiesFactoryBean cannot handle invalid Paths. -->
57 * <value>classpath:org/settings4j/helper/spring/DefaultHibernate.properties</value>
58 * </property>
59 * </bean>
60 * </list>
61 * </property>
62 * </bean>
63 *
64 * <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
65 * <property name="dataSource" ref="db2Datasource2" />
66 * <property name="hibernateProperties" ref="hibernateProperties" />
67 * ....
68 * </bean>
69 * </pre>
70 *
71 * @author Harald.Brabenetz
72 */
73 public class Settings4jFactoryBean implements FactoryBean, InitializingBean {
74
75 private String key;
76 private boolean singleton = true;
77 private Object singletonObject;
78 private Object defaultObject;
79 private Class expectedType;
80
81 public String getKey() {
82 return this.key;
83 }
84
85 /**
86 * @param key - the Setting4j-Key for Your Configuration-Value.
87 */
88 public void setKey(final String key) {
89 this.key = key;
90 }
91
92 /**
93 * @param singleton - If <code>true</code>, the Value will be read during SpringBean-Initialization. Default is
94 * <code>true</code>
95 */
96 public void setSingleton(final boolean singleton) {
97 this.singleton = singleton;
98 }
99
100 /**
101 * Specify the type that the configured object is supposed to be assignable to, if any.
102 *
103 * @param expectedType the expected {@link Class}.
104 */
105 public void setExpectedType(final Class expectedType) {
106 this.expectedType = expectedType;
107 }
108
109 /**
110 * Return the type that the configured object is supposed to be assignable to, if any.
111 *
112 * @return the type that the configured object is supposed to be assignable to.
113 */
114 public Class getExpectedType() {
115 return this.expectedType;
116 }
117
118
119 public Object getDefaultObject() {
120 return this.defaultObject;
121 }
122
123
124 public void setDefaultObject(final Object defaultObject) {
125 this.defaultObject = defaultObject;
126 }
127
128 /** {@inheritDoc} */
129 public Object getObject() {
130 if (this.singleton) {
131 return this.singletonObject;
132 }
133 return getSettings4jObject();
134 }
135
136 /** {@inheritDoc} */
137 public Class getObjectType() {
138 final Object obj = getObject();
139 if (obj != null) {
140 return obj.getClass();
141 }
142 return getExpectedType();
143 }
144
145 /** {@inheritDoc} */
146 public boolean isSingleton() {
147 return this.singleton;
148 }
149
150 /** {@inheritDoc} */
151 public void afterPropertiesSet() {
152 if (this.singleton) {
153 this.singletonObject = getSettings4jObject();
154 }
155 }
156
157 private Object getSettings4jObject() {
158 Object result = Settings4j.getObject(this.key);
159 if (result == null) {
160 result = Settings4j.getString(this.key);
161 }
162
163 if (result == null) {
164 result = this.defaultObject;
165 }
166 return result;
167 }
168
169 }