View Javadoc

1   /**
2    *
3    * Copyright 2003-2004 The Apache Software Foundation
4    *
5    *  Licensed under the Apache License, Version 2.0 (the "License");
6    *  you may not use this file except in compliance with the License.
7    *  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   *  Unless required by applicable law or agreed to in writing, software
12   *  distributed under the License is distributed on an "AS IS" BASIS,
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   *  See the License for the specific language governing permissions and
15   *  limitations under the License.
16   */
17  
18  package org.apache.geronimo.deployment.plugin.local;
19  
20  import java.io.PrintWriter;
21  import java.io.StringWriter;
22  import java.util.ArrayList;
23  import java.util.Arrays;
24  import java.util.HashMap;
25  import java.util.HashSet;
26  import java.util.Iterator;
27  import java.util.List;
28  import java.util.Map;
29  import java.util.Set;
30  import javax.enterprise.deploy.shared.ActionType;
31  import javax.enterprise.deploy.shared.CommandType;
32  import javax.enterprise.deploy.shared.ModuleType;
33  import javax.enterprise.deploy.shared.StateType;
34  import javax.enterprise.deploy.spi.TargetModuleID;
35  import javax.enterprise.deploy.spi.exceptions.OperationUnsupportedException;
36  import javax.enterprise.deploy.spi.status.ClientConfiguration;
37  import javax.enterprise.deploy.spi.status.DeploymentStatus;
38  import javax.enterprise.deploy.spi.status.ProgressEvent;
39  import javax.enterprise.deploy.spi.status.ProgressListener;
40  import javax.enterprise.deploy.spi.status.ProgressObject;
41  import org.apache.geronimo.deployment.plugin.TargetModuleIDImpl;
42  import org.apache.geronimo.deployment.plugin.jmx.CommandContext;
43  import org.apache.geronimo.gbean.AbstractName;
44  import org.apache.geronimo.gbean.AbstractNameQuery;
45  import org.apache.geronimo.kernel.InternalKernelException;
46  import org.apache.geronimo.kernel.Kernel;
47  import org.apache.geronimo.kernel.config.ConfigurationModuleType;
48  
49  /**
50   * @version $Rev: 396767 $ $Date: 2006-04-24 21:07:54 -0700 (Mon, 24 Apr 2006) $
51   */
52  public abstract class CommandSupport implements ProgressObject, Runnable {
53      private final CommandType command;
54      private ActionType action;
55      private StateType state;
56      private String message;
57      private final Set listeners = new HashSet();
58      private final List moduleIDs = new ArrayList();
59      protected CommandContext commandContext = null; //todo: this is pretty bad; should add it into constructor
60  
61      private ProgressEvent event = null;
62  
63      protected CommandSupport(CommandType command) {
64          this.command = command;
65          this.action = ActionType.EXECUTE;
66          this.state = StateType.RUNNING;
67          this.message = null;
68      }
69  
70      protected synchronized void addModule(TargetModuleID moduleID) {
71          moduleIDs.add(moduleID);
72      }
73  
74      protected synchronized int getModuleCount() {
75          return moduleIDs.size();
76      }
77  
78      public synchronized TargetModuleID[] getResultTargetModuleIDs() {
79          return (TargetModuleID[]) moduleIDs.toArray(new TargetModuleID[moduleIDs.size()]);
80      }
81  
82      public synchronized DeploymentStatus getDeploymentStatus() {
83          return new Status(command, action, state, message);
84      }
85  
86      public ClientConfiguration getClientConfiguration(TargetModuleID id) {
87          return null;
88      }
89  
90      public boolean isCancelSupported() {
91          return false;
92      }
93  
94      public void cancel() throws OperationUnsupportedException {
95          throw new OperationUnsupportedException("cancel not supported");
96      }
97  
98      public boolean isStopSupported() {
99          return false;
100     }
101 
102     public void stop() throws OperationUnsupportedException {
103         throw new OperationUnsupportedException("stop not supported");
104     }
105 
106     public void addProgressListener(ProgressListener pol) {
107         ProgressEvent event;
108         synchronized (this) {
109             listeners.add(pol);
110             event = this.event;
111         }
112         if(event != null) {
113             pol.handleProgressEvent(event);
114         }
115     }
116 
117     public synchronized void removeProgressListener(ProgressListener pol) {
118         listeners.remove(pol);
119     }
120 
121     public final void fail(String message) {
122         sendEvent(message, StateType.FAILED);
123     }
124 
125     protected final void complete(String message) {
126         sendEvent(message, StateType.COMPLETED);
127     }
128 
129     public final void updateStatus(String message) {
130         sendEvent(message, state);
131     }
132 
133     public void doFail(Exception e) {
134         if (e instanceof InternalKernelException) {
135             Exception test = (Exception)e.getCause();
136             if(test != null) {
137                 e = test;
138             }
139         }
140 
141         if (commandContext.isLogErrors()) {
142             System.err.println("Deployer operation failed: " + e.getMessage());
143             if (commandContext.isVerbose()) {
144                 e.printStackTrace(System.err);
145             }
146         }
147 
148         StringWriter writer = new StringWriter();
149         PrintWriter printWriter = new PrintWriter(writer);
150         printWriter.println(e.getMessage());
151         if (commandContext.isVerbose()) {
152             e.printStackTrace(printWriter);
153         } else {
154             Throwable throwable = e;
155             while (null != (throwable = throwable.getCause())) {
156                 printWriter.println("\t" + throwable.getMessage());
157             }
158         }
159         fail(writer.toString());
160     }
161 
162     private void sendEvent(String message, StateType state) {
163         assert !Thread.holdsLock(this) : "Trying to send event whilst holding lock";
164 
165         ProgressListener[] toNotify;
166         DeploymentStatus newStatus;
167         synchronized (this) {
168             this.message = message;
169             this.state = state;
170             newStatus = new Status(command, action, state, message);
171             toNotify = (ProgressListener[]) listeners.toArray(new ProgressListener[listeners.size()]);
172             event = new ProgressEvent(this, null, newStatus);
173         }
174 
175         for (int i = 0; i < toNotify.length; i++) {
176             toNotify[i].handleProgressEvent(event);
177         }
178     }
179 
180     protected static String clean(String value) {
181         if(value.startsWith("\"") && value.endsWith("\"")) {
182             return value.substring(1, value.length()-1);
183         }
184         return value;
185     }
186 
187     private static class Status implements DeploymentStatus {
188         private final CommandType command;
189         private final ActionType action;
190         private final StateType state;
191         private final String message;
192 
193         public Status(CommandType command, ActionType action, StateType state, String message) {
194             this.command = command;
195             this.action = action;
196             this.state = state;
197             this.message = message;
198         }
199 
200         public CommandType getCommand() {
201             return command;
202         }
203 
204         public ActionType getAction() {
205             return action;
206         }
207 
208         public String getMessage() {
209             return message;
210         }
211 
212         public StateType getState() {
213             return state;
214         }
215 
216         public boolean isRunning() {
217             return StateType.RUNNING.equals(state);
218         }
219 
220         public boolean isCompleted() {
221             return StateType.COMPLETED.equals(state);
222         }
223 
224         public boolean isFailed() {
225             return StateType.FAILED.equals(state);
226         }
227 
228         public String toString() {
229             StringBuffer buf = new StringBuffer();
230             buf.append("DeploymentStatus[").append(command).append(',');
231             buf.append(action).append(',');
232             buf.append(state);
233             if (message != null) {
234                 buf.append(',').append(message);
235             }
236             buf.append(']');
237             return buf.toString();
238         }
239     }
240 
241     public CommandContext getCommandContext() {
242         return commandContext;
243     }
244 
245     public void setCommandContext(CommandContext commandContext) {
246         this.commandContext = new CommandContext(commandContext);
247     }
248 
249     public static ModuleType convertModuleType(ConfigurationModuleType type) {
250         if(type.getValue() == ConfigurationModuleType.WAR.getValue()) {
251             return ModuleType.WAR;
252         }
253         if(type.getValue() == ConfigurationModuleType.RAR.getValue()) {
254             return ModuleType.RAR;
255         }
256         if(type.getValue() == ConfigurationModuleType.EJB.getValue()) {
257             return ModuleType.EJB;
258         }
259         if(type.getValue() == ConfigurationModuleType.EAR.getValue()) {
260             return ModuleType.EAR;
261         }
262         if(type.getValue() == ConfigurationModuleType.CAR.getValue()) {
263             return ModuleType.CAR;
264         }
265         return null;
266     }
267 
268     public static boolean isWebApp(Kernel kernel, String configName) {
269         Map filter = new HashMap();
270         filter.put("j2eeType", "WebModule");
271         filter.put("name", configName);
272         Set set = kernel.listGBeans(new AbstractNameQuery(null, filter));
273         return set.size() > 0;
274     }
275 
276     protected void addWebURLs(Kernel kernel) {
277         addWebURLs(kernel, moduleIDs);
278     }
279 
280     /**
281      * Given a list of TargetModuleIDs, figure out which ones represent web
282      * modules and add a WebURL to each if possible.
283      */
284     public static void addWebURLs(Kernel kernel, List moduleIDs) {
285         Set webApps = null;
286         for (int i = 0; i < moduleIDs.size(); i++) {
287             TargetModuleIDImpl id = (TargetModuleIDImpl) moduleIDs.get(i);
288             if(id.getType() != null && id.getType().getValue() == ModuleType.WAR.getValue()) {
289                 if(webApps == null) {
290                     webApps = kernel.listGBeans(new AbstractNameQuery("org.apache.geronimo.management.geronimo.WebModule"));
291                 }
292                 for (Iterator it = webApps.iterator(); it.hasNext();) {
293                     AbstractName name = (AbstractName) it.next();
294                     if(name.getName().get("name").equals(id.getModuleID())) {
295                         try {
296                             id.setWebURL(kernel.getAttribute(name, "URLFor").toString());
297                         } catch (Exception e) {
298                             e.printStackTrace();
299                         }
300                     }
301                 }
302             }
303             if(id.getChildTargetModuleID() != null) {
304                 addWebURLs(kernel, Arrays.asList(id.getChildTargetModuleID()));
305             }
306         }
307     }
308 
309     public static List loadChildren(Kernel kernel, String configName) {
310         List kids = new ArrayList();
311 
312         Map filter = new HashMap();
313         filter.put("J2EEApplication", configName);
314 
315         filter.put("j2eeType", "WebModule");
316         Set test = kernel.listGBeans(new AbstractNameQuery(null, filter));
317         for (Iterator it = test.iterator(); it.hasNext();) {
318             AbstractName child = (AbstractName) it.next();
319             String childName = child.getNameProperty("name");
320             kids.add(childName);
321         }
322 
323         filter.put("j2eeType", "EJBModule");
324         test = kernel.listGBeans(new AbstractNameQuery(null, filter));
325         for (Iterator it = test.iterator(); it.hasNext();) {
326             AbstractName child = (AbstractName) it.next();
327             String childName = child.getNameProperty("name");
328             kids.add(childName);
329         }
330 
331         filter.put("j2eeType", "AppClientModule");
332         test = kernel.listGBeans(new AbstractNameQuery(null, filter));
333         for (Iterator it = test.iterator(); it.hasNext();) {
334             AbstractName child = (AbstractName) it.next();
335             String childName = child.getNameProperty("name");
336             kids.add(childName);
337         }
338 
339         filter.put("j2eeType", "ResourceAdapterModule");
340         test = kernel.listGBeans(new AbstractNameQuery(null, filter));
341         for (Iterator it = test.iterator(); it.hasNext();) {
342             AbstractName child = (AbstractName) it.next();
343             String childName = child.getNameProperty("name");
344             kids.add(childName);
345         }
346         return kids;
347     }
348 }