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.clustering.wadi;
018
019 import java.net.URI;
020 import java.util.Collections;
021
022 import org.apache.commons.logging.Log;
023 import org.apache.commons.logging.LogFactory;
024 import org.apache.geronimo.clustering.LocalNode;
025 import org.apache.geronimo.clustering.Node;
026 import org.apache.geronimo.gbean.GBeanInfo;
027 import org.apache.geronimo.gbean.GBeanInfoBuilder;
028 import org.apache.geronimo.gbean.GBeanLifecycle;
029 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory;
030 import org.codehaus.wadi.core.reflect.base.DeclaredMemberFilter;
031 import org.codehaus.wadi.core.reflect.jdk.JDKClassIndexerRegistry;
032 import org.codehaus.wadi.group.Dispatcher;
033 import org.codehaus.wadi.group.DispatcherRegistry;
034 import org.codehaus.wadi.group.MessageExchangeException;
035 import org.codehaus.wadi.group.StaticDispatcherRegistry;
036 import org.codehaus.wadi.servicespace.admin.AdminServiceSpace;
037 import org.codehaus.wadi.tribes.TribesDispatcher;
038 import org.codehaus.wadi.web.impl.URIEndPoint;
039
040 /**
041 *
042 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
043 */
044 public class TribesDispatcherHolder implements GBeanLifecycle, DispatcherHolder {
045 private static final Log log = LogFactory.getLog(TribesDispatcherHolder.class);
046
047 private final URI endPointURI;
048 private final String clusterName;
049 private final LocalNode node;
050 private final DispatcherRegistry dispatcherRegistry;
051
052 private TribesDispatcher dispatcher;
053 private AdminServiceSpace adminServiceSpace;
054
055 public TribesDispatcherHolder(URI endPointURI, String clusterName, LocalNode node) {
056 if (null == endPointURI) {
057 throw new IllegalArgumentException("endPointURI is required");
058 } else if (null == clusterName) {
059 throw new IllegalArgumentException("clusterName is required");
060 } else if (null == node) {
061 throw new IllegalArgumentException("node is required");
062 }
063 this.endPointURI = endPointURI;
064 this.clusterName = clusterName;
065 this.node = node;
066
067 dispatcherRegistry = new StaticDispatcherRegistry();
068 }
069
070 public void doStart() throws Exception {
071 dispatcher = new TribesDispatcher(clusterName,
072 node.getName(),
073 new URIEndPoint(endPointURI),
074 Collections.EMPTY_SET);
075 dispatcher.start();
076
077 adminServiceSpace = new AdminServiceSpace(dispatcher, new JDKClassIndexerRegistry(new DeclaredMemberFilter()));
078
079 registerCustomAdminServices();
080
081 adminServiceSpace.start();
082
083 dispatcherRegistry.register(dispatcher);
084 }
085
086 public void doStop() throws Exception {
087 adminServiceSpace.stop();
088 dispatcherRegistry.unregister(dispatcher);
089 dispatcher.stop();
090 }
091
092 public void doFail() {
093 if (null != adminServiceSpace) {
094 try {
095 adminServiceSpace.stop();
096 } catch (Exception e) {
097 log.error("see nested", e);
098 }
099 }
100
101 if (null != dispatcher) {
102 dispatcherRegistry.unregister(dispatcher);
103 try {
104 dispatcher.stop();
105 } catch (MessageExchangeException e) {
106 log.error("see nested", e);
107 }
108 }
109 }
110
111 public Dispatcher getDispatcher() {
112 return dispatcher;
113 }
114
115 public Node getNode() {
116 return node;
117 }
118
119 protected void registerCustomAdminServices() {
120 NodeServiceHelper nodeServiceHelper = new NodeServiceHelper(adminServiceSpace);
121 nodeServiceHelper.registerNodeService(new BasicNodeService(node));
122 }
123
124 public static final GBeanInfo GBEAN_INFO;
125
126 public static final String GBEAN_ATTR_END_POINT_URI = "endPointURI";
127 public static final String GBEAN_ATTR_CLUSTER_NAME = "clusterName";
128 public static final String GBEAN_ATTR_CLUSTER_URI = "clusterUri";
129
130 public static final String GBEAN_REF_NODE = "Node";
131
132 static {
133 GBeanInfoBuilder infoBuilder = GBeanInfoBuilder.createStatic(TribesDispatcherHolder.class,
134 NameFactory.GERONIMO_SERVICE);
135
136 infoBuilder.addAttribute(GBEAN_ATTR_END_POINT_URI, URI.class, true);
137 infoBuilder.addAttribute(GBEAN_ATTR_CLUSTER_NAME, String.class, true);
138
139 infoBuilder.addReference(GBEAN_REF_NODE, LocalNode.class, NameFactory.GERONIMO_SERVICE);
140
141 infoBuilder.addInterface(DispatcherHolder.class);
142
143 infoBuilder.setConstructor(new String[] {
144 GBEAN_ATTR_END_POINT_URI,
145 GBEAN_ATTR_CLUSTER_NAME,
146 GBEAN_REF_NODE });
147
148 GBEAN_INFO = infoBuilder.getBeanInfo();
149 }
150
151 public static GBeanInfo getGBeanInfo() {
152 return GBEAN_INFO;
153 }
154 }