/*
* This file is part of JGAP.
*
* JGAP offers a dual license model containing the LGPL as well as the MPL.
*
* For licensing information please see the file license.txt included with JGAP
* or have a look at the top of class org.jgap.Chromosome which representatively
* includes the JGAP license policy applicable for any file delivered with JGAP.
*/
package org.jgap.distr.grid.util;
import java.io.*;
import java.net.*;
import java.util.*;
import org.jgap.distr.grid.gp.*;
import org.jgap.distr.grid.request.*;
import org.jgap.gp.*;
import org.jgap.util.*;
/**
* Utility functions related to distributed/grid computing.
*
* @author Klaus Meffert
* @since 3.2
*/
public class GridKit {
/** String containing the CVS revision. Read out via reflection!*/
private final static String CVS_REVISION = "$Revision: 1.5 $";
public static String ensureDirectory(String a_currentDir, String a_subDir,
String a_descr)
throws IOException {
if (a_currentDir == null || a_currentDir.length() < 1) {
String currentDir = FileKit.getCurrentDir();
// Set workdir, create it if it does not exist.
// --------------------------------------------
String workDir = FileKit.addSubDir(currentDir, a_subDir, true);
File f = new File(workDir);
if (!f.exists()) {
if (!f.mkdirs()) {
throw new RuntimeException("Creation of "
+ a_descr + " "
+ workDir
+ " failed!");
}
}
return workDir;
}
else {
return null;
}
}
public static URLConnection getConnection(String a_url)
throws Exception {
URL url1 = new URL(a_url);
URL url = new URL(url1.toExternalForm());
URLConnection con = url.openConnection();
con.setUseCaches(false);
con.setDoInput(true);
con.setDoOutput(true);
return con;
}
public static VersionInfo isUpdateAvailable(String BASE_URL,
String a_moduleName, String currentVersion)
throws Exception {
VersionInfo result;
/**@todo download a versions.txt file and obtain version per project*/
String url = BASE_URL + "getVersion=" + a_moduleName;
addURLParameter(url, "version", currentVersion);
URLConnection con = GridKit.getConnection(url);
ObjectInputStream ois = new ObjectInputStream(con.getInputStream());
result = (VersionInfo) ois.readObject();
return result;
}
public static String addURLParameter(String a_requestURL, String a_key,
long a_value) {
String result = a_requestURL + "&" + a_key + "=" + a_value;
return result;
}
public static String addURLParameter(String a_requestURL, String a_key,
String a_value) {
String result = a_requestURL + "&" + a_key + "=" + a_value;
return result;
}
public static String retrieveModule(String BASE_URL,
VersionInfo a_versionInfo,
String a_destDir)
throws Exception {
String filename = a_versionInfo.filenameOfLib;
if (!getFile(BASE_URL, filename, a_destDir)) {
return null;
}
return filename;
}
public static void updateModule(String a_filename, String a_workDir,
String a_libDir)
throws Exception {
String libDir = a_libDir;
// Copy module to new location.
// ----------------------------
String sourceFileName = a_workDir + a_filename;
FileKit.copyFile(sourceFileName, libDir);
// Delete file in workdir.
// -----------------------
if (!FileKit.deleteFile(sourceFileName)) {
/**@todo write log: delete manually*/
}
}
public static boolean getFile(String BASE_URL, String a_sourceFilename,
String a_targetDir)
throws Exception {
String filename = FileKit.getFilename(a_sourceFilename);
String destFilename = a_targetDir + filename;
long offset;
// If file already exists, determine start offset
File f = new File(destFilename);
if (f.exists()) {
offset = f.length();
}
else {
offset = 0;
}
String a_url = BASE_URL + "download=";
String requestURL = a_url + a_sourceFilename;
// Include start offset into request
requestURL = GridKit.addURLParameter(requestURL, "offset", offset);
URL url1 = new URL(requestURL);
URL url = new URL(url1.toExternalForm());
// Open connection
HttpURLConnection con = (HttpURLConnection) url.openConnection();
// Configure connection
con.setUseCaches(false);
// con.setDoInput(true);
con.setDoOutput(true);
// Receive result
boolean append;
if (offset == 0) {
append = false;
}
else {
append = true;
}
InputStream in = con.getInputStream();
ObjectInputStream sis = new ObjectInputStream(new BufferedInputStream(in,
1024 * 5));
Status s;
// BufferedInputStream ois = new BufferedInputStream(sis, 1024 * 5);
FileOutputStream fos = new FileOutputStream(destFilename, append);
long currentOffset = 0;
try {
int loopIndex = 0;
do {
s = (Status) sis.readObject();
if (s.code == 0) {
if (loopIndex == 0) {
if (s.buffer == null || s.buffer.length < 1) {
System.out.println("File already exists");
return true;
}
}
}
else if (s.code < 0) {
throw new IOException(s.description);
}
loopIndex++;
fos.write(s.buffer);
currentOffset += s.buffer.length;
if (s.code == 0) {
break;
}
// Thread.sleep(50);
} while (true);
} catch (SocketException sex) {
System.err.println("Connection to server lost"
+ " - file transfer interrupted (resum possible)");
sex.printStackTrace();
// Close file being able to resume it later
fos.close();
return false;
}
fos.close();
System.out.println("File received: " + destFilename);
return true;
}
public static void updateModuleLibrary(String BASE_URL, String a_moduleName,
String a_libDir, String a_workDir)
throws Exception {
String currentVersion;
String JGAPVersionNeeded;
String filename;
boolean isCoreModule;
if (a_moduleName.equalsIgnoreCase("evolutionDistributed")) {
/**@todo zuordnung irgendwo abspeichern*/
filename = "evdistr.jar";
isCoreModule = false;
}
else if (a_moduleName.equalsIgnoreCase("jgap")) {
/**@todo zuordnung irgendwo abspeichern*/
filename = "jgap.jar";
isCoreModule = true;
}
else if (a_moduleName.equalsIgnoreCase("rjgrid")) {
/**@todo zuordnung irgendwo abspeichern*/
filename = "rjgrid.zip";
isCoreModule = true;
}
else {
throw new IllegalArgumentException("Unknown module " + a_moduleName);
}
filename = a_libDir + filename;
// Determine if file available locally
if (!FileKit.existsFile(filename)) {
currentVersion = "none";
System.out.println(" File not found: " + filename);
}
else {
// If file exists: determine version of module
if (isCoreModule) {
currentVersion = FileKit.getVersionOfJGAP(filename);
}
else {
currentVersion = FileKit.getVersionOfModule(filename);
// Also determine minimal version of JGAP library that is
// required for the module to work.
// -------------------------------------------------------
JGAPVersionNeeded = FileKit.getVersionOfJGAP(filename);
}
}
// ask server if update required
VersionInfo versionInfo = GridKit.isUpdateAvailable(BASE_URL, a_moduleName,
currentVersion);
if (versionInfo.currentVersion == null) {
System.out.println("Module " + a_moduleName + " is unknown");
return;
}
if (!currentVersion.equals(versionInfo.currentVersion)) {
System.out.println("Newer module " + a_moduleName + " with version "
+ versionInfo.currentVersion
+ " available");
String workDir = a_workDir;
// Download the newest module version
filename = GridKit.retrieveModule(BASE_URL, versionInfo, workDir);
if (filename != null) {
// Do the update
GridKit.updateModule(filename, workDir, a_libDir);
}
}
else {
System.out.println("Module " + a_moduleName + " with version " +
currentVersion + " is up-to-date");
}
}
public static void updateJGAPLibrary(String BASE_URL, String a_libDir,
String a_workDir)
throws Exception {
updateModuleLibrary(BASE_URL, "jgap", a_libDir, a_workDir);
}
public static void main(String[] args)
throws Exception {
JGAPGPXStream xstream = new JGAPGPXStream();
String dir = "D:\\JavaProjekte\\JGAP_CVS\\work\\storage\\ntb\\";
String filename = "ntb_fitness_20080719180208812_12418.45";
File f = new File(dir, filename);
FileInputStream fis = new FileInputStream(f);
IGPProgram result = (IGPProgram) xstream.fromXML(fis);
String line = result.toStringNorm(0);
Vector v = new Vector();
v.add(line);
writeTextFile(v, dir + filename + ".gp");
fis.close();
}
public static void writeTextFile(Vector zeilen, String dateiname)
throws Exception {
FileWriter fi;
fi = new FileWriter(dateiname, false);
PrintWriter os = new PrintWriter(fi);
String s;
for (int i = 0; i < zeilen.size(); i++) {
s = (String) zeilen.elementAt(i);
os.println(s);
}
os.close();
//Auf Fehler abfragen, da keine Exception �ber PrintWriter erzeugt wird!
if (os.checkError()) {
throw new IOException("Fehler beim Schreiben der Textdatei " + dateiname);
}
}
}