001 package org.codehaus.mojo.wagon.shared; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one or more contributor license 005 * agreements. See the NOTICE file distributed with this work for additional information regarding 006 * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance with the License. You may obtain a 008 * 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, software distributed under the License 013 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 014 * or implied. See the License for the specific language governing permissions and limitations under 015 * the License. 016 */ 017 018 import java.io.File; 019 import java.io.FileInputStream; 020 import java.io.FileOutputStream; 021 import java.io.IOException; 022 import java.util.zip.ZipEntry; 023 import java.util.zip.ZipOutputStream; 024 025 import org.apache.maven.plugin.logging.Log; 026 import org.apache.maven.shared.model.fileset.FileSet; 027 import org.apache.maven.shared.model.fileset.util.FileSetManager; 028 import org.apache.maven.wagon.CommandExecutor; 029 import org.apache.maven.wagon.UnsupportedProtocolException; 030 import org.apache.maven.wagon.Wagon; 031 import org.apache.maven.wagon.WagonException; 032 import org.codehaus.plexus.util.IOUtil; 033 import org.codehaus.plexus.util.StringUtils; 034 035 /** 036 * @plexus.component role="org.codehaus.mojo.wagon.shared.WagonUpload" role-hint="default" 037 */ 038 039 public class DefaultWagonUpload implements WagonUpload { 040 public void upload(Wagon wagon, FileSet fileset, Log logger) throws WagonException { 041 042 FileSetManager fileSetManager = new FileSetManager(logger, logger.isDebugEnabled()); 043 044 String[] files = fileSetManager.getIncludedFiles(fileset); 045 046 String url = wagon.getRepository().getUrl() + "/"; 047 048 if (files.length == 0) { 049 logger.info("Nothing to upload."); 050 return; 051 } 052 053 for (int i = 0; i < files.length; ++i) { 054 String relativeDestPath = StringUtils.replace(files[i], "\\", "/"); 055 056 if (!StringUtils.isBlank(fileset.getOutputDirectory())) { 057 relativeDestPath = fileset.getOutputDirectory() + "/" + relativeDestPath; 058 } 059 060 File source = new File(fileset.getDirectory(), files[i]); 061 062 logger.info("Uploading " + source + " to " + url + relativeDestPath + " ..."); 063 064 wagon.put(source, relativeDestPath); 065 } 066 067 } 068 069 @Override 070 public void upload(Wagon wagon, FileSet fileset, boolean optimize, Log logger) throws WagonException, IOException { 071 if (!optimize) { 072 upload(wagon, fileset, logger); 073 return; 074 } 075 076 if (!(wagon instanceof CommandExecutor)) { 077 throw new UnsupportedProtocolException("Wagon " + wagon.getRepository().getProtocol() 078 + " does not support optimize upload"); 079 } 080 081 logger.info("Uploading " + fileset); 082 083 File zipFile; 084 zipFile = File.createTempFile("wagon", ".zip"); 085 086 try { 087 FileSetManager fileSetManager = new FileSetManager(logger, logger.isDebugEnabled()); 088 String[] files = fileSetManager.getIncludedFiles(fileset); 089 090 if (files.length == 0) { 091 logger.info("Nothing to upload."); 092 return; 093 } 094 095 logger.info("Creating " + zipFile + " ..."); 096 createZip(files, zipFile, fileset.getDirectory()); 097 098 String remoteFile = zipFile.getName(); 099 String remoteDir = fileset.getOutputDirectory(); 100 if (!StringUtils.isBlank(remoteDir)) { 101 remoteFile = remoteDir + "/" + remoteFile; 102 } 103 104 logger.info("Uploading " + zipFile + " to " + wagon.getRepository().getUrl() + "/" + remoteFile + " ..."); 105 wagon.put(zipFile, remoteFile); 106 107 // We use the super quiet option here as all the noise seems to kill/stall the connection 108 String command = "unzip -o -qq -d " + remoteDir + " " + remoteFile; 109 110 try { 111 logger.info("Remote: " + command); 112 ((CommandExecutor) wagon).executeCommand(command); 113 } finally { 114 command = "rm -f " + remoteFile; 115 logger.info("Remote: " + command); 116 117 ((CommandExecutor) wagon).executeCommand(command); 118 } 119 120 } finally { 121 zipFile.delete(); 122 } 123 124 } 125 126 private static void createZip(String[] files, File zipName, String basedir) throws IOException { 127 ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipName)); 128 129 try { 130 for (int i = 0; i < files.length; i++) { 131 String file = files[i]; 132 133 file = file.replace('\\', '/'); 134 135 writeZipEntry(zos, new File(basedir, file), file); 136 } 137 } finally { 138 IOUtil.close(zos); 139 } 140 } 141 142 private static void writeZipEntry(ZipOutputStream jar, File source, String entryName) throws IOException { 143 byte[] buffer = new byte[1024]; 144 145 int bytesRead; 146 147 FileInputStream is = new FileInputStream(source); 148 149 try { 150 ZipEntry entry = new ZipEntry(entryName); 151 152 jar.putNextEntry(entry); 153 154 while ((bytesRead = is.read(buffer)) != -1) { 155 jar.write(buffer, 0, bytesRead); 156 } 157 } finally { 158 is.close(); 159 } 160 } 161 162 }