diff options
Diffstat (limited to 'java')
-rw-r--r-- | java/BuildInstructions.md | 10 | ||||
-rw-r--r-- | java/build.gradle | 12 | ||||
-rw-r--r-- | java/gradle.properties | 2 | ||||
-rw-r--r-- | java/gradle/ice.gradle | 2 | ||||
-rw-r--r-- | java/gradle/library.gradle | 2 | ||||
-rw-r--r-- | java/src/Ice/src/main/java/Ice/Util.java | 4 | ||||
-rw-r--r-- | java/src/Ice/src/main/java/IceInternal/BasicStream.java | 24 | ||||
-rw-r--r-- | java/src/Ice/src/main/java/IceInternal/Incoming.java | 3 | ||||
-rw-r--r-- | java/src/Ice/src/main/java/IceInternal/OutgoingAsync.java | 2 | ||||
-rw-r--r-- | java/src/Ice/src/main/java/IceInternal/OutgoingConnectionFactory.java | 119 | ||||
-rw-r--r-- | java/src/Ice/src/main/java/IceInternal/PropertyNames.java | 4 | ||||
-rwxr-xr-x | java/src/IceGridGUI/src/main/java/IceGridGUI/LiveDeployment/Service.java | 66 | ||||
-rw-r--r-- | java/test/src/main/java/test/Ice/optional/AMDInitialI.java | 9 | ||||
-rw-r--r-- | java/test/src/main/java/test/Ice/optional/AllTests.java | 14 | ||||
-rw-r--r-- | java/test/src/main/java/test/Ice/optional/InitialI.java | 8 | ||||
-rw-r--r-- | java/test/src/main/java/test/Ice/optional/Test.ice | 4 | ||||
-rw-r--r-- | java/test/src/main/java/test/Ice/optional/TestAMD.ice | 4 |
17 files changed, 175 insertions, 114 deletions
diff --git a/java/BuildInstructions.md b/java/BuildInstructions.md index e5e3e16079d..3fc75b0a4a6 100644 --- a/java/BuildInstructions.md +++ b/java/BuildInstructions.md @@ -141,12 +141,12 @@ have not built Ice for C++ in this source distribution, you must set the `ICE_HOME` environment variable with the path name of your Ice installation. For example, on Unix: - $ export ICE_HOME=/opt/Ice-3.6.2 (For local build) + $ export ICE_HOME=/opt/Ice-3.6.3 (For local build) $ export ICE_HOME=/usr (For RPM installation) On Windows: - > set ICE_HOME=C:\Program Files (x86)\ZeroC\Ice-3.6.2 + > set ICE_HOME=C:\Program Files (x86)\ZeroC\Ice-3.6.3 Before building Ice for Java, review the settings in the file `gradle.properties` and edit as necessary. @@ -176,7 +176,7 @@ The installation installs the following JAR files to `<prefix>/lib`. freeze-3.6.2.jar glacier2-3.6.2.jar - ice-3.6.2.jar + ice-3.6.3.jar icebox-3.6.2.jar icediscovery-3.6.2.jar icegrid-3.6.2.jar @@ -195,12 +195,12 @@ C++ distribution. If you have not built Ice for C++ in this source distribution then you must set the `ICE_HOME` environment variable with the path name of your Ice installation. On Unix: - $ export ICE_HOME=/opt/Ice-3.6.2 (For local build) + $ export ICE_HOME=/opt/Ice-3.6.3 (For local build) $ export ICE_HOME=/usr (For RPM installation) On Windows: - > set ICE_HOME=c:\Program Files (x86)\ZeroC\Ice-3.6.2 + > set ICE_HOME=c:\Program Files (x86)\ZeroC\Ice-3.6.3 Python is required to run the test suite. To run the tests, open a command window and change to the top-level directory. At the command prompt, execute: diff --git a/java/build.gradle b/java/build.gradle index 8c0cbb25b30..2befd7009f7 100644 --- a/java/build.gradle +++ b/java/build.gradle @@ -23,15 +23,15 @@ subprojects { dirs slice.jarDir } } - + if(new File("/usr/share/maven-repo").exists()) { maven { url "/usr/share/maven-repo" } } - + mavenCentral() - + maven { url 'https://repo.zeroc.com/nexus/content/repositories/thirdparty' } @@ -55,11 +55,11 @@ subprojects { task dist() dist.dependsOn(project(":ice").assemble) -dist.dependsOn(project(":freeze").assemble) +dist.dependsOn(project(":freeze").assemble) dist.dependsOn(project(":glacier2").assemble) dist.dependsOn(project(":icegrid").assemble) -dist.dependsOn(project(":icebox").assemble) -dist.dependsOn(project(":icediscovery").assemble) +dist.dependsOn(project(":icebox").assemble) +dist.dependsOn(project(":icediscovery").assemble) dist.dependsOn(project(":icepatch2").assemble) dist.dependsOn(project(":icestorm").assemble) dist.dependsOn(project(":IceGridGUI").assemble) diff --git a/java/gradle.properties b/java/gradle.properties index b5e805e062d..d06566a45af 100644 --- a/java/gradle.properties +++ b/java/gradle.properties @@ -7,7 +7,7 @@ // // ********************************************************************** -iceVersion = 3.6.2 +iceVersion = 3.6.3 // // The directory that contains Oracle Berkeley DB's db.jar file. When not diff --git a/java/gradle/ice.gradle b/java/gradle/ice.gradle index 2a40fa418ad..96493714c70 100644 --- a/java/gradle/ice.gradle +++ b/java/gradle/ice.gradle @@ -27,7 +27,7 @@ buildscript { } } } - + if(new File("/usr/share/maven-repo").exists()){ repositories { maven { diff --git a/java/gradle/library.gradle b/java/gradle/library.gradle index 7353e00cbb3..3d446c7698c 100644 --- a/java/gradle/library.gradle +++ b/java/gradle/library.gradle @@ -144,7 +144,7 @@ if(jarsClassPath.toBoolean()){ } } } - + install.dependsOn(updateInstallManifest) } else { task install(type: Copy, dependsOn: jarSources, overwrite: true) { diff --git a/java/src/Ice/src/main/java/Ice/Util.java b/java/src/Ice/src/main/java/Ice/Util.java index b2cc28106a3..bd2db69babb 100644 --- a/java/src/Ice/src/main/java/Ice/Util.java +++ b/java/src/Ice/src/main/java/Ice/Util.java @@ -571,7 +571,7 @@ public final class Util public static String stringVersion() { - return "3.6.2"; // "A.B.C", with A=major, B=minor, C=patch + return "3.6.3"; // "A.B.C", with A=major, B=minor, C=patch } /** @@ -584,7 +584,7 @@ public final class Util public static int intVersion() { - return 30602; // AABBCC, with AA=major, BB=minor, CC=patch + return 30603; // AABBCC, with AA=major, BB=minor, CC=patch } /** diff --git a/java/src/Ice/src/main/java/IceInternal/BasicStream.java b/java/src/Ice/src/main/java/IceInternal/BasicStream.java index 5b40a3beb64..e83a2e5234c 100644 --- a/java/src/Ice/src/main/java/IceInternal/BasicStream.java +++ b/java/src/Ice/src/main/java/IceInternal/BasicStream.java @@ -412,29 +412,35 @@ public class BasicStream _readEncapsCache.reset(); } - public void - skipEmptyEncaps(Ice.EncodingVersion encoding) + public Ice.EncodingVersion + skipEmptyEncaps() { int sz = readInt(); - if(sz != 6) + if(sz < 6) { throw new Ice.EncapsulationException(); } - - final int pos = _buf.b.position(); - if(pos + 2 > _buf.size()) + if(sz - 4 > _buf.b.remaining()) { throw new Ice.UnmarshalOutOfBoundsException(); } - if(encoding != null) + Ice.EncodingVersion encoding = new Ice.EncodingVersion(); + encoding.__read(this); + if(encoding.equals(Ice.Util.Encoding_1_0)) { - encoding.__read(this); + if(sz != 6) + { + throw new Ice.EncapsulationException(); + } } else { - _buf.b.position(pos + 2); + // Skip the optional content of the encapsulation if we are expecting an + // empty encapsulation. + _buf.b.position(_buf.b.position() + sz - 6); } + return encoding; } public void diff --git a/java/src/Ice/src/main/java/IceInternal/Incoming.java b/java/src/Ice/src/main/java/IceInternal/Incoming.java index 9afd6ed4903..6f1f205854f 100644 --- a/java/src/Ice/src/main/java/IceInternal/Incoming.java +++ b/java/src/Ice/src/main/java/IceInternal/Incoming.java @@ -383,8 +383,7 @@ final public class Incoming extends IncomingBase implements Ice.Request public final void readEmptyParams() { - _current.encoding = new Ice.EncodingVersion(); - _is.skipEmptyEncaps(_current.encoding); + _current.encoding = _is.skipEmptyEncaps(); } public final byte[] diff --git a/java/src/Ice/src/main/java/IceInternal/OutgoingAsync.java b/java/src/Ice/src/main/java/IceInternal/OutgoingAsync.java index 8d776c84af4..55050ec5cc6 100644 --- a/java/src/Ice/src/main/java/IceInternal/OutgoingAsync.java +++ b/java/src/Ice/src/main/java/IceInternal/OutgoingAsync.java @@ -382,7 +382,7 @@ public class OutgoingAsync extends ProxyOutgoingAsyncBase public void readEmptyParams() { - _is.skipEmptyEncaps(null); + _is.skipEmptyEncaps(); } public byte[] readParamEncaps() diff --git a/java/src/Ice/src/main/java/IceInternal/OutgoingConnectionFactory.java b/java/src/Ice/src/main/java/IceInternal/OutgoingConnectionFactory.java index 029de0bbc63..716550dcc78 100644 --- a/java/src/Ice/src/main/java/IceInternal/OutgoingConnectionFactory.java +++ b/java/src/Ice/src/main/java/IceInternal/OutgoingConnectionFactory.java @@ -871,26 +871,10 @@ public final class OutgoingConnectionFactory connectionStartFailed(Ice.ConnectionI connection, Ice.LocalException ex) { assert(_current != null); - - if(_observer != null) - { - _observer.failed(ex.ice_name()); - _observer.detach(); - } - - _factory.handleConnectionException(ex, _hasMore || _iter.hasNext()); - if(ex instanceof Ice.CommunicatorDestroyedException) // No need to continue. - { - _factory.finishGetConnection(_connectors, ex, this); - } - else if(_iter.hasNext()) // Try the next connector. + if(connectionStartFailedImpl(ex)) { nextConnector(); } - else - { - _factory.finishGetConnection(_connectors, ex, this); - } } // @@ -1059,52 +1043,83 @@ public final class OutgoingConnectionFactory private void nextConnector() { - Ice.ConnectionI connection = null; - try + while(true) { - assert(_iter.hasNext()); - _current = _iter.next(); - - Ice.Instrumentation.CommunicatorObserver obsv = _factory._instance.initializationData().observer; - if(obsv != null) + try { - _observer = obsv.getConnectionEstablishmentObserver(_current.endpoint, - _current.connector.toString()); - if(_observer != null) + assert(_iter.hasNext()); + _current = _iter.next(); + + Ice.Instrumentation.CommunicatorObserver obsv = _factory._instance.initializationData().observer; + if(obsv != null) { - _observer.attach(); + _observer = obsv.getConnectionEstablishmentObserver(_current.endpoint, + _current.connector.toString()); + if(_observer != null) + { + _observer.attach(); + } } - } - if(_factory._instance.traceLevels().network >= 2) - { - StringBuffer s = new StringBuffer("trying to establish "); - s.append(_current.endpoint.protocol()); - s.append(" connection to "); - s.append(_current.connector.toString()); - _factory._instance.initializationData().logger.trace(_factory._instance.traceLevels().networkCat, - s.toString()); + if(_factory._instance.traceLevels().network >= 2) + { + StringBuffer s = new StringBuffer("trying to establish "); + s.append(_current.endpoint.protocol()); + s.append(" connection to "); + s.append(_current.connector.toString()); + _factory._instance.initializationData().logger.trace(_factory._instance.traceLevels().networkCat, + s.toString()); + } + + Ice.ConnectionI connection = _factory.createConnection(_current.connector.connect(), _current); + connection.start(this); } + catch(Ice.LocalException ex) + { + if(_factory._instance.traceLevels().network >= 2) + { + StringBuffer s = new StringBuffer("failed to establish "); + s.append(_current.endpoint.protocol()); + s.append(" connection to "); + s.append(_current.connector.toString()); + s.append("\n"); + s.append(ex); + _factory._instance.initializationData().logger.trace(_factory._instance.traceLevels().networkCat, + s.toString()); + } - connection = _factory.createConnection(_current.connector.connect(), _current); - connection.start(this); + if(connectionStartFailedImpl(ex)) + { + continue; + } + } + break; } - catch(Ice.LocalException ex) + } + + private boolean + connectionStartFailedImpl(Ice.LocalException ex) + { + if(_observer != null) { - if(_factory._instance.traceLevels().network >= 2) - { - StringBuffer s = new StringBuffer("failed to establish "); - s.append(_current.endpoint.protocol()); - s.append(" connection to "); - s.append(_current.connector.toString()); - s.append("\n"); - s.append(ex); - _factory._instance.initializationData().logger.trace(_factory._instance.traceLevels().networkCat, - s.toString()); - } + _observer.failed(ex.ice_name()); + _observer.detach(); + } - connectionStartFailed(connection, ex); + _factory.handleConnectionException(ex, _hasMore || _iter.hasNext()); + if(ex instanceof Ice.CommunicatorDestroyedException) // No need to continue. + { + _factory.finishGetConnection(_connectors, ex, this); + } + else if(_iter.hasNext()) // Try the next connector. + { + return true; + } + else + { + _factory.finishGetConnection(_connectors, ex, this); } + return false; } private final OutgoingConnectionFactory _factory; diff --git a/java/src/Ice/src/main/java/IceInternal/PropertyNames.java b/java/src/Ice/src/main/java/IceInternal/PropertyNames.java index 089edf73a21..838d58f06db 100644 --- a/java/src/Ice/src/main/java/IceInternal/PropertyNames.java +++ b/java/src/Ice/src/main/java/IceInternal/PropertyNames.java @@ -6,7 +6,7 @@ // ICE_LICENSE file included in this distribution. // // ********************************************************************** -// Generated by makeprops.py from file ../config/PropertyNames.xml, Tue Jul 5 22:01:38 2016 +// Generated by makeprops.py from file ./config/PropertyNames.xml, Wed Jul 6 12:39:37 2016 // IMPORTANT: Do not edit this file -- any edits made here will be lost! @@ -125,6 +125,7 @@ public final class PropertyNames new Property("Ice\\.IPv4", false, null), new Property("Ice\\.IPv6", false, null), new Property("Ice\\.LogFile", false, null), + new Property("Ice\\.LogFile\\.SizeMax", false, null), new Property("Ice\\.LogStdErr\\.Convert", false, null), new Property("Ice\\.MessageSizeMax", false, null), new Property("Ice\\.Nohup", false, null), @@ -1003,6 +1004,7 @@ public final class PropertyNames new Property("IceSSL\\.ProtocolVersionMax", false, null), new Property("IceSSL\\.ProtocolVersionMin", false, null), new Property("IceSSL\\.Random", false, null), + new Property("IceSSL\\.SecurityLevel", false, null), new Property("IceSSL\\.Trace\\.Security", false, null), new Property("IceSSL\\.TrustOnly", false, null), new Property("IceSSL\\.TrustOnly\\.Client", false, null), diff --git a/java/src/IceGridGUI/src/main/java/IceGridGUI/LiveDeployment/Service.java b/java/src/IceGridGUI/src/main/java/IceGridGUI/LiveDeployment/Service.java index 7ad220f4ac3..0e9c108595f 100755 --- a/java/src/IceGridGUI/src/main/java/IceGridGUI/LiveDeployment/Service.java +++ b/java/src/IceGridGUI/src/main/java/IceGridGUI/LiveDeployment/Service.java @@ -170,28 +170,24 @@ public class Service extends ListArrayTreeNode { if(_showIceLogDialog == null) { - Ice.ObjectPrx serverAdmin = ((Server)_parent).getServerAdmin(); - if(serverAdmin == null) + Ice.LoggerAdminPrx loggerAdmin = Ice.LoggerAdminPrxHelper.uncheckedCast(getAdminFacet("Logger")); + if(loggerAdmin == null) { - JOptionPane.showMessageDialog(getCoordinator().getMainFrame(), "Admin not available", + JOptionPane.showMessageDialog(getCoordinator().getMainFrame(), "Admin not available", "No Admin for server " + _parent.getId(), JOptionPane.ERROR_MESSAGE); return; } - - // TODO: add support for shared communicator - - Ice.LoggerAdminPrx loggerAdmin = Ice.LoggerAdminPrxHelper.uncheckedCast( - serverAdmin.ice_facet("IceBox.Service." + _id + ".Logger")); + String title = "Service " + _parent.getId() + "/" + _id + " Ice log"; - _showIceLogDialog = new ShowIceLogDialog(this, title, loggerAdmin, _parent.getId() + "-" + _id, + _showIceLogDialog = new ShowIceLogDialog(this, title, loggerAdmin, _parent.getId() + "-" + _id, getRoot().getLogMaxLines(), getRoot().getLogInitialLines()); - } + } else { _showIceLogDialog.toFront(); } } - + @Override public void retrieveLogFile() { @@ -311,14 +307,14 @@ public class Service extends ListArrayTreeNode la.setTarget(this); return _popup; } - + @Override public void clearShowIceLogDialog() { _showIceLogDialog = null; } - - + + Service(Server parent, String serviceName, Utils.Resolver resolver, ServiceInstanceDescriptor descriptor, ServiceDescriptor serviceDescriptor, PropertySetDescriptor serverInstancePSDescriptor) { @@ -344,7 +340,7 @@ public class Service extends ListArrayTreeNode _showIceLogDialog.stopped(); } } - + boolean updateAdapter(AdapterDynamicInfo info) { for(Adapter p : _adapters) @@ -415,9 +411,8 @@ public class Service extends ListArrayTreeNode void showRuntimeProperties() { - Ice.ObjectPrx serverAdmin = ((Server)_parent).getServerAdmin(); - - if(serverAdmin == null) + Ice.PropertiesAdminPrx propAdmin = Ice.PropertiesAdminPrxHelper.uncheckedCast(getAdminFacet("Properties")); + if(propAdmin == null) { _editor.setBuildId("", this); } @@ -467,9 +462,6 @@ public class Service extends ListArrayTreeNode try { - Ice.PropertiesAdminPrx propAdmin = - Ice.PropertiesAdminPrxHelper.uncheckedCast(serverAdmin.ice_facet("IceBox.Service." + _id + - ".Properties")); propAdmin.begin_getPropertiesForPrefix("", cb); } catch(Ice.LocalException e) @@ -550,15 +542,12 @@ public class Service extends ListArrayTreeNode return; // Already loaded. } - Ice.ObjectPrx serverAdmin = ((Server)_parent).getServerAdmin(); - if(serverAdmin == null) + final IceMX.MetricsAdminPrx metricsAdmin = IceMX.MetricsAdminPrxHelper.uncheckedCast(getAdminFacet("Metrics")); + if(metricsAdmin == null) { return; } _metricsRetrieved = true; - final IceMX.MetricsAdminPrx metricsAdmin = - IceMX.MetricsAdminPrxHelper.uncheckedCast(serverAdmin.ice_facet("IceBox.Service." + _id + - ".Metrics")); IceMX.Callback_MetricsAdmin_getMetricsViewNames cb = new IceMX.Callback_MetricsAdmin_getMetricsViewNames() { @@ -603,7 +592,7 @@ public class Service extends ListArrayTreeNode else { e.printStackTrace(); - JOptionPane.showMessageDialog(getCoordinator().getMainFrame(), + JOptionPane.showMessageDialog(getCoordinator().getMainFrame(), "Error: " + e.toString(), "Error", JOptionPane.ERROR_MESSAGE); } @@ -653,6 +642,27 @@ public class Service extends ListArrayTreeNode getRoot().getTreeModel().nodeStructureChanged(this); } + private Ice.ObjectPrx getAdminFacet(String facet) + { + Server parent = (Server)_parent; + Ice.ObjectPrx serverAdmin = parent.getServerAdmin(); + if(serverAdmin == null) + { + return null; + } + try + { + if(Integer.valueOf(parent.getProperties().get("IceBox.UseSharedCommunicator." + _id)) > 0) + { + return serverAdmin.ice_facet("IceBox.SharedCommunicator." + facet); + } + } + catch(NumberFormatException ex) + { + } + return serverAdmin.ice_facet("IceBox.Service." + _id + "." + facet); + } + private final ServiceInstanceDescriptor _instanceDescriptor; private final ServiceDescriptor _serviceDescriptor; private final PropertySetDescriptor _serverInstancePSDescriptor; @@ -666,7 +676,7 @@ public class Service extends ListArrayTreeNode private boolean _metricsRetrieved = false; private ShowIceLogDialog _showIceLogDialog; - + static private ServiceEditor _editor; static private DefaultTreeCellRenderer _cellRenderer; static private JPopupMenu _popup; diff --git a/java/test/src/main/java/test/Ice/optional/AMDInitialI.java b/java/test/src/main/java/test/Ice/optional/AMDInitialI.java index 0d132abe559..b7feeebbd80 100644 --- a/java/test/src/main/java/test/Ice/optional/AMDInitialI.java +++ b/java/test/src/main/java/test/Ice/optional/AMDInitialI.java @@ -564,7 +564,7 @@ public final class AMDInitialI extends Initial { cb.ice_response(new Ice.Optional<OneOptional>(new OneOptional(53))); } - + @Override public void opG_async(AMD_Initial_opG cb, G g, Ice.Current current) @@ -574,6 +574,13 @@ public final class AMDInitialI extends Initial @Override public void + opVoid_async(AMD_Initial_opVoid cb, Ice.Current current) + { + cb.ice_response(); + } + + @Override + public void supportsRequiredParams_async(AMD_Initial_supportsRequiredParams cb, Ice.Current current) { cb.ice_response(true); diff --git a/java/test/src/main/java/test/Ice/optional/AllTests.java b/java/test/src/main/java/test/Ice/optional/AllTests.java index 1db643bedae..91d70d7fcea 100644 --- a/java/test/src/main/java/test/Ice/optional/AllTests.java +++ b/java/test/src/main/java/test/Ice/optional/AllTests.java @@ -415,7 +415,19 @@ public class AllTests test(10 == g.gg2.a); test(20 == g.getGg2Opt().a); test("gg1".equals(g.gg1.a)); - + + initial.opVoid(); + + os = Ice.Util.createOutputStream(communicator); + os.startEncapsulation(); + os.writeOptional(1, Ice.OptionalFormat.F4); + os.writeInt(15); + os.writeOptional(1, Ice.OptionalFormat.VSize); + os.writeString("test"); + os.endEncapsulation(); + inEncaps = os.finished(); + test(initial.ice_invoke("opVoid", Ice.OperationMode.Normal, inEncaps, outEncaps)); + out.println("ok"); out.print("testing marshaling of large containers with fixed size elements... "); diff --git a/java/test/src/main/java/test/Ice/optional/InitialI.java b/java/test/src/main/java/test/Ice/optional/InitialI.java index f581047ac5a..54eda7d7f73 100644 --- a/java/test/src/main/java/test/Ice/optional/InitialI.java +++ b/java/test/src/main/java/test/Ice/optional/InitialI.java @@ -612,7 +612,7 @@ public final class InitialI extends Initial { o.set(new OneOptional(53)); } - + @Override public G opG(G g, Ice.Current current) @@ -621,6 +621,12 @@ public final class InitialI extends Initial } @Override + public void + opVoid(Ice.Current current) + { + } + + @Override public boolean supportsRequiredParams(Ice.Current current) { diff --git a/java/test/src/main/java/test/Ice/optional/Test.ice b/java/test/src/main/java/test/Ice/optional/Test.ice index 9ea0d9b4028..7fbce8c3270 100644 --- a/java/test/src/main/java/test/Ice/optional/Test.ice +++ b/java/test/src/main/java/test/Ice/optional/Test.ice @@ -318,9 +318,11 @@ class Initial ["java:optional"] void returnOptionalClass(bool req, out optional(1) OneOptional o); - + G opG(G g); + void opVoid(); + bool supportsRequiredParams(); bool supportsJavaSerializable(); diff --git a/java/test/src/main/java/test/Ice/optional/TestAMD.ice b/java/test/src/main/java/test/Ice/optional/TestAMD.ice index 42af1f17928..e318e105e39 100644 --- a/java/test/src/main/java/test/Ice/optional/TestAMD.ice +++ b/java/test/src/main/java/test/Ice/optional/TestAMD.ice @@ -319,9 +319,11 @@ class Initial ["java:optional"] void returnOptionalClass(bool req, out optional(1) OneOptional o); - + G opG(G g); + void opVoid(); + bool supportsRequiredParams(); bool supportsJavaSerializable(); |