/*
* Licensed under the Apache License, Version 2.0 (the "License");
*
* You may not use this file except in compliance with the License.
*
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Contributions from 2013-2017 where performed either by US government
* employees, or under US Veterans Health Administration contracts.
*
* US Veterans Health Administration contributions by government employees
* are work of the U.S. Government and are not subject to copyright
* protection in the United States. Portions contributed by government
* employees are USGovWork (17USC ยง105). Not subject to copyright.
*
* Contribution by contractors to the US Veterans Health Administration
* during this period are contractually contributed under the
* Apache License, Version 2.0.
*
* See: https://www.usa.gov/government-works
*
* Contributions prior to 2013:
*
* Copyright (C) International Health Terminology Standards Development Organisation.
* Licensed under the Apache License, Version 2.0.
*
*/
package sh.isaac.pombuilder;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashMap;
import java.util.Map.Entry;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
//~--- non-JDK imports --------------------------------------------------------
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.maven.pom._4_0.Model;
import org.apache.maven.pom._4_0.ObjectFactory;
import sh.isaac.pombuilder.dbbuilder.DBConfigurationCreator;
//~--- classes ----------------------------------------------------------------
/**
* {@link FileUtil}.
*
* @author <a href="mailto:daniel.armbrust.list@gmail.com">Dan Armbrust</a>
*/
public class FileUtil {
/** The Constant LOG. */
private static final Logger LOG = LogManager.getLogger();
//~--- methods -------------------------------------------------------------
/**
* Read file.
*
* @param fileName the file name
* @return the string
* @throws IOException Signals that an I/O exception has occurred.
*/
public static String readFile(String fileName)
throws IOException {
try (InputStream is = DBConfigurationCreator.class.getResourceAsStream("/" + fileName);) {
final byte[] buffer = new byte[is.available()];
is.read(buffer);
return new String(buffer, Charset.forName("UTF-8"));
}
}
/**
* Recursive delete.
*
* @param file the file
* @throws IOException Signals that an I/O exception has occurred.
*/
public static void recursiveDelete(File file)
throws IOException {
if ((file == null) ||!file.exists()) {
return;
}
Files.walkFileTree(file.toPath(),
new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc)
throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
file.delete();
}
/**
* Write file.
*
* @param fromFolder the from folder
* @param relativePath the relative path
* @param toFolder the to folder
* @throws IOException Signals that an I/O exception has occurred.
*/
public static void writeFile(String fromFolder, String relativePath, File toFolder)
throws IOException {
writeFile(fromFolder, relativePath, toFolder, null, null);
}
/**
* Write file.
*
* @param fromFolder the from folder
* @param relativePath the relative path
* @param toFolder the to folder
* @param replacementValues the replacement values
* @param append the append
* @throws IOException Signals that an I/O exception has occurred.
*/
public static void writeFile(String fromFolder,
String relativePath,
File toFolder,
HashMap<String, String> replacementValues,
String append)
throws IOException {
try (InputStream is = FileUtil.class.getResourceAsStream("/" + fromFolder + "/" + relativePath);) {
final byte[] buffer = new byte[is.available()];
is.read(buffer);
String temp = new String(buffer, Charset.forName("UTF-8"));
if (replacementValues != null) {
for (final Entry<String, String> item: replacementValues.entrySet()) {
while (temp.contains(item.getKey())) {
temp = temp.replace(item.getKey(), item.getValue());
}
}
}
if (relativePath.startsWith("DOT")) {
relativePath = relativePath.replaceFirst("^DOT", "."); // front of string
} else if (relativePath.contains("/DOT")) {
relativePath = relativePath.replaceFirst("/DOT", "/."); // down in the relative path
}
final File targetFile = new File(toFolder, relativePath);
targetFile.getParentFile()
.mkdirs();
try (OutputStream outStream = new FileOutputStream(targetFile);) {
outStream.write(temp.getBytes());
if (StringUtils.isNotBlank(append)) {
outStream.write(append.getBytes());
}
}
}
}
/**
* Write pom file.
*
* @param model the model
* @param projectFolder the project folder
* @throws Exception the exception
*/
public static void writePomFile(Model model, File projectFolder)
throws Exception {
try {
final JAXBContext ctx = JAXBContext.newInstance(Model.class);
final Marshaller ma = ctx.createMarshaller();
ma.setProperty(Marshaller.JAXB_SCHEMA_LOCATION,
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd");
ma.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
ma.marshal(new ObjectFactory().createProject(model), new File(projectFolder, "pom.xml"));
} catch (final JAXBException e) {
LOG.error("Error writing", e);
throw new Exception("Error writing pom: " + e);
}
}
}