diff options
author | Bernard Normier <bernard@zeroc.com> | 2016-10-20 21:03:44 -0400 |
---|---|---|
committer | Bernard Normier <bernard@zeroc.com> | 2016-10-20 21:03:44 -0400 |
commit | 3cb9c15995b828c52dba34d0a222f572d5bbc41b (patch) | |
tree | 87bad249c2ee04972be5f3c7635880cb0c556128 /java/src | |
parent | updating IceBT to BlueZ 5 (diff) | |
download | ice-3cb9c15995b828c52dba34d0a222f572d5bbc41b.tar.bz2 ice-3cb9c15995b828c52dba34d0a222f572d5bbc41b.tar.xz ice-3cb9c15995b828c52dba34d0a222f572d5bbc41b.zip |
Added support for non-ASCII characters and universal character names
to stringified identities and proxies.
This includes a new Ice.ToStringMode property.
Diffstat (limited to 'java/src')
24 files changed, 383 insertions, 195 deletions
diff --git a/java/src/Glacier2/src/main/java/com/zeroc/Glacier2/SessionFactoryHelper.java b/java/src/Glacier2/src/main/java/com/zeroc/Glacier2/SessionFactoryHelper.java index f7b86f48c09..d7c293bd3c7 100644 --- a/java/src/Glacier2/src/main/java/com/zeroc/Glacier2/SessionFactoryHelper.java +++ b/java/src/Glacier2/src/main/java/com/zeroc/Glacier2/SessionFactoryHelper.java @@ -352,7 +352,7 @@ public class SessionFactoryHelper { StringBuilder sb = new StringBuilder(); sb.append("\""); - sb.append(Util.identityToString(ident)); + sb.append(Util.identityToString(ident, com.zeroc.Ice.ToStringMode.Unicode)); sb.append("\":"); sb.append(_protocol + " -p "); sb.append(getPortInternal()); diff --git a/java/src/Ice/src/main/java/com/zeroc/Ice/CommunicatorI.java b/java/src/Ice/src/main/java/com/zeroc/Ice/CommunicatorI.java index 64ff934f6d4..035c6b39f15 100644 --- a/java/src/Ice/src/main/java/com/zeroc/Ice/CommunicatorI.java +++ b/java/src/Ice/src/main/java/com/zeroc/Ice/CommunicatorI.java @@ -74,11 +74,11 @@ public final class CommunicatorI implements Communicator return Util.stringToIdentity(s); } - @Override @SuppressWarnings("deprecation") + @Override public String identityToString(Identity ident) { - return Util.identityToString(ident); + return Util.identityToString(ident, _instance.toStringMode()); } @Override diff --git a/java/src/Ice/src/main/java/com/zeroc/Ice/ObjectAdapterI.java b/java/src/Ice/src/main/java/com/zeroc/Ice/ObjectAdapterI.java index 61cf6d72537..2ae50796171 100644 --- a/java/src/Ice/src/main/java/com/zeroc/Ice/ObjectAdapterI.java +++ b/java/src/Ice/src/main/java/com/zeroc/Ice/ObjectAdapterI.java @@ -981,7 +981,7 @@ public final class ObjectAdapterI implements ObjectAdapter if(_routerInfo.getAdapter() != null) { throw new AlreadyRegisteredException("object adapter with router", - Util.identityToString(router.ice_getIdentity())); + _communicator.identityToString(router.ice_getIdentity())); } // diff --git a/java/src/Ice/src/main/java/com/zeroc/Ice/Util.java b/java/src/Ice/src/main/java/com/zeroc/Ice/Util.java index 20ec18f99bd..2cb75ec9cd0 100644 --- a/java/src/Ice/src/main/java/com/zeroc/Ice/Util.java +++ b/java/src/Ice/src/main/java/com/zeroc/Ice/Util.java @@ -275,21 +275,36 @@ public final class Util * * @param ident The object identity to convert. * + * @param toStringMode Specifies if and how non-printable ASCII characters are escaped in the result. + * * @return The string representation of the object identity. **/ - public static String identityToString(Identity ident) + public static String identityToString(Identity ident, ToStringMode toStringMode) { if(ident.category == null || ident.category.length() == 0) { - return StringUtil.escapeString(ident.name, "/"); + return StringUtil.escapeString(ident.name, "/", toStringMode); } else { - return StringUtil.escapeString(ident.category, "/") + '/' + StringUtil.escapeString(ident.name, "/"); + return StringUtil.escapeString(ident.category, "/", toStringMode) + '/' + + StringUtil.escapeString(ident.name, "/", toStringMode); } } /** + * Converts an object identity to a string. + * + * @param ident The object identity to convert. + * + * @return The string representation of the object identity using the default mode (Unicode) + **/ + public static String identityToString(Identity ident) + { + return identityToString(ident, ToStringMode.Unicode); + } + + /** * Compares the object identities of two proxies. * * @param lhs A proxy. diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/CommunicatorObserverI.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/CommunicatorObserverI.java index d16ba494470..a3ffebca386 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/CommunicatorObserverI.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/CommunicatorObserverI.java @@ -320,7 +320,7 @@ public class CommunicatorObserverI implements com.zeroc.Ice.Instrumentation.Comm public String getIdentity() { - return com.zeroc.Ice.Util.identityToString(_current.id); + return _current.adapter.getCommunicator().identityToString(_current.id); } final private com.zeroc.Ice.Current _current; @@ -429,7 +429,7 @@ public class CommunicatorObserverI implements com.zeroc.Ice.Instrumentation.Comm catch(Exception ex) { // Either a fixed proxy or the communicator is destroyed. - os.append(com.zeroc.Ice.Util.identityToString(_proxy.ice_getIdentity())); + os.append(_proxy.ice_getCommunicator().identityToString(_proxy.ice_getIdentity())); os.append(" [").append(_operation).append(']'); } _id = os.toString(); @@ -459,7 +459,7 @@ public class CommunicatorObserverI implements com.zeroc.Ice.Instrumentation.Comm { if(_proxy != null) { - return com.zeroc.Ice.Util.identityToString(_proxy.ice_getIdentity()); + return _proxy.ice_getCommunicator().identityToString(_proxy.ice_getIdentity()); } else { diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/Incoming.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/Incoming.java index 8929771e994..67941f3b1e5 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/Incoming.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/Incoming.java @@ -533,8 +533,8 @@ final public class Incoming implements com.zeroc.Ice.Request com.zeroc.IceUtilInternal.OutputBase out = new com.zeroc.IceUtilInternal.OutputBase(pw); out.setUseTab(false); out.print("dispatch exception:"); - out.print("\nidentity: " + Util.identityToString(_current.id)); - out.print("\nfacet: " + com.zeroc.IceUtilInternal.StringUtil.escapeString(_current.facet, "")); + out.print("\nidentity: " + Util.identityToString(_current.id, _instance.toStringMode())); + out.print("\nfacet: " + com.zeroc.IceUtilInternal.StringUtil.escapeString(_current.facet, "", _instance.toStringMode())); out.print("\noperation: " + _current.operation); if(_current.con != null) { diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/Instance.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/Instance.java index d4c3663560f..5bf70b1d2f6 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/Instance.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/Instance.java @@ -390,6 +390,13 @@ public final class Instance implements com.zeroc.Ice.ClassResolver return _batchAutoFlushSize; } + public com.zeroc.Ice.ToStringMode + toStringMode() + { + // No mutex lock, immutable + return _toStringMode; + } + public int cacheMessageBuffers() { @@ -1065,6 +1072,24 @@ public final class Instance implements com.zeroc.Ice.ClassResolver } } + String toStringModeStr = _initData.properties.getPropertyWithDefault("Ice.ToStringMode", "Unicode"); + if(toStringModeStr.equals("Unicode")) + { + _toStringMode = com.zeroc.Ice.ToStringMode.Unicode; + } + else if(toStringModeStr.equals("ASCII")) + { + _toStringMode = com.zeroc.Ice.ToStringMode.ASCII; + } + else if(toStringModeStr.equals("Compat")) + { + _toStringMode = com.zeroc.Ice.ToStringMode.Compat; + } + else + { + throw new com.zeroc.Ice.InitializationException("The value for Ice.ToStringMode must be Unicode, ASCII or Compat"); + } + _implicitContext = com.zeroc.Ice.ImplicitContextI.create(_initData.properties.getProperty("Ice.ImplicitContext")); @@ -1875,6 +1900,7 @@ public final class Instance implements com.zeroc.Ice.ClassResolver private final DefaultsAndOverrides _defaultsAndOverrides; // Immutable, not reset by destroy(). private final int _messageSizeMax; // Immutable, not reset by destroy(). private final int _batchAutoFlushSize; // Immutable, not reset by destroy(). + private final com.zeroc.Ice.ToStringMode _toStringMode; // Immutable, not reset by destroy(). private final int _cacheMessageBuffers; // Immutable, not reset by destroy(). private final ACMConfig _clientACM; // Immutable, not reset by destroy(). private final ACMConfig _serverACM; // Immutable, not reset by destroy(). diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/LocatorInfo.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/LocatorInfo.java index f363157b13a..8e5cc8974ce 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/LocatorInfo.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/LocatorInfo.java @@ -462,7 +462,7 @@ public final class LocatorInfo else { s.append("object = "); - s.append(com.zeroc.Ice.Util.identityToString(ref.getIdentity())); + s.append(com.zeroc.Ice.Util.identityToString(ref.getIdentity(), ref.getInstance().toStringMode())); s.append("\n"); } @@ -514,13 +514,13 @@ public final class LocatorInfo StringBuilder s = new StringBuilder(128); s.append("object not found\n"); s.append("object = "); - s.append(com.zeroc.Ice.Util.identityToString(ref.getIdentity())); + s.append(com.zeroc.Ice.Util.identityToString(ref.getIdentity(), instance.toStringMode())); instance.initializationData().logger.trace(instance.traceLevels().locationCat, s.toString()); } com.zeroc.Ice.NotRegisteredException e = new com.zeroc.Ice.NotRegisteredException(); e.kindOfObject = "object"; - e.id = com.zeroc.Ice.Util.identityToString(ref.getIdentity()); + e.id = com.zeroc.Ice.Util.identityToString(ref.getIdentity(), instance.toStringMode()); throw e; } catch(com.zeroc.Ice.NotRegisteredException ex) @@ -543,7 +543,7 @@ public final class LocatorInfo else { s.append("object = "); - s.append(com.zeroc.Ice.Util.identityToString(ref.getIdentity())); + s.append(com.zeroc.Ice.Util.identityToString(ref.getIdentity(), instance.toStringMode())); s.append("\n"); } s.append("reason = " + ex); @@ -587,7 +587,7 @@ public final class LocatorInfo { s.append("object\n"); s.append("object = "); - s.append(com.zeroc.Ice.Util.identityToString(ref.getIdentity())); + s.append(com.zeroc.Ice.Util.identityToString(ref.getIdentity(), instance.toStringMode())); s.append("\n"); } instance.initializationData().logger.trace(instance.traceLevels().locationCat, s.toString()); @@ -626,7 +626,7 @@ public final class LocatorInfo StringBuilder s = new StringBuilder(128); s.append("searching for object by id\n"); s.append("object = "); - s.append(com.zeroc.Ice.Util.identityToString(ref.getIdentity())); + s.append(com.zeroc.Ice.Util.identityToString(ref.getIdentity(), instance.toStringMode())); instance.initializationData().logger.trace(instance.traceLevels().locationCat, s.toString()); } diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/PropertyNames.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/PropertyNames.java index 45647f08494..46750aa5e7a 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/PropertyNames.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/PropertyNames.java @@ -6,7 +6,7 @@ // ICE_LICENSE file included in this distribution. // // ********************************************************************** -// Generated by makeprops.py from file ..\config\PropertyNames.xml, Fri Jul 15 14:02:34 2016 +// Generated by makeprops.py from file PropertyNames.xml, Tue Oct 18 11:38:54 2016 // IMPORTANT: Do not edit this file -- any edits made here will be lost! @@ -165,6 +165,7 @@ public final class PropertyNames new Property("Ice\\.ThreadPool\\.Server\\.ThreadIdleTime", false, null), new Property("Ice\\.ThreadPool\\.Server\\.ThreadPriority", false, null), new Property("Ice\\.ThreadPriority", false, null), + new Property("Ice\\.ToStringMode", false, null), new Property("Ice\\.Trace\\.Admin\\.Properties", false, null), new Property("Ice\\.Trace\\.Admin\\.Logger", false, null), new Property("Ice\\.Trace\\.Locator", false, null), @@ -980,7 +981,7 @@ public final class PropertyNames new Property("IceSSL\\.DHParams", false, null), new Property("IceSSL\\.EntropyDaemon", false, null), new Property("IceSSL\\.FindCert", false, null), - new Property("IceSSL\\.FindCert\\.[^\\s]+", true, "IceSSL.FindCert"), + new Property("IceSSL\\.FindCert\\.[^\\s]+", true, null), new Property("IceSSL\\.InitOpenSSL", false, null), new Property("IceSSL\\.KeyFile", true, null), new Property("IceSSL\\.Keychain", false, null), diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/Reference.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/Reference.java index e8420c9c6f7..2b2d2fc12e0 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/Reference.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/Reference.java @@ -306,13 +306,18 @@ public abstract class Reference implements Cloneable // StringBuilder s = new StringBuilder(128); + com.zeroc.Ice.ToStringMode toStringMode = _instance.toStringMode(); + final String separators = " :@"; + + String id = com.zeroc.Ice.Util.identityToString(_identity, toStringMode); + // // If the encoded identity string contains characters which // the reference parser uses as separators, then we enclose // the identity string in quotes. // - String id = com.zeroc.Ice.Util.identityToString(_identity); - if(com.zeroc.IceUtilInternal.StringUtil.findFirstOf(id, " :@") != -1) + + if(com.zeroc.IceUtilInternal.StringUtil.findFirstOf(id, separators) != -1) { s.append('"'); s.append(id); @@ -331,8 +336,8 @@ public abstract class Reference implements Cloneable // the facet string in quotes. // s.append(" -f "); - String fs = com.zeroc.IceUtilInternal.StringUtil.escapeString(_facet, ""); - if(com.zeroc.IceUtilInternal.StringUtil.findFirstOf(fs, " :@") != -1) + String fs = com.zeroc.IceUtilInternal.StringUtil.escapeString(_facet, "", toStringMode); + if(com.zeroc.IceUtilInternal.StringUtil.findFirstOf(fs, separators) != -1) { s.append('"'); s.append(fs); @@ -481,16 +486,16 @@ public abstract class Reference implements Cloneable @Override public Reference clone() { - Reference c = null; - try - { - c = (Reference)super.clone(); - } - catch(CloneNotSupportedException ex) - { - assert false; - } - return c; + Reference c = null; + try + { + c = (Reference)super.clone(); + } + catch(CloneNotSupportedException ex) + { + assert false; + } + return c; } protected int _hashValue; diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/RoutableReference.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/RoutableReference.java index b383011df95..4600da1e9d3 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/RoutableReference.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/RoutableReference.java @@ -353,7 +353,8 @@ public class RoutableReference extends Reference // the reference parser uses as separators, then we enclose // the adapter id string in quotes. // - String a = com.zeroc.IceUtilInternal.StringUtil.escapeString(_adapterId, null); + + String a = com.zeroc.IceUtilInternal.StringUtil.escapeString(_adapterId, null, getInstance().toStringMode()); if(com.zeroc.IceUtilInternal.StringUtil.findFirstOf(a, " :@") != -1) { s.append('"'); diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/ServantManager.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/ServantManager.java index d83dfb8e141..badc3786f45 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/ServantManager.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/ServantManager.java @@ -32,11 +32,12 @@ public final class ServantManager if(m.containsKey(facet)) { com.zeroc.Ice.AlreadyRegisteredException ex = new com.zeroc.Ice.AlreadyRegisteredException(); - ex.id = com.zeroc.Ice.Util.identityToString(ident); + ex.id = com.zeroc.Ice.Util.identityToString(ident, _instance.toStringMode()); ex.kindOfObject = "servant"; if(facet.length() > 0) { - ex.id += " -f " + com.zeroc.IceUtilInternal.StringUtil.escapeString(facet, ""); + ex.id += " -f " + com.zeroc.IceUtilInternal.StringUtil.escapeString(facet, "", + _instance.toStringMode()); } throw ex; } @@ -77,11 +78,12 @@ public final class ServantManager if(m == null || (obj = m.remove(facet)) == null) { com.zeroc.Ice.NotRegisteredException ex = new com.zeroc.Ice.NotRegisteredException(); - ex.id = com.zeroc.Ice.Util.identityToString(ident); + ex.id = com.zeroc.Ice.Util.identityToString(ident, _instance.toStringMode()); ex.kindOfObject = "servant"; if(facet.length() > 0) { - ex.id += " -f " + com.zeroc.IceUtilInternal.StringUtil.escapeString(facet, ""); + ex.id += " -f " + com.zeroc.IceUtilInternal.StringUtil.escapeString(facet, "", + _instance.toStringMode()); } throw ex; } @@ -120,7 +122,7 @@ public final class ServantManager if(m == null) { com.zeroc.Ice.NotRegisteredException ex = new com.zeroc.Ice.NotRegisteredException(); - ex.id = com.zeroc.Ice.Util.identityToString(ident); + ex.id = com.zeroc.Ice.Util.identityToString(ident, _instance.toStringMode()); ex.kindOfObject = "servant"; throw ex; } @@ -218,7 +220,8 @@ public final class ServantManager if(l != null) { com.zeroc.Ice.AlreadyRegisteredException ex = new com.zeroc.Ice.AlreadyRegisteredException(); - ex.id = com.zeroc.IceUtilInternal.StringUtil.escapeString(category, ""); + ex.id = com.zeroc.IceUtilInternal.StringUtil.escapeString(category, "", + _instance.toStringMode()); ex.kindOfObject = "servant locator"; throw ex; } @@ -236,7 +239,8 @@ public final class ServantManager if(l == null) { com.zeroc.Ice.NotRegisteredException ex = new com.zeroc.Ice.NotRegisteredException(); - ex.id = com.zeroc.IceUtilInternal.StringUtil.escapeString(category, ""); + ex.id = com.zeroc.IceUtilInternal.StringUtil.escapeString(category, "", + _instance.toStringMode()); ex.kindOfObject = "servant locator"; throw ex; } diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/TraceUtil.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/TraceUtil.java index 4798d1be659..36b60e57168 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/TraceUtil.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/TraceUtil.java @@ -168,14 +168,20 @@ public final class TraceUtil { try { + com.zeroc.Ice.ToStringMode toStringMode = com.zeroc.Ice.ToStringMode.Unicode; + if(stream.instance() != null) + { + toStringMode = stream.instance().toStringMode(); + } + com.zeroc.Ice.Identity identity = com.zeroc.Ice.Identity.read(stream, null); - out.write("\nidentity = " + com.zeroc.Ice.Util.identityToString(identity)); + out.write("\nidentity = " + com.zeroc.Ice.Util.identityToString(identity, toStringMode)); String[] facet = stream.readStringSeq(); out.write("\nfacet = "); if(facet.length > 0) { - out.write(com.zeroc.IceUtilInternal.StringUtil.escapeString(facet[0], "")); + out.write(com.zeroc.IceUtilInternal.StringUtil.escapeString(facet[0], "", toStringMode)); } String operation = stream.readString(); diff --git a/java/src/Ice/src/main/java/com/zeroc/IceUtilInternal/StringUtil.java b/java/src/Ice/src/main/java/com/zeroc/IceUtilInternal/StringUtil.java index cf6de757a9c..782c352c218 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceUtilInternal/StringUtil.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceUtilInternal/StringUtil.java @@ -75,97 +75,119 @@ public final class StringUtil return -1; } - // - // Write the byte b as an escape sequence if it isn't a printable ASCII - // character and append the escape sequence to sb. Additional characters - // that should be escaped can be passed in special. If b is any of these - // characters, b is preceded by a backslash in sb. - // private static void - encodeChar(byte b, StringBuilder sb, String special) + encodeChar(char c, StringBuilder sb, String special, com.zeroc.Ice.ToStringMode toStringMode) { - switch(b) + switch(c) { - case (byte)'\\': + case '\\': { sb.append("\\\\"); break; } - case (byte)'\'': + case '\'': { sb.append("\\'"); break; } - case (byte)'"': + case '"': { sb.append("\\\""); break; } - case (byte)'\b': + case '\b': { sb.append("\\b"); break; } - case (byte)'\f': + case '\f': { sb.append("\\f"); break; } - case (byte)'\n': + case '\n': { sb.append("\\n"); break; } - case (byte)'\r': + case '\r': { sb.append("\\r"); break; } - case (byte)'\t': + case '\t': { sb.append("\\t"); break; } default: { - if(!(b >= 32 && b <= 126)) - { - sb.append('\\'); - String octal = Integer.toOctalString(b < 0 ? b + 256 : b); - // - // Add leading zeroes so that we avoid problems during - // decoding. For example, consider the encoded string - // \0013 (i.e., a character with value 1 followed by - // the character '3'). If the leading zeroes were omitted, - // the result would be incorrectly interpreted by the - // decoder as a single character with value 11. - // - for(int j = octal.length(); j < 3; j++) - { - sb.append('0'); - } - sb.append(octal); - } - else if(special != null && special.indexOf((char)b) != -1) + if(special != null && special.indexOf(c) != -1) { sb.append('\\'); - sb.append((char)b); + sb.append(c); } else { - sb.append((char)b); + if(c < 32 || c > 126) + { + if(toStringMode == com.zeroc.Ice.ToStringMode.Compat) + { + // + // When ToStringMode=Compat, c is a UTF-8 byte + // + assert(c < 256); + + sb.append('\\'); + String octal = Integer.toOctalString(c); + // + // Add leading zeroes so that we avoid problems during + // decoding. For example, consider the encoded string + // \0013 (i.e., a character with value 1 followed by + // the character '3'). If the leading zeroes were omitted, + // the result would be incorrectly interpreted by the + // decoder as a single character with value 11. + // + for(int j = octal.length(); j < 3; j++) + { + sb.append('0'); + } + sb.append(octal); + } + else if(c < 32 || c == 127 || toStringMode == com.zeroc.Ice.ToStringMode.ASCII) + { + // append \\unnnn + sb.append("\\u"); + String hex = Integer.toHexString(c); + for(int j = hex.length(); j < 4; j++) + { + sb.append('0'); + } + sb.append(hex); + } + else + { + // keep as is + sb.append(c); + } + } + else + { + // printable ASCII character + sb.append(c); + } } + break; } } } // - // Add escape sequences (such as "\n", or "\007") to make a string - // readable in ASCII. Any characters that appear in special are - // prefixed with a backlash in the returned string. + // Add escape sequences (like "\n" to the input string) + // The second parameter adds characters to escape, and can be empty. // public static String - escapeString(String s, String special) + escapeString(String s, String special, com.zeroc.Ice.ToStringMode toStringMode) { if(special != null) { @@ -178,31 +200,72 @@ public final class StringUtil } } - byte[] bytes = null; - try + if(toStringMode == com.zeroc.Ice.ToStringMode.Compat) { - bytes = s.getBytes("UTF8"); + // Encode UTF-8 bytes + + byte[] bytes = null; + try + { + bytes = s.getBytes("UTF8"); + } + catch(java.io.UnsupportedEncodingException ex) + { + assert(false); + return null; + } + + StringBuilder result = new StringBuilder(bytes.length); + for(int i = 0; i < bytes.length; i++) + { + encodeChar((char)(bytes[i] & 0xFF), result, special, toStringMode); + } + + return result.toString(); } - catch(java.io.UnsupportedEncodingException ex) + else { - assert(false); - return null; - } + StringBuilder result = new StringBuilder(s.length()); - StringBuilder result = new StringBuilder(bytes.length); - for(int i = 0; i < bytes.length; i++) - { - encodeChar(bytes[i], result, special); - } + for(int i = 0; i < s.length(); i++) + { + char c = s.charAt(i); + if(toStringMode == com.zeroc.Ice.ToStringMode.Unicode || !Character.isSurrogate(c)) + { + encodeChar(c, result, special, toStringMode); + } + else + { + assert(toStringMode == com.zeroc.Ice.ToStringMode.ASCII && Character.isSurrogate(c)); + if(i + 1 == s.length()) + { + throw new IllegalArgumentException("High surrogate without low surrogate"); + } + else + { + i++; + int codePoint = Character.toCodePoint(c, s.charAt(i)); + // append \Unnnnnnnn + result.append("\\U"); + String hex = Integer.toHexString(codePoint); + for(int j = hex.length(); j < 8; j++) + { + result.append('0'); + } + result.append(hex); + } + } + } - return result.toString(); + return result.toString(); + } } private static char checkChar(String s, int pos) { char c = s.charAt(pos); - if(!(c >= 32 && c <= 126)) + if(c < 32 || c == 127) { String msg; if(pos > 0) @@ -213,42 +276,27 @@ public final class StringUtil { msg = "first character"; } - msg += " is not a printable ASCII character (ordinal " + (int)c + ")"; + msg += " has invalid ordinal value " + (int)c; throw new IllegalArgumentException(msg); } return c; } - static class Holder<T> - { - public Holder() - { - } - - public Holder(T value) - { - this.value = value; - } - - public T value; - } - // - // Decode the character or escape sequence starting at start and return it. - // newStart is set to the index of the first character following the decoded character + // Decode the character or escape sequence starting at start and appends it to result; + // returns the index of the first character following the decoded character // or escape sequence. // - private static char decodeChar(String s, int start, int end, Holder<Integer> nextStart) + private static int + decodeChar(String s, int start, int end, StringBuilder result) { assert(start >= 0); assert(start < end); assert(end <= s.length()); - char c; - if(s.charAt(start) != '\\') { - c = checkChar(s, start++); + result.append(checkChar(s, start++)); } else { @@ -256,45 +304,98 @@ public final class StringUtil { throw new IllegalArgumentException("trailing backslash"); } - switch(s.charAt(++start)) + + char c = s.charAt(++start); + + switch(c) { case '\\': case '\'': case '"': { - c = s.charAt(start++); + ++start; + result.append(c); break; } case 'b': { ++start; - c = '\b'; + result.append('\b'); break; } case 'f': { ++start; - c = '\f'; + result.append('\f'); break; } case 'n': { ++start; - c = '\n'; + result.append('\n'); break; } case 'r': { ++start; - c = '\r'; + result.append('\r'); break; } case 't': { ++start; - c = '\t'; + result.append('\t'); + break; + } + case 'u': + case 'U': + { + int codePoint = 0; + boolean inBMP = (c == 'u'); + int size = inBMP ? 4 : 8; + ++start; + while(size > 0 && start < end) + { + c = s.charAt(start++); + int charVal = 0; + if(c >= '0' && c <= '9') + { + charVal = c - '0'; + } + else if(c >= 'a' && c <= 'f') + { + charVal = 10 + (c - 'a'); + } + else if(c >= 'A' && c <= 'F') + { + charVal = 10 + (c - 'A'); + } + else + { + break; // while + } + codePoint = codePoint * 16 + charVal; + --size; + } + if(size > 0) + { + throw new IllegalArgumentException("Invalid universal character name: too few hex digits"); + } + if(inBMP && Character.isSurrogate((char)codePoint)) + { + throw new IllegalArgumentException("A non-BMP character cannot be encoded with \\unnnn, use \\Unnnnnnnn instead"); + } + if(inBMP || Character.isBmpCodePoint(codePoint)) + { + result.append((char)codePoint); + } + else + { + result.append(Character.toChars(codePoint)); + } break; } + case '0': case '1': case '2': @@ -304,49 +405,71 @@ public final class StringUtil case '6': case '7': { - int val = 0; - for(int j = 0; j < 3 && start < end; ++j) + // UTF-8 byte sequence encoded with octal escapes + + byte[] arr = new byte[end - start]; + int i = 0; + boolean done = false; + while(!done) { - int charVal = s.charAt(start++) - '0'; - if(charVal < 0 || charVal > 7) + int val = 0; + for(int j = 0; j < 3 && start < end; ++j) { - --start; - break; + int charVal = s.charAt(start++) - '0'; + if(charVal < 0 || charVal > 7) + { + --start; + if(j == 0) + { + // first character after escape is not 0-7: + done = true; + --start; // go back to the previous backslash + } + break; // for + } + val = val * 8 + charVal; + } + + if(!done) + { + if(val > 255) + { + String msg = "octal value \\" + Integer.toOctalString(val) + " (" + val + ") is out of range"; + throw new IllegalArgumentException(msg); + } + arr[i++] = (byte)val; + + if((start + 1 < end) && s.charAt(start) == '\\') + { + start++; + // loop, read next octal escape sequence + } + else + { + done = true; + } } - val = val * 8 + charVal; } - if(val > 255) + + try { - String msg = "octal value \\" + Integer.toOctalString(val) + " (" + val + ") is out of range"; - throw new IllegalArgumentException(msg); + result.append(new String(arr, 0, i, "UTF8")); + } + catch(java.io.UnsupportedEncodingException ex) + { + throw new IllegalArgumentException("unsupported encoding", ex); } - c = (char)val; break; } default: { - c = checkChar(s, start++); + result.append(checkChar(s, start++)); break; } } } - nextStart.value = start; - return c; - } - // - // Remove escape sequences from s and append the result to sb. - // Return true if successful, false otherwise. - // - private static void - decodeString(String s, int start, int end, StringBuilder sb) - { - Holder<Integer> nextStart = new Holder<>(); - while(start < end) - { - sb.append(decodeChar(s, start, end, nextStart)); - start = nextStart.value; - } + return start; } // @@ -358,23 +481,25 @@ public final class StringUtil { assert(start >= 0 && start <= end && end <= s.length()); - StringBuilder sb = new StringBuilder(end - start); - decodeString(s, start, end, sb); - String decodedString = sb.toString(); - - byte[] arr = new byte[decodedString.length()]; - for(int i = 0; i < arr.length; ++i) + // Optimization for strings without escapes + int p = s.indexOf('\\', start); + if(p == -1 || p >= end) { - arr[i] = (byte)decodedString.charAt(i); - } - - try - { - return new String(arr, 0, arr.length, "UTF8"); + p = start; + while(p < end) + { + checkChar(s, p++); + } + return s.substring(start, end); } - catch(java.io.UnsupportedEncodingException ex) + else { - throw new IllegalArgumentException("unsupported encoding", ex); + StringBuilder sb = new StringBuilder(end - start); + while(start < end) + { + start = decodeChar(s, start, end, sb); + } + return sb.toString(); } } diff --git a/java/src/IceBox/src/main/java/com/zeroc/IceBox/Admin.java b/java/src/IceBox/src/main/java/com/zeroc/IceBox/Admin.java index ace16b7d0b7..6f1645bb53b 100644 --- a/java/src/IceBox/src/main/java/com/zeroc/IceBox/Admin.java +++ b/java/src/IceBox/src/main/java/com/zeroc/IceBox/Admin.java @@ -82,7 +82,7 @@ public final class Admin return 1; } - managerProxy = "\"" + com.zeroc.Ice.Util.identityToString(managerIdentity) + "\" :" + + managerProxy = "\"" + communicator().identityToString(managerIdentity) + "\" :" + managerEndpoints; } else @@ -94,7 +94,7 @@ public final class Admin return 1; } - managerProxy = "\"" + com.zeroc.Ice.Util.identityToString(managerIdentity) + "\" @" + + managerProxy = "\"" + communicator().identityToString(managerIdentity) + "\" @" + managerAdapterId; } diff --git a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/AdapterEditor.java b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/AdapterEditor.java index 6b2477854f8..20415fa116f 100644 --- a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/AdapterEditor.java +++ b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/AdapterEditor.java @@ -575,9 +575,11 @@ class AdapterEditor extends CommunicatorChildEditor private java.util.Map<String, String[]> objectDescriptorSeqToMap(java.util.List<ObjectDescriptor> objects) { java.util.Map<String, String[]> result = new java.util.TreeMap<>(); + com.zeroc.Ice.Communicator communicator = getAdapter().getRoot().getCoordinator().getCommunicator(); + for(ObjectDescriptor p : objects) { - String k = com.zeroc.Ice.Util.identityToString(p.id); + String k = communicator.identityToString(p.id); result.put(k, new String[]{p.type, getAdapter().lookupPropertyValue(k),p.proxyOptions}); } return result; @@ -587,11 +589,12 @@ class AdapterEditor extends CommunicatorChildEditor { String badIdentities = ""; java.util.LinkedList<ObjectDescriptor> result = new java.util.LinkedList<>(); + com.zeroc.Ice.Communicator communicator = getAdapter().getRoot().getCoordinator().getCommunicator(); for(java.util.Map.Entry<String, String[]> p : map.entrySet()) { try { - com.zeroc.Ice.Identity id = com.zeroc.Ice.Util.stringToIdentity(p.getKey()); + com.zeroc.Ice.Identity id = communicator.stringToIdentity(p.getKey()); String[] val = p.getValue(); result.add(new ObjectDescriptor(id, val[0], val[2])); } diff --git a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/PropertiesField.java b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/PropertiesField.java index 782c476376e..cb6ad3998f0 100644 --- a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/PropertiesField.java +++ b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/PropertiesField.java @@ -111,11 +111,11 @@ public class PropertiesField extends JTable for(ObjectDescriptor q : p.objects) { - hiddenPropertyValues.add(com.zeroc.Ice.Util.identityToString(q.id)); + hiddenPropertyValues.add(com.zeroc.Ice.Util.identityToString(q.id, com.zeroc.Ice.ToStringMode.Unicode)); } for(ObjectDescriptor q : p.allocatables) { - hiddenPropertyValues.add(com.zeroc.Ice.Util.identityToString(q.id)); + hiddenPropertyValues.add(com.zeroc.Ice.Util.identityToString(q.id, com.zeroc.Ice.ToStringMode.Unicode)); } } } diff --git a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/ReplicaGroupEditor.java b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/ReplicaGroupEditor.java index 4f1642b15e8..c81585473f1 100644 --- a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/ReplicaGroupEditor.java +++ b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/ReplicaGroupEditor.java @@ -422,9 +422,10 @@ class ReplicaGroupEditor extends Editor private java.util.Map<String, String[]> objectDescriptorSeqToMap(java.util.List<ObjectDescriptor> objects) { java.util.Map<String, String[]> result = new java.util.TreeMap<>(); + com.zeroc.Ice.Communicator communicator = _target.getCoordinator().getCommunicator(); for(ObjectDescriptor p : objects) { - result.put(com.zeroc.Ice.Util.identityToString(p.id), new String[]{p.type, p.proxyOptions}); + result.put(communicator.identityToString(p.id), new String[]{p.type, p.proxyOptions}); } return result; } @@ -433,12 +434,13 @@ class ReplicaGroupEditor extends Editor { String badIdentities = ""; java.util.LinkedList<ObjectDescriptor> result = new java.util.LinkedList<>(); + com.zeroc.Ice.Communicator communicator = _target.getCoordinator().getCommunicator(); for(java.util.Map.Entry<String, String[]> p : map.entrySet()) { try { - com.zeroc.Ice.Identity id = com.zeroc.Ice.Util.stringToIdentity(p.getKey()); + com.zeroc.Ice.Identity id = communicator.stringToIdentity(p.getKey()); String[] val = p.getValue(); result.add(new ObjectDescriptor(id, val[0], val[1])); } diff --git a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/TreeNode.java b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/TreeNode.java index f8276f2dc2c..56dd18e634e 100644 --- a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/TreeNode.java +++ b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Application/TreeNode.java @@ -140,11 +140,11 @@ public abstract class TreeNode extends TreeNodeBase for(ObjectDescriptor q : p.objects) { - hiddenPropertyValues.add(com.zeroc.Ice.Util.identityToString(q.id)); + hiddenPropertyValues.add(com.zeroc.Ice.Util.identityToString(q.id, com.zeroc.Ice.ToStringMode.Unicode)); } for(ObjectDescriptor q : p.allocatables) { - hiddenPropertyValues.add(com.zeroc.Ice.Util.identityToString(q.id)); + hiddenPropertyValues.add(com.zeroc.Ice.Util.identityToString(q.id, com.zeroc.Ice.ToStringMode.Unicode)); } } } @@ -261,7 +261,7 @@ public abstract class TreeNode extends TreeNodeBase for(ObjectDescriptor p : objects) { java.util.List<String[]> attributes = new java.util.LinkedList<>(); - String strId = com.zeroc.Ice.Util.identityToString(p.id); + String strId = com.zeroc.Ice.Util.identityToString(p.id, com.zeroc.Ice.ToStringMode.Unicode); attributes.add(createAttribute("identity", strId)); if(p.type.length() > 0) { diff --git a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Coordinator.java b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Coordinator.java index 8bbd0625ac1..c35d5e3608f 100644 --- a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Coordinator.java +++ b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/Coordinator.java @@ -2014,7 +2014,7 @@ public class Coordinator masterRegistryId.name = "Registry"; cb.setRegistry(RegistryPrx.uncheckedCast(_communicator.stringToProxy( - "\"" + com.zeroc.Ice.Util.identityToString(masterRegistryId) + + "\"" + _communicator.identityToString(masterRegistryId) + "\""))); } diff --git a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/LiveDeployment/Root.java b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/LiveDeployment/Root.java index 277e5c34a56..c0f646fa74f 100644 --- a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/LiveDeployment/Root.java +++ b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/LiveDeployment/Root.java @@ -600,23 +600,23 @@ public class Root extends ListArrayTreeNode { for(ObjectInfo info : objects) { - _objects.put(com.zeroc.Ice.Util.identityToString(info.proxy.ice_getIdentity()), info); + _objects.put(info.proxy.ice_getCommunicator().identityToString(info.proxy.ice_getIdentity()), info); } } public void objectAdded(ObjectInfo info) { - _objects.put(com.zeroc.Ice.Util.identityToString(info.proxy.ice_getIdentity()), info); + _objects.put(info.proxy.ice_getCommunicator().identityToString(info.proxy.ice_getIdentity()), info); } public void objectUpdated(ObjectInfo info) { - _objects.put(com.zeroc.Ice.Util.identityToString(info.proxy.ice_getIdentity()), info); + _objects.put(info.proxy.ice_getCommunicator().identityToString(info.proxy.ice_getIdentity()), info); } public void objectRemoved(com.zeroc.Ice.Identity id) { - _objects.remove(com.zeroc.Ice.Util.identityToString(id)); + _objects.remove(_coordinator.getCommunicator().identityToString(id)); } // @@ -836,7 +836,7 @@ public class Root extends ListArrayTreeNode JOptionPane.ERROR_MESSAGE); } - String strIdentity = com.zeroc.Ice.Util.identityToString(proxy.ice_getIdentity()); + String strIdentity = _coordinator.getCommunicator().identityToString(proxy.ice_getIdentity()); final String prefix = "Adding well-known object '" + strIdentity + "'..."; final AdminPrx admin = _coordinator.getAdmin(); @@ -887,7 +887,7 @@ public class Root extends ListArrayTreeNode { com.zeroc.Ice.ObjectPrx proxy = _coordinator.getCommunicator().stringToProxy(strProxy); com.zeroc.Ice.Identity identity = proxy.ice_getIdentity(); - final String strIdentity = com.zeroc.Ice.Util.identityToString(identity); + final String strIdentity = _coordinator.getCommunicator().identityToString(identity); final String prefix = "Removing well-known object '" + strIdentity + "'..."; final String errorTitle = "Failed to remove object '" + strIdentity + "'"; diff --git a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/LiveDeployment/TableField.java b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/LiveDeployment/TableField.java index 77ac0980e60..8bb4a53393d 100644 --- a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/LiveDeployment/TableField.java +++ b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/LiveDeployment/TableField.java @@ -77,7 +77,7 @@ public class TableField extends JTable { com.zeroc.Ice.Identity id = new com.zeroc.Ice.Identity(resolver.substitute(p.id.name), resolver.substitute(p.id.category)); - map.put(com.zeroc.Ice.Util.identityToString(id), resolver.substitute(p.type)); + map.put(com.zeroc.Ice.Util.identityToString(id, com.zeroc.Ice.ToStringMode.Unicode), resolver.substitute(p.type)); } setSortedMap(map); } diff --git a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/ObjectObserverI.java b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/ObjectObserverI.java index f68074429f7..7d80cf457fb 100644 --- a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/ObjectObserverI.java +++ b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/ObjectObserverI.java @@ -71,7 +71,7 @@ class ObjectObserverI implements ObjectObserver { if(_trace) { - _coordinator.traceObserver("objectRemoved for object " + com.zeroc.Ice.Util.identityToString(id)); + _coordinator.traceObserver("objectRemoved for object " + _coordinator.getCommunicator().identityToString(id)); } SwingUtilities.invokeLater(() -> _coordinator.objectRemoved(id)); diff --git a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/SessionKeeper.java b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/SessionKeeper.java index 53d4f2a83ca..e6da2e4b8b6 100644 --- a/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/SessionKeeper.java +++ b/java/src/IceGridGUI/src/main/java/com/zeroc/IceGridGUI/SessionKeeper.java @@ -1114,7 +1114,7 @@ public class SessionKeeper { com.zeroc.Ice.LocatorPrx prx = com.zeroc.Ice.LocatorPrx.uncheckedCast( communicator.stringToProxy( - com.zeroc.Ice.Util.identityToString(locator.ice_getIdentity()) + + communicator.identityToString(locator.ice_getIdentity()) + ":" + e.toString())); if(_directDiscoveryEndpointModel.indexOf(prx) == -1) @@ -2226,7 +2226,7 @@ public class SessionKeeper id.name = "Locator"; id.category = _directInstanceName.getText(); StringBuilder endpoint = new StringBuilder(); - endpoint.append(com.zeroc.Ice.Util.identityToString(id)); + endpoint.append(_coordinator.getCommunicator().identityToString(id)); endpoint.append(":"); endpoint.append(_directCustomEndpointValue.getText()); _coordinator.getCommunicator().stringToProxy(endpoint.toString()); @@ -2283,7 +2283,7 @@ public class SessionKeeper id.name = "router"; id.category = _routedInstanceName.getText(); StringBuilder endpoint = new StringBuilder(); - endpoint.append(com.zeroc.Ice.Util.identityToString(id)); + endpoint.append(_coordinator.getCommunicator().identityToString(id)); endpoint.append(":"); endpoint.append(_routedCustomEndpointValue.getText()); _coordinator.getCommunicator().stringToProxy(endpoint.toString()); @@ -3125,7 +3125,7 @@ public class SessionKeeper id.name = "Locator"; id.category = _directInstanceName.getText(); StringBuilder endpoint = new StringBuilder(); - endpoint.append(com.zeroc.Ice.Util.identityToString(id)); + endpoint.append(_coordinator.getCommunicator().identityToString(id)); endpoint.append(":"); endpoint.append(_directCustomEndpointValue.getText()); return containsSecureEndpoints(endpoint.toString()); @@ -3143,7 +3143,7 @@ public class SessionKeeper id.name = "router"; id.category = _routedInstanceName.getText(); StringBuilder endpoint = new StringBuilder(); - endpoint.append(com.zeroc.Ice.Util.identityToString(id)); + endpoint.append(_coordinator.getCommunicator().identityToString(id)); endpoint.append(":"); endpoint.append(_routedCustomEndpointValue.getText()); return containsSecureEndpoints(endpoint.toString()); @@ -3335,7 +3335,7 @@ public class SessionKeeper id.name = inf.getDirect() ? "Locator" : "router"; id.category = inf.getInstanceName(); StringBuilder endpoint = new StringBuilder(); - endpoint.append(com.zeroc.Ice.Util.identityToString(id)); + endpoint.append(_coordinator.getCommunicator().identityToString(id)); endpoint.append(":"); endpoint.append(inf.getEndpoint()); ssl = containsSecureEndpoints(endpoint.toString()); |