use of org.drools.core.factmodel.traits.Thing in project drools by kiegroup.
the class TraitHelper method applyManyTraits.
protected <T, K> T applyManyTraits(Activation activation, K core, Collection<Class<? extends Thing>> traits, Object value, boolean logical, Mode... modes) throws LogicalTypeInconsistencyException {
// Precondition : traits is not empty, checked by don
TraitFactory builder = TraitFactory.getTraitBuilderForKnowledgeBase(entryPoint.getKnowledgeBase());
TraitableBean inner = makeTraitable(core, builder, logical, activation);
Collection<Thing> mostSpecificTraits = inner.getMostSpecificTraits();
boolean newTraitsAdded = false;
T firstThing = null;
List<Thing> things = new ArrayList<Thing>(traits.size());
checkStaticTypeCode(inner);
for (Class<?> trait : traits) {
boolean needsProxy = trait.isAssignableFrom(inner.getClass());
boolean hasTrait = inner.hasTrait(trait.getName());
boolean needsUpdate = needsProxy || core != inner;
if (!hasTrait) {
T thing = (T) asTrait(core, inner, trait, needsProxy, hasTrait, needsUpdate, builder, logical, activation);
configureTrait(thing, value);
things.add((Thing) thing);
if (!newTraitsAdded && trait != Thing.class) {
firstThing = thing;
newTraitsAdded = true;
}
}
}
for (Thing t : things) {
doInsertTrait(activation, t, core, logical, modes);
}
if (newTraitsAdded) {
if (mostSpecificTraits != null) {
updateCore(inner, core, null, logical, activation);
if (!mostSpecificTraits.isEmpty()) {
updateManyTraits(inner, onlyTraitBitSetMask(), things, core.getClass(), mostSpecificTraits, activation);
}
}
}
return firstThing;
}
Aggregations