blob: 5bb932879977f246bcaf81568819779620c43d90 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.core.startup;
import java.awt.GraphicsEnvironment;
import java.io.File;
import java.io.PrintWriter;
import java.util.Locale;
import java.util.MissingResourceException;
import org.netbeans.CLIHandler;
import org.openide.filesystems.FileUtil;
import org.openide.util.NbBundle;
/**
* Handler for core options.
* @author Jaroslav Tulach
*/
@org.openide.util.lookup.ServiceProvider(service=org.netbeans.CLIHandler.class)
public class CLIOptions extends CLIHandler {
/** directory for modules */
static final String DIR_MODULES = "modules"; // NOI18N
static boolean defaultsLoaded = false; // package private for testing
/** The flag whether to create the log - can be set via -nologging
* command line option */
protected static boolean noLogging = false;
/** The flag whether to show the Splash screen on the startup */
private static boolean noSplash;
/* The class of the UIManager to be used for netbeans - can be set by command-line argument -ui <class name> */
protected static Class uiClass;
static String uiClassName;
/* The size of the fonts in the UI - 0 pt, the default value is set in NbTheme (for Metal L&F), for other L&Fs is set
in the class Main. The value can be changed in Themes.xml in system directory or by command-line argument -fontsize <size> */
private static int uiFontSize = 0;
private static boolean fallbackToMemory;
/** The netbeans home dir - acquired from property netbeans.home */
private static String homeDir;
/** The netbeans user dir - acquired from property netbeans.user */
private static String userDir;
/** The netbeans system dir - ${netbeans.user}/system */
private static String systemDir;
private static File cacheDir;
/**
* Create a default handler.
*/
public CLIOptions() {
super(WHEN_BOOT);
}
protected int cli(Args arguments) {
return cli(arguments.getArguments());
}
private static boolean gui = true;
static boolean isFallbackToMemory() {
return fallbackToMemory;
}
static void fallbackToMemory() {
fallbackToMemory = true;
}
/** Checks whether we are supposed to use GUI features or not.
*/
public static boolean isGui () {
return gui && !GraphicsEnvironment.isHeadless();
}
private static boolean isOption (String value, String optionName) {
if (value == null) return false;
if (value.startsWith ("--") && optionName.length() > 1) {
return value.substring (2).equals (optionName);
} else if (value.startsWith ("-") && optionName.length() == 1) {
return value.substring (1).contains(optionName);
}
return false;
}
public final int cli(String[] args) {
// let's go through the command line
for (int i = 0; i < args.length; i++) {
if (args[i] == null) {
continue;
}
boolean used = true;
if (isOption (args[i], "nogui")) { // NOI18N
gui = false;
} else if (isOption (args[i], "nosplash")) { // NOI18N
noSplash = true;
} else if (isOption (args[i], "noinfo")) { // NOI18N
// obsolete switch, ignore
} else if (isOption (args[i], "nologging")) { // NOI18N
noLogging = true;
} else if (isOption (args[i], "userdir")) { // NOI18N
args[i] = null;
try {
String v = args[++i];
if (!v.equals(/*Places.MEMORY*/"memory")) {
v = FileUtil.normalizeFile(new File(v)).getPath();
}
userDir = v;
System.setProperty("netbeans.user", v);
} catch(ArrayIndexOutOfBoundsException e) {
System.err.println(getString("ERR_UserDirExpected"));
return 2;
}
} else if (isOption(args[i], "cachedir")) { // NOI18N
args[i] = null;
try {
cacheDir = FileUtil.normalizeFile(new File(args[++i]));
} catch(ArrayIndexOutOfBoundsException e) {
System.err.println(getString("ERR_UserDirExpected"));
return 2;
}
} else if (isOption (args[i], "ui") || isOption (args[i], "laf")) { // NOI18N
args[i] = null;
try {
String ui = args[++i];
//Translate L&F ID into L&F class for known IDs
if ("Metal".equals(ui)) {
ui = "javax.swing.plaf.metal.MetalLookAndFeel";
} else if ("GTK".equals(ui)) {
ui = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";
} else if ("Nimbus".equals(ui)) {
ui = "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
} else if ("Windows".equals(ui)) {
ui = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
} else if ("Aqua".equals(ui)) {
ui = "com.apple.laf.AquaLookAndFeel";
}
uiClassName = ui;
uiClass = Class.forName(ui);
} catch(ArrayIndexOutOfBoundsException e) {
System.err.println(getString("ERR_UIExpected"));
return 2;
} catch (ClassNotFoundException e2) {
// ignore, will be reported later. Maybe.
}
} else if (isOption (args[i], "fontsize")) { // NOI18N
args[i] = null;
try {
uiFontSize = Integer.parseInt(args[++i]);
} catch(ArrayIndexOutOfBoundsException e) {
System.err.println(getString("ERR_FontSizeExpected"));
return 2;
} catch (NumberFormatException e2) {
System.err.println(getString("ERR_BadFontSize"));
return 1;
}
} else if (isOption (args[i], "locale")) { // NOI18N
args[i] = null;
try {
String localeParam = args[++i];
String language;
String country = ""; // NOI18N
String variant = ""; // NOI18N
int index1 = localeParam.indexOf(":"); // NOI18N
if (index1 == -1)
language = localeParam;
else {
language = localeParam.substring(0, index1);
int index2 = localeParam.indexOf(":", index1+1); // NOI18N
if (index2 != -1) {
country = localeParam.substring(index1+1, index2);
variant = localeParam.substring(index2+1);
}
else
country = localeParam.substring(index1+1);
}
Locale.setDefault(new Locale(language, country, variant));
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println(getString("ERR_LocaleExpected"));
return 2;
}
} else if (isOption (args[i], "branding")) { // NOI18N
args[i] = null;
if (++i == args.length) {
System.err.println(getString("ERR_BrandingNeedsArgument"));
return 2;
}
String branding = args[i];
if (branding.equals("-")) branding = null; // NOI18N
try {
NbBundle.setBranding(branding);
} catch (IllegalArgumentException iae) {
iae.printStackTrace();
return 1;
}
} else {
used = false;
}
if (used) {
args[i] = null;
}
}
return 0;
}
/** Initializes logging etc.
*/
public static void initialize() {
TopLogging.initialize();
StartLog.logProgress("TopLogging initialized"); // NOI18N
}
protected void usage(PrintWriter w) {
w.println("Core options:");
w.println(" --laf <LaF classname> use given LookAndFeel class instead of the default");
w.println(" --fontsize <size> set the base font size of the user interface, in points");
w.println(" --locale <language[:country[:variant]]> use specified locale");
w.println(" --userdir <path> use specified directory to store user settings");
w.println(" --cachedir <path> use specified directory to store user cache, must be different from userdir");
w.println(" --nosplash do not show the splash screen");
w.println("");
// \ --branding <token> use specified branding (- for default)
//
// \ --nologging do not create the log file\n\
// \ --nogui just start up internals, do not show GUI
}
private static String getString (String key) {
return NbBundle.getMessage (CLIOptions.class, key);
}
//
// Directory functions
//
/** Directory to place logs into logging.
*/
public static String getLogDir () {
return new File (new File (getUserDir (), "var"), "log").toString ();
}
/** Tests need to clear some static variables.
*/
static final void clearForTests () {
homeDir = null;
userDir = null;
}
/** Getter for home directory. */
public static String getHomeDir () {
if (homeDir == null) {
homeDir = System.getProperty ("netbeans.home");
}
return homeDir;
}
/** Getter for user home directory. */
public static String getUserDir () {
if (userDir == null || !userDir.equals(System.getProperty("netbeans.user"))) {
userDir = System.getProperty ("netbeans.user");
if ("memory".equals (userDir)) { // NOI18N
return "memory"; // NOI18N
}
if (userDir == null) {
if (homeDir == null) {
return "memory"; // NOI18N
}
System.err.println(NbBundle.getMessage(CLIOptions.class, "ERR_no_user_directory"));
Thread.dumpStack(); // likely to happen from misbehaving unit tests, etc.
TopLogging.exit(1);
}
// #11735, #21085: avoid relative user dirs, or ../ seqs
File userDirF = FileUtil.normalizeFile(new File(userDir));
String _homeDir = getHomeDir();
if (_homeDir != null) {
File homeDirF = FileUtil.normalizeFile(new File(_homeDir));
if ((userDirF.getAbsolutePath() + File.separatorChar).startsWith(homeDirF.getParentFile().getAbsolutePath() + File.separatorChar)) {
System.err.println(NbBundle.getMessage(CLIOptions.class, "ERR_user_dir_is_inside_home", userDirF, homeDirF.getParentFile()));
TopLogging.exit(1);
}
}
userDir = userDirF.getPath();
System.setProperty("netbeans.user", userDir); // NOI18N
File systemDirFile = new File(userDirF, NbRepository.CONFIG_FOLDER);
makedir (systemDirFile);
systemDir = systemDirFile.getAbsolutePath ();
// makedir(new File(userDirF, DIR_MODULES)); // NOI18N
}
return userDir;
}
public static File getCacheDir() {
return cacheDir;
}
private static void makedir (File f) {
if (f.isFile ()) {
Object[] arg = new Object[] {f};
System.err.println (NbBundle.getMessage (CLIOptions.class, "CTL_CannotCreate_text", arg));
org.netbeans.TopSecurityManager.exit (6);
}
if (! f.exists ()) {
if (! f.mkdirs ()) {
Object[] arg = new Object[] {f};
System.err.println (NbBundle.getMessage (CLIOptions.class, "CTL_CannotCreateSysDir_text", arg));
org.netbeans.TopSecurityManager.exit (7);
}
}
}
/** System directory getter.
*/
protected static String getSystemDir () {
getUserDir ();
return systemDir;
}
//
// other getters
//
private static void initDefaults() {
if (!defaultsLoaded) {
if (CLIOptions.uiFontSize == 0) {
String key = "";
try {
key = NbBundle.getMessage (Main.class, "CTL_globalFontSize"); //NOI18N
} catch (MissingResourceException mre) {
//Key not found, nothing to do
}
if (key.length() > 0) {
try {
CLIOptions.uiFontSize = Integer.parseInt(key);
} catch (NumberFormatException exc) {
//Incorrect value, nothing to do
}
}
}
if (!noSplash) {
// was not overriden from command line - read brandable setting
String value = NbBundle.getMessage(CLIOptions.class, "SplashOnByDefault");
noSplash = !Boolean.parseBoolean(value);
}
defaultsLoaded = true;
}
}
public static int getFontSize () {
initDefaults();
return uiFontSize;
}
static boolean isNoSplash() {
initDefaults();
return noSplash;
}
}