diff --git a/src/jvm/jnet/src/main/java/org/mases/jnet/developed/JNetEventResult.java b/src/jvm/jnet/src/main/java/org/mases/jnet/developed/JNetEventResult.java index c39ae17df5..eaa2b4583c 100644 --- a/src/jvm/jnet/src/main/java/org/mases/jnet/developed/JNetEventResult.java +++ b/src/jvm/jnet/src/main/java/org/mases/jnet/developed/JNetEventResult.java @@ -19,26 +19,32 @@ package org.mases.jnet.developed; public class JNetEventResult { - boolean _hasOverride = false; - Object _returnData; + volatile boolean _hasOverrideSet = false; + volatile boolean _hasOverride = false; + volatile Object _returnData; public boolean getHasOverride() { + if (!_hasOverrideSet) throw new IllegalStateException(".NET side never changed the value of HasOverride property."); return _hasOverride; } public void setHasOverride(boolean hasOverride) { + _hasOverrideSet = true; _hasOverride = hasOverride; } public Object getReturnData() { + if (!_hasOverrideSet) throw new IllegalStateException(".NET side never changed the value of HasOverride property."); return _returnData; } public void setReturnData(Object retData) { - _returnData = retData; + throw new IllegalStateException(".NET side shall never invoke this method."); + //_returnData = retData; } public void setReturnData(boolean hasOverride, Object retData) { + _hasOverrideSet = true; _hasOverride = hasOverride; _returnData = retData; } diff --git a/src/net/JNetReflector/InternalMethods.cs b/src/net/JNetReflector/InternalMethods.cs index 1b8a773146..db2996a52a 100644 --- a/src/net/JNetReflector/InternalMethods.cs +++ b/src/net/JNetReflector/InternalMethods.cs @@ -2394,7 +2394,8 @@ static string AnalyzeJavaMethods(this Class classDefinition, string extendingInt ReportTrace(ReflectionTraceLevel.Debug, "Preparing method {0}", genString); - var singleMethod = template.Replace(AllPackageClasses.ClassStub.MethodStub.RETURNTYPE, returnType) + var singleMethod = template.Replace(AllPackageClasses.ClassStub.MethodStub.LISTENER_INDEX_VARIABLE_NAME, string.Format(AllPackageClasses.ClassStub.MethodStub.LISTENER_INDEX_VARIABLE_NAME_FORMAT, eventHandlerName)) + .Replace(AllPackageClasses.ClassStub.MethodStub.RETURNTYPE, returnType) .Replace(AllPackageClasses.ClassStub.MethodStub.NAME, methodNameOrigin) .Replace(AllPackageClasses.ClassStub.MethodStub.PARAMETERS, paramsString) .Replace(AllPackageClasses.ClassStub.MethodStub.EXTEND_EXCEPTIONS, exceptionsThrowed) @@ -2407,7 +2408,8 @@ static string AnalyzeJavaMethods(this Class classDefinition, string extendingInt execStub = string.Format(isVoidMethod ? AllPackageClasses.ClassStub.MethodStub.SUPERINTERFACE_VOID_LISTENER_BASE_EXECUTION_FORMAT : AllPackageClasses.ClassStub.MethodStub.SUPERINTERFACE_TYPED_LISTENER_BASE_EXECUTION_FORMAT, methodNameOrigin, executionParamsString.Length == 0 ? string.Empty : executionParamsString); - var singleBaseMethod = template.Replace(AllPackageClasses.ClassStub.MethodStub.RETURNTYPE, returnType) + var singleBaseMethod = template.Replace(AllPackageClasses.ClassStub.MethodStub.LISTENER_INDEX_VARIABLE_NAME, string.Empty) + .Replace(AllPackageClasses.ClassStub.MethodStub.RETURNTYPE, returnType) .Replace(AllPackageClasses.ClassStub.MethodStub.NAME, methodNameOrigin + SpecialNames.BaseMethodSuffix) .Replace(AllPackageClasses.ClassStub.MethodStub.PARAMETERS, paramsString) .Replace(AllPackageClasses.ClassStub.MethodStub.EXTEND_EXCEPTIONS, exceptionsThrowed) @@ -2421,7 +2423,8 @@ static string AnalyzeJavaMethods(this Class classDefinition, string extendingInt execStub = string.Format(isVoidMethod ? AllPackageClasses.ClassStub.MethodStub.SUPERINTERFACE_VOID_LISTENER_EXECUTION_FORMAT : AllPackageClasses.ClassStub.MethodStub.SUPERINTERFACE_TYPED_LISTENER_EXECUTION_FORMAT, extendingInterface, methodNameOrigin, executionParamsString.Length == 0 ? string.Empty : executionParamsString); - var singleDefaultMethod = template.Replace(AllPackageClasses.ClassStub.MethodStub.RETURNTYPE, returnType) + var singleDefaultMethod = template.Replace(AllPackageClasses.ClassStub.MethodStub.LISTENER_INDEX_VARIABLE_NAME, string.Empty) + .Replace(AllPackageClasses.ClassStub.MethodStub.RETURNTYPE, returnType) .Replace(AllPackageClasses.ClassStub.MethodStub.NAME, methodNameOrigin + SpecialNames.DefaultMethodSuffix) .Replace(AllPackageClasses.ClassStub.MethodStub.PARAMETERS, paramsString) .Replace(AllPackageClasses.ClassStub.MethodStub.EXTEND_EXCEPTIONS, exceptionsThrowed) diff --git a/src/net/JNetReflector/Templates/SingleListenerJavaFile.template b/src/net/JNetReflector/Templates/SingleListenerJavaFile.template index cd7a0ebe36..97086a90c8 100644 --- a/src/net/JNetReflector/Templates/SingleListenerJavaFile.template +++ b/src/net/JNetReflector/Templates/SingleListenerJavaFile.template @@ -17,18 +17,34 @@ public final class ALLPACKAGE_CLASSES_STUB_SIMPLECLASS_PLACEHOLDER ALLPACKAGE_CL public synchronized void release() { _internalListener.release(); } + + public synchronized int getEventIndex(String eventName) { + return _internalListener.getEventIndex(eventName); + } public synchronized void raiseEvent(String eventName) { _internalListener.raiseEvent(eventName); } + + public synchronized void raiseEvent(int eventIndex) { + _internalListener.raiseEvent(eventIndex); + } public synchronized void raiseEvent(String eventName, Object e) { _internalListener.raiseEvent(eventName, e); } + + public synchronized void raiseEvent(int eventIndex, Object e) { + _internalListener.raiseEvent(eventIndex, e); + } public synchronized void raiseEvent(String eventName, Object e, Object... objects) { _internalListener.raiseEvent(eventName, e, objects); } + + public synchronized void raiseEvent(int eventIndex, Object e, Object... objects) { + _internalListener.raiseEvent(eventIndex, e, objects); + } public Object getEventData() { return _internalListener.getEventData(); diff --git a/src/net/JNetReflector/Templates/SingleListenerJavaMethod.template b/src/net/JNetReflector/Templates/SingleListenerJavaMethod.template index 5d3857b057..5b358ba512 100644 --- a/src/net/JNetReflector/Templates/SingleListenerJavaMethod.template +++ b/src/net/JNetReflector/Templates/SingleListenerJavaMethod.template @@ -1,4 +1,5 @@ -//@Override +METHOD_STUB_LISTENER_INDEX_VARIABLE_NAME +//@Override public METHOD_STUB_RETURN_TYPE_PLACEHOLDER METHOD_STUB_METHOD_NAME_PLACEHOLDER(METHOD_STUB_PARAMETERS_PLACEHOLDER)METHOD_STUB_EXTEND_EXCEPTIONS_PLACEHOLDER { METHOD_STUB_EXECUTION_PLACEHOLDER } \ No newline at end of file diff --git a/src/net/JNetReflector/Templates/Templates.cs b/src/net/JNetReflector/Templates/Templates.cs index 44fe970153..56ab6cdd75 100644 --- a/src/net/JNetReflector/Templates/Templates.cs +++ b/src/net/JNetReflector/Templates/Templates.cs @@ -205,6 +205,7 @@ public class MethodStub public const string WHERECLAUSES = "METHOD_STUB_WHERECLAUSES_PLACEHOLDER"; public const string EXECUTION = "METHOD_STUB_EXECUTION_PLACEHOLDER"; public const string EXTEND_EXCEPTIONS = "METHOD_STUB_EXTEND_EXCEPTIONS_PLACEHOLDER"; + public const string LISTENER_INDEX_VARIABLE_NAME = "METHOD_STUB_LISTENER_INDEX_VARIABLE_NAME"; public const string LISTENER_EXECUTION_TYPE = "METHOD_STUB_LISTENER_EXECUTION_TYPE_PLACEHOLDER"; public const string LISTENER_EXECUTION = "METHOD_STUB_LISTENER_EXECUTION_PLACEHOLDER"; public const string LISTENER_HANDLER_EXECUTION = "METHOD_STUB_LISTENER_HANDLER_EXECUTION_PLACEHOLDER"; @@ -248,22 +249,29 @@ public class MethodStub + "{1}" + Environment.NewLine + "}}" + Environment.NewLine; + public static string LISTENER_INDEX_VARIABLE_NAME_FORMAT = "int _{0}Index = 0;"; public static string VOID_LISTENER_EXECUTION_FORMAT = "org.mases.jnet.developed.JNetEventResult eventDataExchange = new org.mases.jnet.developed.JNetEventResult();" + Environment.NewLine - + "raiseEvent(\"{0}\", eventDataExchange{1}); if (!eventDataExchange.getHasOverride()) throw new UnsupportedOperationException(\"The method shall be implemented in .NET side since does not have a default implementation within the JVM\");"; + + "if (_{0}Index <= 0) _{0}Index = getEventIndex(\"{0}\");" + Environment.NewLine + + "raiseEvent(_{0}Index, eventDataExchange{1}); if (!eventDataExchange.getHasOverride()) throw new UnsupportedOperationException(\"The method shall be implemented in .NET side since does not have a default implementation within the JVM\");"; public const string SUPERINTERFACE_VOID_LISTENER_EXECUTION_FORMAT = "{0}.super.{1}({2});"; public const string SUPERINTERFACE_VOID_LISTENER_BASE_EXECUTION_FORMAT = "super.{0}({1});"; public static string SUPERINTERFACE_VOID_DEFAULT_EXECUTION_FORMAT = "org.mases.jnet.developed.JNetEventResult eventDataExchange = new org.mases.jnet.developed.JNetEventResult();" + Environment.NewLine - + "raiseEvent(\"{0}\", eventDataExchange{1}); if (!eventDataExchange.getHasOverride()) {2}.super.{3}({4});"; + + "if (_{0}Index <= 0) _{0}Index = getEventIndex(\"{0}\");" + Environment.NewLine + + "raiseEvent(_{0}Index, eventDataExchange{1}); if (!eventDataExchange.getHasOverride()) {2}.super.{3}({4});"; public static string SUPERINTERFACE_VOID_ADAPTER_EXECUTION_FORMAT = "org.mases.jnet.developed.JNetEventResult eventDataExchange = new org.mases.jnet.developed.JNetEventResult();" + Environment.NewLine - + "raiseEvent(\"{0}\", eventDataExchange{1}); if (!eventDataExchange.getHasOverride()) super.{2}({3});"; + + "if (_{0}Index <= 0) _{0}Index = getEventIndex(\"{0}\");" + Environment.NewLine + + "raiseEvent(_{0}Index, eventDataExchange{1}); if (!eventDataExchange.getHasOverride()) super.{2}({3});"; public static string TYPED_LISTENER_EXECUTION_FORMAT = "org.mases.jnet.developed.JNetEventResult eventDataExchange = new org.mases.jnet.developed.JNetEventResult();" + Environment.NewLine - + "raiseEvent(\"{0}\", eventDataExchange{1}); if (!eventDataExchange.getHasOverride()) throw new UnsupportedOperationException(\"The method shall be implemented in .NET side since does not have a default implementation within the JVM\"); Object retVal = eventDataExchange.getReturnData(); return ({2})retVal;"; + + "if (_{0}Index <= 0) _{0}Index = getEventIndex(\"{0}\");" + Environment.NewLine + + "raiseEvent(_{0}Index, eventDataExchange{1}); if (!eventDataExchange.getHasOverride()) throw new UnsupportedOperationException(\"The method shall be implemented in .NET side since does not have a default implementation within the JVM\"); Object retVal = eventDataExchange.getReturnData(); return ({2})retVal;"; public const string SUPERINTERFACE_TYPED_LISTENER_EXECUTION_FORMAT = "return {0}.super.{1}({2});"; public const string SUPERINTERFACE_TYPED_LISTENER_BASE_EXECUTION_FORMAT = "return super.{0}({1});"; public static string SUPERINTERFACE_TYPED_DEFAULT_EXECUTION_FORMAT = "org.mases.jnet.developed.JNetEventResult eventDataExchange = new org.mases.jnet.developed.JNetEventResult();" + Environment.NewLine - + "raiseEvent(\"{0}\", eventDataExchange{1}); Object retVal; if (!eventDataExchange.getHasOverride()) retVal = {3}.super.{4}({5}); else retVal = eventDataExchange.getReturnData(); return ({2})retVal;"; + + "if (_{0}Index <= 0) _{0}Index = getEventIndex(\"{0}\");" + Environment.NewLine + + "raiseEvent(_{0}Index, eventDataExchange{1}); Object retVal; if (!eventDataExchange.getHasOverride()) retVal = {3}.super.{4}({5}); else retVal = eventDataExchange.getReturnData(); return ({2})retVal;"; public static string SUPERINTERFACE_TYPED_ADAPTER_EXECUTION_FORMAT = "org.mases.jnet.developed.JNetEventResult eventDataExchange = new org.mases.jnet.developed.JNetEventResult();" + Environment.NewLine - + "raiseEvent(\"{0}\", eventDataExchange{1}); Object retVal; if (!eventDataExchange.getHasOverride()) retVal = super.{3}({4}); else retVal = eventDataExchange.getReturnData(); return ({2})retVal;"; + + "if (_{0}Index <= 0) _{0}Index = getEventIndex(\"{0}\");" + Environment.NewLine + + "raiseEvent(_{0}Index, eventDataExchange{1}); Object retVal; if (!eventDataExchange.getHasOverride()) retVal = super.{3}({4}); else retVal = eventDataExchange.getReturnData(); return ({2})retVal;"; } public class PropertyStub