/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved. * * Oracle and Java are registered trademarks of Oracle and/or its affiliates. * Other names may be trademarks of their respective owners. * * The contents of this file are subject to the terms of either the GNU General * Public License Version 2 only ("GPL") or the Common Development and Distribution * License("CDDL") (collectively, the "License"). You may not use this file except in * compliance with the License. You can obtain a copy of the License at * http://www.netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the * License for the specific language governing permissions and limitations under the * License. When distributing the software, include this License Header Notice in * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP. Oracle * designates this particular file as subject to the "Classpath" exception as * provided by Oracle in the GPL Version 2 section of the License file that * accompanied this code. If applicable, add the following below the License Header, * with the fields enclosed by brackets [] replaced by your own identifying * information: "Portions Copyrighted [year] [name of copyright owner]" * * Contributor(s): * * The Original Software is NetBeans. The Initial Developer of the Original Software * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All * Rights Reserved. * * If you wish your version of this file to be governed by only the CDDL or only the * GPL Version 2, indicate your decision by adding "[Contributor] elects to include * this software in this distribution under the [CDDL or GPL Version 2] license." If * you do not indicate a single choice of license, a recipient has the option to * distribute your version of this file under either the CDDL, the GPL Version 2 or * to extend the choice of license to its licensees as provided above. However, if * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then * the option applies only if the new code is made subject to such option by the * copyright holder. */ package org.mycompany.installer.utils.applications; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.netbeans.installer.utils.FileUtils; import org.netbeans.installer.utils.LogManager; import org.netbeans.installer.utils.ResourceUtils; import org.netbeans.installer.utils.StringUtils; import org.netbeans.installer.utils.SystemUtils; import org.netbeans.installer.utils.exceptions.NativeException; import org.netbeans.installer.utils.system.WindowsNativeUtils; import org.netbeans.installer.utils.system.WindowsNativeUtils; import org.netbeans.installer.utils.system.windows.WindowsRegistry; /** * * @author Dmitry Lipin */ public class NetBeansRCPUtils { /** * Get resolved application user directory * @param appLocation Application home directory * @throws IOException if can`t get application default userdir */ public static File getApplicationUserDirFile(File appLocation) throws IOException { String dir = getApplicationUserDir(appLocation); String userHome = System.getProperty("user.home"); if(SystemUtils.isWindows()) { WindowsNativeUtils wnu = (WindowsNativeUtils) SystemUtils.getNativeUtils(); WindowsRegistry reg = wnu.getWindowsRegistry(); String key = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; try { if(reg.keyExists(reg.HKCU, key) && reg.valueExists(reg.HKCU, key, "AppData")) { userHome = reg.getStringValue(reg.HKCU, key, "AppData", false); } } catch (NativeException e) { LogManager.log(e); } } dir = dir.replace(USER_HOME_TOKEN, userHome); dir = dir.replace(APPNAME_TOKEN, getApplicationName(appLocation)); return new File(dir); } /** * Get application user directory as it is written in application`s configuration file * @param appLocation Application home directory * @throws IOException if can`t get default userdir */ public static String getApplicationUserDir(File appLocation) throws IOException { File []confFiles = new File(appLocation, "etc").listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".conf"); } }); File conf = null; if(confFiles.length == 1) { conf = confFiles[0]; } else if(confFiles.length >2) { for(File f : confFiles) { String prefix = f.getName().substring(0, f.getName().indexOf(".conf")); if((SystemUtils.isUnix() && new File(appLocation, "bin/" + prefix).exists()) || (SystemUtils.isWindows() && new File(appLocation, "bin/" + prefix + ".exe").exists())) { conf = f; break; } } } if(conf == null) { return null; } String contents = FileUtils.readFile(conf); Matcher matcher = Pattern.compile( NEW_LINE_PATTERN + SPACES_PATTERN + (SystemUtils.isMacOS() ? DEFAULT_USERDIR_MAC : DEFAULT_USERDIR) + "\"(.*?)\"").matcher(contents); if(matcher.find() && matcher.groupCount() == 1) { return matcher.group(1); } else { throw new IOException(StringUtils.format( ERROR_CANNOT_GET_USERDIR_STRING,conf)); } } /** * Get application name - i.e. <name> in bin/<name>.exe and etc/<name>.conf * @param appLocation Application home directory */ public static String getApplicationName(File appLocation) { File []confFiles = new File(appLocation, "etc").listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".conf"); } }); if(confFiles.length == 1) { String name = confFiles[0].getName(); return name.substring(0, name.indexOf(".conf")); } else if(confFiles.length >2) { for(File f : confFiles) { String name = f.getName(); String prefix = name.substring(0, name.indexOf(".conf")); if((SystemUtils.isUnix() && new File(appLocation, "bin/" + prefix).exists()) || (SystemUtils.isWindows() && new File(appLocation, "bin/" + prefix + ".exe").exists())) { return prefix; } } } return null; } ///////////////////////////////////////////////////////////////////////////////// // Instance private NetBeansRCPUtils() { // does nothing } ///////////////////////////////////////////////////////////////////////////////// // Constants public static final String NEW_LINE_PATTERN = "[\r\n|\n|\r]"; // NOI18N public static final String SPACES_PATTERN = "\\ *"; // NOI18N public static final String DEFAULT_USERDIR = "default_userdir="; // NOI18N public static final String DEFAULT_USERDIR_MAC = "default_mac_userdir="; // NOI18N public static final String USER_HOME_TOKEN = "${HOME}"; // NOI18N public static final String APPNAME_TOKEN = "${APPNAME}"; // NOI18N public static final String ERROR_CANNOT_GET_USERDIR_STRING = ResourceUtils.getString(NetBeansRCPUtils.class, "NU.error.cannot.get.userdir");//NOI18N }