added RegistryUtil

This commit is contained in:
Sebastian Sdorra
2011-01-16 18:44:51 +01:00
parent eb801a05c6
commit c643dcfcbe
2 changed files with 184 additions and 84 deletions

View File

@@ -29,6 +29,8 @@
* *
*/ */
package sonia.scm.installer; package sonia.scm.installer;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
@@ -36,10 +38,9 @@ package sonia.scm.installer;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.io.SimpleCommand;
import sonia.scm.io.SimpleCommandResult;
import sonia.scm.repository.HgConfig; import sonia.scm.repository.HgConfig;
import sonia.scm.util.IOUtil; import sonia.scm.util.IOUtil;
import sonia.scm.util.RegistryUtil;
import sonia.scm.util.Util; import sonia.scm.util.Util;
//~--- JDK imports ------------------------------------------------------------ //~--- JDK imports ------------------------------------------------------------
@@ -48,8 +49,6 @@ import java.io.File;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.io.IOException; import java.io.IOException;
import java.util.Scanner;
/** /**
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
@@ -60,20 +59,21 @@ public class WindowsHgInstaller extends AbstractHgInstaller
/** Field description */ /** Field description */
private static final String FILE_LIBRARY_ZIP = "library.zip"; private static final String FILE_LIBRARY_ZIP = "library.zip";
/** Field description */
private static final String FILE_LIB_MERCURIAL =
"Lib\\site-packages\\mercurial";
/** Field description */ /** Field description */
private static final String FILE_MERCURIAL_EXE = "hg.exe"; private static final String FILE_MERCURIAL_EXE = "hg.exe";
/** Field description */ /** Field description */
private static final String FILE_MERCURIAL_SCRIPT = "hg.bat"; private static final String FILE_MERCURIAL_SCRIPT = "hg.bat";
/** Field description */
private static final String FILE_TEMPLATES = "templates";
/** Field description */ /** Field description */
private static final String FILE_SCRIPTS = "Scripts"; private static final String FILE_SCRIPTS = "Scripts";
/** Field description */ /** Field description */
private static final String FILE_LIB_MERCURIAL = "Lib\\site-packages\\mercurial"; private static final String FILE_TEMPLATES = "templates";
/** Field description */ /** Field description */
private static final String[] REGISTRY_HG = new String[] private static final String[] REGISTRY_HG = new String[]
@@ -87,11 +87,12 @@ public class WindowsHgInstaller extends AbstractHgInstaller
}; };
/** Field description */ /** Field description */
private static final String REGISTRY_PYTHON = "HKEY_CLASSES_ROOT\\Python.File\\shell\\open\\command"; private static final String REGISTRY_PYTHON =
"HKEY_CLASSES_ROOT\\Python.File\\shell\\open\\command";
/** the logger for WindowsHgInstaller */ /** the logger for WindowsHgInstaller */
private static final Logger logger = LoggerFactory private static final Logger logger =
.getLogger(WindowsHgInstaller.class); LoggerFactory.getLogger(WindowsHgInstaller.class);
//~--- constructors --------------------------------------------------------- //~--- constructors ---------------------------------------------------------
@@ -122,10 +123,12 @@ public class WindowsHgInstaller extends AbstractHgInstaller
super.install(config); super.install(config);
String pythonBinary = getPythonBinary(); String pythonBinary = getPythonBinary();
config.setPythonBinary(pythonBinary); config.setPythonBinary(pythonBinary);
File hgScript = getMercurialScript(pythonBinary); File hgScript = getMercurialScript(pythonBinary);
File hgDirectory = getMercurialDirectory(); File hgDirectory = getMercurialDirectory();
if (hgScript != null) if (hgScript != null)
{ {
config.setHgBinary(hgScript.getAbsolutePath()); config.setHgBinary(hgScript.getAbsolutePath());
@@ -145,8 +148,7 @@ public class WindowsHgInstaller extends AbstractHgInstaller
* @param config * @param config
*/ */
@Override @Override
public void update(HgConfig config) public void update(HgConfig config) {}
{}
/** /**
* Method description * Method description
@@ -233,8 +235,8 @@ public class WindowsHgInstaller extends AbstractHgInstaller
IOUtil.copy(templateDirectory, new File(libDir, FILE_TEMPLATES)); IOUtil.copy(templateDirectory, new File(libDir, FILE_TEMPLATES));
} }
config.setHgBinary(new File(hgDirectory, FILE_MERCURIAL_EXE) config.setHgBinary(new File(hgDirectory,
.getAbsolutePath()); FILE_MERCURIAL_EXE).getAbsolutePath());
} }
//~--- get methods ---------------------------------------------------------- //~--- get methods ----------------------------------------------------------
@@ -251,7 +253,7 @@ public class WindowsHgInstaller extends AbstractHgInstaller
for (String registryKey : REGISTRY_HG) for (String registryKey : REGISTRY_HG)
{ {
String path = getRegistryValue(registryKey, null, null); String path = RegistryUtil.getRegistryValue(registryKey);
if (path != null) if (path != null)
{ {
@@ -275,6 +277,10 @@ public class WindowsHgInstaller extends AbstractHgInstaller
* Returns the location of the script to run Mercurial, if Mercurial is * Returns the location of the script to run Mercurial, if Mercurial is
* installed as a Python package from source. Only packages that include a * installed as a Python package from source. Only packages that include a
* templates directory will be recognized. * templates directory will be recognized.
*
* @param pythonBinary
*
* @return
*/ */
private File getMercurialScript(String pythonBinary) private File getMercurialScript(String pythonBinary)
{ {
@@ -283,6 +289,7 @@ public class WindowsHgInstaller extends AbstractHgInstaller
if (pythonBinary != null) if (pythonBinary != null)
{ {
File pythonBinaryFile = new File(pythonBinary); File pythonBinaryFile = new File(pythonBinary);
if (pythonBinaryFile.exists()) if (pythonBinaryFile.exists())
{ {
File pythonDir = pythonBinaryFile.getParentFile(); File pythonDir = pythonBinaryFile.getParentFile();
@@ -290,10 +297,14 @@ public class WindowsHgInstaller extends AbstractHgInstaller
File potentialHgScript = new File(scriptsDir, FILE_MERCURIAL_SCRIPT); File potentialHgScript = new File(scriptsDir, FILE_MERCURIAL_SCRIPT);
File mercurialPackageDir = new File(pythonDir, FILE_LIB_MERCURIAL); File mercurialPackageDir = new File(pythonDir, FILE_LIB_MERCURIAL);
File templatesDir = new File(mercurialPackageDir, FILE_TEMPLATES); File templatesDir = new File(mercurialPackageDir, FILE_TEMPLATES);
if (potentialHgScript.exists() && templatesDir.exists()) if (potentialHgScript.exists() && templatesDir.exists())
{
hgScript = potentialHgScript; hgScript = potentialHgScript;
} }
} }
}
return hgScript; return hgScript;
} }
@@ -305,7 +316,7 @@ public class WindowsHgInstaller extends AbstractHgInstaller
*/ */
private String getPythonBinary() private String getPythonBinary()
{ {
String python = getRegistryValue(REGISTRY_PYTHON, null, null); String python = RegistryUtil.getRegistryValue(REGISTRY_PYTHON);
if (python == null) if (python == null)
{ {
@@ -314,71 +325,4 @@ public class WindowsHgInstaller extends AbstractHgInstaller
return python; return python;
} }
/**
* Method description
*
*
* @param key
* @param subKey
* @param defaultValue
*
* @return
*/
private String getRegistryValue(String key, String subKey, String defaultValue)
{
String programDirectory = defaultValue;
SimpleCommand command = null;
if (subKey != null)
{
command = new SimpleCommand("reg", "query", key, "/v", subKey);
}
else
{
command = new SimpleCommand("reg", "query", key);
}
try
{
SimpleCommandResult result = command.execute();
if (result.isSuccessfull())
{
String output = result.getOutput();
Scanner scanner = new Scanner(output);
while (scanner.hasNextLine())
{
String line = scanner.nextLine();
int index = line.indexOf("REG_SZ");
if (index > 0)
{
programDirectory = line.substring(index + "REG_SZ".length()).trim();
if (programDirectory.startsWith("\""))
{
programDirectory = programDirectory.substring(1);
programDirectory = programDirectory.substring(0, programDirectory
.indexOf("\""));
}
if (logger.isDebugEnabled())
{
logger.debug("use program directory {}", programDirectory);
}
break;
}
}
}
}
catch (IOException ex)
{
logger.error(ex.getMessage(), ex);
}
return programDirectory;
}
} }

View File

@@ -0,0 +1,156 @@
/**
* Copyright (c) 2010, Sebastian Sdorra
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of SCM-Manager; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://bitbucket.org/sdorra/scm-manager
*
*/
package sonia.scm.util;
//~--- non-JDK imports --------------------------------------------------------
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.io.SimpleCommand;
import sonia.scm.io.SimpleCommandResult;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.util.Scanner;
/**
*
* @author Sebastian Sdorra
*/
public class RegistryUtil
{
/** the logger for RegistryUtil */
private static final Logger logger =
LoggerFactory.getLogger(RegistryUtil.class);
//~--- get methods ----------------------------------------------------------
/**
* Method description
*
*
* @param key
*
* @return
*/
public static String getRegistryValue(String key)
{
return getRegistryValue(key, null, null);
}
/**
* Method description
*
*
* @param key
* @param defaultValue
*
* @return
*/
public static String getRegistryValue(String key, String defaultValue)
{
return getRegistryValue(key, null, defaultValue);
}
/**
* Method description
*
*
* @param key
* @param subKey
* @param defaultValue
*
* @return
*/
public static String getRegistryValue(String key, String subKey,
String defaultValue)
{
String value = defaultValue;
SimpleCommand command = null;
if (subKey != null)
{
command = new SimpleCommand("reg", "query", key, "/v", subKey);
}
else
{
command = new SimpleCommand("reg", "query", key);
}
try
{
SimpleCommandResult result = command.execute();
if (result.isSuccessfull())
{
String output = result.getOutput();
Scanner scanner = new Scanner(output);
while (scanner.hasNextLine())
{
String line = scanner.nextLine();
int index = line.indexOf("REG_SZ");
if (index > 0)
{
value = line.substring(index + "REG_SZ".length()).trim();
if (value.startsWith("\""))
{
value = value.substring(1);
value = value.substring(0, value.indexOf("\""));
}
if (logger.isDebugEnabled())
{
logger.debug("registry value {} at {}", value, key);
}
break;
}
}
}
}
catch (IOException ex)
{
logger.error(ex.getMessage(), ex);
}
return value;
}
}