001: package celtixinstaller;
002:
003: import java.io.BufferedReader;
004: import java.io.BufferedWriter;
005: import java.io.File;
006: import java.io.FileInputStream;
007: import java.io.FileOutputStream;
008: import java.io.FileWriter;
009: import java.io.InputStreamReader;
010: import java.io.OutputStream;
011: import java.net.URL;
012: import java.util.ArrayList;
013: import java.util.Iterator;
014: import java.util.List;
015: import java.util.Set;
016: import java.util.TreeSet;
017: import java.util.jar.JarEntry;
018: import java.util.jar.JarInputStream;
019:
020: public final class Installer {
021: static final Set BINARY_EXTS = new TreeSet();
022: static {
023: BINARY_EXTS.add("jar");
024: BINARY_EXTS.add("zip");
025: BINARY_EXTS.add("gif");
026: BINARY_EXTS.add("jpg");
027: BINARY_EXTS.add("jpeg");
028: BINARY_EXTS.add("pdf");
029: BINARY_EXTS.add("png");
030: BINARY_EXTS.add("odt");
031: BINARY_EXTS.add("ott");
032: BINARY_EXTS.add("p12");
033: BINARY_EXTS.add("pem");
034: BINARY_EXTS.add("truststore");
035: BINARY_EXTS.add("keystore");
036: BINARY_EXTS.add("exe");
037: BINARY_EXTS.add("dll");
038: }
039: static boolean verbose;
040:
041: private Installer() {
042: //never constructed
043: }
044:
045: private static boolean isBinary(String s) {
046: if (s.indexOf("maven_repo") != -1) {
047: return true;
048: }
049: Iterator it = BINARY_EXTS.iterator();
050: while (it.hasNext()) {
051: String ext = (String) it.next();
052: if (s.endsWith(ext)) {
053: return true;
054: }
055: }
056: return false;
057: }
058:
059: public static void main(String args[]) throws Exception {
060: File outputDir = new File(".");
061: outputDir = outputDir.getCanonicalFile();
062:
063: if (!System.getProperty("java.version").startsWith("1.5")) {
064: System.out.println("WARNING: Installing with Java "
065: + System.getProperty("java.version") + ".");
066: System.out
067: .println(" Celtix requires JDK 1.5 to run.");
068: }
069:
070: if (args.length != 0 && "-verbose".equals(args[0])) {
071: verbose = true;
072: String tmp[] = new String[args.length - 1];
073: System.arraycopy(args, 1, tmp, 0, args.length - 1);
074: args = tmp;
075: }
076: if (args.length != 0) {
077: outputDir = new File(args[0]);
078: }
079:
080: System.out.println("Unpacking celtix to "
081: + outputDir.toString());
082:
083: URL url = Installer.class
084: .getResource("/celtixinstaller/Installer.class");
085:
086: if (url.toString().contains("%20")) {
087: String strReplace = url.toString().replace("%20", " ");
088: url = new URL(strReplace);
089: }
090:
091: String jarf = url.getFile();
092: jarf = jarf.substring(0, jarf.indexOf("!"));
093: url = new URL(jarf);
094:
095: byte buffer[] = new byte[4096];
096: JarInputStream jin = new JarInputStream(new FileInputStream(url
097: .getFile()));
098: List executes = new ArrayList();
099:
100: for (JarEntry entry = jin.getNextJarEntry(); entry != null; entry = jin
101: .getNextJarEntry()) {
102: if (entry.isDirectory()) {
103: if (!entry.getName().startsWith("META-INF")
104: && !entry.getName().startsWith(
105: "celtixinstaller")) {
106: if (verbose) {
107: System.out.println("Making directory: "
108: + entry.getName());
109: }
110: File file = new File(outputDir, entry.getName());
111: file.mkdirs();
112: file.setLastModified(entry.getTime());
113: }
114: } else if (!entry.getName().startsWith("META-INF")
115: && !entry.getName().startsWith("celtixinstaller")) {
116:
117: boolean binary = isBinary(entry.getName().toLowerCase());
118: if ((entry.getName().indexOf("/bin/") != -1 || entry
119: .getName().indexOf("\\bin\\") != -1)
120: && !entry.getName().toLowerCase().endsWith(
121: ".bat")) {
122: executes.add(entry.getName());
123: }
124:
125: File outFile = new File(outputDir, entry.getName());
126: if (binary) {
127: if (verbose) {
128: System.out.println("Installing Binary: "
129: + entry.getName());
130: }
131:
132: OutputStream out = new FileOutputStream(outFile);
133: for (int len = jin.read(buffer); len != -1; len = jin
134: .read(buffer)) {
135: out.write(buffer, 0, len);
136: }
137: out.close();
138: } else {
139: if (verbose) {
140: System.out.println("Installing Text: "
141: + entry.getName());
142: }
143:
144: BufferedWriter writer = new BufferedWriter(
145: new FileWriter(outFile));
146: BufferedReader reader = new BufferedReader(
147: new InputStreamReader(jin));
148: for (String s = reader.readLine(); s != null; s = reader
149: .readLine()) {
150: writer.write(s);
151: writer.newLine();
152: }
153: writer.close();
154: }
155: outFile.setLastModified(entry.getTime());
156: }
157:
158: }
159: setExecutable(executes);
160: }
161:
162: static void setExecutable(List executes) throws Exception {
163: if (System.getProperty("os.name").indexOf("Windows") == -1
164: && !executes.isEmpty()) {
165: if (verbose) {
166: Iterator it = executes.iterator();
167: while (it.hasNext()) {
168: System.out.println("Setting executable: "
169: + it.next());
170: }
171: }
172:
173: //add executable bit
174: executes.add(0, "chmod");
175: executes.add(1, "+x");
176:
177: Runtime.getRuntime().exec(
178: (String[]) executes.toArray(new String[executes
179: .size()]));
180: }
181: }
182: }
|