Hi list,
hope this question belongs here:
I use the Tapestry Registry for a non-web app to manage my dependencies, and
the same code works differently on my MAC (where it runs fine) and on an Ubuntu
VM (where it crashes, see the trace)
The code triggering the different behaviors is summarized here:
RegistryBuilder builder = new RegistryBuilder();
builder.add(UtilsModule.class);
builder.add(ExperimentAutomationAppModule.class);
Registry registry = builder.build();
registry.performRegistryStartup();
// This is the code:
SineTraceGenerator generator = (SineTraceGenerator) registry
.getService("SineTraceGenerator",
TraceGenerator.class);
The ExperimentAutomationAppModule builds the SineTraceGenerator as follows:
public static TraceGenerator buildSineTraceGenerator(Logger logger,
@Value("${ecssim.trace-amplitude}") Double amplitude,
@Value("${ecssim.trace-frequency}") Double frequency,
@Value("${ecssim.trace-phaseShift}") Double phaseShift,
@Value("${ecssim.trace-verticalShift}") Double
verticalShift,
@Value("${ecssim.clients-traceFile}") String traceFile)
{
return new SineTraceGenerator(amplitude, frequency, phaseShift,
verticalShift, traceFile);
}
The SineGeneratorClass is defined as:
public class SineTraceGenerator implements TraceGenerator
Now, I clearly understand that Tapestry underneath uses its ClassLoading
machinery, but it remains unclear why *and how to solve this* there is such a
big difference (crash/not-crash) in the two cases.
I would like to use something like:
public static SineTraceGenerator buildSineTraceGenerator(...
And I cannot either do:
TraceGenerator generator = (SineTraceGenerator) registry
.getService("SineTraceGenerator",
TraceGenerator.class);
Would be the following a good design ? ... How knows !
public class SineTraceGenerator implements TraceGenerator, SinePattern
SinePattern pattern = registry
.getService("SineTraceGenerator",
SinePattern.class);
pattern.setFrequency( ... );
...
TraceGenerator generator = (SineTraceGenerator) registry
.getService("SineTraceGenerator",
TraceGenerator.class);
generator.generate();
Or should I need to define two services that are implemented by the same
instance object ? This sounds quite dirty although...
Regards
-- Alessio
================= TRACE/LOG
INFO org.apache.tapestry5.ioc.RegistryBuilder: Adding module definition for
class org.apache.tapestry5.ioc.services.TapestryIOCModule
INFO org.apache.tapestry5.ioc.RegistryBuilder: Adding module definition for
class org.gambi.utils.UtilsModule
INFO org.apache.tapestry5.ioc.RegistryBuilder: Adding module definition for
class org.gambi.experiments.ExperimentAutomationAppModule
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] --> Eager loading services
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] <-- Eager loading services [2.24
ms]
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] --> Eager loading services
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] <-- Eager loading services [0.18
ms]
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] --> Eager loading services
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] <-- Eager loading services [0.11
ms]
DEBUG org.apache.tapestry5.ioc.services.TapestryIOCModule.RegistryStartup:
Creating proxy for service RegistryStartup
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] --> Creating proxy for service
RegistryStartup
DEBUG org.apache.tapestry5.ioc.Registry: [ 2] --> Obtaining AspectDecorator
service
DEBUG org.apache.tapestry5.ioc.services.TapestryIOCModule.AspectDecorator:
Creating proxy for service AspectDecorator
DEBUG org.apache.tapestry5.ioc.Registry: [ 3] --> Creating proxy for service
AspectDecorator
DEBUG org.apache.tapestry5.ioc.services.TapestryIOCModule.PlasticProxyFactory:
Loading class $AspectDecorator_28566c0cafeaa:
// class version 49.0 (49)
// access flags 0x1
public class $AspectDecorator_28566c0cafeaa implements
org/apache/tapestry5/ioc/services/AspectDecorator java/io/Serializable {
// access flags 0x12
private final Lorg/apache/tapestry5/ioc/ObjectCreator; creator
// access flags 0x12
private final Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken; token
// access flags 0x1
public
build(Ljava/lang/Class;Ljava/lang/Object;Lorg/apache/tapestry5/ioc/MethodAdvice;Ljava/lang/String;)Ljava/lang/Object;
ALOAD 0
INVOKESPECIAL $AspectDecorator_28566c0cafeaa.delegate
()Lorg/apache/tapestry5/ioc/services/AspectDecorator;
ALOAD 1
ALOAD 2
ALOAD 3
ALOAD 4
INVOKEINTERFACE org/apache/tapestry5/ioc/services/AspectDecorator.build
(Ljava/lang/Class;Ljava/lang/Object;Lorg/apache/tapestry5/ioc/MethodAdvice;Ljava/lang/String;)Ljava/lang/Object;
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public
createBuilder(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;)Lorg/apache/tapestry5/ioc/services/AspectInterceptorBuilder;
ALOAD 0
INVOKESPECIAL $AspectDecorator_28566c0cafeaa.delegate
()Lorg/apache/tapestry5/ioc/services/AspectDecorator;
ALOAD 1
ALOAD 2
ALOAD 3
INVOKEINTERFACE
org/apache/tapestry5/ioc/services/AspectDecorator.createBuilder
(Ljava/lang/Class;Ljava/lang/Object;Ljava/lang/String;)Lorg/apache/tapestry5/ioc/services/AspectInterceptorBuilder;
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public
createBuilder(Ljava/lang/Class;Ljava/lang/Object;Lorg/apache/tapestry5/ioc/AnnotationAccess;Ljava/lang/String;)Lorg/apache/tapestry5/ioc/services/AspectInterceptorBuilder;
ALOAD 0
INVOKESPECIAL $AspectDecorator_28566c0cafeaa.delegate
()Lorg/apache/tapestry5/ioc/services/AspectDecorator;
ALOAD 1
ALOAD 2
ALOAD 3
ALOAD 4
INVOKEINTERFACE
org/apache/tapestry5/ioc/services/AspectDecorator.createBuilder
(Ljava/lang/Class;Ljava/lang/Object;Lorg/apache/tapestry5/ioc/AnnotationAccess;Ljava/lang/String;)Lorg/apache/tapest
ry5/ioc/services/AspectInterceptorBuilder;
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1010
final reject_field_change_creator(Lorg/apache/tapestry5/ioc/ObjectCreator;)V
NEW java/lang/IllegalStateException
DUP
LDC "Field creator of class $AspectDecorator_28566c0cafeaa is read-only."
INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
ATHROW
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1010
final
reject_field_change_token(Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken;)V
NEW java/lang/IllegalStateException
DUP
LDC "Field token of class $AspectDecorator_28566c0cafeaa is read-only."
INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
ATHROW
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x2
private delegate()Lorg/apache/tapestry5/ioc/services/AspectDecorator;
ALOAD 0
GETFIELD $AspectDecorator_28566c0cafeaa.creator :
Lorg/apache/tapestry5/ioc/ObjectCreator;
INVOKEINTERFACE org/apache/tapestry5/ioc/ObjectCreator.createObject
()Ljava/lang/Object;
CHECKCAST org/apache/tapestry5/ioc/services/AspectDecorator
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x2
private writeReplace()Ljava/lang/Object; throws java/io/ObjectStreamException
ALOAD 0
GETFIELD $AspectDecorator_28566c0cafeaa.token :
Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken;
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public toString()Ljava/lang/String;
LDC "<Proxy for
AspectDecorator(org.apache.tapestry5.ioc.services.AspectDecorator)>"
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public
<init>(Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
ALOAD 0
ALOAD 1
ICONST_0
INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get
(I)Ljava/lang/Object;
CHECKCAST org/apache/tapestry5/ioc/ObjectCreator
PUTFIELD $AspectDecorator_28566c0cafeaa.creator :
Lorg/apache/tapestry5/ioc/ObjectCreator;
ALOAD 0
ALOAD 1
ICONST_1
INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get
(I)Ljava/lang/Object;
CHECKCAST org/apache/tapestry5/ioc/internal/ServiceProxyToken
PUTFIELD $AspectDecorator_28566c0cafeaa.token :
Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken;
RETURN
MAXSTACK = 0
MAXLOCALS = 0
}
DEBUG org.apache.tapestry5.ioc.Registry: [ 3] <-- Creating proxy for service
AspectDecorator [49.05 ms]
DEBUG org.apache.tapestry5.ioc.Registry: [ 2] <-- Obtaining AspectDecorator
service [49.98 ms]
DEBUG org.apache.tapestry5.ioc.services.TapestryIOCModule.PlasticProxyFactory:
Loading class $Runnable_28566c0cafeab:
// class version 49.0 (49)
// access flags 0x1
public class $Runnable_28566c0cafeab implements java/lang/Runnable
java/io/Serializable {
// access flags 0x12
private final Lorg/apache/tapestry5/ioc/ObjectCreator; creator
// access flags 0x12
private final Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken; token
// access flags 0x1
public run()V
ALOAD 0
INVOKESPECIAL $Runnable_28566c0cafeab.delegate ()Ljava/lang/Runnable;
INVOKEINTERFACE java/lang/Runnable.run ()V
RETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1010
final reject_field_change_creator(Lorg/apache/tapestry5/ioc/ObjectCreator;)V
NEW java/lang/IllegalStateException
DUP
LDC "Field creator of class $Runnable_28566c0cafeab is read-only."
INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
ATHROW
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1010
final
reject_field_change_token(Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken;)V
NEW java/lang/IllegalStateException
DUP
LDC "Field token of class $Runnable_28566c0cafeab is read-only."
INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
ATHROW
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x2
private delegate()Ljava/lang/Runnable;
ALOAD 0
GETFIELD $Runnable_28566c0cafeab.creator :
Lorg/apache/tapestry5/ioc/ObjectCreator;
INVOKEINTERFACE org/apache/tapestry5/ioc/ObjectCreator.createObject
()Ljava/lang/Object;
CHECKCAST java/lang/Runnable
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x2
private writeReplace()Ljava/lang/Object; throws java/io/ObjectStreamException
ALOAD 0
GETFIELD $Runnable_28566c0cafeab.token :
Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken;
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public toString()Ljava/lang/String;
LDC "<Proxy for RegistryStartup(java.lang.Runnable)>"
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public
<init>(Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
ALOAD 0
ALOAD 1
ICONST_0
INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get
(I)Ljava/lang/Object;
CHECKCAST org/apache/tapestry5/ioc/ObjectCreator
PUTFIELD $Runnable_28566c0cafeab.creator :
Lorg/apache/tapestry5/ioc/ObjectCreator;
ALOAD 0
ALOAD 1
ICONST_1
INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get
(I)Ljava/lang/Object;
CHECKCAST org/apache/tapestry5/ioc/internal/ServiceProxyToken
PUTFIELD $Runnable_28566c0cafeab.token :
Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken;
RETURN
MAXSTACK = 0
MAXLOCALS = 0
}
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] <-- Creating proxy for service
RegistryStartup [87.90 ms]
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] --> Realizing service
RegistryStartup
DEBUG org.apache.tapestry5.ioc.Registry: [ 2] --> Instantiating service
RegistryStartup implementation via
org.apache.tapestry5.ioc.internal.services.RegistryStartup(Logger, List) (at
RegistryStartup
.java:36) via
org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at
TapestryIOCModule.java:49)
DEBUG org.apache.tapestry5.ioc.Registry: [ 3] --> Creating plan to instantiate
org.apache.tapestry5.ioc.internal.services.RegistryStartup via public
org.apache.tapestry5.ioc.internal.services.Registr
yStartup(org.slf4j.Logger,java.util.List)
DEBUG org.apache.tapestry5.ioc.Registry: [ 4] --> Determining injection value
for parameter #1 (org.slf4j.Logger)
DEBUG org.apache.tapestry5.ioc.Registry: [ 4] <-- Determining injection value
for parameter #1 (org.slf4j.Logger) [1.49 ms]
DEBUG org.apache.tapestry5.ioc.Registry: [ 4] --> Determining injection value
for parameter #2 (java.util.List)
DEBUG org.apache.tapestry5.ioc.Registry: [ 5] --> Collecting ordered
configuration for service RegistryStartup
DEBUG org.apache.tapestry5.ioc.Registry: [ 5] <-- Collecting ordered
configuration for service RegistryStartup [3.48 ms]
DEBUG org.apache.tapestry5.ioc.services.TapestryIOCModule.RegistryStartup:
Constructed configuration: []
DEBUG org.apache.tapestry5.ioc.Registry: [ 4] <-- Determining injection value
for parameter #2 (java.util.List) [13.56 ms]
DEBUG org.apache.tapestry5.ioc.Registry: [ 3] <-- Creating plan to instantiate
org.apache.tapestry5.ioc.internal.services.RegistryStartup via public
org.apache.tapestry5.ioc.internal.services.Registr
yStartup(org.slf4j.Logger,java.util.List) [17.91 ms]
DEBUG org.apache.tapestry5.ioc.Registry: [ 3] --> Invoking constructor
org.apache.tapestry5.ioc.internal.services.RegistryStartup(Logger, List) (at
RegistryStartup.java:36) via org.apache.tapestry5.i
oc.services.TapestryIOCModule.bind(ServiceBinder) (at
TapestryIOCModule.java:49) (for service 'RegistryStartup')
DEBUG org.apache.tapestry5.ioc.services.TapestryIOCModule.RegistryStartup:
Invoking constructor
org.apache.tapestry5.ioc.internal.services.RegistryStartup(Logger, List) (at
RegistryStartup.java:36) vi
a org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at
TapestryIOCModule.java:49) (for service 'RegistryStartup')
DEBUG org.apache.tapestry5.ioc.Registry: [ 3] <-- Invoking constructor
org.apache.tapestry5.ioc.internal.services.RegistryStartup(Logger, List) (at
RegistryStartup.java:36) via org.apache.tapestry5.i
oc.services.TapestryIOCModule.bind(ServiceBinder) (at
TapestryIOCModule.java:49) (for service 'RegistryStartup') [0.36 ms]
DEBUG org.apache.tapestry5.ioc.Registry: [ 2] <-- Instantiating service
RegistryStartup implementation via
org.apache.tapestry5.ioc.internal.services.RegistryStartup(Logger, List) (at
RegistryStartup
.java:36) via
org.apache.tapestry5.ioc.services.TapestryIOCModule.bind(ServiceBinder) (at
TapestryIOCModule.java:49) [20.71 ms]
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] <-- Realizing service
RegistryStartup [21.27 ms]
DEBUG org.gambi.experiments.ExperimentAutomationAppModule.SineTraceGenerator:
Creating proxy for service SineTraceGenerator
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] --> Creating proxy for service
SineTraceGenerator
DEBUG org.apache.tapestry5.ioc.Registry: [ 2] --> Obtaining AspectDecorator
service
DEBUG org.apache.tapestry5.ioc.Registry: [ 2] <-- Obtaining AspectDecorator
service [0.37 ms]
DEBUG org.apache.tapestry5.ioc.services.TapestryIOCModule.PlasticProxyFactory:
Loading class $TraceGenerator_28566c0cafeac:
// class version 49.0 (49)
// access flags 0x1
public class $TraceGenerator_28566c0cafeac implements
org/gambi/experiments/services/TraceGenerator java/io/Serializable {
// access flags 0x12
private final Lorg/apache/tapestry5/ioc/ObjectCreator; creator
// access flags 0x12
private final Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken; token
// access flags 0x1
public generateTrace(J)V
ALOAD 0
INVOKESPECIAL $TraceGenerator_28566c0cafeac.delegate
()Lorg/gambi/experiments/services/TraceGenerator;
LLOAD 1
INVOKEINTERFACE org/gambi/experiments/services/TraceGenerator.generateTrace
(J)V
RETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public generateTrace(JJ)V
ALOAD 0
INVOKESPECIAL $TraceGenerator_28566c0cafeac.delegate
()Lorg/gambi/experiments/services/TraceGenerator;
LLOAD 1
LLOAD 3
INVOKEINTERFACE org/gambi/experiments/services/TraceGenerator.generateTrace
(JJ)V
RETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public generateTrace(JLjava/lang/String;)V
ALOAD 0
INVOKESPECIAL $TraceGenerator_28566c0cafeac.delegate
()Lorg/gambi/experiments/services/TraceGenerator;
LLOAD 1
ALOAD 3
INVOKEINTERFACE org/gambi/experiments/services/TraceGenerator.generateTrace
(JLjava/lang/String;)V
RETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public generateTrace(JJLjava/lang/String;)V
ALOAD 0
INVOKESPECIAL $TraceGenerator_28566c0cafeac.delegate
()Lorg/gambi/experiments/services/TraceGenerator;
LLOAD 1
LLOAD 3
ALOAD 5
INVOKEINTERFACE org/gambi/experiments/services/TraceGenerator.generateTrace
(JJLjava/lang/String;)V
RETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public generateTraceAsMap(J)Ljava/util/Map;
ALOAD 0
INVOKESPECIAL $TraceGenerator_28566c0cafeac.delegate
()Lorg/gambi/experiments/services/TraceGenerator;
LLOAD 1
INVOKEINTERFACE
org/gambi/experiments/services/TraceGenerator.generateTraceAsMap
(J)Ljava/util/Map;
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1010
final reject_field_change_creator(Lorg/apache/tapestry5/ioc/ObjectCreator;)V
NEW java/lang/IllegalStateException
DUP
LDC "Field creator of class $TraceGenerator_28566c0cafeac is read-only."
INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
ATHROW
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1010
final
reject_field_change_token(Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken;)V
NEW java/lang/IllegalStateException
DUP
LDC "Field token of class $TraceGenerator_28566c0cafeac is read-only."
INVOKESPECIAL java/lang/IllegalStateException.<init> (Ljava/lang/String;)V
ATHROW
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x2
private delegate()Lorg/gambi/experiments/services/TraceGenerator;
ALOAD 0
GETFIELD $TraceGenerator_28566c0cafeac.creator :
Lorg/apache/tapestry5/ioc/ObjectCreator;
INVOKEINTERFACE org/apache/tapestry5/ioc/ObjectCreator.createObject
()Ljava/lang/Object;
CHECKCAST org/gambi/experiments/services/TraceGenerator
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x2
private writeReplace()Ljava/lang/Object; throws java/io/ObjectStreamException
ALOAD 0
GETFIELD $TraceGenerator_28566c0cafeac.token :
Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken;
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public toString()Ljava/lang/String;
LDC "<Proxy for
SineTraceGenerator(org.gambi.experiments.services.TraceGenerator)>"
ARETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x1
public
<init>(Lorg/apache/tapestry5/internal/plastic/StaticContext;Lorg/apache/tapestry5/plastic/InstanceContext;)V
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
ALOAD 0
ALOAD 1
ICONST_0
INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get
(I)Ljava/lang/Object;
CHECKCAST org/apache/tapestry5/ioc/ObjectCreator
PUTFIELD $TraceGenerator_28566c0cafeac.creator :
Lorg/apache/tapestry5/ioc/ObjectCreator;
ALOAD 0
ALOAD 1
ICONST_1
INVOKEVIRTUAL org/apache/tapestry5/internal/plastic/StaticContext.get
(I)Ljava/lang/Object;
CHECKCAST org/apache/tapestry5/ioc/internal/ServiceProxyToken
PUTFIELD $TraceGenerator_28566c0cafeac.token :
Lorg/apache/tapestry5/ioc/internal/ServiceProxyToken;
RETURN
MAXSTACK = 0
MAXLOCALS = 0
}
DEBUG org.apache.tapestry5.ioc.Registry: [ 1] <-- Creating proxy for service
SineTraceGenerator [6.48 ms]
Exception in thread "main" java.lang.ClassCastException:
$TraceGenerator_28566c0cafeac cannot be cast to
org.gambi.experiments.services.impl.SineTraceGenerator
at
org.gambi.experiments.ExperimentAutomation.main(ExperimentAutomation.java:50)