Skip to content

Commit

Permalink
[DROOLS-536] KieBuilder does not resolve declarations across packages
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofusco committed Jul 7, 2014
1 parent 0a7991b commit 869b669
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import org.drools.compiler.lang.descr.PackageDescr;
import org.drools.compiler.lang.descr.TypeDeclarationDescr;
import org.drools.core.builder.conf.impl.JaxbConfigurationImpl;
import org.drools.core.rule.TypeDeclaration;
import org.kie.api.io.Resource;
import org.kie.api.io.ResourceConfiguration;
import org.kie.api.io.ResourceType;
Expand All @@ -19,7 +18,6 @@

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -295,14 +293,14 @@ private void buildTypeDeclarations(Collection<CompositePackageDescr> packages) {
}
}

Map<String,TypeDeclarationDescr> unprocesseableDescrs = new HashMap<String,TypeDeclarationDescr>();
Map<String, TypeDeclarationDescr> unprocesseableDescrs = new HashMap<String, TypeDeclarationDescr>();
List<TypeDefinition> unresolvedTypes = new ArrayList<TypeDefinition>();
for (CompositePackageDescr packageDescr : packages) {
buildTypeDeclarations(packageDescr, unresolvedTypes, unprocesseableDescrs);
}

if ( ! unprocesseableDescrs.isEmpty() ) {
List<AbstractClassTypeDeclarationDescr> sortedDescrs = new ArrayList<AbstractClassTypeDeclarationDescr>( unprocesseableDescrs.values() );
Collection<AbstractClassTypeDeclarationDescr> sortedDescrs = TypeDeclarationBuilder.sortByHierarchy( kBuilder, unprocesseableDescrs.values() );
for ( AbstractClassTypeDeclarationDescr descr : sortedDescrs ) {
unprocesseableDescrs.remove( descr.getType().getFullName() );
PackageRegistry pkg = kBuilder.getPackageRegistry().get( descr.getType().getNamespace() );
Expand All @@ -321,11 +319,9 @@ private void buildTypeDeclarations(Collection<CompositePackageDescr> packages) {
// now we need to sort TypeDeclarations based on the mutual, cross-package dependencies.
// This can't be done at the beginning, before the build pass, since the names are not yet fully qualified there.
// TODO there may be more efficient ways to do it (?)
Collection<AbstractClassTypeDeclarationDescr> sorted = kBuilder.getTypeBuilder().sortByHierarchy( allDescrs );
int j = 0;
for ( AbstractClassTypeDeclarationDescr descr : sorted ) {
TypeDeclaration decl = kBuilder.getPackageRegistry( descr.getNamespace() ).getPackage().getTypeDeclaration( descr.getTypeName() );
decl.setOrder( j++ );
for ( AbstractClassTypeDeclarationDescr descr : TypeDeclarationBuilder.sortByHierarchy( kBuilder, allDescrs ) ) {
kBuilder.getPackageRegistry( descr.getNamespace() ).getPackage().getTypeDeclaration( descr.getTypeName() ).setOrder( j++ );
}

for (CompositePackageDescr packageDescr : packages) {
Expand All @@ -335,7 +331,7 @@ private void buildTypeDeclarations(Collection<CompositePackageDescr> packages) {
}
}

private List<TypeDefinition> buildTypeDeclarations(CompositePackageDescr packageDescr, List<TypeDefinition> unresolvedTypes, Map<String,TypeDeclarationDescr> unprocessableDescrs) {
private List<TypeDefinition> buildTypeDeclarations(CompositePackageDescr packageDescr, List<TypeDefinition> unresolvedTypes, Map<String, TypeDeclarationDescr> unprocessableDescrs) {
kBuilder.setAssetFilter(packageDescr.getFilter());
PackageRegistry pkgRegistry = kBuilder.createPackageRegistry(packageDescr);
if (pkgRegistry == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -965,7 +965,7 @@ void removeTypesGeneratedFromResource(Resource resource) {
}
}

List<TypeDefinition> processTypeDeclarations( PackageRegistry pkgRegistry, PackageDescr packageDescr, List<TypeDefinition> unresolvedTypes, Map<String,TypeDeclarationDescr> unprocessableDescrs ) {
List<TypeDefinition> processTypeDeclarations( PackageRegistry pkgRegistry, PackageDescr packageDescr, List<TypeDefinition> unresolvedTypes, Map<String, TypeDeclarationDescr> unprocessableDescrs ) {

Map<String, PackageDescr> foreignPackages = null;

Expand Down Expand Up @@ -1083,7 +1083,7 @@ List<TypeDefinition> processTypeDeclarations( PackageRegistry pkgRegistry, Packa
}

// sort declarations : superclasses must be generated first
Collection<AbstractClassTypeDeclarationDescr> sortedTypeDescriptors = sortByHierarchy(packageDescr.getClassAndEnumDeclarationDescrs());
Collection<AbstractClassTypeDeclarationDescr> sortedTypeDescriptors = sortByHierarchy(kbuilder, packageDescr.getClassAndEnumDeclarationDescrs());

for (AbstractClassTypeDeclarationDescr typeDescr : sortedTypeDescriptors) {
registerGeneratedType(typeDescr);
Expand All @@ -1108,7 +1108,7 @@ public void processTypeDeclaration( PackageRegistry pkgRegistry,
AbstractClassTypeDeclarationDescr typeDescr,
Collection<AbstractClassTypeDeclarationDescr> sortedTypeDescriptors,
List<TypeDefinition> unresolvedTypes,
Map<String,TypeDeclarationDescr> unprocessableDescrs ) {
Map<String, TypeDeclarationDescr> unprocessableDescrs ) {
//descriptor needs fields inherited from superclass
if (typeDescr instanceof TypeDeclarationDescr) {
TypeDeclarationDescr tDescr = (TypeDeclarationDescr) typeDescr;
Expand All @@ -1134,14 +1134,6 @@ public void processTypeDeclaration( PackageRegistry pkgRegistry,
return;
}

// for ( QualifiedName qualifiedName : typeDescr.getSuperTypes() ) {
// for ( TypeDefinition def : unresolvedTypes ) {
// if ( def.typeDescr.getType().equals( qualifiedName ) ) {
// unresolvedTypes.add( )
// }
// }
// }

// Go on with the build
TypeDeclaration type = new TypeDeclaration(typeDescr.getTypeName());
if (typeDescr.getResource() == null) {
Expand Down Expand Up @@ -1256,9 +1248,8 @@ private AnnotationDescr getSingleAnnotation(AbstractClassTypeDeclarationDescr ty
* resulting collection. This ensures that superclasses are processed before
* their subclasses
*/
public Collection<AbstractClassTypeDeclarationDescr> sortByHierarchy(List<AbstractClassTypeDeclarationDescr> typeDeclarations) {
public static Collection<AbstractClassTypeDeclarationDescr> sortByHierarchy(KnowledgeBuilderImpl kbuilder, Collection<? extends AbstractClassTypeDeclarationDescr> typeDeclarations) {

HierarchySorter<QualifiedName> sorter = new HierarchySorter<QualifiedName>();
Map<QualifiedName, Collection<QualifiedName>> taxonomy = new HashMap<QualifiedName, Collection<QualifiedName>>();
Map<QualifiedName, AbstractClassTypeDeclarationDescr> cache = new HashMap<QualifiedName, AbstractClassTypeDeclarationDescr>();

Expand All @@ -1271,7 +1262,7 @@ public Collection<AbstractClassTypeDeclarationDescr> sortByHierarchy(List<Abstra
taxonomy.put(name, new ArrayList<QualifiedName>());
} else {
kbuilder.addBuilderResult(new TypeDeclarationError(tdescr,
"Found duplicate declaration for type " + tdescr.getType()));
"Found duplicate declaration for type " + tdescr.getType()));
}

Collection<QualifiedName> supers = taxonomy.get(name);
Expand All @@ -1284,7 +1275,7 @@ public Collection<AbstractClassTypeDeclarationDescr> sortByHierarchy(List<Abstra
} else {
circular = true;
kbuilder.addBuilderResult(new TypeDeclarationError(tdescr,
"Found circular dependency for type " + tdescr.getTypeName()));
"Found circular dependency for type " + tdescr.getTypeName()));
break;
}
}
Expand All @@ -1302,7 +1293,7 @@ public Collection<AbstractClassTypeDeclarationDescr> sortByHierarchy(List<Abstra
}

}
List<QualifiedName> sorted = sorter.sort(taxonomy);
List<QualifiedName> sorted = new HierarchySorter<QualifiedName>().sort(taxonomy);
ArrayList list = new ArrayList(sorted.size());
for (QualifiedName name : sorted) {
list.add(cache.get(name));
Expand All @@ -1311,9 +1302,9 @@ public Collection<AbstractClassTypeDeclarationDescr> sortByHierarchy(List<Abstra
return list;
}

private boolean hasCircularDependency(QualifiedName name,
QualifiedName typeName,
Map<QualifiedName, Collection<QualifiedName>> taxonomy) {
private static boolean hasCircularDependency(QualifiedName name,
QualifiedName typeName,
Map<QualifiedName, Collection<QualifiedName>> taxonomy) {
if (name.equals(typeName)) {
return true;
}
Expand Down

0 comments on commit 869b669

Please sign in to comment.