package cloudsync; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.logging.ConsoleHandler; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; import cloudsync.exceptions.InfoException; import org.apache.commons.cli.ParseException; import org.apache.commons.lang3.StringUtils; import cloudsync.connector.LocalFilesystemConnector; import cloudsync.connector.RemoteConnector; import cloudsync.exceptions.CloudsyncException; import cloudsync.exceptions.UsageException; import cloudsync.helper.CmdOptions; import cloudsync.helper.Crypt; import cloudsync.helper.Handler; import cloudsync.logging.LogconsoleHandler; import cloudsync.logging.LogfileFormatter; import cloudsync.logging.LogfileHandler; import cloudsync.model.options.SyncType; public class Cloudsync { private final static Logger LOGGER = Logger.getLogger(Cloudsync.class.getName()); private final CmdOptions options; public Cloudsync(final String[] args) { this.options = new CmdOptions(args); final Logger logger = Logger.getLogger("cloudsync"); logger.setLevel(Level.ALL); java.util.logging.Handler[] handlers = logger.getHandlers(); for(java.util.logging.Handler h : handlers) { h.close(); logger.removeHandler(h); } final ConsoleHandler handler = new LogconsoleHandler(); handler.setLevel(Level.ALL); logger.addHandler(handler); logger.setUseParentHandlers(false); } private void start() throws CloudsyncException, UsageException, InfoException { options.parse(); String logpath = options.getLogfilePath(); if (logpath != null) { final Logger logger = Logger.getLogger("cloudsync"); FileHandler fh; try { Path logfilePath = Paths.get(logpath); if (Files.exists(logfilePath)) { Path preservedPath = Paths.get(logpath + ".1"); Files.move(logfilePath, preservedPath, StandardCopyOption.REPLACE_EXISTING); } fh = new LogfileHandler(logpath); fh.setFormatter(new LogfileFormatter()); logger.addHandler(fh); } catch (SecurityException e) { throw new CloudsyncException("Unexpected error on logfile creation", e); } catch (IOException e) { throw new CloudsyncException("Unexpected error on logfile creation", e); } } String name = options.getName(); final LocalFilesystemConnector localConnection = new LocalFilesystemConnector(options); Handler handler = null; try { String remoteConnectorName = options.getRemoteConnector(); RemoteConnector remoteConnector = null; try { remoteConnector = (RemoteConnector) Class.forName("cloudsync.connector.Remote" + remoteConnectorName + "Connector").newInstance(); } catch (IllegalAccessException e) { } catch (InstantiationException e) { } catch (ClassNotFoundException e) { throw new CloudsyncException("Remote connector '" + remoteConnectorName + "' not found", e); } remoteConnector.init(name, options); final long start = System.currentTimeMillis(); SyncType type = options.getType(); String[] includePatterns = options.getIncludePatterns(); if (includePatterns != null) { LOGGER.log(Level.FINEST, "use include pattern: " + "[^" + StringUtils.join(includePatterns, "$] | [$") + "$]"); } String[] excludePatterns = options.getExcludePatterns(); if (excludePatterns != null) { LOGGER.log(Level.FINEST, "use exclude pattern: " + "[^" + StringUtils.join(excludePatterns, "$] | [$") + "$]"); } handler = new Handler(name, localConnection, remoteConnector, options.getNoEncryption() ? null : new Crypt(options), options.getExistingBehavior(), options.getFollowLinks(), options.getPermissionType(),options.getFileErrorBehavior()); handler.init(type, options.getCacheFile(), options.getLockFile(), options.getPIDFile(), options.getNoCache(), options.getForceStart()); switch ( type ) { case BACKUP: handler.backup(options.isDryRun(), includePatterns, excludePatterns); break; case RESTORE: handler.restore(options.isDryRun(), includePatterns, excludePatterns); break; case LIST: handler.list(includePatterns, excludePatterns); break; case CLEAN: handler.clean(); break; } final long end = System.currentTimeMillis(); LOGGER.log(Level.INFO, "runtime: " + ((end - start) / 1000.0f) + " seconds"); } finally { if (handler != null) handler.finalize(); } } public static void main(final String[] args) throws ParseException { final Cloudsync cloudsync = new Cloudsync(args); try { cloudsync.start(); } catch (UsageException e) { if (!StringUtils.isEmpty(e.getMessage())) { LOGGER.log(Level.WARNING, e.getMessage() + "\n"); } cloudsync.options.printHelp(); } catch (InfoException e) { if (!StringUtils.isEmpty(e.getMessage())) { System.out.println("\n" + e.getMessage() + "\n"); } } catch (CloudsyncException e) { LOGGER.log(Level.WARNING, e.getMessage() + "\n"); if (e.getCause() != null) { e.printStackTrace(); } } } }