Skip to content

Commit 3a53d75

Browse files
committed
Experimental : Improve Traits with Map Core
1 parent b73748e commit 3a53d75

32 files changed

+2940
-3612
lines changed

drools-compiler/src/test/java/org/drools/compiler/factmodel/traits/Imp2.java

-49
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,9 @@
1616

1717
package org.drools.compiler.factmodel.traits;
1818

19-
import org.drools.core.factmodel.traits.LogicalTypeInconsistencyException;
2019
import org.drools.core.factmodel.traits.Thing;
2120
import org.drools.core.factmodel.traits.TraitFieldTMS;
2221
import org.drools.core.factmodel.traits.TraitFieldTMSImpl;
23-
import org.drools.core.factmodel.traits.TraitTypeMap;
2422
import org.drools.core.factmodel.traits.TraitableBean;
2523

2624
import java.util.BitSet;
@@ -72,60 +70,13 @@ public void _setTraitMap(Map map) {
7270
__$$dynamic_traits_map$$ = map;
7371
}
7472

75-
public boolean hasTraits() {
76-
return __$$dynamic_traits_map$$ != null && ! __$$dynamic_traits_map$$.isEmpty();
77-
}
78-
7973
public Map<String, Thing<Imp2>> _getTraitMap() {
8074
if ( __$$dynamic_traits_map$$ == null ) {
8175
__$$dynamic_traits_map$$ = new HashMap<String, Thing<Imp2>>();
8276
}
8377
return __$$dynamic_traits_map$$;
8478
}
8579

86-
public void addTrait(String type, Thing proxy) {
87-
_getTraitMap().put(type, proxy);
88-
}
89-
90-
public Thing getTrait(String type) {
91-
return _getTraitMap().get( type );
92-
}
93-
94-
public boolean hasTrait(String type) {
95-
return _getTraitMap().containsKey(type);
96-
}
97-
98-
public BitSet getCurrentTypeCode() {
99-
return ((TraitTypeMap) __$$dynamic_traits_map$$).getCurrentTypeCode();
100-
}
101-
102-
public Collection<Thing<Imp2>> removeTrait(String type) {
103-
return ((TraitTypeMap)_getTraitMap()).removeCascade( type );
104-
}
105-
106-
public Collection<Thing<Imp2>> removeTrait( BitSet typeCode ) {
107-
return ((TraitTypeMap)_getTraitMap()).removeCascade( typeCode );
108-
}
109-
110-
public Collection<String> getTraits() {
111-
return _getTraitMap().keySet();
112-
}
113-
114-
public void denyTrait(Class trait) throws LogicalTypeInconsistencyException {
115-
//To change body of implemented methods use File | Settings | File Templates.
116-
}
117-
118-
public void allowTrait(Class trait) {
119-
//To change body of implemented methods use File | Settings | File Templates.
120-
}
121-
122-
public Collection<Thing> getMostSpecificTraits() {
123-
return null; //To change body of implemented methods use File | Settings | File Templates.
124-
}
125-
126-
public void _setBottomTypeCode(BitSet code) {
127-
//To change body of implemented methods use File | Settings | File Templates.
128-
}
12980

