/**
* 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.guvnor.server.util;
import java.io.StringReader;
import org.drools.builder.ResourceType;
import org.drools.guvnor.client.common.AssetFormats;
import org.drools.guvnor.client.rpc.AnalysisReport;
import org.drools.guvnor.server.ServiceImplementation;
import org.drools.guvnor.server.contenthandler.ContentHandler;
import org.drools.guvnor.server.contenthandler.ContentManager;
import org.drools.guvnor.server.contenthandler.IRuleAsset;
import org.drools.io.ResourceFactory;
import org.drools.repository.AssetItem;
import org.drools.repository.AssetItemIterator;
import org.drools.repository.PackageItem;
import org.drools.verifier.Verifier;
import org.drools.verifier.VerifierError;
import org.drools.verifier.builder.ScopesAgendaFilter;
import org.drools.verifier.data.VerifierReport;
public class VerifierRunner {
private Verifier verifier;
private PackageItem packageItem;
public VerifierRunner(Verifier verifier) {
this.verifier = verifier;
}
public AnalysisReport verify(PackageItem packageItem,
ScopesAgendaFilter scopesAgendaFilter) {
this.packageItem = packageItem;
addHeaderToVerifier();
addToVerifier( packageItem.listAssetsByFormat( new String[]{AssetFormats.DSL} ),
ResourceType.DSL );
// TODO: Model JARS
addToVerifier( packageItem.listAssetsByFormat( new String[]{AssetFormats.DRL_MODEL} ),
ResourceType.DRL );
addToVerifier( packageItem.listAssetsByFormat( new String[]{AssetFormats.FUNCTION} ),
ResourceType.DRL );
addToVerifier( packageItem.listAssetsByFormat( new String[]{AssetFormats.DSL_TEMPLATE_RULE} ),
ResourceType.DSLR );
addToVerifier( packageItem.listAssetsByFormat( new String[]{AssetFormats.DECISION_SPREADSHEET_XLS} ),
ResourceType.DTABLE );
addGuidedDecisionTablesToVerifier();
addDRLRulesToVerifier();
addToVerifier( packageItem.listAssetsByFormat( new String[]{AssetFormats.BUSINESS_RULE} ),
ResourceType.BRL );
fireAnalysis( scopesAgendaFilter );
VerifierReport report = verifier.getResult();
return VerifierReportCreator.doReport( report );
}
private void fireAnalysis(ScopesAgendaFilter scopesAgendaFilter) throws RuntimeException {
verifier.fireAnalysis( scopesAgendaFilter );
if ( verifier.hasErrors() ) {
StringBuilder message = new StringBuilder( "Verifier Errors:\n" );
for ( VerifierError verifierError : verifier.getErrors() ) {
message.append( "\t" );
message.append( verifierError.getMessage() );
message.append( "\n" );
}
throw new RuntimeException( message.toString() );
}
}
private void addHeaderToVerifier() {
StringBuffer header = new StringBuffer();
header.append( "package " + packageItem.getName() + "\n" );
header.append( ServiceImplementation.getDroolsHeader( packageItem ) + "\n" );
verifier.addResourcesToVerify( ResourceFactory.newReaderResource( new StringReader( header.toString() ) ),
ResourceType.DRL );
}
private void addToVerifier(AssetItemIterator assets,
ResourceType resourceType) {
while ( assets.hasNext() ) {
AssetItem asset = assets.next();
if ( !asset.isArchived() && !asset.getDisabled() ) {
verifier.addResourcesToVerify( ResourceFactory.newReaderResource( new StringReader( asset.getContent() ) ),
resourceType );
}
}
}
private void addGuidedDecisionTablesToVerifier() {
AssetItemIterator rules = packageItem.listAssetsByFormat( AssetFormats.DECISION_TABLE_GUIDED );
while ( rules.hasNext() ) {
AssetItem rule = rules.next();
ContentHandler contentHandler = ContentManager.getHandler( rule.getFormat() );
if ( contentHandler.isRuleAsset() ) {
IRuleAsset ruleAsset = (IRuleAsset) contentHandler;
String drl = ruleAsset.getRawDRL( rule );
verifier.addResourcesToVerify( ResourceFactory.newReaderResource( new StringReader( drl ) ),
ResourceType.DRL );
}
}
}
private void addDRLRulesToVerifier() {
AssetItemIterator rules = packageItem.listAssetsByFormat( AssetFormats.DRL );
while ( rules.hasNext() ) {
AssetItem rule = rules.next();
ContentHandler contentHandler = ContentManager.getHandler( rule.getFormat() );
if ( contentHandler.isRuleAsset() ) {
IRuleAsset ruleAsset = (IRuleAsset) contentHandler;
String drl = ruleAsset.getRawDRL( rule );
verifier.addResourcesToVerify( ResourceFactory.newReaderResource( new StringReader( drl ) ),
ResourceType.DRL );
}
}
}
}