/**
* Copyright 2010 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.verifier.visitor;
import java.util.Collections;
import java.util.List;
import java.util.jar.JarInputStream;
import org.drools.ide.common.client.modeldriven.SuggestionCompletionEngine;
import org.drools.ide.common.server.rules.SuggestionCompletionLoader;
import org.drools.lang.descr.ImportDescr;
import org.drools.lang.descr.PackageDescr;
import org.drools.lang.descr.RuleDescr;
import org.drools.verifier.components.Field;
import org.drools.verifier.components.Import;
import org.drools.verifier.components.ObjectType;
import org.drools.verifier.components.RulePackage;
import org.drools.verifier.data.VerifierData;
/**
*
* @author Toni Rikkola
*/
public class PackageDescrVisitor {
private final VerifierData data;
private List<JarInputStream> jars = null;
private RulePackage rulePackage;
public PackageDescrVisitor(VerifierData data,
List<JarInputStream> jars) {
this.data = data;
this.jars = jars;
}
public void visitPackageDescr(PackageDescr descr) throws UnknownDescriptionException {
rulePackage = data.getPackageByName( descr.getName() );
if ( rulePackage == null ) {
rulePackage = new RulePackage();
rulePackage.setName( descr.getName() );
data.add( rulePackage );
}
visitImports( descr.getImports() );
TypeDeclarationDescrVisitor typeDeclarationDescrVisitor = new TypeDeclarationDescrVisitor( data );
typeDeclarationDescrVisitor.visit( descr.getTypeDeclarations() );
visitRules( descr.getRules() );
}
@SuppressWarnings("unchecked")
private void visitImports(List<ImportDescr> importDescrs) {
StringBuilder header = new StringBuilder();
for ( ImportDescr i : importDescrs ) {
String fullPath = i.getTarget();
String name = fullPath.substring( fullPath.lastIndexOf( "." ) + 1 );
header.append( "import " );
header.append( fullPath );
header.append( "\n" );
Import objectImport = new Import( rulePackage );
objectImport.setName( fullPath );
objectImport.setShortName( name );
data.add( objectImport );
ObjectType objectType = this.data.getObjectTypeByFullName( fullPath );
if ( objectType == null ) {
objectType = new ObjectType();
}
objectType.setName( name );
objectType.setFullName( fullPath );
data.add( objectType );
}
SuggestionCompletionLoader loader = new SuggestionCompletionLoader();
SuggestionCompletionEngine engine = loader.getSuggestionEngine( header.toString(),
jars,
Collections.EMPTY_LIST );
for ( String factTypeName : engine.getFactTypes() ) {
for ( String fieldName : engine.getFieldCompletions( factTypeName ) ) {
ObjectType objectType = this.data.getObjectTypeByObjectTypeNameAndPackageName( factTypeName,
rulePackage.getName() );
Field field = data.getFieldByObjectTypeAndFieldName( objectType.getFullName(),
fieldName );
if ( field == null ) {
field = ObjectTypeFactory.createField( fieldName,
objectType );
field.setFieldType( engine.getFieldType( objectType.getName(),
fieldName ) );
data.add( field );
}
}
}
}
private void visitRules(List<RuleDescr> rules) throws UnknownDescriptionException {
for ( RuleDescr ruleDescr : rules ) {
visitRuleDescr( ruleDescr );
}
}
private void visitRuleDescr(RuleDescr descr) throws UnknownDescriptionException {
RuleDescrVisitor visitor = new RuleDescrVisitor( data,
rulePackage );
visitor.visitRuleDescr( descr );
}
}