// **********************************************************************
//
// Copyright (c) 2003-2010 ZeroC, Inc. All rights reserved.
//
// This copy of Ice is licensed to you under the terms described in the
// ICE_LICENSE file included in this distribution.
//
// **********************************************************************
package Ice;
/**
* Utility methods for the Ice run time.
**/
public final class Util
{
/**
* Creates a new empty property set.
*
* @return A new empty property set.
**/
public static Properties
createProperties()
{
return new PropertiesI();
}
/**
* Creates a property set initialized from an argument vector.
*
* @param args A command-line argument vector, possibly containing
* options to set properties. If the command-line options include
* a <code>--Ice.Config</code> option, the corresponding configuration
* files are parsed. If the same property is set in a configuration
* file and in the argument vector, the argument vector takes precedence.
* <p>
* This method modifies the argument vector by removing any Ice-related options.
*
* @return A property set initialized with the property settings
* that were removed from <code>args</code>.
**/
public static Properties
createProperties(StringSeqHolder args)
{
return new PropertiesI(args, null);
}
/**
* Creates a property set initialized from an argument vector.
*
* @param args A command-line argument vector, possibly containing
* options to set properties. If the command-line options include
* a <code>--Ice.Config</code> option, the corresponding configuration
* files are parsed. If the same property is set in a configuration
* file and in the argument vector, the argument vector takes precedence.
* <p>
* This method modifies the argument vector by removing any Ice-related options.
* @param defaults Default values for the property set. Settings in configuration
* files and <code>args</code> override these defaults.
*
* @return An initalized property set.
**/
public static Properties
createProperties(StringSeqHolder args, Properties defaults)
{
return new PropertiesI(args, defaults);
}
/**
* Creates a property set initialized from an argument vector.
*
* @param args A command-line argument vector, possibly containing
* options to set properties. If the command-line options include
* a <code>--Ice.Config</code> option, the corresponding configuration
* files are parsed. If the same property is set in a configuration
* file and in the argument vector, the argument vector takes precedence.
*
* @return A property set initialized with the property settings
* in <code>args</code>.
**/
public static Properties
createProperties(String[] args)
{
StringSeqHolder argsH = new StringSeqHolder(args);
return createProperties(argsH);
}
/**
* Creates a property set initialized from an argument vector.
*
* @param args A command-line argument vector, possibly containing
* options to set properties. If the command-line options include
* a <code>--Ice.Config</code> option, the corresponding configuration
* files are parsed. If the same property is set in a configuration
* file and in the argument vector, the argument vector takes precedence.
* @param defaults Default values for the property set. Settings in configuration
* files and <code>args</code> override these defaults.
*
* @return An initalized property set.
**/
public static Properties
createProperties(String[] args, Properties defaults)
{
StringSeqHolder argsH = new StringSeqHolder(args);
return createProperties(argsH, defaults);
}
/**
* Creates a communicator.
*
* @param args A command-line argument vector. Any Ice-related options
* in this vector are used to intialize the communicator.
* This method modifies the argument vector by removing any Ice-related options.
*
* @return The initialized communicator.
**/
public static Communicator
initialize(StringSeqHolder args)
{
return initialize(args, null);
}
/**
* Creates a communicator.
*
* @param args A command-line argument vector. Any Ice-related options
* in this vector are used to intialize the communicator.
*
* @return The initialized communicator.
**/
public static Communicator
initialize(String[] args)
{
StringSeqHolder argsH = new StringSeqHolder(args);
return initialize(argsH);
}
/**
* Creates a communicator.
*
* @param args A command-line argument vector. Any Ice-related options
* in this vector are used to intialize the communicator.
* This method modifies the argument vector by removing any Ice-related options.
*
* @param initData Additional intialization data. Property settings in <code>args</code>
* override property settings in <code>initData</code>.
*
* @return The initialized communicator.
*
* @see InitializationData
**/
public static Communicator
initialize(StringSeqHolder args, InitializationData initData)
{
if(initData == null)
{
initData = new InitializationData();
}
else
{
initData = (InitializationData)initData.clone();
}
initData.properties = createProperties(args, initData.properties);
CommunicatorI result = new CommunicatorI(initData);
result.finishSetup(args);
return result;
}
/**
* Creates a communicator.
*
* @param args A command-line argument vector. Any Ice-related options
* in this vector are used to intialize the communicator.
*
* @param initData Additional intialization data. Property settings in <code>args</code>
* override property settings in <code>initData</code>.
*
* @return The initialized communicator.
*
* @see InitializationData
**/
public static Communicator
initialize(String[] args, InitializationData initData)
{
StringSeqHolder argsH = new StringSeqHolder(args);
return initialize(argsH, initData);
}
/**
* Creates a communicator.
*
* @param initData Additional intialization data.
*
* @return The initialized communicator.
*
* @see InitializationData
**/
public static Communicator
initialize(InitializationData initData)
{
if(initData == null)
{
initData = new InitializationData();
}
else
{
initData = (InitializationData)initData.clone();
}
CommunicatorI result = new CommunicatorI(initData);
result.finishSetup(new StringSeqHolder(new String[0]));
return result;
}
/**
* Creates a communicator using a default configuration.
**/
public static Communicator
initialize()
{
return initialize(new InitializationData());
}
/**
* Converts a string to an object identity.
*
* @param s The string to convert.
*
* @return The converted object identity.
**/
public static Identity
stringToIdentity(String s)
{
Identity ident = new Identity();
//
// Find unescaped separator.
//
int slash = -1, pos = 0;
while((pos = s.indexOf('/', pos)) != -1)
{
if(pos == 0 || s.charAt(pos - 1) != '\\')
{
if(slash == -1)
{
slash = pos;
}
else
{
//
// Extra unescaped slash found.
//
IdentityParseException ex = new IdentityParseException();
ex.str = "unescaped backslash in identity `" + s + "'";
throw ex;
}
}
pos++;
}
if(slash == -1)
{
ident.category = "";
try
{
ident.name = IceUtilInternal.StringUtil.unescapeString(s, 0, s.length());
}
catch(IllegalArgumentException e)
{
IdentityParseException ex = new IdentityParseException();
ex.str = "invalid identity name `" + s + "': " + e.getMessage();
throw ex;
}
}
else
{
try
{
ident.category = IceUtilInternal.StringUtil.unescapeString(s, 0, slash);
}
catch(IllegalArgumentException e)
{
IdentityParseException ex = new IdentityParseException();
ex.str = "invalid category in identity `" + s + "': " + e.getMessage();
throw ex;
}
if(slash + 1 < s.length())
{
try
{
ident.name = IceUtilInternal.StringUtil.unescapeString(s, slash + 1, s.length());
}
catch(IllegalArgumentException e)
{
IdentityParseException ex = new IdentityParseException();
ex.str = "invalid name in identity `" + s + "': " + e.getMessage();
throw ex;
}
}
else
{
ident.name = "";
}
}
return ident;
}
/**
* Converts an object identity to a string.
*
* @param ident The object identity to convert.
*
* @return The string representation of the object identity.
**/
public static String
identityToString(Identity ident)
{
if(ident.category == null || ident.category.length() == 0)
{
return IceUtilInternal.StringUtil.escapeString(ident.name, "/");
}
else
{
return IceUtilInternal.StringUtil.escapeString(ident.category, "/") + '/' +
IceUtilInternal.StringUtil.escapeString(ident.name, "/");
}
}
/**
* @deprecated generateUUID() is deprecated, use java.util.UUID instead.
**/
public static String
generateUUID()
{
return java.util.UUID.randomUUID().toString();
}
/**
* Compares the object identities of two proxies.
*
* @param lhs A proxy.
* @param rhs A proxy.
* @return -1 if the identity in <code>lhs</code> compares
* less than the identity in <code>rhs</code>; 0 if the identities
* compare equal; 1, otherwise.
*
* @see ProxyIdentityKey
* @see ProxyIdentityAndFacetKey
* @see ProxyIdentityAndFacetCompare
**/
public static int
proxyIdentityCompare(ObjectPrx lhs, ObjectPrx rhs)
{
if(lhs == null && rhs == null)
{
return 0;
}
else if(lhs == null && rhs != null)
{
return -1;
}
else if(lhs != null && rhs == null)
{
return 1;
}
else
{
Identity lhsIdentity = lhs.ice_getIdentity();
Identity rhsIdentity = rhs.ice_getIdentity();
int n;
if((n = lhsIdentity.name.compareTo(rhsIdentity.name)) != 0)
{
return n;
}
return lhsIdentity.category.compareTo(rhsIdentity.category);
}
}
/**
* Compares the object identities and facets of two proxies.
*
* @param lhs A proxy.
* @param rhs A proxy.
* @return -1 if the identity and facet in <code>lhs</code> compare
* less than the identity and facet in <code>rhs</code>; 0 if the identities
* and facets compare equal; 1, otherwise.
*
* @see ProxyIdentityAndFacetKey
* @see ProxyIdentityKey
* @see ProxyIdentityCompare
**/
public static int
proxyIdentityAndFacetCompare(ObjectPrx lhs, ObjectPrx rhs)
{
if(lhs == null && rhs == null)
{
return 0;
}
else if(lhs == null && rhs != null)
{
return -1;
}
else if(lhs != null && rhs == null)
{
return 1;
}
else
{
Identity lhsIdentity = lhs.ice_getIdentity();
Identity rhsIdentity = rhs.ice_getIdentity();
int n;
if((n = lhsIdentity.name.compareTo(rhsIdentity.name)) != 0)
{
return n;
}
if((n = lhsIdentity.category.compareTo(rhsIdentity.category)) != 0)
{
return n;
}
String lhsFacet = lhs.ice_getFacet();
String rhsFacet = rhs.ice_getFacet();
if(lhsFacet == null && rhsFacet == null)
{
return 0;
}
else if(lhsFacet == null)
{
return -1;
}
else if(rhsFacet == null)
{
return 1;
}
return lhsFacet.compareTo(rhsFacet);
}
}
/**
* Creates an input stream for dynamic invocation and dispatch.
*
* @param communicator The communicator for the stream.
* @param bytes An encoded request or reply.
* @return The input stream.
**/
public static InputStream
createInputStream(Communicator communicator, byte[] bytes)
{
return new InputStreamI(communicator, bytes);
}
/**
* Creates an output stream for dynamic invocation and dispatch.
*
* @param communicator The communicator for the stream.
* @return The output stream.
**/
public static OutputStream
createOutputStream(Communicator communicator)
{
return new OutputStreamI(communicator);
}
/**
* Returns the process-wide logger.
*
* @return The process-wide logger.
**/
public static Logger
getProcessLogger()
{
synchronized(_processLoggerMutex)
{
if(_processLogger == null)
{
//
// TODO: Would be nice to be able to use process name as prefix by default.
//
_processLogger = new LoggerI("", "");
}
return _processLogger;
}
}
/**
* Changes the process-wide logger.
*
* @param logger The new process-wide logger.
**/
public static void
setProcessLogger(Logger logger)
{
synchronized(_processLoggerMutex)
{
_processLogger = logger;
}
}
/**
* Returns the Ice version in the form <code>A.B.C</code>, where <code>A</code> indicates the
* major version, <code>B</code> indicates the minor version, and <code>C</code> indicates the
* patch level.
*
* @return The Ice version.
**/
public static String
stringVersion()
{
return "3.4.1"; // "A.B.C", with A=major, B=minor, C=patch
}
/**
* Returns the Ice version as an integer in the form <code>A.BB.CC</code>, where <code>A</code>
* indicates the major version, <code>BB</code> indicates the minor version, and <code>CC</code>
* indicates the patch level. For example, for Ice 3.3.1, the returned value is 30301.
*
* @return The Ice version.
**/
public static int
intVersion()
{
return 30401; // AABBCC, with AA=major, BB=minor, CC=patch
}
private static String _localAddress = null;
private static java.lang.Object _processLoggerMutex = new java.lang.Object();
private static Logger _processLogger = null;
}