/******************************************************************************* * (c) Copyright 2016 Hewlett-Packard Development Company, L.P. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License v2.0 which accompany this distribution. * * The Apache License is available at * http://www.apache.org/licenses/LICENSE-2.0 * *******************************************************************************/ package io.cloudslang.lang.compiler; import io.cloudslang.lang.entities.SlangSystemPropertyConstant; import java.io.File; import java.io.IOException; import java.net.URI; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; public class SlangSource { private final String content; private final String name; private final String filePath; private final Extension fileExtension; public SlangSource(String content, String name) { Validate.notNull(content, "Source cannot be null"); this.content = content; this.name = name; this.filePath = null; this.fileExtension = null; } private SlangSource(String content, String name, String filePath, Extension fileExtension) { Validate.notNull(content, "Source cannot be null"); this.content = content; this.name = name; this.filePath = filePath; this.fileExtension = fileExtension; } public static SlangSource fromFile(File file) { Validate.notNull(file, "File cannot be null"); Validate.isTrue(file.isFile(), "File content: " + file.getName() + " doesn't lead to a file, directories are not supported"); String content; try { content = readFileToString(file); } catch (IOException e) { throw new RuntimeException("There was a problem reading the file: " + file.getName(), e); } String fileName = file.getName(); String filePath = file.getPath(); Extension extension = Extension.findExtension(fileName); return new SlangSource(content, fileName, filePath, extension); } public static SlangSource fromFile(URI uri) { return fromFile(new File(uri)); } public static SlangSource fromBytes(byte[] bytes, String name) { return new SlangSource(new String(bytes, getCloudSlangCharset()), name); } public static Charset getCloudSlangCharset() { String cslangEncoding = System.getProperty(SlangSystemPropertyConstant.CSLANG_ENCODING.getValue()); return StringUtils.isEmpty(cslangEncoding) ? StandardCharsets.UTF_8 : Charset.forName(cslangEncoding); } private static String readFileToString(File file) throws IOException { Charset charset = getCloudSlangCharset(); return FileUtils.readFileToString(file, charset); } public String getContent() { return content; } public String getName() { return name; } public Extension getFileExtension() { return fileExtension; } public String getFilePath() { return filePath; } @Override public String toString() { return "SlangSource{" + "content='" + content + '\'' + ", name='" + name + '\'' + ", filePath='" + filePath + '\'' + ", fileExtension=" + fileExtension + '}'; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } SlangSource that = (SlangSource) o; return new EqualsBuilder() .append(content, that.content) .append(name, that.name) .append(filePath, that.filePath) .append(fileExtension, that.fileExtension) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder(17, 37) .append(content) .append(name) .append(filePath) .append(fileExtension) .toHashCode(); } }