Search in sources :

Example 26 with TypeDeclaration

use of org.drools.core.rule.TypeDeclaration in project drools by kiegroup.

the class DialectUtil method rewriteModifyDescr.

private static void rewriteModifyDescr(RuleBuildContext context, JavaBlockDescr d, String originalBlock, StringBuilder consequence, Declaration declr, String obj) {
    List<String> settableProperties = null;
    Class<?> typeClass = findModifiedClass(context, d, declr);
    TypeDeclaration typeDeclaration = typeClass == null ? null : context.getKnowledgeBuilder().getTypeDeclaration(typeClass);
    boolean isPropertyReactive = typeDeclaration != null && typeDeclaration.isPropertyReactive();
    if (isPropertyReactive) {
        typeDeclaration.setTypeClass(typeClass);
        settableProperties = typeDeclaration.getAccessibleProperties();
    }
    ConsequenceMetaData.Statement statement = null;
    if (typeDeclaration != null) {
        statement = new ConsequenceMetaData.Statement(ConsequenceMetaData.Statement.Type.MODIFY, typeClass);
        context.getRule().getConsequenceMetaData().addStatement(statement);
    }
    BitMask modificationMask = isPropertyReactive ? getEmptyPropertyReactiveMask(settableProperties.size()) : allSetButTraitBitMask();
    int end = originalBlock.indexOf("{");
    if (end == -1) {
        // no block
        context.addError(new DescrBuildError(context.getParentDescr(), context.getRuleDescr(), null, "Block missing after modify" + d.getTargetExpression() + " ?\n"));
        return;
    }
    addLineBreaks(consequence, originalBlock.substring(0, end));
    int start = end + 1;
    // adding each of the expressions:
    for (String exprStr : ((JavaModifyBlockDescr) d).getExpressions()) {
        end = originalBlock.indexOf(exprStr, start);
        addLineBreaks(consequence, originalBlock.substring(start, end));
        consequence.append(obj).append(".");
        consequence.append(exprStr);
        consequence.append("; ");
        start = end + exprStr.length();
        if (typeDeclaration != null) {
            modificationMask = parseModifiedProperties(statement, settableProperties, typeDeclaration, isPropertyReactive, modificationMask, exprStr);
        }
    }
    addLineBreaks(consequence, originalBlock.substring(end));
    appendUpdateStatement(consequence, declr, obj, modificationMask, typeClass);
}
Also used : ConsequenceMetaData(org.drools.core.rule.ConsequenceMetaData) DescrBuildError(org.drools.compiler.compiler.DescrBuildError) JavaModifyBlockDescr(org.drools.compiler.rule.builder.dialect.java.parser.JavaModifyBlockDescr) PropertySpecificUtil.allSetButTraitBitMask(org.drools.core.reteoo.PropertySpecificUtil.allSetButTraitBitMask) BitMask(org.drools.core.util.bitmask.BitMask) AllSetBitMask(org.drools.core.util.bitmask.AllSetBitMask) TypeDeclaration(org.drools.core.rule.TypeDeclaration)

Example 27 with TypeDeclaration

use of org.drools.core.rule.TypeDeclaration in project drools by kiegroup.

the class DialectUtil method parseInsertDescr.

private static void parseInsertDescr(RuleBuildContext context, JavaBlockDescr block) {
    String expr = block.getTargetExpression();
    if (expr.startsWith("new ")) {
        int argsStart = expr.indexOf('(');
        if (argsStart > 0) {
            String className = expr.substring(4, argsStart).trim();
            Class<?> typeClass = findClassByName(context, className);
            TypeDeclaration typeDeclaration = typeClass == null ? null : context.getKnowledgeBuilder().getTypeDeclaration(typeClass);
            if (typeDeclaration != null) {
                ConsequenceMetaData.Statement statement = new ConsequenceMetaData.Statement(ConsequenceMetaData.Statement.Type.INSERT, typeClass);
                context.getRule().getConsequenceMetaData().addStatement(statement);
                String constructorParams = expr.substring(argsStart + 1, expr.indexOf(')')).trim();
                List<String> args = splitArgumentsList(constructorParams);
                ClassDefinition classDefinition = typeDeclaration.getTypeClassDef();
                List<FactField> fields = classDefinition.getFields();
                if (args.size() == fields.size()) {
                    for (int i = 0; i < args.size(); i++) {
                        statement.addField(fields.get(i).getName(), args.get(i));
                    }
                }
            }
        }
    }
}
Also used : FactField(org.kie.api.definition.type.FactField) ConsequenceMetaData(org.drools.core.rule.ConsequenceMetaData) ClassDefinition(org.drools.core.factmodel.ClassDefinition) TypeDeclaration(org.drools.core.rule.TypeDeclaration)

Example 28 with TypeDeclaration

use of org.drools.core.rule.TypeDeclaration in project drools by kiegroup.

the class PatternBuilder method isEvent.

