/**
* 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;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.drools.builder.ResourceType;
import org.drools.factconstraints.client.ConstraintConfiguration;
import org.drools.factconstraints.server.factory.ConstraintsFactory;
import org.drools.guvnor.client.common.AssetFormats;
import org.drools.guvnor.client.rpc.AnalysisReport;
import org.drools.guvnor.client.rpc.RuleAsset;
import org.drools.guvnor.client.rpc.VerificationService;
import org.drools.guvnor.client.rpc.WorkingSetConfigData;
import org.drools.guvnor.server.security.PackageNameType;
import org.drools.guvnor.server.security.PackageUUIDType;
import org.drools.guvnor.server.security.RoleTypes;
import org.drools.guvnor.server.util.LoggingHelper;
import org.drools.guvnor.server.util.VerifierRunner;
import org.drools.io.ResourceFactory;
import org.drools.repository.PackageItem;
import org.drools.verifier.DefaultVerifierConfiguration;
import org.drools.verifier.Verifier;
import org.drools.verifier.VerifierConfiguration;
import org.drools.verifier.VerifierConfigurationImpl;
import org.drools.verifier.builder.ScopesAgendaFilter;
import org.drools.verifier.builder.VerifierBuilderFactory;
import org.jboss.seam.annotations.remoting.WebRemote;
import org.jboss.seam.annotations.security.Restrict;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.security.Identity;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
/**
*
* @author rikkola
*
*/
public class VerificationServiceImplementation extends RemoteServiceServlet
implements
VerificationService {
private static final long serialVersionUID = 510l;
private static final LoggingHelper log = LoggingHelper.getLogger( ServiceImplementation.class );
private Verifier defaultVerifier = VerifierBuilderFactory.newVerifierBuilder().newVerifier();
private ServiceImplementation getService() {
return RepositoryServiceServlet.getService();
}
@WebRemote
@Restrict("#{identity.loggedIn}")
public AnalysisReport analysePackage(String packageUUID) throws SerializationException {
if ( Contexts.isSessionContextActive() ) {
Identity.instance().checkPermission( new PackageUUIDType( packageUUID ),
RoleTypes.PACKAGE_DEVELOPER );
}
PackageItem packageItem = getService().getRulesRepository().loadPackageByUUID( packageUUID );
VerifierRunner runner = new VerifierRunner( defaultVerifier );
AnalysisReport report = runner.verify( packageItem,
new ScopesAgendaFilter( true,
ScopesAgendaFilter.VERIFYING_SCOPE_KNOWLEDGE_PACKAGE ) );
defaultVerifier.flushKnowledgeSession();
return report;
}
@WebRemote
@Restrict("#{identity.loggedIn}")
public AnalysisReport verifyAsset(RuleAsset asset,
Set<String> activeWorkingSets) throws SerializationException {
return this.performAssetVerification( asset,
true,
activeWorkingSets );
}
@WebRemote
@Restrict("#{identity.loggedIn}")
public AnalysisReport verifyAssetWithoutVerifiersRules(RuleAsset asset,
Set<String> activeWorkingSets) throws SerializationException {
return this.performAssetVerification( asset,
false,
activeWorkingSets );
}
private AnalysisReport performAssetVerification(RuleAsset asset,
boolean useVerifierDefaultConfig,
Set<String> activeWorkingSets) throws SerializationException {
long startTime = System.currentTimeMillis();
if ( Contexts.isSessionContextActive() ) {
Identity.instance().checkPermission( new PackageNameType( asset.metaData.packageName ),
RoleTypes.PACKAGE_DEVELOPER );
}
PackageItem packageItem = getService().getRulesRepository().loadPackage( asset.metaData.packageName );
ScopesAgendaFilter verificationScope;
if ( isAssetDecisionTable( asset ) ) {
verificationScope = new ScopesAgendaFilter( true,
ScopesAgendaFilter.VERIFYING_SCOPE_DECISION_TABLE );
} else {
verificationScope = new ScopesAgendaFilter( true,
ScopesAgendaFilter.VERIFYING_SCOPE_SINGLE_RULE );
}
List<String> constraintRules = applyWorkingSets( activeWorkingSets );
VerifierRunner runner;
Verifier verifierToBeUsed = null;
if ( useVerifierDefaultConfig ) {
verifierToBeUsed = defaultVerifier;
} else {
verifierToBeUsed = getWorkingSetVerifier( constraintRules );
}
runner = new VerifierRunner( verifierToBeUsed );
log.debug( "constraints rules: " + constraintRules );
try {
AnalysisReport report = runner.verify( packageItem,
verificationScope );
verifierToBeUsed.flushKnowledgeSession();
log.debug( "Asset verification took: " + (System.currentTimeMillis() - startTime) );
return report;
} catch ( Throwable t ) {
throw new SerializationException( t.getMessage() );
}
}
private boolean isAssetDecisionTable(RuleAsset asset) {
return AssetFormats.DECISION_TABLE_GUIDED.equals( asset.metaData.format ) || AssetFormats.DECISION_SPREADSHEET_XLS.equals( asset.metaData.format );
}
private List<String> applyWorkingSets(Set<String> activeWorkingSets) throws SerializationException {
if ( activeWorkingSets == null ) {
return new LinkedList<String>();
}
RuleAsset[] workingSets = getService().loadRuleAssets( activeWorkingSets.toArray( new String[activeWorkingSets.size()] ) );
List<String> constraintRules = new LinkedList<String>();
if ( workingSets != null ) {
for ( RuleAsset workingSet : workingSets ) {
WorkingSetConfigData wsConfig = (WorkingSetConfigData) workingSet.content;
if ( wsConfig.constraints != null ) {
for ( ConstraintConfiguration config : wsConfig.constraints ) {
constraintRules.add( ConstraintsFactory.getInstance().getVerifierRule( config ) );
}
}
}
}
return constraintRules;
}
private Verifier getWorkingSetVerifier(Collection<String> additionalVerifierRules) {
VerifierConfiguration configuration = new DefaultVerifierConfiguration();
configuration = new VerifierConfigurationImpl();
if ( additionalVerifierRules != null ) {
for ( String rule : additionalVerifierRules ) {
configuration.getVerifyingResources().put( ResourceFactory.newByteArrayResource( rule.getBytes() ),
ResourceType.DRL );
}
}
return VerifierBuilderFactory.newVerifierBuilder().newVerifier( configuration );
}
}