/*******************************************************************************
* Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://robocode.sourceforge.net/license/epl-v10.html
*
* Contributors:
* Pavel Savara
* - Initial implementation
*******************************************************************************/
package net.sf.robocode.version;
import net.sf.robocode.io.FileUtil;
import static net.sf.robocode.io.Logger.logError;
import static net.sf.robocode.io.Logger.logMessage;
import static net.sf.robocode.io.Logger.logWarning;
import net.sf.robocode.settings.ISettingsManager;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
/**
* @author Pavel Savara (original)
* @author Mathew A. Nelson (original)
* @author Flemming N. Larsen (contributor)
*/
public final class VersionManager implements IVersionManager {
private static final String VERSIONS_TXT = "versions.txt";
private static final String UNKNOWN_VERSION = "unknown";
private static Version version;
final ISettingsManager settingsManager;
final boolean versionChanged;
public VersionManager(ISettingsManager settingsManager) {
this.settingsManager = settingsManager;
if (settingsManager != null) {
versionChanged = !settingsManager.getLastRunVersion().equals(getVersion());
if (versionChanged) {
settingsManager.setLastRunVersion(getVersion());
}
} else {
versionChanged = false;
}
}
public String checkForNewVersion() {
String newVersLine = null;
InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader reader = null;
try {
URL url = new URL("http://robocode.sourceforge.net/version/version.html");
URLConnection urlConnection = url.openConnection();
urlConnection.setConnectTimeout(5000);
if (urlConnection instanceof HttpURLConnection) {
logMessage("Update checking with http.");
HttpURLConnection h = (HttpURLConnection) urlConnection;
if (h.usingProxy()) {
logMessage("http using proxy.");
}
}
inputStream = urlConnection.getInputStream();
inputStreamReader = new InputStreamReader(inputStream);
reader = new BufferedReader(inputStreamReader);
newVersLine = reader.readLine();
} catch (MalformedURLException e) {
logError("Unable to check for new version", e);
newVersLine = null;
} catch (IOException e) {
logError("Unable to check for new version", e);
newVersLine = null;
} finally {
FileUtil.cleanupStream(inputStream);
FileUtil.cleanupStream(inputStreamReader);
FileUtil.cleanupStream(reader);
}
return newVersLine;
}
public String getVersion() {
return getVersionInstance().toString();
}
private static Version getVersionInstance() {
if (version == null) {
version = new Version(getVersionFromJar());
}
return version;
}
public boolean isLastRunVersionChanged() {
return versionChanged;
}
public String getVersionN() {
Version v = getVersionInstance();
return v.getMajor() + "." + v.getMinor() + "." + v.getRevision() + "." + v.getBuild();
}
public int getVersionAsInt() {
Version v = getVersionInstance();
return (v.getMajor() << 24) + (v.getMinor() << 16) + (v.getRevision() << 8) + v.getBuild();
}
private static String getVersionFromJar() {
String versionString = null;
BufferedReader in = null;
try {
URL versionsUrl = VersionManager.class.getResource("/" + VERSIONS_TXT);
if (versionsUrl == null) {
logError("The URL for the " + VERSIONS_TXT + " was not found");
versionString = UNKNOWN_VERSION;
} else {
final URLConnection connection = versionsUrl.openConnection();
connection.setUseCaches(false);
final InputStream is = connection.getInputStream();
in = new BufferedReader(new InputStreamReader(is));
versionString = in.readLine();
while (versionString != null && !versionString.substring(0, 8).equalsIgnoreCase("Version ")) {
versionString = in.readLine();
}
}
} catch (FileNotFoundException e) {
logError("No " + VERSIONS_TXT + " file in robocode.jar");
versionString = UNKNOWN_VERSION;
} catch (IOException e) {
logError("Error while reading " + VERSIONS_TXT + " from robocode.jar: " + e);
versionString = UNKNOWN_VERSION;
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ignored) {}
}
}
String version = UNKNOWN_VERSION;
if (versionString != null && !versionString.equals(UNKNOWN_VERSION)) {
try {
version = versionString.substring(7);
} catch (Exception ignore) {}
}
if (version.equals(UNKNOWN_VERSION)) {
logWarning("Getting version from file");
return getVersionFromFile();
}
return version;
}
private static String getVersionFromFile() {
String versionString = null;
FileReader fileReader = null;
BufferedReader in = null;
try {
File dir = FileUtil.getCwd();
if (System.getProperty("TESTING", "false").equals("true")) {
dir = dir.getParentFile().getParentFile().getParentFile();
}
fileReader = new FileReader(new File(dir, VERSIONS_TXT));
in = new BufferedReader(fileReader);
versionString = in.readLine();
} catch (FileNotFoundException e) {
logError("No " + VERSIONS_TXT + " file.");
versionString = UNKNOWN_VERSION;
} catch (IOException e) {
logError("IO Exception reading " + VERSIONS_TXT, e);
versionString = UNKNOWN_VERSION;
} finally {
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException ignored) {}
}
if (in != null) {
try {
in.close();
} catch (IOException ignored) {}
}
}
String version = UNKNOWN_VERSION;
if (versionString != null && !versionString.equals(UNKNOWN_VERSION)) {
try {
version = versionString.substring(7);
} catch (Exception ignore) {}
}
return version;
}
}