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