001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with 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,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.geronimo.farm.deployment;
021
022 import org.apache.commons.logging.Log;
023 import org.apache.commons.logging.LogFactory;
024 import org.apache.geronimo.farm.config.ClusterInfo;
025 import org.apache.geronimo.farm.config.NodeInfo;
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.kernel.Kernel;
030 import org.apache.geronimo.kernel.config.ConfigurationManager;
031 import org.apache.geronimo.kernel.config.ConfigurationUtil;
032 import org.apache.geronimo.kernel.repository.Artifact;
033
034 /**
035 *
036 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $
037 */
038 public class BasicClusterConfigurationController implements GBeanLifecycle, ClusterConfigurationController {
039 private static final Log log = LogFactory.getLog(BasicClusterConfigurationController.class);
040
041 private final ClusterInfo clusterInfo;
042 private final String nodeName;
043 private final Artifact artifact;
044 private boolean startConfigurationUponStart;
045 private boolean ignoreStartConfigurationFailureUponStart;
046
047 public BasicClusterConfigurationController(ClusterInfo clusterInfo,
048 String nodeName,
049 Artifact artifact,
050 boolean startConfigurationUponStart,
051 boolean ignoreStartConfigurationFailureUponStart) {
052 if (null == clusterInfo) {
053 throw new IllegalArgumentException("clusterInfo is required");
054 } else if (null == nodeName) {
055 throw new IllegalArgumentException("nodeName is required");
056 } else if (null == artifact) {
057 throw new IllegalArgumentException("artifact is required");
058 }
059 this.clusterInfo = clusterInfo;
060 this.nodeName = nodeName;
061 this.artifact = artifact;
062 this.startConfigurationUponStart = startConfigurationUponStart;
063 this.ignoreStartConfigurationFailureUponStart = ignoreStartConfigurationFailureUponStart;
064 }
065
066 public void doStart() throws Exception {
067 if (startConfigurationUponStart) {
068 try {
069 startConfiguration();
070 } catch (Exception e) {
071 if (ignoreStartConfigurationFailureUponStart) {
072 log.info("Exception while starting configuration [" + artifact + "] on [" + nodeName
073 + "]. Ignoring.", e);
074 } else {
075 log.error("Exception while starting configuration [" + artifact + "] on [" + nodeName + "].", e);
076 throw e;
077 }
078 }
079 }
080 }
081
082 public void doFail() {
083 try {
084 stopConfiguration();
085 } catch (Exception e) {
086 log.error("Exception while stopping configuration [" + artifact + "] on [" + nodeName + "].", e);
087 }
088 }
089
090 public void doStop() throws Exception {
091 try {
092 stopConfiguration();
093 } catch (Exception e) {
094 log.error("Exception while stopping configuration [" + artifact + "] on [" + nodeName + "].", e);
095 throw e;
096 }
097 }
098
099 public void startConfiguration() throws Exception {
100 for (NodeInfo nodeInfo : clusterInfo.getNodeInfos()) {
101 if (!nodeInfo.getName().equals(nodeName)) {
102 continue;
103 }
104
105 Kernel kernel = nodeInfo.newKernel();
106
107 ConfigurationManager configurationManager = newConfigurationManager(kernel);
108 if (!configurationManager.isLoaded(artifact)) {
109 configurationManager.loadConfiguration(artifact);
110 }
111 configurationManager.startConfiguration(artifact);
112 }
113 }
114
115 public void stopConfiguration() throws Exception {
116 for (NodeInfo nodeInfo : clusterInfo.getNodeInfos()) {
117 if (!nodeInfo.getName().equals(nodeName)) {
118 continue;
119 }
120
121 Kernel kernel = nodeInfo.newKernel();
122
123 ConfigurationManager configurationManager = newConfigurationManager(kernel);
124 configurationManager.stopConfiguration(artifact);
125 }
126 }
127
128 protected ConfigurationManager newConfigurationManager(Kernel kernel) {
129 return ConfigurationUtil.getConfigurationManager(kernel);
130 }
131
132 public static final GBeanInfo GBEAN_INFO;
133
134 public static final String GBEAN_J2EE_TYPE = "ClusterConfigurationController";
135 public static final String GBEAN_ATTR_NODE_NAME = "nodeName";
136 public static final String GBEAN_ATTR_ARTIFACT = "artifact";
137 public static final String GBEAN_ATTR_START_CONF_UPON_START= "startConfigurationUponStart";
138 public static final String GBEAN_ATTR_IGNORE_START_CONF_FAIL_UPON_START= "ignoreStartConfigurationFailureUponStart";
139 public static final String GBEAN_REF_CLUSTER_INFO = "ClusterInfo";
140
141 static {
142 GBeanInfoBuilder builder = GBeanInfoBuilder.createStatic(BasicClusterConfigurationController.class, GBEAN_J2EE_TYPE);
143
144 builder.addAttribute(GBEAN_ATTR_NODE_NAME, String.class, true);
145 builder.addAttribute(GBEAN_ATTR_ARTIFACT, Artifact.class, true);
146 builder.addAttribute(GBEAN_ATTR_START_CONF_UPON_START, boolean.class, true);
147 builder.addAttribute(GBEAN_ATTR_IGNORE_START_CONF_FAIL_UPON_START, boolean.class, true);
148
149 builder.addReference(GBEAN_REF_CLUSTER_INFO, ClusterInfo.class);
150
151 builder.addInterface(ClusterConfigurationController.class);
152
153 builder.setConstructor(new String[] {GBEAN_REF_CLUSTER_INFO,
154 GBEAN_ATTR_NODE_NAME,
155 GBEAN_ATTR_ARTIFACT,
156 GBEAN_ATTR_START_CONF_UPON_START,
157 GBEAN_ATTR_IGNORE_START_CONF_FAIL_UPON_START});
158
159 GBEAN_INFO = builder.getBeanInfo();
160 }
161
162 public static GBeanInfo getGBeanInfo() {
163 return GBEAN_INFO;
164 }
165
166 }