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: */package org.apache.geronimo.deployment.cli;
017:
018: import java.io.IOException;
019: import java.io.OutputStreamWriter;
020: import java.util.HashSet;
021: import java.util.List;
022: import java.util.Set;
023:
024: import javax.enterprise.deploy.spi.DeploymentManager;
025: import javax.enterprise.deploy.spi.Target;
026: import javax.enterprise.deploy.spi.TargetModuleID;
027: import javax.enterprise.deploy.spi.status.ProgressEvent;
028: import javax.enterprise.deploy.spi.status.ProgressListener;
029: import javax.enterprise.deploy.spi.status.ProgressObject;
030:
031: import jline.ConsoleReader;
032: import org.apache.geronimo.common.DeploymentException;
033:
034: /**
035: * Base class for CLI deployer commands. Tracks some simple properties and
036: * has common utility methods.
037: *
038: * @version $Rev: 596781 $ $Date: 2007-11-20 10:57:56 -0800 (Tue, 20 Nov 2007) $
039: */
040: public abstract class AbstractCommand implements DeployCommand {
041:
042: public AbstractCommand() {
043: }
044:
045: public boolean isLocalOnly() {
046: return false;
047: }
048:
049: protected void emit(ConsoleReader out, String message)
050: throws IOException {
051: out.printString(DeployUtils.reformat(message, 4, 72));
052: out.flushConsole();
053: }
054:
055: /**
056: * Busy-waits until the provided <code>ProgressObject</code>
057: * indicates that it's no longer running.
058: *
059: * @param out a <code>PrintWriter</code> value, only used in case
060: * of an <code>InterruptedException</code> to output the stack
061: * trace.
062: * @param po a <code>ProgressObject</code> value
063: */
064: protected void waitForProgress(final ConsoleReader out,
065: ProgressObject po) {
066: po.addProgressListener(new ProgressListener() {
067: String last = null;
068:
069: public void handleProgressEvent(ProgressEvent event) {
070: String msg = event.getDeploymentStatus().getMessage();
071: if (last != null && !last.equals(msg)) {
072: try {
073: emit(out, last);
074: } catch (IOException e1) {
075: //ignore
076: }
077: }
078: last = msg;
079: }
080: });
081: while (po.getDeploymentStatus().isRunning()) {
082: try {
083: Thread.sleep(100);
084: } catch (InterruptedException e) {
085: try {
086: out.printString(e.getMessage());
087: out.printNewline();
088: } catch (IOException e1) {
089: //ignore
090: }
091: }
092: }
093: return;
094: }
095:
096: protected static boolean isMultipleTargets(TargetModuleID[] ids) {
097: Set set = new HashSet();
098: for (int i = 0; i < ids.length; i++) {
099: TargetModuleID id = ids[i];
100: set.add(id.getTarget().getName());
101: }
102: return set.size() > 1;
103: }
104:
105: protected static Target[] identifyTargets(List targetNames,
106: final DeploymentManager mgr) throws DeploymentException {
107: //TODO consider if nicknames that match multiple servers should be allowed. Also if regexps should be used in matching
108: Target[] tlist = new Target[targetNames.size()];
109: Target[] all = mgr.getTargets();
110: Set found = new HashSet();
111: for (int i = 0; i < tlist.length; i++) {
112: for (int j = 0; j < all.length; j++) {
113: Target server = all[j];
114: // check for exact target name match
115: if (server.getName().equals(targetNames.get(i))
116: // check for "target-nickname" match (they match if
117: // the full target name contains the user-provided
118: // nickname)
119: || server.getName().indexOf(
120: targetNames.get(i).toString()) > -1) {
121: tlist[i] = server;
122: if (found.contains(server.getName())) {
123: throw new DeploymentException(
124: "Target list should not contain duplicates or nicknames that match duplicates ("
125: + targetNames.get(i) + ")");
126: }
127: found.add(server.getName());
128: break;
129: }
130: }
131: if (tlist[i] == null) {
132: throw new DeploymentException(
133: "No target named or matching '"
134: + targetNames.get(i) + "' was found");
135: }
136: }
137: return tlist;
138: }
139: }
|