blob: 1f43e20d69cdc0c4c9376df8447760af92a59f5b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Christian Pontesegger and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Christian Pontesegger - initial API and implementation
*******************************************************************************/
package org.eclipse.ease.modules.platform;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
public class FilesystemHandle implements IFileHandle {
private final File fFile;
private int fMode;
protected BufferedReader fReader = null;
private PrintWriter fWriter = null;
private OutputStream fOutput = null;
public FilesystemHandle(final File file, final int mode) {
fFile = file;
fMode = mode;
}
protected BufferedReader createReader() throws Exception {
return new BufferedReader(new InputStreamReader(new FileInputStream(fFile)));
}
private BufferedReader getReader() {
try {
if (fReader == null)
fReader = createReader();
} catch (final Exception e) {
}
return fReader;
}
@Override
public String read(final int characters) throws IOException {
final BufferedReader reader = getReader();
if (reader != null) {
final StringBuilder result = new StringBuilder();
final char[] buffer = new char[1024 * 4];
while (characters != 0) {
final int length = reader.read(buffer, 0, (characters < 0) ? buffer.length : Math.min(buffer.length, characters));
if (length == -1) {
// EOF reached
reader.close();
break;
}
result.append(new String(buffer, 0, length));
}
return result.toString();
}
return null;
}
@Override
public String readLine() throws IOException {
final BufferedReader reader = getReader();
if (reader != null)
return reader.readLine();
return null;
}
@Override
public boolean write(final String data) {
try {
// replace file content or append content
if (fWriter == null) {
if (fOutput == null)
fOutput = new BufferedOutputStream(new FileOutputStream(fFile, (fMode & APPEND) == APPEND));
fWriter = new PrintWriter(new OutputStreamWriter(fOutput));
}
fWriter.print(data);
fWriter.flush();
return true;
} catch (final Exception e) {
}
return false;
}
@Override
public boolean write(final byte[] data) {
try {
// replace file content or append content
if (fOutput == null)
fOutput = new BufferedOutputStream(new FileOutputStream(fFile, (fMode & APPEND) == APPEND));
fOutput.write(data);
fOutput.flush();
return true;
} catch (final Exception e) {
}
return false;
}
protected static StringBuilder read(final Reader reader) throws IOException {
// consume reader
final StringBuilder builder = new StringBuilder();
final char[] buffer = new char[1024 * 4];
int bytes = 0;
do {
bytes = reader.read(buffer);
builder.append(buffer, 0, Math.max(bytes, 0));
} while (bytes != -1);
if (builder.length() > 0)
return builder;
return null;
}
@Override
public boolean exists() {
return fFile.exists();
}
@Override
public boolean createFile(final boolean createHierarchy) throws Exception {
if (createHierarchy) {
final File folder = fFile.getParentFile();
if (!folder.exists())
folder.mkdirs();
}
return fFile.createNewFile();
}
public void setMode(final int mode) {
fMode = mode;
}
protected int getMode() {
return fMode;
}
@Override
protected void finalize() throws Throwable {
close();
super.finalize();
}
@Override
public void close() {
try {
if (fReader != null)
fReader.close();
} catch (final IOException e) {
}
try {
if (fWriter != null)
fWriter.close();
} catch (final Exception e) {
}
try {
if (fOutput != null)
fOutput.close();
} catch (final Exception e) {
}
}
@Override
public Object getFile() {
return fFile;
}
}