1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
|
package ij.plugin;
import ij.*;
import ij.gui.*;
import ij.util.Tools;
import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.reflect.*;
/** This plugin implements the Help/Update ImageJ command. */
public class ImageJ_Updater implements PlugIn {
private static final String URL = "http://wsr.imagej.net";
private String notes;
public void run(String arg) {
if (arg.equals("menus")) {
updateMenus();
return;
}
if (IJ.getApplet()!=null)
return;
URL url = getClass().getResource("/ij/IJ.class");
String ij_jar = url == null ? null : url.toString().replaceAll("%20", " ");
if (ij_jar==null || !ij_jar.startsWith("jar:file:")) {
error("Could not determine location of ij.jar");
return;
}
int exclamation = ij_jar.indexOf('!');
ij_jar = ij_jar.substring(9, exclamation);
if (IJ.debugMode) IJ.log("Updater (jar loc): "+ij_jar);
File file = new File(ij_jar);
if (!file.exists()) {
error("File not found: "+file.getPath());
return;
}
if (!file.canWrite()) {
String msg = "No write access: "+file.getPath();
error(msg);
return;
}
String[] list = openUrlAsList(URL+"/jars/list.txt");
if (list==null || list.length==0) {
error("Error opening "+URL+"/jars/list.txt");
return;
}
int count = list.length + 2;
String[] versions = new String[count];
String[] urls = new String[count];
versions[0] = list[0];
urls[0] = URL+"/jars/ij.jar";
for (int i=1; i<count-2; i++) {
String version = list[i];
versions[i] = version.substring(0,version.length()-1); // remove letter
urls[i] = URL+"/jars/ij"+version.substring(1,2)+version.substring(3,6)+".jar";
}
versions[count-2] = "daily build";
urls[count-2] = URL+"/download/daily-build/ij.jar";
versions[count-1] = "previous";
urls[count-1] = URL+"/jars/ij2.jar";
//for (int i=0; i<count; i++)
// IJ.log(i+" "+versions[i]+" "+urls[i]);
int choice = showDialog(versions);
if (choice==-1 || !Commands.closeAll())
return;
byte[] jar = null;
jar = getJar(urls[choice]);
if (jar==null) {
error("Unable to download ij.jar from "+urls[choice]);
return;
}
Prefs.savePreferences();
saveJar(file, jar);
if (choice<count-2) // force macro Function Finder to download fresh list
new File(IJ.getDirectory("macros")+"functions.html").delete();
System.exit(0);
}
int showDialog(String[] versions) {
GenericDialog gd = new GenericDialog("ImageJ Updater 2");
gd.addChoice("Upgrade To:", versions, versions[0]);
String msg =
"You are currently running v"+ImageJ.VERSION+ImageJ.BUILD+".\n"+
" \n"+
"If you click \"OK\", ImageJ will quit\n"+
"and you will be running the upgraded\n"+
"version after you restart ImageJ.\n";
gd.addMessage(msg);
gd.showDialog();
if (gd.wasCanceled())
return -1;
else
return gd.getNextChoiceIndex();
}
String openUrlAsString(String address, int maxLines) {
StringBuffer sb;
try {
URL url = new URL(address);
InputStream in = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
sb = new StringBuffer();
int count = 0;
String line;
while ((line=br.readLine())!=null && count++<maxLines)
sb.append (line + "\n");
in.close ();
} catch (IOException e) {sb = null;}
return sb!=null?new String(sb):null;
}
byte[] getJar(String address) {
byte[] data;
try {
URL url = new URL(address);
IJ.showStatus("Connecting to "+IJ.URL);
URLConnection uc = url.openConnection();
int len = uc.getContentLength();
if (IJ.debugMode) IJ.log("Updater (url): "+ address + " "+ len);
if (len<=0)
return null;
String name = address.contains("daily")?"daily build (":"ij.jar (";
IJ.showStatus("Downloading "+ name + IJ.d2s((double)len/1048576,1)+"MB)");
InputStream in = uc.getInputStream();
data = new byte[len];
int n = 0;
while (n < len) {
int count = in.read(data, n, len - n);
if (count<0)
throw new EOFException();
n += count;
IJ.showProgress(n, len);
}
in.close();
} catch (IOException e) {
if (IJ.debugMode) IJ.log(""+e);
return null;
}
if (IJ.debugMode) IJ.wait(6000);
return data;
}
void saveJar(File f, byte[] data) {
try {
FileOutputStream out = new FileOutputStream(f);
out.write(data, 0, data.length);
out.close();
} catch (IOException e) {
}
}
String[] openUrlAsList(String address) {
IJ.showStatus("Connecting to "+IJ.URL);
Vector v = new Vector();
try {
URL url = new URL(address);
InputStream in = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
while (true) {
line = br.readLine();
if (line==null) break;
if (!line.equals("")) v.addElement(line);
}
br.close();
} catch(Exception e) { }
String[] lines = new String[v.size()];
v.copyInto((String[])lines);
IJ.showStatus("");
return lines;
}
void error(String msg) {
IJ.error("ImageJ Updater", msg);
}
void updateMenus() {
if (IJ.debugMode) {
long start = System.currentTimeMillis();
Menus.updateImageJMenus();
IJ.log("Refresh Menus: "+(System.currentTimeMillis()-start)+" ms");
} else
Menus.updateImageJMenus();
}
}
|