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