13081
public TraitFieldTMS _getFieldTMS() {
13182
return null; //To change body of implemented methods use File | Settings | File Templates.

drools-compiler/src/test/java/org/drools/compiler/factmodel/traits/ImpCoreWrapper.java

-45
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,12 @@
1717
package org.drools.compiler.factmodel.traits;
1818

1919
import org.drools.core.factmodel.traits.CoreWrapper;
20-
import org.drools.core.factmodel.traits.LogicalTypeInconsistencyException;
2120
import org.drools.core.factmodel.traits.Thing;
2221
import org.drools.core.factmodel.traits.TraitFieldTMS;
2322
import org.drools.core.factmodel.traits.TraitTypeMap;
2423
import org.drools.core.factmodel.traits.TraitableBean;
2524

2625
import java.util.BitSet;
27-
import java.util.Collection;
2826
import java.util.HashMap;
2927
import java.util.Map;
3028

@@ -53,53 +51,10 @@ public Map<String,Thing<Imp>> _getTraitMap() {
5351
return __$$dynamic_traits_map$$;
5452
}
5553

56-
public void addTrait(String type, Thing<Imp> proxy) throws LogicalTypeInconsistencyException {
57-
_getTraitMap().put( type, proxy );
58-
}
59-
60-
public BitSet getCurrentTypeCode() {
61-
return ((TraitTypeMap) __$$dynamic_traits_map$$).getCurrentTypeCode();
62-
}
63-
64-
65-
66-
6754
public void _setTraitMap(Map map) {
6855
this.__$$dynamic_traits_map$$ = map;
6956
}
7057

71-
public Thing<Imp> getTrait(String type) {
72-
return _getTraitMap().get( type );
73-
}
74-
75-
public boolean hasTrait(String type) {
76-
return _getTraitMap().containsKey( type );
77-
}
78-
79-
public boolean hasTraits() {
80-
return __$$dynamic_traits_map$$ != null && ! __$$dynamic_traits_map$$.isEmpty();
81-
}
82-
83-
public Collection<Thing<Imp>> removeTrait(String type) {
84-
return ((TraitTypeMap)_getTraitMap()).removeCascade( type );
85-
}
86-
87-
public Collection<Thing<Imp>> removeTrait( BitSet typeCode ) {
88-
return ((TraitTypeMap)_getTraitMap()).removeCascade( typeCode );
89-
}
90-
91-
public Collection<String> getTraits() {
92-
return _getTraitMap().keySet();
93-
}
94-
95-
public Collection<Thing> getMostSpecificTraits() {
96-
return ((TraitTypeMap) _getTraitMap()).getMostSpecificTraits();
97-
}
98-
99-
public void _setBottomTypeCode(BitSet code) {
100-
((TraitTypeMap) __$$dynamic_traits_map$$).setBottomCode( code );
101-
}
102-
10358
public TraitFieldTMS _getFieldTMS() {
10459
return null; //To change body of implemented methods use File | Settings | File Templates.
10560
}

drools-compiler/src/test/java/org/drools/compiler/factmodel/traits/StudentImpl.java

-40
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,13 @@
1616

1717
package org.drools.compiler.factmodel.traits;
1818

19-
import org.drools.core.factmodel.traits.LogicalTypeInconsistencyException;
2019
import org.drools.core.factmodel.traits.Thing;
2120
import org.drools.core.factmodel.traits.TraitFieldTMS;
2221
import org.drools.core.factmodel.traits.TraitTypeMap;
2322
import org.drools.core.factmodel.traits.Traitable;
2423
import org.drools.core.factmodel.traits.TraitableBean;
2524

2625
import java.util.BitSet;
27-
import java.util.Collection;
28-
import java.util.Collections;
2926
import java.util.HashMap;
3027
import java.util.Map;
3128

@@ -116,43 +113,6 @@ public void _setTraitMap(Map<String, Thing<StudentImpl>> map) {
116113
//To change body of implemented methods use File | Settings | File Templates.
117114
}
118115

119-
public void addTrait(String type, Thing<StudentImpl> proxy) throws LogicalTypeInconsistencyException {
120-
traitMap.put( type, proxy );
121-
}
122-
123-
public Thing<StudentImpl> getTrait(String type) {
124-
return traitMap.get( type );
125-
}
126-
127-
public boolean hasTraits() {
128-
return traitMap != null && ! traitMap.isEmpty();
129-
}
130-
131-
132-
public boolean hasTrait(String type) {
133-
return traitMap.containsKey( type );
134-
}
135-
136-
public Collection<Thing<StudentImpl>> removeTrait(String type) {
137-
return ((TraitTypeMap) _getTraitMap()).removeCascade( type );
138-
}
139-
140-
public Collection<Thing<StudentImpl>> removeTrait(BitSet typeCode) {
141-
return ((TraitTypeMap) _getTraitMap()).removeCascade(typeCode);
142-
}
143-
144-
public Collection<String> getTraits() {
145-
return Collections.EMPTY_SET;
146-
}
147-
148-
public Collection<Thing> getMostSpecificTraits() {
149-
return Collections.EMPTY_SET;
150-
}
151-
152-
public void _setBottomTypeCode(BitSet code) {
153-
//To change body of implemented methods use File | Settings | File Templates.
154-
}
155-
156116
public TraitFieldTMS _getFieldTMS() {
157117
return null; //To change body of implemented methods use File | Settings | File Templates.
158118
}

drools-compiler/src/test/java/org/drools/compiler/factmodel/traits/TraitMapCoreTest.java

+65-1
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616
package org.drools.compiler.factmodel.traits;
1717

1818
import org.drools.compiler.CommonTestMethodBase;
19+
import org.drools.core.ClassObjectFilter;
20+
import org.drools.core.factmodel.TraitableMap;
1921
import org.drools.core.factmodel.traits.TraitFactory;
22+
import org.drools.core.factmodel.traits.Traitable;
2023
import org.drools.core.factmodel.traits.VirtualPropertyMode;
2124
import org.junit.Test;
2225
import org.kie.api.runtime.KieSession;
23-
import org.kie.internal.runtime.StatefulKnowledgeSession;
2426

2527
import java.util.ArrayList;
2628
import java.util.HashMap;
@@ -1266,4 +1268,66 @@ public void testMapTraitPossibilities4()
12661268
assertEquals( 1, list.size() );
12671269
assertNotNull(list.get(0));
12681270
}
1271+
1272+
1273+
1274+
1275+
@Test()
1276+
public void donCustomMapTest() {
1277+
String source = "package org.drools.traits.test; \n" +
1278+
"import java.util.*\n;" +
1279+
"import " + TraitMapCoreTest.DomainMap.class.getCanonicalName() + ";\n" +
1280+
"" +
1281+
"global List list; \n" +
1282+
"" +
1283+
"" +
1284+
"declare trait PersonMap" +
1285+
"@propertyReactive \n" +
1286+
" name : String \n" +
1287+
" age : int \n" +
1288+
" height : Double \n" +
1289+
"end\n" +
1290+
"" +
1291+
"" +
1292+
"rule Don \n" +
1293+
"when \n" +
1294+
" $m : Map( this[ \"age\"] == 18 ) " +
1295+
"then \n" +
1296+
" don( $m, PersonMap.class );\n" +
1297+
"end \n" +
1298+
"" +
1299+
"rule Log \n" +
1300+
"when \n" +
1301+
" $p : PersonMap( name == \"john\", age > 10 ) \n" +
1302+
"then \n" +
1303+
" modify ( $p ) { \n" +
1304+
" setHeight( 184.0 ); \n" +
1305+
" }" +
1306+
"end \n";
1307+
1308+
KieSession ksession = loadKnowledgeBaseFromString( source ).newKieSession();
1309+
TraitFactory.setMode( VirtualPropertyMode.MAP, ksession.getKieBase() );
1310+
1311+
List list = new ArrayList();
1312+
ksession.setGlobal( "list", list );
1313+
1314+
HashMap map = new DomainMap();
1315+
map.put( "name", "john" );
1316+
map.put( "age", 18 );
1317+
1318+
ksession.insert( map );
1319+
ksession.fireAllRules();
1320+
1321+
assertTrue( map.containsKey( "height" ) );
1322+
assertEquals( map.get( "height"), 184.0 );
1323+
1324+
assertEquals( 2, ksession.getObjects().size() );
1325+
assertEquals( 1, ksession.getObjects( new ClassObjectFilter( DomainMap.class ) ).size() );
1326+
1327+
}
1328+
1329+
@Traitable
1330+
public static class DomainMap extends HashMap<String,Object> implements TraitableMap {
1331+
1332+
}
12691333
}

