KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > objectstyle > cayenne > event > JavaGroupsBridgeFactory


1 /* ====================================================================
2  *
3  * The ObjectStyle Group Software License, version 1.1
4  * ObjectStyle Group - http://objectstyle.org/
5  *
6  * Copyright (c) 2002-2005, Andrei (Andrus) Adamchik and individual authors
7  * of the software. All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  *
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  *
16  * 2. Redistributions in binary form must reproduce the above copyright
17  * notice, this list of conditions and the following disclaimer in
18  * the documentation and/or other materials provided with the
19  * distribution.
20  *
21  * 3. The end-user documentation included with the redistribution, if any,
22  * must include the following acknowlegement:
23  * "This product includes software developed by independent contributors
24  * and hosted on ObjectStyle Group web site (http://objectstyle.org/)."
25  * Alternately, this acknowlegement may appear in the software itself,
26  * if and wherever such third-party acknowlegements normally appear.
27  *
28  * 4. The names "ObjectStyle Group" and "Cayenne" must not be used to endorse
29  * or promote products derived from this software without prior written
30  * permission. For written permission, email
31  * "andrus at objectstyle dot org".
32  *
33  * 5. Products derived from this software may not be called "ObjectStyle"
34  * or "Cayenne", nor may "ObjectStyle" or "Cayenne" appear in their
35  * names without prior written permission.
36  *
37  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
38  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40  * DISCLAIMED. IN NO EVENT SHALL THE OBJECTSTYLE GROUP OR
41  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
42  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
43  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
44  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
46  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
47  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
48  * SUCH DAMAGE.
49  * ====================================================================
50  *
51  * This software consists of voluntary contributions made by many
52  * individuals and hosted on ObjectStyle Group web site. For more
53  * information on the ObjectStyle Group, please see
54  * <http://objectstyle.org/>.
55  */

56 package org.objectstyle.cayenne.event;
57
58 import java.lang.reflect.Constructor JavaDoc;
59 import java.util.Map JavaDoc;
60
61 import org.apache.commons.beanutils.BeanUtils;
62 import org.apache.log4j.Logger;
63 import org.objectstyle.cayenne.CayenneRuntimeException;
64
65 /**
66  * Factory to create JavaGroupsBridge instances. If JavaGroups library is not installed this
67  * factory will return a noop EventBridge as a failover mechanism.
68  *
69  * @since 1.1
70  * @author Andrei Adamchik
71  */

72 public class JavaGroupsBridgeFactory implements EventBridgeFactory {
73     private static Logger logObj = Logger.getLogger(JavaGroupsBridgeFactory.class);
74
75     public static final String JavaDoc MCAST_ADDRESS_DEFAULT = "228.0.0.5";
76     public static final String JavaDoc MCAST_PORT_DEFAULT = "22222";
77
78     public static final String JavaDoc MCAST_ADDRESS_PROPERTY =
79         "cayenne.JavaGroupsBridge.mcast.address";
80     public static final String JavaDoc MCAST_PORT_PROPERTY =
81         "cayenne.JavaGroupsBridge.mcast.port";
82
83     /**
84      * Defines a property for JavaGroups XML configuration file. Example file can be found at
85      * <a HREF="http://www.filip.net/javagroups/javagroups-protocol.xml">http://www.filip.net/javagroups/javagroups-protocol.xml</a>.
86      */

87     public static final String JavaDoc JGROUPS_CONFIG_URL_PROPERTY =
88         "javagroupsbridge.config.url";
89
90     /**
91      * Creates a JavaGroupsBridge instance. Since JavaGroups is not shipped with Cayenne and should be
92      * installed separately, a common misconfiguration problem may be the absense of JavaGroups jar file.
93      * This factory returns a dummy noop EventBridge, if this is the case. This would
94      * allow the application to continue to run, but without remote notifications.
95      */

96     public EventBridge createEventBridge(EventSubject localSubject, Map JavaDoc properties) {
97         try {
98             // sniff JavaGroups presence
99
Class.forName("org.jgroups.Channel");
100             return createJavaGroupsBridge(localSubject, properties);
101         } catch (Exception JavaDoc ex) {
102             // recover from no JavaGroups
103
return createNoopBridge();
104         }
105     }
106
107     private EventBridge createNoopBridge() {
108         logObj.warn(
109             "*** Remote events disabled. Reason: JGroups is not available. Download JGroups from http://www.jgroups.org/");
110         return new NoopEventBridge();
111     }
112
113     private EventBridge createJavaGroupsBridge(
114         EventSubject localSubject,
115         Map JavaDoc properties) {
116
117         // create JavaGroupsBridge using reflection to avoid triggering
118
// ClassNotFound exceptions due to JavaGroups absence.
119

120         try {
121             Constructor JavaDoc c =
122                 Class.forName(
123                     "org.objectstyle.cayenne.event.JavaGroupsBridge").getConstructor(
124                     new Class JavaDoc[] { EventSubject.class, String JavaDoc.class });
125
126             Object JavaDoc bridge =
127                 c.newInstance(
128                     new Object JavaDoc[] {
129                         localSubject,
130                         EventBridge.convertToExternalSubject(localSubject)});
131
132             // configure properties
133
String JavaDoc multicastAddress = (String JavaDoc) properties.get(MCAST_ADDRESS_PROPERTY);
134             String JavaDoc multicastPort = (String JavaDoc) properties.get(MCAST_PORT_PROPERTY);
135             String JavaDoc configURL = (String JavaDoc) properties.get(JGROUPS_CONFIG_URL_PROPERTY);
136
137             BeanUtils.setProperty(bridge, "configURL", configURL);
138             BeanUtils.setProperty(
139                 bridge,
140                 "multicastAddress",
141                 multicastAddress != null ? multicastAddress : MCAST_ADDRESS_DEFAULT);
142             BeanUtils.setProperty(
143                 bridge,
144                 "multicastPort",
145                 multicastPort != null ? multicastPort : MCAST_PORT_DEFAULT);
146
147             return (EventBridge) bridge;
148         } catch (Exception JavaDoc ex) {
149             throw new CayenneRuntimeException("Error creating JavaGroupsBridge", ex);
150         }
151     }
152
153     // mockup EventBridge
154
class NoopEventBridge extends EventBridge {
155
156         public NoopEventBridge() {
157             super(null, null);
158         }
159
160         public boolean receivesExternalEvents() {
161             return false;
162         }
163
164         public boolean receivesLocalEvents() {
165             return false;
166         }
167
168         protected void startupExternal() {
169         }
170
171         protected void shutdownExternal() {
172         }
173
174         protected void sendExternalEvent(CayenneEvent localEvent) {
175         }
176
177         public void startup(EventManager eventManager, int mode, Object JavaDoc eventsSource) {
178             this.eventManager = eventManager;
179         }
180
181         public void shutdown() {
182         }
183     }
184 }
185
Popular Tags