/*
* Copyright 2016 MovingBlocks
*
* 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.
*/
package org.terasology.launcher.game;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/***
* Contains version data for a single instance of a Terasology engine build, parsed out of the main jar.
*/
public final class TerasologyGameVersionInfo implements Serializable {
private static final long serialVersionUID = 4L;
private static final Logger logger = LoggerFactory.getLogger(TerasologyGameVersionInfo.class);
private static final String VERSION_INFO_FILE = "org/terasology/version/versionInfo.properties";
private static final String BUILD_NUMBER = "buildNumber";
private static final String BUILD_ID = "buildId";
private static final String BUILD_TAG = "buildTag";
private static final String BUILD_URL = "buildUrl";
private static final String JOB_NAME = "jobName";
private static final String GIT_BRANCH = "gitBranch";
private static final String GIT_COMMIT = "gitCommit";
private static final String DATE_TIME = "dateTime";
private static final String DISPLAY_VERSION = "displayVersion";
private static final String ENGINE_VERSION = "engineVersion";
private static final String DEFAULT_VALUE = "";
private final String buildNumber;
private final String buildId;
private final String buildTag;
private final String buildUrl;
private final String jobName;
private final String gitBranch;
private final String gitCommit;
private final String dateTime;
private final String displayVersion;
private final String engineVersion;
private final String stringRepresentation;
private TerasologyGameVersionInfo(Properties properties) {
buildNumber = properties.getProperty(BUILD_NUMBER, DEFAULT_VALUE);
buildId = properties.getProperty(BUILD_ID, DEFAULT_VALUE);
buildTag = properties.getProperty(BUILD_TAG, DEFAULT_VALUE);
buildUrl = properties.getProperty(BUILD_URL, DEFAULT_VALUE);
jobName = properties.getProperty(JOB_NAME, DEFAULT_VALUE);
gitBranch = properties.getProperty(GIT_BRANCH, DEFAULT_VALUE);
gitCommit = properties.getProperty(GIT_COMMIT, DEFAULT_VALUE);
dateTime = properties.getProperty(DATE_TIME, DEFAULT_VALUE);
displayVersion = properties.getProperty(DISPLAY_VERSION, DEFAULT_VALUE);
engineVersion = properties.getProperty(ENGINE_VERSION, DEFAULT_VALUE);
final StringBuilder stringRepresentationBuilder = new StringBuilder();
stringRepresentationBuilder
.append("[")
.append(BUILD_NUMBER)
.append("=")
.append(buildNumber)
.append(", ")
.append(BUILD_ID)
.append("=")
.append(buildId)
.append(", ")
.append(BUILD_TAG)
.append("=")
.append(buildTag)
.append(", ")
.append(BUILD_URL)
.append("=")
.append(buildUrl)
.append(", ")
.append(JOB_NAME)
.append("=")
.append(jobName)
.append(", ")
.append(GIT_BRANCH)
.append("=")
.append(gitBranch)
.append(", ")
.append(GIT_COMMIT)
.append("=")
.append(gitCommit)
.append(", ")
.append(DATE_TIME)
.append("=")
.append(dateTime)
.append(", ")
.append(DISPLAY_VERSION)
.append("=")
.append(displayVersion)
.append(", ")
.append(ENGINE_VERSION)
.append("=")
.append(engineVersion)
.append("]");
stringRepresentation = stringRepresentationBuilder.toString();
}
public static TerasologyGameVersionInfo getEmptyGameVersionInfo() {
return new TerasologyGameVersionInfo(new Properties());
}
public static TerasologyGameVersionInfo loadFromInputStream(InputStream inStream) {
return new TerasologyGameVersionInfo(loadPropertiesFromInputStream(inStream));
}
private static Properties loadPropertiesFromInputStream(InputStream inStream) {
final Properties properties = new Properties();
if (inStream != null) {
try {
properties.load(inStream);
} catch (IOException e) {
logger.error("Loading game version info failed!", e);
} finally {
try {
inStream.close();
} catch (IOException e) {
logger.warn("Closing InputStream failed!", e);
}
}
}
return properties;
}
public static TerasologyGameVersionInfo loadFromJar(File terasologyGameJar) {
final Properties properties = new Properties();
try {
if (terasologyGameJar.exists() && terasologyGameJar.isFile() && terasologyGameJar.canRead()) {
try (ZipFile zipFile = new ZipFile(terasologyGameJar)) {
final ZipEntry zipEntry = zipFile.getEntry(VERSION_INFO_FILE);
if (zipEntry != null) {
properties.load(zipFile.getInputStream(zipEntry));
}
}
}
if (properties.isEmpty()) {
logger.warn("Could not load TerasologyGameVersionInfo from file '{}'!", terasologyGameJar);
}
} catch (IOException e) {
logger.error("Could not load TerasologyGameVersionInfo from file '{}'!", terasologyGameJar, e);
}
return new TerasologyGameVersionInfo(properties);
}
public String getBuildNumber() {
return buildNumber;
}
public String getBuildId() {
return buildId;
}
public String getBuildTag() {
return buildTag;
}
public String getBuildUrl() {
return buildUrl;
}
public String getJobName() {
return jobName;
}
public String getGitBranch() {
return gitBranch;
}
public String getGitCommit() {
return gitCommit;
}
public String getDateTime() {
return dateTime;
}
public String getDisplayVersion() {
return displayVersion;
}
public String getEngineVersion() {
return engineVersion;
}
@Override
public String toString() {
return stringRepresentation;
}
}