/*
* Copyright 2012 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.drools.workbench.screens.guided.scorecard.backend.server.indexing;
import org.drools.workbench.models.commons.backend.oracle.ProjectDataModelOracleUtils;
import org.drools.workbench.models.datamodel.imports.Import;
import org.drools.workbench.models.datamodel.imports.Imports;
import org.drools.workbench.models.datamodel.oracle.DataType;
import org.drools.workbench.models.datamodel.oracle.ProjectDataModelOracle;
import org.drools.workbench.models.guided.scorecard.shared.Characteristic;
import org.drools.workbench.models.guided.scorecard.shared.ScoreCardModel;
import org.kie.workbench.common.services.refactoring.backend.server.impact.ResourceReferenceCollector;
import org.kie.workbench.common.services.refactoring.model.index.ResourceReference;
import org.kie.workbench.common.services.refactoring.service.PartType;
import org.kie.workbench.common.services.refactoring.service.ResourceType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.uberfire.commons.validation.PortablePreconditions;
/**
* Visitor to extract index information from a Guided Score Card Model
*/
public class GuidedScoreCardIndexVisitor extends ResourceReferenceCollector {
private static final Logger logger = LoggerFactory.getLogger( GuidedScoreCardIndexVisitor.class );
private final ProjectDataModelOracle dmo;
private final ScoreCardModel model;
public GuidedScoreCardIndexVisitor( final ProjectDataModelOracle dmo,
final ScoreCardModel model ) {
this.dmo = PortablePreconditions.checkNotNull( "dmo",
dmo );
this.model = PortablePreconditions.checkNotNull( "model",
model );
}
public void visit() {
//Add type
final String typeName = model.getFactName();
if ( typeName == null || typeName.isEmpty() ) {
return;
}
final String fullyQualifiedClassName = getFullyQualifiedClassName( typeName );
ResourceReference resRef = addResourceReference(fullyQualifiedClassName, ResourceType.JAVA);
//Add field
final String fieldName = model.getFieldName();
if ( fieldName == null || fieldName.isEmpty() ) {
return;
}
resRef.addPartReference(fieldName, PartType.FIELD);
final String fieldFullyQualifiedClassName = getFieldFullyQualifiedClassName( fullyQualifiedClassName, fieldName );
addResourceReference(fieldFullyQualifiedClassName, ResourceType.JAVA);
//Add Characteristics
for ( Characteristic c : model.getCharacteristics() ) {
visit( c );
}
// agenda-group, ruleflow-group
String agendaGroup = model.getAgendaGroup();
if( agendaGroup != null && ! agendaGroup.isEmpty() ) {
addSharedReference(agendaGroup, PartType.AGENDA_GROUP);
}
String ruleFlowGroup = model.getRuleFlowGroup();
if( ruleFlowGroup != null && ! ruleFlowGroup.isEmpty() ) {
addSharedReference(ruleFlowGroup, PartType.RULEFLOW_GROUP);
}
Imports imports = model.getImports();
if( imports != null ) {
visit(imports);
}
}
private void visit( final Imports imports ) {
for( Import imp : imports.getImports() ) {
String impStr = imp.getType();
if( ! impStr.endsWith("*") ) {
addResourceReference(impStr, ResourceType.JAVA );
} else {
logger.debug("Wildcard import encountered : '" + impStr + "'");
}
}
}
private void visit( final Characteristic c ) {
//Add type
final String typeName = c.getFact();
final String fullyQualifiedClassName = getFullyQualifiedClassName( typeName );
ResourceReference resRef = addResourceReference(fullyQualifiedClassName, ResourceType.JAVA);
//Add field
final String fieldName = c.getField();
final String fieldFullyQualifiedClassName = getFieldFullyQualifiedClassName( fullyQualifiedClassName,
fieldName );
resRef.addPartReference(fieldName, PartType.FIELD);
addResourceReference(fieldFullyQualifiedClassName, ResourceType.JAVA);
}
private String getFullyQualifiedClassName( final String typeName ) {
if ( typeName.contains( "." ) ) {
return typeName;
}
for ( Import i : model.getImports().getImports() ) {
if ( i.getType().endsWith( typeName ) ) {
return i.getType();
}
}
final String packageName = model.getPackageName();
return ( !( packageName == null || packageName.isEmpty() ) ? packageName + "." + typeName : typeName );
}
private String getFieldFullyQualifiedClassName( final String fullyQualifiedClassName,
final String fieldName ) {
String className = ProjectDataModelOracleUtils.getFieldFullyQualifiedClassName(dmo, fullyQualifiedClassName, fieldName);
if( className == null ) {
className = DataType.TYPE_OBJECT;
}
return className;
}
}