Skip to content

Commit 2442d19

Browse files
Changed DynamicSystem to be instanced rather than subclassed
1 parent 4d1cb1b commit 2442d19

File tree

4 files changed

+58
-96
lines changed

4 files changed

+58
-96
lines changed

src/org/ironchefpython/modapi/Prototype.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,5 +96,9 @@ public Class<?> getJavaType() {
9696
}
9797
}
9898

99+
public Map<String, Callable> getHandlers() {
100+
return handlers;
101+
}
102+
99103

100104
}

src/org/mockengine/DynamicComponentFactory.java renamed to src/org/mockengine/DynamicEntitySystemFactory.java

Lines changed: 20 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.mockengine;
22

3+
import java.util.HashMap;
34
import java.util.Map;
45

56
import javassist.CannotCompileException;
@@ -19,29 +20,38 @@
1920
import org.mozilla.javascript.Context;
2021
import org.mozilla.javascript.Scriptable;
2122

22-
public class DynamicComponentFactory {
23-
private static final String COMPONENT_NAME_TEMPLATE = "%sComponent";
23+
public class DynamicEntitySystemFactory {
24+
private static final String COMPONENT_NAME_TEMPLATE = "org.terasology.gen.%sComponent";
2425
private static final String SYSTEM_NAME_TEMPLATE = "%sComponentSystem";
2526
private final ClassPool cp;
2627
private final JsModManager manager;
2728
private final Context cx;
2829
private final Scriptable scope;
2930

30-
public DynamicComponentFactory(JsModManager mm) {
31+
private Map<String, Class<? extends DynamicComponent>> compCache;
32+
33+
public DynamicEntitySystemFactory(JsModManager mm) {
3134
cp = new ClassPool();
3235
cp.appendSystemPath();
3336

3437
this.manager = mm;
3538
this.cx = this.manager.getContext();
3639
this.scope = this.manager.getScope();
40+
41+
this.compCache = new HashMap<String, Class<? extends DynamicComponent>>();
3742
}
3843

39-
public Class<? extends DynamicComponent> makeComponent(String name) throws Exception {
40-
return makeComponent(manager.getPrototype(name));
44+
public Class<? extends DynamicComponent> getComponent(String name) throws Exception {
45+
Class<? extends DynamicComponent> result = compCache.get(name);
46+
if (result == null) {
47+
result = makeComponent(manager.getPrototype(name));
48+
compCache.put(name, result);
49+
}
50+
return result;
4151
}
4252

43-
public Class<? extends DynamicSystem> makeSystem(String name) throws Exception {
44-
return makeSystem(manager.getPrototype(name));
53+
public DynamicSystem getSystem(String name) throws Exception {
54+
return makeSystem(manager.getPrototype(name), getComponent(name));
4555
}
4656

4757
public Class<? extends DynamicComponent> makeComponent(Prototype p) throws Exception {
@@ -95,75 +105,9 @@ public Class<? extends DynamicComponent> makeComponent(Prototype p) throws Excep
95105

96106
}
97107

98-
public Class<? extends DynamicSystem> makeSystem(Prototype p) throws Exception {
99-
String className = makeSystemClassName(p.getId());
100-
CtClass comp = cp.makeClass(className, cp.get(DynamicSystem.class.getName()));
101-
comp.addConstructor(CtNewConstructor.defaultConstructor(comp));
102-
103-
CtField scopeField = new CtField(cp.get(Scriptable.class.getName()), "__SCOPE__", comp);
104-
scopeField.setModifiers(Modifier.STATIC + Modifier.PUBLIC);
105-
comp.addField(scopeField);
106-
107-
CtField cxField = new CtField(cp.get(Context.class.getName()), "__CX__", comp);
108-
cxField.setModifiers(Modifier.STATIC + Modifier.PUBLIC);
109-
comp.addField(cxField);
110-
111-
CtField updateCallable = new CtField(cp.get(Callable.class.getName()), "__UPDATER__", comp);
112-
updateCallable.setModifiers(Modifier.STATIC + Modifier.PUBLIC);
113-
comp.addField(updateCallable);
114-
115-
CtMethod updater = CtNewMethod.make(
116-
Modifier.PROTECTED,
117-
CtClass.voidType,
118-
"_update",
119-
new CtClass[] { cp.get(Float.class.getName()),
120-
cp.get(DynamicComponent.class.getName()) },
121-
new CtClass[0],
122-
"{__UPDATER__.call(__CX__, __SCOPE__, ("
123-
+ Scriptable.class.getName() + ") "
124-
+ Context.class.getName()
125-
+ ".javaToJS($2, __SCOPE__), new Object[] {$1} );}",
126-
comp);
127-
comp.addMethod(updater);
128-
129-
130-
// for (Map.Entry<String, DynamicProperty> e : p.getPropertyMap().entrySet()) {
131-
// DynamicProperty prop = e.getValue();
132-
// addToClass(e.getKey(), comp, prop.getFieldType(), prop.isStatic());
133-
// }
134-
//
135-
136-
//
137-
//
138-
// CtClass[] types = getParamClasses(p.getConstructor().getProvided(), p.getPropertyMap());
139-
// String body = "{";
140-
// String[] provided = p.getConstructor().getProvided();
141-
// for (int i = 0; i < provided.length; i++) {
142-
// body += "this." + provided[i] + "=$" + (i+1) + ";";
143-
// }
144-
// body += "}";
145-
// comp.addConstructor(CtNewConstructor.make(types, new CtClass[0], body, comp));
146-
//
147-
// CtField initField = new CtField(ClassPool.getDefault().get(Callable.class.getName()), "__INIT__", comp);
148-
// initField.setModifiers(Modifier.STATIC + Modifier.PUBLIC);
149-
// comp.addField(initField);
150-
//
151-
// @SuppressWarnings("unchecked")
152-
Class<? extends DynamicSystem> result = comp.toClass();
153-
//
154-
// for (Map.Entry<String, DynamicProperty> e : p.getPropertyMap().entrySet()) {
155-
// DynamicProperty prop = e.getValue();
156-
// if (prop.isStatic()) {
157-
// result.getField(e.getKey()).set(null, prop.getValue());
158-
// }
159-
// }
160-
//
161-
result.getField("__SCOPE__").set(null, scope);
162-
result.getField("__CX__").set(null, cx);
163-
result.getField("__UPDATER__").set(null, p.getUpdater());
164-
//
165-
return result;
166-
108+
public DynamicSystem makeSystem(Prototype p, Class<? extends DynamicComponent> compClass) throws Exception {
109+
String name = makeSystemClassName(p.getId());
110+
return new DynamicSystem(name, scope, cx, p.getUpdater(), compClass, p.getHandlers());
167111
}
168112

169113

src/org/mockengine/DynamicSystem.java

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.mozilla.javascript.Callable;
77
import org.mozilla.javascript.Context;
88
import org.mozilla.javascript.Scriptable;
9+
import org.terasology.entitySystem.ComponentSystem;
910
import org.terasology.entitySystem.EntityManager;
1011
import org.terasology.entitySystem.EntityRef;
1112
import org.terasology.entitySystem.Event;
@@ -14,45 +15,58 @@
1415
import org.terasology.game.CoreRegistry;
1516

1617

17-
public abstract class DynamicSystem {
18+
public class DynamicSystem implements ComponentSystem {
19+
private final Scriptable scope;
20+
private final Context cx;
21+
private final Callable updater;
22+
private final Class<? extends DynamicComponent> componentClass;
23+
private final Map<String, Callable> handlers;
24+
private final String name;
25+
26+
public DynamicSystem(String name, Scriptable scope, Context cx, Callable updater,
27+
Class<? extends DynamicComponent> compClass,
28+
Map<String, Callable> handlers) {
29+
this.name = name;
30+
this.scope = scope;
31+
this.cx = cx;
32+
this.updater = updater;
33+
this.componentClass = compClass;
34+
this.handlers = handlers;
35+
}
36+
1837
private EntityManager entityManager;
1938
private EventSystem eventSystem;
20-
21-
public void initialise() {
39+
40+
public void initialise() {
2241
entityManager = CoreRegistry.get(EntityManager.class);
2342
eventSystem = CoreRegistry.get(EventSystem.class);
2443

25-
for (final Map.Entry<String, Callable> e : _getHandlers().entrySet()) {
44+
for (final Map.Entry<String, Callable> e : handlers.entrySet()) {
2645
Class<? extends Event> eventClass = getEventByName(e.getKey());
2746

2847
EventReceiver reciever = new EventReceiver(){
2948
public void onEvent(Event event, EntityRef entity) {
30-
call(e.getValue(), entity.getComponent(_getComponentClass()), new Object[]{event, entity});
49+
call(e.getValue(), entity.getComponent(componentClass), new Object[]{event, entity});
3150
}
3251
};
33-
eventSystem.registerEventReceiver(reciever, eventClass, _getComponentClass());
52+
eventSystem.registerEventReceiver(reciever, eventClass, componentClass);
3453
}
3554
}
3655

37-
protected abstract Scriptable _getScope();
38-
protected abstract Context _getContext();
39-
protected abstract Callable _getUpdater();
40-
protected abstract Class<? extends DynamicComponent> _getComponentClass();
41-
protected abstract Map<String, Callable> _getHandlers();
4256

4357
@SuppressWarnings("unchecked")
4458
public void update(float delta) {
45-
for (EntityRef entity : entityManager.iteratorEntities(_getComponentClass())) {
46-
DynamicComponent component = entity.getComponent(_getComponentClass());
47-
call( _getUpdater(), component, new Object[] {delta});
59+
for (EntityRef entity : entityManager.iteratorEntities(componentClass)) {
60+
DynamicComponent component = entity.getComponent(componentClass);
61+
call(updater, component, new Object[] {delta});
4862
entity.saveComponent(component);
4963
}
5064
}
5165

5266
private Object call(Callable callable, DynamicComponent reciever,
5367
Object[] args) {
54-
return callable.call(_getContext(), _getScope(),
55-
(Scriptable) Context.javaToJS(reciever, _getScope()), args);
68+
return callable.call(cx, scope,
69+
(Scriptable) Context.javaToJS(reciever, scope), args);
5670
}
5771

5872
private Class<? extends Event> getEventByName(String eventType) {

test/org/ironchefpython/rhinodemo/HealthTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import org.mockengine.DynamicComponent;
77
import org.mockengine.DynamicComponent.Getter;
88
import org.mockengine.DynamicComponent.Constructor;
9-
import org.mockengine.DynamicComponentFactory;
9+
import org.mockengine.DynamicEntitySystemFactory;
1010
import org.mockengine.DynamicSystem;
1111

1212

@@ -28,10 +28,10 @@ public void mockTest() throws Exception {
2828
mm.runScript(HealthTest.class.getResourceAsStream("health.js"), "health.js");
2929

3030
// Create a factory that turns prototypes into Terasology Classes
31-
DynamicComponentFactory componentFactory = new DynamicComponentFactory(mm);
31+
DynamicEntitySystemFactory componentFactory = new DynamicEntitySystemFactory(mm);
3232

3333
// Create the HealthComponent class
34-
Class<? extends DynamicComponent> HealthComponent = componentFactory.makeComponent("Health");
34+
Class<? extends DynamicComponent> HealthComponent = componentFactory.getComponent("Health");
3535

3636
// Create a Constructor object that makes a new HealthComponent
3737
Constructor ctr = new Constructor(HealthComponent, Number.class, Number.class, Number.class);
@@ -48,7 +48,7 @@ public void mockTest() throws Exception {
4848
System.out.println(ratio);
4949

5050

51-
Class<? extends DynamicSystem> HealthSystem = componentFactory.makeSystem("Health");
51+
DynamicSystem healthSystem = componentFactory.getSystem("Health");
5252

5353
}
5454

0 commit comments

Comments
 (0)