//$HeadURL$
/*---------------- FILE HEADER ------------------------------------------
This file is part of deegree.
Copyright (C) 2001-2008 by:
Department of Geography, University of Bonn
http://www.giub.uni-bonn.de/deegree/
lat/lon GmbH
http://www.lat-lon.de
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
Andreas Poth
lat/lon GmbH
Aennchenstr. 19
53177 Bonn
Germany
E-Mail: poth@lat-lon.de
Prof. Dr. Klaus Greve
Department of Geography
University of Bonn
Meckenheimer Allee 166
53115 Bonn
Germany
E-Mail: greve@giub.uni-bonn.de
---------------------------------------------------------------------------*/
package org.deegree.igeo.io;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.net.URL;
import org.apache.commons.httpclient.HttpException;
import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.framework.util.FileUtils;
import org.deegree.framework.util.HttpUtils;
import org.deegree.framework.util.StringTools;
import org.deegree.igeo.ApplicationContainer;
/**
* The <code></code> class TODO add class documentation here.
*
* @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
*
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*
*/
public class RemoteFSAccess implements FileSystemAccess {
private static final ILogger LOG = LoggerFactory.getLogger( RemoteFSAccess.class );
private ApplicationContainer<?> appCont;
private String remoteAddr = "http://blizzard:8280/fileaccess/fileaccess";
/**
*
*/
public RemoteFSAccess() {
if ( System.getProperty( "remoteFileAddress" ) != null ) {
remoteAddr = System.getProperty( "remoteFileAddress" );
}
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.io.FileSystemAccess#setApplicationContainer(org.deegree.igeo.ApplicationContainer)
*/
public void setApplicationContainer( ApplicationContainer<?> appCont ) {
this.appCont = appCont;
// TODO
// read remote address from settings
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.io.FileSystemAccess#deleteFile(java.io.File)
*/
public void deleteFile( File file )
throws IOException {
String req = HttpUtils.addAuthenticationForKVP( "", this.appCont.getUser(), this.appCont.getPassword(),
this.appCont.getCertificate( remoteAddr ) );
StringBuilder sb = new StringBuilder( 500 );
sb.append( req ).append( '&' );
sb.append( "FILE=" ).append( file.getPath() ).append( "&ACTION=delete" );
LOG.logDebug( "remote address: ", remoteAddr );
LOG.logDebug( "request: ", sb );
HttpUtils.performHttpGet( remoteAddr, sb.toString(), 15000, null, null, null );
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.io.FileSystemAccess#exists(java.io.File)
*/
public boolean exists( File file )
throws IOException, HttpException {
String req = HttpUtils.addAuthenticationForKVP( remoteAddr, this.appCont.getUser(), this.appCont.getPassword(),
this.appCont.getCertificate( remoteAddr ) );
StringBuilder sb = new StringBuilder( 500 );
sb.append( req ).append( '&' );
sb.append( "FILE=" ).append( file.getPath() ).append( "&ACTION=exists" );
LOG.logDebug( "remote address: ", remoteAddr );
LOG.logDebug( "request: ", sb );
InputStream is = HttpUtils.performHttpGet( remoteAddr, sb.toString(), 15000, null, null, null ).getResponseBodyAsStream();
String s = FileUtils.readTextFile( is ).toString();
return "true".equals( s );
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.io.FileSystemAccess#listDirectory(java.io.File, java.lang.String[])
*/
public File[] listDirectory( File directory, String... extension )
throws IOException {
String req = HttpUtils.addAuthenticationForKVP( "", this.appCont.getUser(), this.appCont.getPassword(),
this.appCont.getCertificate( remoteAddr ) );
StringBuilder sb = new StringBuilder( 500 );
sb.append( req ).append( '&' );
if ( extension == null ) {
extension = new String[] { "*" };
}
String ext = StringTools.arrayToString( extension, ',' );
if ( ext.equalsIgnoreCase( "prj" ) ) {
sb.append( "action=listProjects&extensions=" ).append( ext );
} else {
sb.append( "action=listDataFiles&extensions=" ).append( ext );
}
if ( directory != null ) {
sb.append( "&root=" ).append( directory.getPath() );
}
LOG.logDebug( "remote address: ", remoteAddr );
LOG.logDebug( "request: ", sb );
InputStream is = HttpUtils.performHttpGet( remoteAddr, sb.toString(), 15000, null, null, null ).getResponseBodyAsStream();
String s = FileUtils.readTextFile( is ).toString();
String[] fl = StringTools.toArray( s, ",;", false );
File[] files = new File[fl.length];
for ( int i = 0; i < fl.length; i++ ) {
files[i] = new File( fl[i] );
}
return files;
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.io.FileSystemAccess#readFile(java.io.File)
*/
public InputStream readFile( File file )
throws IOException {
String req = HttpUtils.addAuthenticationForKVP( "", this.appCont.getUser(), this.appCont.getPassword(),
this.appCont.getCertificate( remoteAddr ) );
StringBuilder sb = new StringBuilder( 500 );
sb.append( req ).append( '&' );
sb.append( "FILE=" ).append( file.getPath() ).append( "&ACTION=readFile" );
LOG.logDebug( "remote address: ", remoteAddr );
LOG.logDebug( "request: ", sb );
return HttpUtils.performHttpGet( remoteAddr, sb.toString(), 15000, null, null, null ).getResponseBodyAsStream();
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.io.FileSystemAccess#getFileURL(java.io.File)
*/
public URL getFileURL( String file )
throws IOException {
if ( file.toLowerCase().startsWith( "http://" ) ) {
return new URL( file );
} else {
File fl = new File( file );
if ( fl.isAbsolute() ) {
fl = new File( fl.getName() );
}
String req = HttpUtils.addAuthenticationForKVP( "", this.appCont.getUser(), this.appCont.getPassword(),
this.appCont.getCertificate( remoteAddr ) );
StringBuilder sb = new StringBuilder( 500 );
String path = StringTools.replace( fl.getPath(), "/", "2F", true );
path = StringTools.replace( path, "\\", "2F", true );
sb.append( remoteAddr ).append( '?' ).append( req ).append( '&' );
sb.append( "FILE=" ).append( path ).append( "&ACTION=readFile" );
LOG.logDebug( "file URL: ", sb );
return new URL( sb.toString() );
}
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.io.FileSystemAccess#writeFile(java.io.File, java.io.InputStream)
*/
public void writeFile( File file, InputStream contentStream )
throws IOException {
String req = HttpUtils.addAuthenticationForKVP( remoteAddr + "?", this.appCont.getUser(),
this.appCont.getPassword(),
this.appCont.getCertificate( remoteAddr ) );
StringBuilder sb = new StringBuilder( 500 );
sb.append( req ).append( '&' ).append( "FILE=" ).append( file.getPath() ).append( "&ACTION=writeFile" );
LOG.logDebug( "remote address: ", remoteAddr );
LOG.logDebug( "request: ", sb );
HttpUtils.performHttpPost( sb.toString(), contentStream, 15000, null, null, "text/xml", null, null );
contentStream.close();
}
/*
* (non-Javadoc)
*
* @see org.deegree.igeo.io.FileSystemAccess#writeFile(java.io.File, java.io.Reader)
*/
public void writeFile( File file, Reader contentReader )
throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream( 100000 );
char[] buffer = new char[10240];
int cnt = contentReader.read( buffer );
do {
String s = new String( buffer, 0, cnt );
bos.write( s.getBytes() );
} while ( ( cnt = contentReader.read( buffer ) ) > 0 );
contentReader.close();
writeFile( file, new ByteArrayInputStream( bos.toByteArray() ) );
bos.close();
}
}