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