001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.mail;
018
019 import java.util.Enumeration;
020 import java.util.Properties;
021
022 import org.apache.commons.logging.Log;
023 import org.apache.commons.logging.LogFactory;
024
025 import org.apache.geronimo.gbean.GBeanInfo;
026 import org.apache.geronimo.gbean.GBeanInfoBuilder;
027 import org.apache.geronimo.gbean.GBeanLifecycle;
028
029 /**
030 * A generic GBean that provides for the configuration of a JavaMail protocol.
031 * <p/>
032 * Values that are set in the individual member variables will override any of
033 * the corresponding values that have been set in the properties set.
034 *
035 * @version $Rev: 486195 $ $Date: 2006-12-12 10:42:02 -0500 (Tue, 12 Dec 2006) $
036 */
037 public class ProtocolGBean implements GBeanLifecycle {
038
039 // common attributes exported by all ProtocolBeans
040 static public final String GBEAN_OBJECTNAME = "objectName";
041 static public final String GBEAN_PROTOCOL = "protocol";
042 static public final String GBEAN_PROPERTIES = "properties";
043 static public final String GBEAN_HOST = "host";
044 static public final String GBEAN_USER = "user";
045 static public final String GBEAN_ADD_OVERRIDES = "addOverrides";
046
047 // common constants for GBEAN properties that are used by a number of transports.
048 static public final String GBEAN_PORT = "port";
049 static public final String GBEAN_CONNECTION_TIMEOUT = "connectionTimeout";
050 static public final String GBEAN_TIMEOUT = "timeout";
051 static public final String GBEAN_FROM = "from";
052 static public final String GBEAN_AUTH = "auth";
053 static public final String GBEAN_REALM = "saslRealm";
054 static public final String GBEAN_QUITWAIT = "quitWait";
055 static public final String GBEAN_FACTORY_CLASS = "socketFactoryClass";
056 static public final String GBEAN_FACTORY_FALLBACK = "socketFactoryFallback";
057 static public final String GBEAN_FACTORY_PORT = "socketFactoryPort";
058 static public final String GBEAN_LOCALHOST = "localhost";
059 static public final String GBEAN_LOCALADDRESS = "localaddress";
060 static public final String GBEAN_LOCALPORT = "localport";
061
062 private final Log log = LogFactory.getLog(ProtocolGBean.class);
063
064 private final String objectName;
065 private Properties properties;
066 private final String protocol;
067 private String host;
068 private String user;
069
070 /**
071 * Construct an instance of ProtocolGBean
072 */
073 public ProtocolGBean() {
074 this.objectName = null;
075 this.protocol = null;
076 this.properties = null;
077 }
078
079 /**
080 * Construct an instance of ProtocolGBean
081 * <p/>
082 * Values that are set in the individual member variables will override any of
083 * the corresponding values that have been set in the properties set.
084 *
085 * @param objectName the object name of the protocol
086 * @param protocol the name of the protocol
087 * @param properties the set of default properties for the protocol
088 * @param host the host the protocol connects to
089 * @param user the default name for the protocol
090 */
091 public ProtocolGBean(String objectName, String protocol, Properties properties, String host, String user) {
092 assert protocol != null;
093
094 this.objectName = objectName;
095 this.protocol = protocol;
096 this.properties = (properties == null ? new Properties() : properties);
097 this.host = host;
098 this.user = user;
099 }
100
101 /**
102 * Returns the object name of this protocol GBean
103 */
104 public String getObjectName() {
105 return objectName;
106 }
107
108 /**
109 * Returns the set of default properties for the protocol.
110 * <p/>
111 * Values that are set in the individual member variables will override any of
112 * the corresponding values that have been set in the properties set.
113 */
114 public Properties getProperties() {
115 return properties;
116 }
117
118 /**
119 * Sets the set of default properties for the protocol.
120 * <p/>
121 * Values that are set in the individual member variables will override any of
122 * the corresponding values that have been set in the properties set.
123 *
124 * @param properties set of default properties for the protocol
125 */
126 public void setProperties(Properties properties) {
127 this.properties = properties;
128 }
129
130 /**
131 * Returns the name of the protocol
132 */
133 public String getProtocol() {
134 return protocol;
135 }
136
137 /**
138 * Returns the host the protocol connects to.
139 */
140 public String getHost() {
141 return host;
142 }
143
144 /**
145 * Set the host the protocol connects to.
146 *
147 * @param host the host the protocol connects to
148 */
149 public void setHost(String host) {
150 this.host = host;
151 }
152
153 /**
154 * Returns the default user name for the protocol.
155 */
156 public String getUser() {
157 return user;
158 }
159
160 /**
161 * Sets the default user name for the protocol.
162 *
163 * @param user the default user name for the protocol
164 */
165 public void setUser(String user) {
166 this.user = user;
167 }
168
169 /**
170 * Add the overrides from the member variables to the properties file.
171 */
172 public void addOverrides(Properties props) {
173 Enumeration keys = properties.propertyNames();
174
175 // copy the properties attribute into the over rides as well. These are copied
176 // with the key names unchanged, so they must be specified fully qualified.
177 while (keys.hasMoreElements()) {
178 String key = (String)keys.nextElement();
179 props.put(key, properties.getProperty(key));
180 }
181
182 if (host != null) props.put("mail." + protocol + ".host", host);
183 if (user != null) props.put("mail." + protocol + ".user", user);
184 }
185
186 public void doStart() throws Exception {
187 log.debug("Started " + objectName);
188 }
189
190 public void doStop() throws Exception {
191 log.debug("Stopped " + objectName);
192 }
193
194 public void doFail() {
195 log.warn("Failed " + objectName);
196 }
197
198 public static final GBeanInfo GBEAN_INFO;
199
200 static {
201 GBeanInfoBuilder infoFactory = GBeanInfoBuilder.createStatic(ProtocolGBean.class); //TODO just a gbean?
202
203 infoFactory.addAttribute(GBEAN_OBJECTNAME, String.class, false);
204 infoFactory.addAttribute(GBEAN_PROTOCOL, String.class, true);
205 infoFactory.addAttribute(GBEAN_PROPERTIES, Properties.class, true);
206 infoFactory.addAttribute(GBEAN_HOST, String.class, true);
207 infoFactory.addAttribute(GBEAN_USER, String.class, true);
208 infoFactory.addOperation(GBEAN_ADD_OVERRIDES, new Class[]{Properties.class});
209
210 infoFactory.setConstructor(new String[]{GBEAN_OBJECTNAME, GBEAN_PROTOCOL, GBEAN_PROPERTIES, GBEAN_HOST, GBEAN_USER});
211
212 GBEAN_INFO = infoFactory.getBeanInfo();
213 }
214
215 public static GBeanInfo getGBeanInfo() {
216 return GBEAN_INFO;
217 }
218 }