private boolean isEvent(RuleBuildContext context, Class<?> userProvidedClass) {
    TypeDeclaration typeDeclaration = getTypeDeclaration(context, userProvidedClass);
    if (typeDeclaration != null) {
        return typeDeclaration.getRole() == Role.Type.EVENT;
    }
    Role role = userProvidedClass.getAnnotation(Role.class);
    return role != null && role.value() == Role.Type.EVENT;
}
Also used : Role(org.kie.api.definition.type.Role) TypeDeclaration(org.drools.core.rule.TypeDeclaration)

Example 29 with TypeDeclaration

use of org.drools.core.rule.TypeDeclaration in project drools by kiegroup.

the class PatternBuilder method buildRuleBindings.

protected void buildRuleBindings(RuleBuildContext context, PatternDescr patternDescr, Pattern pattern, BindingDescr fieldBindingDescr, TypeDeclaration typeDeclaration) {
    if (context.getDeclarationResolver().isDuplicated(context.getRule(), fieldBindingDescr.getVariable(), null)) {
        processDuplicateBindings(fieldBindingDescr.isUnification(), patternDescr, pattern, fieldBindingDescr, fieldBindingDescr.getBindingField(), fieldBindingDescr.getVariable(), context);
        if (fieldBindingDescr.isUnification()) {
            return;
        }
    }
    Declaration declr = pattern.addDeclaration(fieldBindingDescr.getVariable());
    final InternalReadAccessor extractor = getFieldReadAccessor(context, fieldBindingDescr, pattern, fieldBindingDescr.getBindingField(), declr, true);
    if (extractor == null) {
        registerDescrBuildError(context, patternDescr, "Field Reader does not exist for declaration '" + fieldBindingDescr.getVariable() + "' in '" + fieldBindingDescr + "' in the rule '" + context.getRule().getName() + "'");
        return;
    }
    declr.setReadAccessor(extractor);
    if (typeDeclaration != null && extractor instanceof ClassFieldReader) {
        addFieldToPatternWatchlist(pattern, typeDeclaration, ((ClassFieldReader) extractor).getFieldName());
    }
}
Also used : ClassFieldReader(org.drools.core.base.ClassFieldReader) InternalReadAccessor(org.drools.core.spi.InternalReadAccessor) Declaration(org.drools.core.rule.Declaration) TypeDeclaration(org.drools.core.rule.TypeDeclaration)

Example 30 with TypeDeclaration

use of org.drools.core.rule.TypeDeclaration in project drools by kiegroup.

the class PatternBuilder method processClassObjectType.

private void processClassObjectType(RuleBuildContext context, ObjectType objectType, Pattern pattern) {
    if (objectType instanceof ClassObjectType) {
        // make sure the Pattern is wired up to correct ClassObjectType and set as a target for rewiring
        context.getPkg().getClassFieldAccessorStore().wireObjectType(objectType, pattern);
        Class<?> cls = ((ClassObjectType) objectType).getClassType();
        if (cls.getPackage() != null && !cls.getPackage().getName().equals("java.lang")) {
            // register the class in its own package unless it is primitive or belongs to java.lang
            TypeDeclaration typeDeclr = context.getKnowledgeBuilder().getAndRegisterTypeDeclaration(cls, cls.getPackage().getName());
            context.setTypesafe(typeDeclr == null || typeDeclr.isTypesafe());
        } else {
            context.setTypesafe(true);
        }
    }
}
Also used : AcceptsClassObjectType(org.drools.core.spi.AcceptsClassObjectType) ClassObjectType(org.drools.core.base.ClassObjectType) TypeDeclaration(org.drools.core.rule.TypeDeclaration)

Aggregations

TypeDeclaration (org.drools.core.rule.TypeDeclaration)72 Test (org.junit.Test)15 InternalKnowledgePackage (org.drools.core.definitions.InternalKnowledgePackage)12 KnowledgeBuilderImpl (org.drools.compiler.builder.impl.KnowledgeBuilderImpl)11 PackageRegistry (org.drools.compiler.compiler.PackageRegistry)10 ClassDefinition (org.drools.core.factmodel.ClassDefinition)9 ClassObjectType (org.drools.core.base.ClassObjectType)7 TypeDeclarationDescr (org.drools.compiler.lang.descr.TypeDeclarationDescr)5 HashMap (java.util.HashMap)4 Map (java.util.Map)4 TypeDeclarationError (org.drools.compiler.compiler.TypeDeclarationError)4 AbstractClassTypeDeclarationDescr (org.drools.compiler.lang.descr.AbstractClassTypeDeclarationDescr)4 PackageDescr (org.drools.compiler.lang.descr.PackageDescr)4 ObjectType (org.drools.core.spi.ObjectType)4 ArrayList (java.util.ArrayList)3 LinkedHashMap (java.util.LinkedHashMap)3 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)3 BindingDescr (org.drools.compiler.lang.descr.BindingDescr)3 TypeFieldDescr (org.drools.compiler.lang.descr.TypeFieldDescr)3 KnowledgePackageImpl (org.drools.core.definitions.impl.KnowledgePackageImpl)3