/**
* 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.jsr94.rules;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.rules.InvalidRuleSessionException;
import javax.rules.RuleExecutionSetMetadata;
import javax.rules.RuleSession;
import javax.rules.admin.RuleExecutionSet;
import org.drools.jsr94.rules.admin.RuleExecutionSetImpl;
import org.drools.jsr94.rules.repository.RuleExecutionSetRepository;
import org.drools.jsr94.rules.repository.RuleExecutionSetRepositoryException;
/**
* The Drools implementation of the <code>RuleSession</code> interface which is
* a representation of a client session with a rules engine. A rules engine
* session serves as an entry point into an underlying rules engine. The
* <code>RuleSession</code> is bound to a rules engine instance and exposes a
* vendor-neutral rule processing API for executing <code>Rule</code>s within a
* bound <code>RuleExecutionSet</code>.
* <p/>
* Note: the <code>release</code> method must be called to clean up all
* resources used by the <code>RuleSession</code>. Calling <code>release</code>
* may make the <code>RuleSession</code> eligible to be returned to a
* <code>RuleSession</code> pool.
*
* @see RuleSession
*
* @author N. Alex Rupp (n_alex <at>codehaus.org)
* @author <a href="mailto:thomas.diesler@softcon-itec.de">thomas diesler </a>
*/
abstract class AbstractRuleSessionImpl
implements
RuleSession {
private RuleExecutionSetRepository repository;
public AbstractRuleSessionImpl(final RuleExecutionSetRepository repository) {
this.repository = repository;
}
/**
* The Drools <code>RuleExecutionSet</code> associated
* with this <code>RuleSession</code>.
*/
private RuleExecutionSetImpl ruleExecutionSet;
/**
* A <code>Map</code> of <code>String</code>/<code>Object</code> pairs
* passed as application data to the Drools <code>WorkingMemory</code>.
*/
private Map properties;
/**
* Sets additional properties used to create this <code>RuleSession</code>.
*
* @param properties additional properties used to create the
* <code>RuleSession</code> implementation.
*/
protected void setProperties(final Map properties) {
this.properties = properties;
}
/**
* Returns the additional properties used to create this
* <code>RuleSession</code>.
*
* @return the additional properties used to create this
* <code>RuleSession</code>.
*/
protected Map getProperties() {
return this.properties;
}
/**
* Sets the Drools <code>RuleExecutionSet</code> associated
* with this <code>RuleSession</code>.
*
* @param ruleExecutionSet the Drools <code>RuleExecutionSet</code> to associate
* with this <code>RuleSession</code>.
*/
protected void setRuleExecutionSet(final RuleExecutionSetImpl ruleExecutionSet) {
this.ruleExecutionSet = ruleExecutionSet;
}
/**
* Returns the Drools <code>RuleExecutionSet</code> associated
* with this <code>RuleSession</code>.
*
* @return the Drools <code>RuleExecutionSet</code> associated
* with this <code>RuleSession</code>.
*/
protected RuleExecutionSetImpl getRuleExecutionSet() {
return this.ruleExecutionSet;
}
protected abstract void checkRuleSessionValidity() throws InvalidRuleSessionException;
// JSR94 interface methods start here -------------------------------------
/**
* Returns the meta data for the rule execution set bound to this rule
* session.
*
* @return the RuleExecutionSetMetaData bound to this rule session.
*/
public RuleExecutionSetMetadata getRuleExecutionSetMetadata() {
String theBindUri = null;
List registrations = null;
try {
registrations = this.repository.getRegistrations();
} catch (RuleExecutionSetRepositoryException e) {
String s = "Error while retrieving rule execution set registrations";
throw new RuntimeException(s, e);
}
for ( final Iterator i = registrations.iterator(); i.hasNext(); ) {
final String aBindUri = (String) i.next();
// FIXME: provide the correct properties
RuleExecutionSet aRuleSet = null;
try {
aRuleSet = this.repository.getRuleExecutionSet( aBindUri, null );
} catch (RuleExecutionSetRepositoryException e) {
String s = "Error while retrieving rule execution set bound to: " + aBindUri;
throw new RuntimeException(s, e);
}
if ( aRuleSet == this.ruleExecutionSet ) {
theBindUri = aBindUri;
break;
}
}
return new RuleExecutionSetMetadataImpl( theBindUri,
this.ruleExecutionSet.getName(),
this.ruleExecutionSet.getDescription() );
}
/**
* Releases all resources used by this rule session.
* This method renders this rule session unusable until
* it is reacquired through the <code>RuleRuntime</code>.
*/
public void release() {
setProperties( null );
setRuleExecutionSet( null );
}
}