/* (c) 2015 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.importer;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystem;
import org.apache.commons.vfs2.FileSystemManager;
import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.VFS;
import org.apache.commons.vfs2.auth.StaticUserAuthenticator;
import org.apache.commons.vfs2.impl.DefaultFileSystemConfigBuilder;
import org.geoserver.platform.GeoServerExtensions;
import org.geoserver.security.GeoServerSecurityManager;
/**
* Import data that will be fetched from a remote location during the init phase, similar to an
* upload, but operated by GeoServer, and turned into another type of import data
*
* @author Andrea Aime - GeoSolutions
*
*/
public class RemoteData extends ImportData {
private static final long serialVersionUID = -1748855285827081507L;
String location;
String domain;
String username;
String password;
public RemoteData(String location) {
this.location = location;
}
public RemoteData(RemoteData other) {
super(other);
this.location = other.location;
this.domain = other.domain;
this.username = other.username;
this.password = other.password;
}
@Override
public String getName() {
return location;
}
/**
* The location from which to fetch the data
*
* @return the location
*/
public String getLocation() {
return location;
}
/**
* @return the username
*/
public String getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return the password
*/
public String getPassword() {
return password;
}
/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}
public ImportData resolve(Importer importer) throws IOException {
// prepare the target
Directory target = Directory.createNew(importer.getUploadRoot());
FileSystemManager manager = null;
FileObject fo = null;
try {
manager = VFS.getManager();
if (username != null) {
StaticUserAuthenticator auth = new StaticUserAuthenticator(domain, username,
password);
FileSystemOptions opts = new FileSystemOptions();
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
fo = manager.resolveFile(location, opts);
} else {
fo = manager.resolveFile(location);
}
target.accept(fo);
} finally {
if (fo != null) {
FileSystem fs = fo.getFileSystem();
fo.close();
manager.closeFileSystem(fs);
}
}
return target;
}
/**
* @return the domain
*/
public String getDomain() {
return domain;
}
/**
* @param domain the domain to set
*/
public void setDomain(String domain) {
this.domain = domain;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((domain == null) ? 0 : domain.hashCode());
result = prime * result + ((location == null) ? 0 : location.hashCode());
result = prime * result + ((password == null) ? 0 : password.hashCode());
result = prime * result + ((username == null) ? 0 : username.hashCode());
return result;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RemoteData other = (RemoteData) obj;
if (domain == null) {
if (other.domain != null)
return false;
} else if (!domain.equals(other.domain))
return false;
if (location == null) {
if (other.location != null)
return false;
} else if (!location.equals(other.location))
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (username == null) {
if (other.username != null)
return false;
} else if (!username.equals(other.username))
return false;
return true;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "RemoteData [location=" + location + ", domain=" + domain + ", username=" + username
+ ", password=" + password + "]";
}
private void writeObject(ObjectOutputStream out) throws IOException {
GeoServerSecurityManager manager = GeoServerExtensions.bean(GeoServerSecurityManager.class);
RemoteData encrypted = new RemoteData(this);
encrypted.setPassword(manager.getConfigPasswordEncryptionHelper().encode(password));
encrypted.defaultWriteObject(out);
}
private void defaultWriteObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
GeoServerSecurityManager manager = GeoServerExtensions.bean(GeoServerSecurityManager.class);
this.password = manager.getConfigPasswordEncryptionHelper().decode(this.password);
}
}