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 018 package org.apache.geronimo.deployment.cli; 019 020 import java.io.IOException; 021 import java.io.OutputStreamWriter; 022 import java.util.HashSet; 023 import java.util.List; 024 import java.util.Set; 025 026 import javax.enterprise.deploy.spi.DeploymentManager; 027 import javax.enterprise.deploy.spi.Target; 028 import javax.enterprise.deploy.spi.TargetModuleID; 029 import javax.enterprise.deploy.spi.status.ProgressEvent; 030 import javax.enterprise.deploy.spi.status.ProgressListener; 031 import javax.enterprise.deploy.spi.status.ProgressObject; 032 033 import jline.ConsoleReader; 034 import org.apache.geronimo.common.DeploymentException; 035 036 /** 037 * Base class for CLI deployer commands. Tracks some simple properties and 038 * has common utility methods. 039 * 040 * @version $Rev: 706640 $ $Date: 2008-10-21 14:44:05 +0000 (Tue, 21 Oct 2008) $ 041 */ 042 public abstract class AbstractCommand implements DeployCommand { 043 044 public AbstractCommand() { 045 } 046 047 public boolean isLocalOnly() { 048 return false; 049 } 050 051 protected void emit(ConsoleReader out, String message) throws IOException { 052 out.printString(DeployUtils.reformat(message, 4, 72)); 053 out.flushConsole(); 054 } 055 056 /** 057 * Busy-waits until the provided <code>ProgressObject</code> 058 * indicates that it's no longer running. 059 * 060 * @param out a <code>PrintWriter</code> value, only used in case 061 * of an <code>InterruptedException</code> to output the stack 062 * trace. 063 * @param po a <code>ProgressObject</code> value 064 */ 065 protected void waitForProgress(final ConsoleReader out, 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, final DeploymentManager mgr) throws DeploymentException { 106 //TODO consider if nicknames that match multiple servers should be allowed. Also if regexps should be used in matching 107 Target[] tlist = new Target[targetNames.size()]; 108 Target[] all = mgr.getTargets(); 109 Set found = new HashSet(); 110 for (int i = 0; i < tlist.length; i++) { 111 for (int j = 0; j < all.length; j++) { 112 Target server = all[j]; 113 // check for exact target name match 114 if (server.getName().equals(targetNames.get(i)) 115 // check for "target-nickname" match (they match if 116 // the full target name contains the user-provided 117 // nickname) 118 || server.getName().indexOf(targetNames.get(i).toString()) > -1) { 119 tlist[i] = server; 120 if (found.contains(server.getName())) { 121 throw new DeploymentException("Target list should not contain duplicates or nicknames that match duplicates (" + targetNames.get(i) + ")"); 122 } 123 found.add(server.getName()); 124 break; 125 } 126 } 127 if (tlist[i] == null) { 128 throw new DeploymentException("No target named or matching '" + targetNames.get(i) + "' was found"); 129 } 130 } 131 return tlist; 132 } 133 }