drools-core/src/main/java/org/drools/core/base/TraitHelper.java

+3-8
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,6 @@ protected <T, K> T applyTrait( Activation activation, K core, Class<T> trait, Ob
265265

266266
checkStaticTypeCode( inner );
267267

268-
BitSet boundary = inner.getCurrentTypeCode() != null ? (BitSet) inner.getCurrentTypeCode().clone() : null;
269-
270268
Collection<Thing> mostSpecificTraits = getTraitBoundary( inner, needsProxy, hasTrait, trait );
271269

272270
T thing = asTrait( core, inner, trait, needsProxy, hasTrait, needsUpdate, builder, logical, activation );
@@ -513,13 +511,10 @@ private <K> InternalFactHandle lookupHandleForWrapper( K core ) {
513511
}
514512

515513
public FactHandle lookupFactHandle(Object object) {
516-
FactHandle handle = null;
517-
518-
if ( handle != null ) {
519-
return handle;
514+
FactHandle handle = getFactHandleFromWM( object );
515+
if ( handle == null && object instanceof CoreWrapper ) {
516+
handle = getFactHandleFromWM( ((CoreWrapper) object).getCore() );
520517
}
521-
522-
handle = getFactHandleFromWM( object );
523518
return handle;
524519
}
525520

drools-core/src/main/java/org/drools/core/factmodel/FieldDefinition.java

+27-3
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ public class FieldDefinition
5151
private String initExpr = null;
5252
private boolean recursive = false;
5353
private Map<String,Object> metaData;
54+
private String getterName = null;
55+
private String setterName = null;
5456

5557
private List<AnnotationDefinition> annotations;
5658

@@ -104,6 +106,8 @@ public void readExternal(ObjectInput in) throws IOException,
104106
this.priority = in.readInt();
105107
this.initExpr = (String) in.readObject();
106108
this.metaData = (Map<String, Object>) in.readObject();
109+
this.getterName = ( String ) in.readObject();
110+
this.setterName = ( String ) in.readObject();
107111
}
108112

109113
public void writeExternal(ObjectOutput out) throws IOException {
@@ -119,6 +123,8 @@ public void writeExternal(ObjectOutput out) throws IOException {
119123
out.writeInt( this.priority );
120124
out.writeObject( this.initExpr );
121125
out.writeObject( this.metaData );
126+
out.writeObject( this.getterName );
127+
out.writeObject( this.setterName );
122128
}
123129

124130
/**
@@ -172,7 +178,10 @@ public void setKey(boolean key) {
172178
* @return
173179
*/
174180
public String getReadMethod() {
175-
String prefix = null;
181+
if ( getterName != null ) {
182+
return getterName;
183+
}
184+
String prefix;
176185
if ( "boolean".equals( this.type ) ) {
177186
prefix = "is";
178187
} else {
@@ -188,8 +197,8 @@ public String getReadMethod() {
188197
* @return
189198
*/
190199
public String getWriteMethod() {
191-
return "set" + this.name.substring( 0,
192-
1 ).toUpperCase() + this.name.substring( 1 );
200+
return setterName != null ? setterName :
201+
"set" + this.name.substring( 0, 1 ).toUpperCase() + this.name.substring( 1 );
193202
}
194203

195204
/**
@@ -530,4 +539,19 @@ public void setOverriding( String overriding ) {
530539
this.overriding = overriding;
531540
}
532541

542+
public String getGetterName() {
543+
return getterName;
544+
}
545+
546+
public void setGetterName( String getterName ) {
547+
this.getterName = getterName;
548+
}
549+
550+
public String getSetterName() {
551+
return setterName;
552+
}
553+
554+
public void setSetterName( String setterName ) {
555+
this.setterName = setterName;
556+
}
533557
}

0 commit comments

Comments
 (0)