net.sourceforge.squirrel_sql.fw.util.IOUtilitiesImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of fw Show documentation
Show all versions of fw Show documentation
The framework library contains utility classes that are generic and useful for building applications
that introspect a database via JDBC. These are not intended to be SQuirreLSQL-specific and could be
used by other projects JDBC front-end applications. This project is guaranteed to have no code
dependencies on other SQuirreLSQL projects and could therefore be used when building a different
JDBC front-end application.
/*
* Copyright (C) 2007 Rob Manning
* [email protected]
*
* 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
*/
package net.sourceforge.squirrel_sql.fw.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.GetMethod;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
public class IOUtilitiesImpl implements IOUtilities
{
/** The size of the byte array which is used to fetch data from disk to do various I/O operations */
public static final int DISK_DATA_BUFFER_SIZE = 8192;
/** Logger for this class. */
private final ILogger s_log = LoggerController.createLogger(IOUtilitiesImpl.class);
/* Spring-Injected */
private FileWrapperFactory fileWrapperFactory;
/**
* @param fileWrapperFactory the fileWrapperFactory to set
*/
public void setFileWrapperFactory(FileWrapperFactory fileWrapperFactory)
{
this.fileWrapperFactory = fileWrapperFactory;
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities#closeInputStream(java.io.InputStream)
*/
public void closeInputStream(InputStream is)
{
if (is != null)
{
try
{
is.close();
}
catch (Exception e)
{
s_log.error("closeInputStream: Unable to close InputStream - " + e.getMessage(), e);
}
}
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities#closeOutputStream(java.io.OutputStream)
*/
public void closeOutputStream(OutputStream os)
{
if (os != null)
{
try
{
os.close();
}
catch (Exception e)
{
s_log.error("closeOutpuStream: Unable to close OutputStream - " + e.getMessage(), e);
}
}
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities#closeReader(java.io.Reader)
*/
public void closeReader(Reader reader)
{
if (reader != null)
{
try
{
reader.close();
}
catch (Exception e)
{
s_log.error("closeReader: Unable to close Reader - " + e.getMessage(), e);
}
}
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities#closeWriter(java.io.Writer)
*/
public void closeWriter(Writer writer)
{
if (writer != null)
{
try
{
writer.close();
}
catch (Exception e)
{
s_log.error("closeReader: Unable to close Writer - " + e.getMessage(), e);
}
}
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities#flushWriter(java.io.Writer)
*/
@Override
public void flushWriter(Writer writer)
{
if (writer != null)
{
try
{
writer.flush();
}
catch (Exception e)
{
s_log.error("flushReader: Unable to flush Writer - " + e.getMessage(), e);
}
}
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities# copyBytes(java.io.InputStream,
* java.io.OutputStream)
*/
public void copyBytes(InputStream is, OutputStream os) throws IOException
{
byte[] buffer = new byte[DISK_DATA_BUFFER_SIZE];
int length;
while ((length = is.read(buffer)) > 0)
{
os.write(buffer, 0, length);
}
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities# copyBytesToFile(java.io.InputStream,
* net.sourceforge.squirrel_sql.fw.util.FileWrapper)
*/
public int copyBytesToFile(InputStream is, FileWrapper outputFile) throws IOException
{
BufferedOutputStream outputFileStream = null;
int totalLength = 0;
try
{
if (!outputFile.exists())
{
outputFile.createNewFile();
}
outputFileStream = new BufferedOutputStream(new FileOutputStream(outputFile.getAbsolutePath()));
byte[] buffer = new byte[DISK_DATA_BUFFER_SIZE];
int length = 0;
while ((length = is.read(buffer)) != -1)
{
totalLength += length;
outputFileStream.write(buffer, 0, length);
}
}
finally
{
closeOutputStream(outputFileStream);
}
return totalLength;
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities#getCheckSum(java.io.File)
*/
public long getCheckSum(File f) throws IOException
{
CRC32 result = new CRC32();
FileInputStream fis = null;
try
{
fis = new FileInputStream(f);
int len = 0;
byte[] buffer = new byte[DISK_DATA_BUFFER_SIZE];
while ((len = fis.read(buffer)) != -1)
{
result.update(buffer, 0, len);
}
}
finally
{
closeInputStream(fis);
}
return result.getValue();
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities#
* getCheckSum(net.sourceforge.squirrel_sql.fw.util.FileWrapper)
*/
public long getCheckSum(FileWrapper f) throws IOException
{
return getCheckSum(new File(f.getAbsolutePath()));
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities#
* copyFile(net.sourceforge.squirrel_sql.fw.util.FileWrapper,
* net.sourceforge.squirrel_sql.fw.util.FileWrapper)
*/
public void copyFile(FileWrapper from, FileWrapper to) throws IOException
{
FileInputStream in = null;
FileOutputStream out = null;
try
{
in = new FileInputStream(from.getAbsolutePath());
out = new FileOutputStream(to.getAbsolutePath());
byte[] buffer = new byte[8192];
int len;
while ((len = in.read(buffer)) != -1)
{
out.write(buffer, 0, len);
}
}
finally
{
closeInputStream(in);
closeOutputStream(out);
}
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities# constructHttpUrl(java.lang.String, int,
* java.lang.String)
*/
public URL constructHttpUrl(final String host, final int port, final String fileToGet)
throws MalformedURLException
{
URL url = null;
String server = host;
if (server.startsWith(HTTP_PROTOCOL_PREFIX))
{
int beginIdx = server.indexOf("://") + 3;
server = server.substring(beginIdx, host.length());
}
if (port == 80)
{
url = new URL(HTTP_PROTOCOL_PREFIX, server, fileToGet);
}
else
{
url = new URL(HTTP_PROTOCOL_PREFIX, server, port, fileToGet);
}
return url;
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities# downloadHttpFile(java.lang.String, int,
* java.lang.String, net.sourceforge.squirrel_sql.fw.util.FileWrapper)
*/
public int downloadHttpFile(URL url, FileWrapper destFile, IProxySettings proxySettings)
throws IOException
{
BufferedInputStream is = null;
HttpMethod method = null;
int resultCode = -1;
int result = -1;
try
{
if (s_log.isDebugEnabled())
{
s_log.debug("downloadHttpFile: downloading file (" + destFile.getName() + ") from url: " + url);
}
HttpClient client = new HttpClient();
setupProxy(proxySettings, client, url);
method = new GetMethod(url.toString());
method.setFollowRedirects(true);
resultCode = client.executeMethod(method);
if (s_log.isDebugEnabled())
{
s_log.debug("downloadHttpFile: response code was: " + resultCode);
}
if (resultCode != 200) { throw new FileNotFoundException("Failed to download file from url (" + url
+ "): HTTP Response Code=" + resultCode); }
InputStream mis = method.getResponseBodyAsStream();
is = new BufferedInputStream(mis);
if (s_log.isDebugEnabled())
{
s_log.debug("downloadHttpFile: writing http response body to file: " + destFile.getAbsolutePath());
}
result = copyBytesToFile(mis, destFile);
}
catch (IOException e)
{
s_log.error("downloadHttpFile: Unexpected exception while "
+ "attempting to open an HTTP connection to url (" + url + ") to download a file ("
+ destFile.getAbsolutePath() + "): " + e.getMessage(), e);
throw e;
}
finally
{
closeInputStream(is);
method.releaseConnection();
}
return result;
}
/**
* Setup proxy configuration specified in proxySettings. This setup is skipped if: 1) proxySettings is
* null. 2) proxySettings.getHttpUseProxy() is false (HttpClient doesn't support SOCKS proxy) 3) The url's
* host component is in the "non-proxy" host list
*
* @param proxySettings
* the ProxySettings to use
* @param client
* the instance of HttpClient to configure
* @param url
* the URL of the file to be retrieved
*/
private void setupProxy(IProxySettings proxySettings, HttpClient client, URL url)
{
if (proxySettings == null) { return; }
if (!proxySettings.getHttpUseProxy()) { return; }
if (proxySettings.getHttpNonProxyHosts() != null
&& proxySettings.getHttpNonProxyHosts().contains(url.getHost())) { return; }
String proxyHost = proxySettings.getHttpProxyServer();
int proxyPort = Integer.parseInt(proxySettings.getHttpProxyPort());
String proxyUsername = proxySettings.getHttpProxyUser();
String proxyPassword = proxySettings.getHttpProxyPassword();
client.getHostConfiguration().setProxy(proxyHost, proxyPort);
if (proxyUsername != null && !"".equals(proxyUsername))
{
Credentials credentials = new UsernamePasswordCredentials(proxyUsername, proxyPassword);
client.getState().setProxyCredentials(AuthScope.ANY, credentials);
}
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities#getLinesFromFile(java.lang.String, java.util.List)
*/
@Override
public List getLinesFromFile(String filename, List lineFixers) throws IOException
{
ArrayList lines = new ArrayList();
BufferedReader reader = new BufferedReader(new FileReader(filename));
String line = null;
while ((line = reader.readLine()) != null)
{
if (lineFixers != null)
{
for (ScriptLineFixer fixer : lineFixers)
{
line = fixer.fixLine(filename, line);
}
}
lines.add(line);
}
reader.close();
return lines;
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities#writeLinesToFile(java.lang.String, java.util.List)
*/
@Override
public void writeLinesToFile(String filename, List lines) throws FileNotFoundException
{
PrintWriter out = new PrintWriter(new File(filename));
for (String outline : lines)
{
out.write(outline);
out.write(NEW_LINE);
}
out.close();
}
/**
* @see net.sourceforge.squirrel_sql.fw.util.IOUtilities# copyResourceFromJarFile(java.lang.String,
* java.lang.String, java.lang.String)
*/
@Override
public void copyResourceFromJarFile(String jarFilename, String resourceName, String destinationFile)
throws ZipException, IOException
{
ZipFile appJar = new ZipFile(new File(jarFilename));
Enumeration extends ZipEntry> entries = appJar.entries();
while (entries.hasMoreElements())
{
ZipEntry entry = entries.nextElement();
String entryName = entry.getName();
if (entryName.endsWith(resourceName))
{
InputStream is = null;
try {
FileWrapper destinationFileWrapper = fileWrapperFactory.create(destinationFile);
is = appJar.getInputStream(entry);
copyBytesToFile(is, destinationFileWrapper);
} finally {
closeInputStream(is);
}
break;
}
}
}
}