blob: d8a1564249a2dde3e4b1dd41bbf198e45b8b92d3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.uima.buildhelper;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
/**
* Check if the requested artifact is already in the .m2 repository
* if so, just return
* else, download the requested artifact from archive.apache.org/dist/uima/
*
* @goal copy-from-apache-dist
* @phase validate
*
*/
public class CopyFromApacheDist extends AbstractMojo {
private static final int MAXRETRIES = 6;
private static final int MINTOTALSIZE = 100;
/**
* Group Id
* @parameter default-value="${project.groupId}"
*/
private String groupId;
/**
* Artifact Id
* @parameter default-value="uimaj"
*/
private String artifactId;
/**
* Version, e.g. 2.4.0
* @parameter
* @required
*/
private String version = null;
/**
* Type
*
* @parameter default-value="zip"
*/
private String type;
/**
* Classifier
*
* @parameter default-value="bin"
*/
private String classifier;
/**
* Repository
*
* @parameter default-value="${settings.localRepository}"
*/
private String repository;
public void execute() throws MojoExecutionException {
// repoloc / org/apache/uima / artifactId / version / artifactId - version - classifier . type
String targetInLocalFileSystem = String.format("%s/%s/%s/%s/%s-%s%s.%s",
repository,
groupId.replace('.', '/'),
artifactId,
version,
artifactId,
version,
(classifier.length() > 0) ? ("-" + classifier) : "",
type);
File targetFile = new File(targetInLocalFileSystem);
if (targetFile.exists()) {
System.out.format("copy-from-apache-dist returning, file %s exists%n", targetInLocalFileSystem);
return;
}
// http://archive.apache.org/dist/uima/ artifactId - version / artifactId - version - classifier . type
String remoteLocation = String.format("http://%s.apache.org/dist/uima/%s-%s/%s-%s%s.%s",
"archive",
// "www",
artifactId,
version,
artifactId,
version,
(classifier.length() > 0) ? ("-" + classifier) : "",
type);
// read remote file
URL remoteURL = null;
try {
remoteURL = new URL(remoteLocation);
} catch (MalformedURLException e) {
throw new MojoExecutionException("Bad URL internally: " + remoteLocation, e);
}
FileOutputStream os = null;
targetFile.getParentFile().mkdirs();
if (targetFile.exists()) {
System.out.format(" *** Surprise, file %s exists on 2nd check%n", targetInLocalFileSystem);
return;
}
try {
os = new FileOutputStream(targetFile);
} catch (FileNotFoundException e) {
throw new MojoExecutionException("While creating local file in location " + targetFile.getAbsolutePath(), e);
}
int totalSize = 0;
int readSoFar = 0;
retryLoop:
for (int retry = 0; retry < MAXRETRIES; retry ++) {
HttpURLConnection remoteConnection = null;
InputStream is = null;
try {
remoteConnection = (HttpURLConnection) remoteURL.openConnection();
if (readSoFar > 0) {
String rangespec = String.format("bytes=%d-", readSoFar);
System.out.format("Requesting range: %s%n", rangespec);
remoteConnection.setRequestProperty("Range", rangespec);
}
if (totalSize == 0) {
totalSize = remoteConnection.getContentLength();
if (totalSize < MINTOTALSIZE) {
throw new MojoExecutionException(String.format("File size %d too small for %s%n", totalSize, remoteLocation));
}
}
is = remoteConnection.getInputStream();
// if (readSoFar > 0) {
// System.out.format("Skipping over %,d bytes read so far; this may take some time%n", readSoFar);
// long skipped = is.skip(readSoFar);
// if (skipped != readSoFar) {
// System.out.format("Skipping only skipped %,d out of %,d; retrying", skipped, readSoFar);
// continue retryLoop;
// }
// }
} catch (IOException e) {
throw new MojoExecutionException("While reading remote location " + remoteLocation, e);
}
System.out.format("copy-from-apache-dist file %s to %s%n", remoteLocation, targetInLocalFileSystem);
System.out.format("%,12d of %,12d\r", readSoFar, totalSize);
byte[] buf = new byte[1024*1024]; // buffer size
long timeToLog = System.currentTimeMillis();
while(true) {
int bytesRead;
try {
bytesRead = is.read(buf);
} catch (IOException e) {
throw new MojoExecutionException("While reading remote file in location " + remoteLocation, e);
}
if (bytesRead < 0 ) {
if (readSoFar == totalSize) {
System.out.format("%,12d of %,12d%nFinished%n", readSoFar, totalSize);
break;
}
System.out.format("%n *** Premature EOF, %,12d read out of %,12d Retry %d%n", readSoFar, totalSize, retry);
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (retry == (MAXRETRIES - 1)) {
throw new MojoExecutionException("CopyFromApacheDist retry limit exceeded ");
}
continue retryLoop;
}
retry = 0; // reset retry count because we read some good bytes
try {
os.write(buf, 0, bytesRead);
} catch (IOException e) {
throw new MojoExecutionException("While writing target file in location " + targetFile.getAbsolutePath(), e);
}
readSoFar = readSoFar + bytesRead;
if (System.currentTimeMillis() - timeToLog > 1000) {
timeToLog = System.currentTimeMillis();
System.out.format("%,12d of %,12d\r", readSoFar, totalSize);
}
}
try {
os.close();
} catch (IOException e) {
throw new MojoExecutionException("While closing target file in location " + targetFile.getAbsolutePath(), e);
}
try {
is.close();
} catch (IOException e) {
throw new MojoExecutionException("While closing remote file in location " + remoteLocation, e);
}
break; // out of retry loop
}
}
// public static void main(String[] args) throws IOException {
// String remoteLocation = "http://archive.apache.org/dist/uima/uimaj-2.4.0/uimaj-2.4.0-bin.zip.asc";
// // read remote file
// URL remoteURL = null;
// try {
// remoteURL = new URL(remoteLocation);
// } catch (MalformedURLException e) {
// // throw new MojoExecutionException("Bad URL internally: " + remoteLocation, e);
// }
//
// InputStream is = null;
// try {
// is = remoteURL.openStream();
// } catch (IOException e) {
// e.printStackTrace();
// // throw new MojoExecutionException("While reading remote location " + remoteLocation, e);
// }
// FileOutputStream os = null;
// try {
// os = new FileOutputStream("c:/temp/t");
// } catch (FileNotFoundException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// byte[] buf = new byte[1024*1024]; // 1 meg buffer size
// while(true) {
// int bytesRead = is.read(buf);
// if (bytesRead < 0) {
// break;
// }
// os.write(buf, 0, bytesRead);
// }
// os.close();
// is.close();
//
// }
}