/*
* Created on May 24, 2007
*
* This code belongs to Jonathan Fuerth
*/
package net.osmand.data.index;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import net.osmand.Base64;
import net.osmand.LogUtil;
import org.apache.commons.logging.Log;
/**
* Initially was taken from GoogleCodeUploadTask
*/
public class GoogleCodeUploadIndex {
private final static Log log = LogUtil.getLog(GoogleCodeUploadIndex.class);
/**
* Google user name to authenticate as (this is just the username part;
* don't include the @gmail.com part).
*/
private String userName;
/**
* Coogle Code password (not the same as the gmail password) !!!!
*/
private String password;
/**
* Google Code project name to upload to.
*/
private String projectName;
/**
* The local path of the file to upload.
*/
private String fileName;
/**
* The file name that this file will be given on Google Code.
*/
private String targetFileName;
/**
* Summary of the upload.
*/
private String summary;
/**
* Description of the upload.
*/
private String description;
/**
* The labels that the download should have, separated by commas. Extra
* whitespace before and after each label name will not be considered part
* of the label name.
*/
private String labels;
private void log(String e){
log.info(e);
}
/**
* Uploads the contents of the file {@link #fileName} to the project's
* Google Code upload url. Performs the basic http authentication required
* by Google Code.
*/
public void upload() throws IOException {
System.clearProperty("javax.net.ssl.trustStoreProvider"); // fixes open-jdk-issue //$NON-NLS-1$
System.clearProperty("javax.net.ssl.trustStoreType"); //$NON-NLS-1$
final String BOUNDARY = "CowMooCowMooCowCowCow"; //$NON-NLS-1$
URL url = createUploadURL();
log("The upload URL is " + url); //$NON-NLS-1$
InputStream in = new BufferedInputStream(new FileInputStream(fileName));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Authorization", "Basic " + createAuthToken(userName, password)); //$NON-NLS-1$ //$NON-NLS-2$
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); //$NON-NLS-1$ //$NON-NLS-2$
conn.setRequestProperty("User-Agent", "Google Code Upload Ant Task 0.1"); //$NON-NLS-1$ //$NON-NLS-2$
log("Attempting to connect (username is " + userName + ")..."); //$NON-NLS-1$ //$NON-NLS-2$
conn.connect();
//log("Sending request parameters..."); //$NON-NLS-1$
OutputStream out = conn.getOutputStream();
sendLine(out, "--" + BOUNDARY); //$NON-NLS-1$
sendLine(out, "content-disposition: form-data; name=\"summary\""); //$NON-NLS-1$
sendLine(out, ""); //$NON-NLS-1$
sendLine(out, summary);
if (labels != null) {
String[] labelArray = labels.split("\\,"); //$NON-NLS-1$
if (labelArray != null && labelArray.length > 0) {
// log("Setting "+labelArray.length+" label(s)"); //$NON-NLS-1$ //$NON-NLS-2$
for (int n = 0, i = labelArray.length; n < i; n++) {
sendLine(out, "--" + BOUNDARY); //$NON-NLS-1$
sendLine(out, "content-disposition: form-data; name=\"label\""); //$NON-NLS-1$
sendLine(out, ""); //$NON-NLS-1$
sendLine(out, labelArray[n].trim());
}
}
}
log("Sending file... "+targetFileName); //$NON-NLS-1$
sendLine(out, "--" + BOUNDARY); //$NON-NLS-1$
sendLine(out, "content-disposition: form-data; name=\"filename\"; filename=\"" + targetFileName + "\""); //$NON-NLS-1$ //$NON-NLS-2$
sendLine(out, "Content-Type: application/octet-stream"); //$NON-NLS-1$
sendLine(out, ""); //$NON-NLS-1$
int count;
byte[] buf = new byte[8192];
while ( (count = in.read(buf)) >= 0 ) {
out.write(buf, 0, count);
}
in.close();
sendLine(out, ""); //$NON-NLS-1$
sendLine(out, "--" + BOUNDARY + "--"); //$NON-NLS-1$ //$NON-NLS-2$
out.flush();
out.close();
log("Response code " + conn.getResponseCode());
in = conn.getErrorStream();
if (in != null) {
StringBuilder errorBody = new StringBuilder();
while ((count = in.read(buf)) >= 0) {
errorBody.append(new String(buf, 0, count, "utf-8")); //$NON-NLS-1$
}
if (errorBody.length() > 0) {
log("ERROR " + errorBody.toString());
}
in.close();
}
// For whatever reason, you have to read from the input stream before
// the url connection will start sending
in = conn.getInputStream();
StringBuilder responseBody = new StringBuilder();
while ( (count = in.read(buf)) >= 0 ) {
responseBody.append(new String(buf, 0, count, "ascii")); //$NON-NLS-1$
}
log("Upload finished response " + responseBody.toString());
in.close();
conn.disconnect();
}
/**
* Just sends an ASCII version of the given string, followed by a CRLF line terminator,
* to the given output stream.
*/
private void sendLine(OutputStream out, String string) throws IOException {
out.write(string.getBytes("ascii")); //$NON-NLS-1$
out.write("\r\n".getBytes("ascii")); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Creates a (base64-encoded) HTTP basic authentication token for the
* given user name and password.
*/
private static String createAuthToken(String userName, String password) {
String string = (userName + ":" + password); //$NON-NLS-1$
try {
return Base64.encode(string.getBytes("UTF-8")); //$NON-NLS-1$
}
catch (java.io.UnsupportedEncodingException notreached){
throw new InternalError(notreached.toString());
}
}
/**
* Creates the correct URL for uploading to the named google code project.
* If uploadUrl is not set (this is the standard case), the correct URL will
* be generated based on the {@link #projectName}. Otherwise, if uploadUrl
* is set, it will be used and the project name setting will be ignored.
*/
private URL createUploadURL() throws MalformedURLException {
if (projectName == null) {
throw new NullPointerException("projectName must be set"); //$NON-NLS-1$
}
return new URL("https", projectName + ".googlecode.com", "/files"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
}
// ============ Getters and Setters ==============
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getTargetFileName() {
return targetFileName;
}
public void setTargetFileName(String targetFileName) {
this.targetFileName = targetFileName;
}
public String getLabels() {
return labels;
}
public void setLabels(String labels) {
this.labels = labels;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public static void main(String[] args) throws IOException {
GoogleCodeUploadIndex uploadIndex = new GoogleCodeUploadIndex();
// uploadIndex.setLabels("");
// uploadIndex.setProjectName("osmand");
// uploadIndex.setFileName(_);
// uploadIndex.setTargetFileName(_);
// uploadIndex.setUserName(_);
// uploadIndex.setSummary(_);
// uploadIndex.setPassword(_);
uploadIndex.upload();
}
}