/**
* Copyright (c) 2015 Genome Research Ltd.
*
* Author: Cancer Genome Project cgpit@sanger.ac.uk
*
* This file is part of WwDocker.
*
* WwDocker is free software: you can redistribute it and/or modify it under the
* terms of the GNU Affero General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option) any
* later version.
*
* This program 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 Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* 1. The usage of a range of years within a copyright statement contained
* within this distribution should be interpreted as being equivalent to a list
* of years including the first and last year specified and all consecutive
* years between them. For example, a copyright statement that reads 'Copyright
* (c) 2005, 2007- 2009, 2011-2012' should be interpreted as being identical to
* a statement that reads 'Copyright (c) 2005, 2007, 2008, 2009, 2011, 2012' and
* a copyright statement that reads "Copyright (c) 2005-2012' should be
* interpreted as being identical to a statement that reads 'Copyright (c) 2005,
* 2006, 2007, 2008, 2009, 2010, 2011, 2012'."
*/
package uk.ac.sanger.cgp.wwdocker.actions;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.DirectoryIteratorException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.configuration.BaseConfiguration;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import uk.ac.sanger.cgp.wwdocker.beans.WorkerState;
/**
*
* @author kr2
*/
public class Utils {
private static final Logger logger = LogManager.getLogger();
protected static String logOutput(String stdout) {
return logOutput(stdout, Level.INFO);
}
public static String logOutput(String stdout, Level type) {
String remainder = null;
String[] lines = stdout.split(System.lineSeparator());
if(! stdout.endsWith(System.lineSeparator())) {
remainder = lines[lines.length-1];
}
int limit = lines.length;
if(remainder == null) {
remainder = "";
}
else {
limit--;
}
for(int i=0; i<limit; i++) {
logger.log(type, "\t" + lines[i]);
}
return remainder;
}
public static Map<String, WorkerState> messagesToWorkerState(List<String> messages) {
Map<String, WorkerState> workers = new HashMap();
for(String m : messages) {
WorkerState ws = (WorkerState) Utils.jsonToObject(m, WorkerState.class);
workers.put(ws.getResource().getHostName(), ws); // we always want the most recent response so this is safe
}
return workers;
}
public static File expandUserDirPath(BaseConfiguration config, String parameter, boolean checkExists) {
File thing = expandUserFilePath(config, parameter, checkExists);
if(!thing.isDirectory()) {
throw new RuntimeException("Path indicated by '"+parameter+"="+config.getString(parameter)+"' is not a directory once expanded to '"+thing.getAbsolutePath()+"'");
}
return thing;
}
public static File expandUserFile(BaseConfiguration config, String parameter, boolean checkExists) {
File thing = expandUserFilePath(config, parameter, checkExists);
if(!thing.isFile()) {
throw new RuntimeException("Path indicated by '"+parameter+"="+config.getString(parameter)+"' is not a file once expanded to '"+thing.getAbsolutePath()+"'");
}
return thing;
}
public static File expandUserFilePath(BaseConfiguration config, String parameter, boolean checkExists) {
String localTmp = config.getString(parameter);
if(localTmp.startsWith("~")) {
logger.trace("Attempting to expand path: " + localTmp);
if(localTmp.startsWith("~/")) {
localTmp = localTmp.replaceFirst("^~", System.getProperty("user.home"));
}
else {
throw new RuntimeException("Config value for '"+parameter+"' must be a full path or begin '~/'");
}
logger.trace("Expanded path: " + localTmp);
}
File expanded = new File(localTmp);
if(!expanded.exists()) {
throw new RuntimeException("File or path indicated by '"+parameter+"="+config.getString(parameter)+"' does not exist once expanded to '"+localTmp+"'");
}
return expanded;
}
public static File thisJarFile() {
File thisJar = null;
try {
thisJar = new File(Remote.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
}
catch(URISyntaxException e) {
throw new RuntimeException(e.getMessage(), e);
}
return thisJar;
}
public static String fileDigest(File file) {
String md5;
try {
FileInputStream fis = new FileInputStream(file);
md5 = DigestUtils.md5Hex(fis);
fis.close();
} catch (FileNotFoundException e) {
throw new RuntimeException(e.getMessage(), e);
}
catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
return md5;
}
public static String objectToJson(Object obj) {
ObjectMapper mapper = new ObjectMapper();
String json;
try {
json = mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new RuntimeException(e.getMessage(), e);
}
return json;
}
public static Object jsonToObject(String json, Class classType) {
ObjectMapper mapper = new ObjectMapper();
Object obj;
try {
obj = mapper.readValue(json, classType);
}
catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
return obj;
}
public static List<File> getGnosKeys(BaseConfiguration config) {
List<File> gnosKeys = new ArrayList();
Path dir = Paths.get(config.getString("gnosKeys"));
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for(Path item : stream) {
File file = item.toFile();
if(file.isFile() && !file.isHidden()) {
gnosKeys.add(file);
}
}
} catch (IOException | DirectoryIteratorException e) {
throw new RuntimeException(e.getMessage(), e);
}
return gnosKeys;
}
public static List<File> getWorkInis(BaseConfiguration config) {
List<File> iniFiles = new ArrayList();
Path dir = Paths.get(config.getString("wfl_inis"));
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
for(Path item : stream) {
File file = item.toFile();
if(file.isFile() && file.canRead() && !file.isHidden()) {
if(!file.getName().endsWith(".ini")) {
continue;
}
iniFiles.add(file);
}
}
} catch (IOException | DirectoryIteratorException e) {
throw new RuntimeException(e.getMessage(), e);
}
return iniFiles;
}
}