You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by br...@apache.org on 2004/07/06 16:42:49 UTC

cvs commit: maven-plugins/artifact/src/main/org/apache/maven/deploy/deployers ScpExeDeployer.java

brett       2004/07/06 07:42:49

  Added:       artifact/src/main/org/apache/maven/deploy/deployers
                        ScpExeDeployer.java
  Log:
  PR: MPARTIFACT-22
  
  Revision  Changes    Path
  1.1                  maven-plugins/artifact/src/main/org/apache/maven/deploy/deployers/ScpExeDeployer.java
  
  Index: ScpExeDeployer.java
  ===================================================================
  package org.apache.maven.deploy.deployers;
  
  
  /* ====================================================================
   *   Copyright 2001-2004 The Apache Software Foundation.
   *
   *   Licensed under the Apache License, Version 2.0 (the "License");
   *   you may not use this file except in compliance with the License.
   *   You may obtain a copy of the License at
   *
   *       http://www.apache.org/licenses/LICENSE-2.0
   *
   *   Unless required by applicable law or agreed to in writing, software
   *   distributed under the License is distributed on an "AS IS" BASIS,
   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *   See the License for the specific language governing permissions and
   *   limitations under the License.
   * ====================================================================
   */
  
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogFactory;
  import org.apache.maven.deploy.DeployRequest;
  import org.apache.maven.deploy.RepositoryInfo;
  import org.apache.maven.deploy.exceptions.AuthenticationException;
  import org.apache.maven.deploy.exceptions.TransferFailedException;
  
  
  /**
   * SCP deployer using "external" scp program.  To allow for
   * ssh-agent type behavior.  Also provides backwards compatible 
   * support for those using the 
   * maven.scp.executable/maven.scp.args
   * and maven.ssh.executable/maven.ssh.args
   * 
   * 
   */
  public class ScpExeDeployer extends AbstractDeployer
  {
  
      public final static String PROTOCOL = "scpexe://";
      private RepositoryInfo repositoryInfo = null;
  
      private String cmd = null;
  
      private static final Log LOG = LogFactory.getLog(ScpExeDeployer.class);
  
      /* (non-Javadoc)
       * @see org.apache.maven.deploy.deployers.Deployer#init(org.apache.maven.deploy.HostInfo)
       */
      public void init(RepositoryInfo repoInfo) throws AuthenticationException
      {
      	repositoryInfo = repoInfo;
      }
  
      private RepositoryInfo getRepositoryInfo() {
      	return repositoryInfo;
      }
      
      /**
       * @see org.apache.maven.deploy.deployers.Deployer#release()
       */
      public void release()
      {
      }
  
      /**
       * @see org.apache.maven.deploy.deployers.Deployer#deploy(org.apache.maven.deploy.DeployRequest)
       */
      public void deploy(DeployRequest request) throws TransferFailedException
      {
          String mkdirCmd =
              "mkdir -p "
                  + getRepositoryInfo().getBasedir()
                  + "/"
                  + request.dirname()
                  + "\n";
  
          executeSimpleCommand(mkdirCmd);
  
          doCopy(request);
  
          if (getRepositoryInfo().getGroup() != null)
          {
              String chgrpCmd =
                  "chgrp "
                      + getRepositoryInfo().getGroup()
                      + " "
                      + getRepositoryInfo().getBasedir()
                      + "/"
                      + request.getDestFile()
                      + "\n";
  
              executeSimpleCommand(chgrpCmd);
          }
      }
      
      private String arrayToString(String[] array) {
      	StringBuffer sb = new StringBuffer();
      	for (int i=0; i<array.length; i++) {
      		sb.append(array[i]);
      		sb.append(" ");
      	}
      	return sb.toString();
      }
      
      private void executeSimpleCommand(String cmd) throws TransferFailedException {
          String args = getRepositoryInfo().getSshArgs();
          if (args == null) {
          	args = "";
          }
      	String[] sshCmd = { getRepositoryInfo().getSshExe(), 
      		args,
  			getRepositoryInfo().getUserName() + "@" + getRepositoryInfo().getHost(),
  			cmd };
      	try {
      		if (LOG.isDebugEnabled()) {
      			LOG.debug("Executing command: " + arrayToString(sshCmd));
      		}
  			Process p = Runtime.getRuntime().exec(sshCmd);
  			p.waitFor();
  		} catch (IOException e) {
  			LOG.error("Error executing command: " + cmd);
  			throw new TransferFailedException("Error executing command: ", e);
  		} catch (InterruptedException e) {
  			LOG.error("Error executing command: " + cmd);
  			throw new TransferFailedException("Error executing command: ", e);
  		}
      }
      
      private void doCopy(DeployRequest request) throws TransferFailedException {
      	 String srcFile = request.getSrcFile();
           String destFile = getRepositoryInfo().getBasedir() + "/" + request.getDestFile();
           String dest = getRepositoryInfo().getUserName() + "@" + getRepositoryInfo().getHost() + ":" + destFile;
           String args = getRepositoryInfo().getScpArgs();
           if (args == null) {
           	args = "";
           }
  
           if (destFile.indexOf("SNAPSHOT") > 0) {
           	// If an old SNAPSHOT exists, remove it
           	executeSimpleCommand("rm -r " + destFile);
           }
  
           String[] scpCmd = { getRepositoryInfo().getScpExe(), 
          		args,
      			srcFile,
  				dest };
          	try {
          		if (LOG.isDebugEnabled()) {
          			LOG.debug("Executing command: " + arrayToString(scpCmd));
          		}
      			Process p = Runtime.getRuntime().exec(scpCmd);
      		    // any error message?
      		    StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");
  
      		    // any output?
      		    StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "OUTPUT");
  
      		    // kick them off
      		    errorGobbler.start();
      		    outputGobbler.start();
  
      			p.waitFor();
      		} catch (IOException e) {
      			LOG.error("Error executing command: " + cmd);
      			throw new TransferFailedException("Error executing command: ", e);
      		} catch (InterruptedException e) {
      			LOG.error("Error executing command: " + cmd);
      			throw new TransferFailedException("Error executing command: ", e);
      		}
      	
      }
      
      private class StreamGobbler extends Thread
  	{
  	    private InputStream is;
  	    private String type;
  	    
  		public StreamGobbler(InputStream is, String type) {
  		    this.is = is;
  		    this.type = type;
  		}	
  	
  		public void run() {
  		    try {
  		        InputStreamReader isr = new InputStreamReader(is);
  		        BufferedReader br = new BufferedReader(isr);
  		        String line = null;
  		        while ((line = br.readLine()) != null) {
  		            LOG.debug(type + ">" + line);
  		        }
  		        br.close();
  		        isr.close();
  	
  		    } catch (IOException ioe) {
  		        ioe.printStackTrace();
  		    }
  		}
  	}
      
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org