/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* 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.kie.workbench.common.services.refactoring.backend.server.indexing.drools;
import java.util.List;
import org.drools.compiler.compiler.DrlParser;
import org.drools.compiler.compiler.DroolsError;
import org.drools.compiler.lang.descr.PackageDescr;
import org.drools.workbench.models.datamodel.oracle.ProjectDataModelOracle;
import org.kie.api.io.ResourceType;
import org.kie.workbench.common.services.refactoring.backend.server.indexing.AbstractFileIndexer;
import org.kie.workbench.common.services.refactoring.backend.server.indexing.DefaultIndexBuilder;
import org.kie.workbench.common.services.refactoring.backend.server.indexing.ErrorMessageUtilities;
import org.kie.workbench.common.services.refactoring.backend.server.indexing.PackageDescrIndexVisitor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.uberfire.backend.server.util.Paths;
import org.uberfire.ext.metadata.engine.Indexer;
import org.uberfire.java.nio.file.Path;
/**
* All Drools-related {@link Indexer} implemenations should implement this class in order to avoid duplicate code.
*/
public abstract class AbstractDrlFileIndexer extends AbstractFileIndexer {
private static final Logger logger = LoggerFactory.getLogger( AbstractDrlFileIndexer.class );
/**
* All Drools-related {@link Indexer} implemenations end up extracting the DRL from the related Rule representation
* (see {@link ResourceType}).
* </p>
* The following method then parses the DRL and returns all relevant reference information.
* @param path The {@link Path} of the asset/resource, necessary for extracting reference information.
* @param drl A {@link String} representation of the DRL.
* @return The {@link DefaultIndexBuilder}
* @throws Exception
*/
public DefaultIndexBuilder fillDrlIndexBuilder( final Path path, final String drl ) throws Exception {
final DrlParser drlParser = new DrlParser();
final PackageDescr packageDescr = drlParser.parse( true, drl );
if ( drlParser.hasErrors() ) {
final List<DroolsError> errors = drlParser.getErrors();
logger.warn( ErrorMessageUtilities.makeErrorMessage( path,
errors.toArray( new DroolsError[ errors.size() ] ) ) );
return null;
}
if ( packageDescr == null ) {
logger.warn( ErrorMessageUtilities.makeErrorMessage( path ) );
return null;
}
final ProjectDataModelOracle dmo = getProjectDataModelOracle( path );
// responsible for basic index info: project name, branch, etc
final DefaultIndexBuilder builder = getIndexBuilder(path);
if( builder == null ) {
return null;
}
builder.setPackageName(packageDescr.getName());
// Retrieves info from the parsed syntac tree (PackageDescr)
final PackageDescrIndexVisitor visitor = new PackageDescrIndexVisitor( dmo, builder, packageDescr );
visitor.visit();
addReferencedResourcesToIndexBuilder(builder, visitor);
return builder;
}
/**
* Delegate resolution of package name to method to assist testing
*
* @param path The {@link Path} of the file being indexed
* @return The package name, as a {@link String}
*/
protected String getPackageName( final Path path ) {
return projectService.resolvePackage( Paths.convert( path ) ).getPackageName();
}
/**
* Delegate resolution of DMO to method to assist testing
*
* @param path The {@link Path} of the file being indexed
* @return The all-seeing, all-knowing {@link ProjectDataModelOracle}
*/
protected abstract ProjectDataModelOracle getProjectDataModelOracle( final Path path );
}