blob: 37a509924c530c7627b0457872363356b310089e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2013 Oracle and/or its affiliates. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
* which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* Contributors:
* Oracle - initial API and implementation from Oracle TopLink
******************************************************************************/
package org.eclipse.persistence.tools.workbench;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;
import org.eclipse.persistence.tools.workbench.framework.internal.FrameworkApplication;
import org.eclipse.persistence.tools.workbench.uitools.GlobalAWTExceptionHandler;
import org.eclipse.persistence.tools.workbench.utility.ClassTools;
import org.eclipse.persistence.tools.workbench.utility.ExceptionBroadcaster;
import org.eclipse.persistence.tools.workbench.utility.ExceptionHandlerThreadGroup;
import org.eclipse.persistence.tools.workbench.utility.ExceptionListener;
import org.eclipse.persistence.tools.workbench.utility.SimpleExceptionBroadcaster;
import org.eclipse.persistence.tools.workbench.utility.log.LoggingExceptionListener;
/**
* Starting point for typical user of the TopLink Workbench.
* This class will parse any command line arguments and launch the
* Framework Application with the appropriate logger and
* the set of preferences. The application will be launched
* in its own thread [and thread group].
*
* Current command-line arguments:
* [-open projectFile]
* [-dev]
*
* This class builds the objects that should be in place before launching
* the application; specifically, the thread group must be in place.
*/
public class Main {
/**
* Launch the Framework Application.
*/
public static void main(String[] args) {
new Main().execute(args);
}
/**
* Default constructor.
*/
private Main() {
super();
}
/**
* Put in the various hooks necessary to catch all the "uncaught"
* exceptions that might occur while the application is executing.
* These hooks will forward those exceptions to the same logger
* that is passed to the application.
*/
private void execute(String[] args) {
// parse the command line arguments
File projectFile = this.projectFile(args);
boolean developmentMode = this.developmentMode(args);
// build the shared logger
Logger logger = this.buildLogger();
ExceptionListener listener = new LoggingExceptionListener(logger, Level.SEVERE, "UNEXPECTED_EXCEPTION");
ExceptionBroadcaster broadcaster = new SimpleExceptionBroadcaster();
broadcaster.addExceptionListener(listener);
// put the exception handler hooks in place
ThreadGroup threadGroup = new ExceptionHandlerThreadGroup("application", broadcaster);
GlobalAWTExceptionHandler.register(broadcaster);
// get the appropriate preferences node
Preferences preferences = this.buildPreferences();
// launch the application - this thread will only live until
// the app is launched and its windows opened,
// at which point the AWT EventDispatchThread will take over
new Thread(threadGroup, new ApplicationLauncher(logger, preferences, projectFile, developmentMode), "Main").start();
}
/**
* Return the project file the user would like to open upon start-up.
*/
private File projectFile(String[] args) {
for (int i = 0; i < args.length; i++) {
String arg = args[i];
if (arg.toLowerCase().equals("-open")) {
int j = i + 1;
if (j < args.length) {
return new File(args[j]);
}
}
}
return null;
}
/**
* Return whether to simulate development mode.
*/
private boolean developmentMode(String[] args) {
for (int i = 0; i < args.length; i++) {
String arg = args[i];
if (arg.toLowerCase().equals("-dev")) {
return true;
}
}
return false;
}
/**
* Build a logger with a name based on our package name.
* This logger will log to the standard error stream
* (typically the console).
*/
private Logger buildLogger() {
Logger logger = Logger.getLogger(this.buildLoggerName(), FrameworkApplication.getResourceBundleName());
return logger;
}
/**
* Return a logger name based on the jdk logging "guidelines".
*/
private String buildLoggerName() {
return ClassTools.packageNameFor(this.getClass());
}
/**
* Build a preferences node with a name based on our package name.
*/
private Preferences buildPreferences() {
Preferences preferences = Preferences.userNodeForPackage(this.getClass());
return preferences;
}
// ********** nested class **********
/**
* Define a command that will launch the application.
*/
private static class ApplicationLauncher implements Runnable {
private Logger logger;
private Preferences preferences;
private File projectFile;
private boolean developmentMode;
ApplicationLauncher(Logger logger, Preferences preferences, File projectFile, boolean developmentMode) {
super();
this.logger = logger;
this.preferences = preferences;
this.projectFile = projectFile;
this.developmentMode = developmentMode;
}
public void run() {
FrameworkApplication.launch(this.logger, this.preferences, this.projectFile, this.developmentMode);
}
}
}