/*
* ******************************************************************************
* MontiCore Language Workbench
* Copyright (c) 2015, MontiCore, All rights reserved.
*
* This project 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 3.0 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 project. If not, see <http://www.gnu.org/licenses/>.
* ******************************************************************************
*/
package de.monticore.io;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Path;
import org.apache.commons.io.FileUtils;
import com.google.common.base.Charsets;
import de.se_rwth.commons.logging.Log;
/**
* This class handles all I/O commands in Monticore.
* <p>
* Important conventions: File locations are always encoded as Path objects.
* When creating Path objects please make use of the {@link Path#resolve} method
* whenever applicable. This convention extends beyond the FileHandler. Do
* <b>not</b> exchange information between classes using String literals or File
* objects. Doing so within classes is permitted, though discouraged.<br>
* Failure to adhere to such a convention has caused innumerable trivial bugs in
* past implementations.
* <p>
* This class uses UTF_8 encoding per default.
*
* @author Sebastian Oberhoff
*/
public class FileReaderWriter {
private Charset charset;
/**
* Sets the encoding for all subsequent operations until another encoding is
* assigned.
*
* @param charset The encoding to be used
*/
public void setCharset(Charset charset) {
this.charset = charset;
}
/**
* Uses the default encoding UTF_8;
*/
public FileReaderWriter() {
this.charset = Charsets.UTF_8;
}
/**
* @param charset The initial encoding to be used until another encoding is
* assigned.
* @see #setCharset
*/
public FileReaderWriter(Charset charset) {
this.charset = charset;
}
/**
* Writes a String to a file using the specified encoding.
*
* @param targetPath The location of the file to be written to.
* @param content The String that's supposed to be written into the file
* @see #setCharset(Charset)
*/
public void storeInFile(Path targetPath, String content) {
try {
FileUtils.write(targetPath.toFile(), content, this.charset);
}
catch (IOException e) {
Log.error("0xA1023 IOException occured.", e);
Log.debug("IOException occured while trying to write to the File " + targetPath + ".", e,
this.getClass().getName());
}
}
/**
* Reads the String content from a file using the specified encoding.
*
* @param sourcePath The absolute location (fully specifies the filename) of
* the file to be read
* @return The String content of the file
* @see #setCharset(Charset)
*/
public String readFromFile(Path sourcePath) {
String content = null;
try {
content = FileUtils.readFileToString(sourcePath.toFile(), this.charset);
}
catch (IOException e) {
Log.error("0xA1024 IOException occured.", e);
Log.debug("IOException while trying to read the content of " + sourcePath
+ ".", e, this.getClass().getName());
}
Log.errorIfNull(content);
return content;
}
}