/* * JFileSync * Copyright (C) 2002-2007, Jens Heidrich * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301, USA */ package jfs; import java.io.File; import java.io.PrintStream; import java.net.URL; import javax.swing.UIManager; import jfs.conf.JFSConfig; import jfs.conf.JFSConst; import jfs.conf.JFSDirectoryPair; import jfs.conf.JFSFilter; import jfs.conf.JFSLog; import jfs.conf.JFSSettings; import jfs.conf.JFSText; import jfs.gui.JFSMainView; import jfs.shell.JFSShell; import jfs.sync.JFSTable; /** * JFileSync is an application for synchronizing pairs of directories. This class is the main class of the application. * It processes all command line options and starts (1) a JFS server, (2) the Java Swing-based graphical user interface, * or (3) a command line shell. * * @see JFSServerFactory#startCmdLineServer() * @see jfs.gui.JFSMainView * @see JFSShell#startShell(boolean) * @author Jens Heidrich * @version $Id: JFileSync.java,v 1.40 2007/07/20 15:24:22 heidrich Exp $ */ public final class JFileSync { private JFileSync() { } /** * Determines the home directory, where the JAR file respectively the class files are located. */ public static String getHome() { try { URL packageUrl = ClassLoader.getSystemResource("jfs"); File jfsLibDir = null; // JFS started from JAR: if (packageUrl.getProtocol().equals("jar")) { URL jarUrl = new URL(packageUrl.getFile()); File jfsFile = new File(jarUrl.toURI()); jfsLibDir = jfsFile.getParentFile().getParentFile(); } // JFS started from classes directory: if (packageUrl.getProtocol().equals("file")) { File jfsFile = new File(packageUrl.toURI()); jfsLibDir = jfsFile.getParentFile(); } return jfsLibDir.getPath(); } catch (Exception e) { return "."; } } /** * Start of the application. * * @param args * Command line arguments. */ public static void main(String[] args) { // Get settings for the first time in order to load stored // settings before doing any actions: JFSSettings s = JFSSettings.getInstance(); // Get translation and configuration object: JFSText t = JFSText.getInstance(); JFSConfig config = JFSConfig.getInstance(); PrintStream p = JFSLog.getOut().getStream(); // Clean config before starting (if main method is used as service): config.clean(); boolean quiet = false; boolean loadDefaultFile = true; boolean nogui = false; int i = 0; // Handle command line arguments: try { while (i<args.length) { if (args[i].equals("-debug")) { s.setDebug(true); } else if (args[i].equals("-config")) { i++; config.load(new File(args[i])); loadDefaultFile = false; } else if (args[i].equals("-sync")) { i++; config.setSyncMode(Byte.parseByte(args[i])); loadDefaultFile = false; } else if (args[i].equals("-view")) { i++; config.setView(Byte.parseByte(args[i])); loadDefaultFile = false; } else if (args[i].equals("-dir")) { i++; config.addDirectoryPair(new JFSDirectoryPair(args[i], args[i+1])); i++; loadDefaultFile = false; } else if (args[i].equals("-granularity")) { i++; config.setGranularity(Integer.parseInt(args[i])); loadDefaultFile = false; } else if (args[i].equals("-buffersize")) { i++; config.setBufferSize(Integer.parseInt(args[i])); loadDefaultFile = false; } else if (args[i].equals("-overwriteuseractions")) { config.setKeepUserActions(false); loadDefaultFile = false; } else if (args[i].equals("-nohistory")) { config.setStoreHistory(false); loadDefaultFile = false; } else if (args[i].equals("-nowriteprotection")) { config.setCanWrite(false); loadDefaultFile = false; } else if (args[i].equals("-include")||args[i].equals("-exclude")) { i++; JFSFilter filter = new JFSFilter(args[i]); if (args[i-1].equals("-include")) { config.addInclude(filter); } else { config.addExclude(filter); } if (((i+1)<args.length)&&!args[i+1].startsWith("-")) { i++; filter.setType(args[i]); if (((i+1)<args.length)&&!args[i+1].startsWith("-")) { i++; filter.setRange(args[i]); } } loadDefaultFile = false; } else if (args[i].equals("-username")) { i++; config.setServerUserName(args[i]); loadDefaultFile = false; } else if (args[i].equals("-passphrase")) { i++; config.setServerPassPhrase(args[i]); loadDefaultFile = false; } else if (args[i].equals("-timeout")) { i++; config.setServerTimeout(Integer.parseInt(args[i])); loadDefaultFile = false; } else if (args[i].equals("-nogui")) { nogui = true; } else if (args[i].equals("-quiet")) { quiet = true; } else if (args[i].equals("-laf")) { if (((i+1)>=args.length)||args[i+1].startsWith("-")) { p.println(t.get("cmd.laf")); UIManager.LookAndFeelInfo[] laf = UIManager.getInstalledLookAndFeels(); for (int j = 0; j<laf.length; j++) { p.println(j+1+". "+laf[j].getName()+" <"+laf[j].getClassName()+">"); } System.exit(0); } else { i++; s.setLaf(args[i]); } } else if (args[i].equals("-help")||args[i].equals("-?")) { printCmdLineHelpAndExit(); } else if (args[i].equals("-version")) { p.println(t.get("general.appName")+" "+JFSConst.getInstance().getString("jfs.version")); p.println(t.get("info.copyright")); p.println(t.get("info.author")); p.println(t.get("info.copyright.addon")); p.println(t.get("info.author.addon")); p.println(t.get("info.home")+" "+getHome()); System.exit(0); } else if (args.length==1) { config.load(new File(args[i])); loadDefaultFile = false; } else { printCmdLineHelpAndExit(); } i++; } } catch (ArrayIndexOutOfBoundsException e) { printCmdLineHelpAndExit(); } catch (NumberFormatException e) { JFSLog.getErr().getStream().println(t.get("error.numberFormat")); System.exit(0); } // Initialize new synchronization table: JFSTable table = JFSTable.getInstance(); config.attach(table); if (!nogui) { // Start GUI: p.println(t.get("cmd.startGui")); // Determine whether the last configuration when (stored when // the program was exited should be loaded at GUI startup: s.setNoGui(false); new JFSMainView(loadDefaultFile); } else { s.setNoGui(true); JFSShell.startShell(quiet); } } /** * Performs a busy wait. * * @param duration * The number of milli-seconds to wait. */ public static void busyWait(long duration) { long time = System.currentTimeMillis(); long stop = time+duration; while (time<=stop) { time = System.currentTimeMillis(); } } /** * Prints the command line help file and exits. */ private static void printCmdLineHelpAndExit() { JFSShell.printURL(JFSConst.getInstance().getResourceUrl("jfs.help.topic.cmdLine")); System.exit(0); } }