package org.eclipse.buckminster.fetcher;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.ecf.core.util.Base64;
import org.eclipse.osgi.util.NLS;
/**
* Base class for {@link IResourceFetcher}. Provides authentication and fetch
* entry point for children classes. Also creates destination directory if
* needed.
*
* @author Guillaume CHATELET
*/
public abstract class AbstractResourceFetcher implements IResourceFetcher {
private final URL url;
private final String destinationDir;
private String login;
private String password;
public AbstractResourceFetcher(URL url, String dir) {
this.url = url;
this.destinationDir = dir;
}
@Override
public void fetch(IProgressMonitor monitor) throws IOException, CoreException {
URLConnection conn = null;
InputStream in = null;
try {
conn = url.openConnection();
if (login != null) {
final String userPassword = login + ':' + password;
final String encoding = Base64.encode(userPassword.getBytes());
conn.setRequestProperty("Authorization", "Basic " + encoding); //$NON-NLS-1$ //$NON-NLS-2$
}
in = conn.getInputStream();
monitor.subTask(NLS.bind(Messages.preparing_destination_folder_0, destinationDir));
prepareDirectories(destinationDir);
monitor.subTask(NLS.bind(Messages.fetching_0, getUrl().toString()));
consume(new BufferedInputStream(in), monitor);
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException ioe) {
}
}
}
@Override
public void setBasicAuthCredential(String login, String password) {
if (login == null || password == null)
throw new NullPointerException(Messages.login_and_password_must_be_not_null);
this.login = login;
this.password = password;
}
protected abstract void consume(InputStream stream, IProgressMonitor monitor) throws IOException, CoreException;
final protected String getDestinationDir() {
return destinationDir;
}
protected URL getUrl() {
return url;
}
final private void prepareDirectories(String dir) {
new File(dir).mkdirs();
}
}