org.drools.android.roboguice.DroolsContainerModule Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of drools-android Show documentation
Show all versions of drools-android Show documentation
Integration code that enables Drools to run on the Android platform
/*
* Copyright 2015 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.android.roboguice;
import android.app.Application;
import android.content.Context;
import com.google.inject.AbstractModule;
import com.google.inject.Provider;
import com.google.inject.name.Named;
import com.google.inject.name.Names;
import org.drools.android.DroolsAndroidContext;
import org.drools.compiler.kie.builder.impl.KieContainerImpl;
import org.drools.compiler.kie.builder.impl.KieProject;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.model.KieBaseModel;
import org.kie.api.builder.model.KieSessionModel;
import org.kie.api.cdi.KBase;
import org.kie.api.cdi.KContainer;
import org.kie.api.cdi.KSession;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.StatelessKieSession;
import org.roboguice.shaded.goole.common.base.Preconditions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.lang.annotation.Annotation;
/**
* Roboguice module for KieContainer, KieBase, and KieSession injections.
*/
public class DroolsContainerModule extends AbstractModule {
private static final Logger logger = LoggerFactory.getLogger(DroolsContainerModule.class);
private Application application;
private KieServices ks;
private KieContainerImpl classpathContainer;
public DroolsContainerModule(Application ctx) {
this.application = ctx;
}
@Override
protected void configure() {
DroolsAndroidContext.setContext(application);
ks = KieServices.Factory.get();
classpathContainer = (KieContainerImpl) ks.getKieClasspathContainer();
KieProject kieProject = classpathContainer.getKieProject();
logger.debug("Binding @KContainer");
bind(KieContainer.class).toInstance(classpathContainer);
if (kieProject.getDefaultKieBaseModel() != null) {
bind(KieBase.class).toProvider(
new KBaseProvider(kieProject.getDefaultKieBaseModel(), classpathContainer));
}
if (kieProject.getDefaultKieSession() != null) {
bind(KieSession.class).toProvider(
new KSessionProvider(kieProject.getDefaultKieSession(), classpathContainer));
}
if (kieProject.getDefaultStatelessKieSession() != null) {
bind(StatelessKieSession.class).toProvider(
new KStatelessSessionProvider(classpathContainer.getKieProject().getDefaultStatelessKieSession(), classpathContainer));
}
bind(KieContainer.class).annotatedWith(KContainer.class).toInstance(classpathContainer);
for (final String kbaseName : classpathContainer.getKieBaseNames()) {
logger.debug("Binding @KBase({})", kbaseName);
bind(KieBase.class).annotatedWith(new KBaseImpl(kbaseName)).toProvider(
new KBaseProvider(classpathContainer.getKieBaseModel(kbaseName), classpathContainer));
for (final String ksessionName : classpathContainer.getKieSessionNamesInKieBase(kbaseName)) {
logger.debug("Binding @KSession({})", ksessionName);
KieSessionModel model = classpathContainer.getKieSessionModel(ksessionName);
if (model.getType().equals(KieSessionModel.KieSessionType.STATEFUL)) {
bind(KieSession.class).annotatedWith(new KSessionImpl(ksessionName))
.toProvider(new KSessionProvider(model, classpathContainer));
} else {
bind(StatelessKieSession.class).annotatedWith(new KSessionImpl(ksessionName))
.toProvider(new KStatelessSessionProvider(model, classpathContainer));
}
}
}
}
private static class KBaseProvider implements Provider {
private KieContainer kContainer;
private final KieBaseModel kBaseModel;
public KBaseProvider(final KieBaseModel kBaseModel,
KieContainer kContainer) {
this.kBaseModel = kBaseModel;
this.kContainer = kContainer;
}
@Override
public KieBase get() {
return kContainer.getKieBase(kBaseModel.getName());
}
}
private static class KSessionProvider implements Provider {
private KieContainer kContainer;
private final KieSessionModel kSessionModel;
public KSessionProvider(final KieSessionModel kSessionModel,
KieContainer kContainer) {
this.kSessionModel = kSessionModel;
this.kContainer = kContainer;
}
@Override
public KieSession get() {
return kContainer.newKieSession(kSessionModel.getName());
}
}
private static class KStatelessSessionProvider implements Provider {
private KieContainer kContainer;
private final KieSessionModel kSessionModel;
public KStatelessSessionProvider(final KieSessionModel kSessionModel,
KieContainer kContainer) {
this.kSessionModel = kSessionModel;
this.kContainer = kContainer;
}
@Override
public StatelessKieSession get() {
return kContainer.newStatelessKieSession(kSessionModel.getName());
}
}
}
class KBaseImpl implements KBase, Serializable {
private final String value;
private final String name;
private static final long serialVersionUID = 0L;
public KBaseImpl(String v) {
this(v, "");
}
public KBaseImpl(String value, String name) {
this.value = (String) Preconditions.checkNotNull(value, "value");
this.name = (String) Preconditions.checkNotNull(name, "name");
}
public String value() {
return this.value;
}
public String name() {
return name;
}
public int hashCode() {
return (127 * "value".hashCode() ^ this.value.hashCode()) +
(127 * "name".hashCode() ^ this.name.hashCode());
}
public boolean equals(Object o) {
if (!(o instanceof KBase)) {
return false;
} else {
KBase other = (KBase) o;
return this.value.equals(other.value())
&& this.name.equals(other.name());
}
}
public String toString() {
return String.format("@%s(value=%s, name=%s)", KBase.class.getName(), this.value, this.name);
}
public Class extends Annotation> annotationType() {
return KBase.class;
}
}
class KSessionImpl implements KSession, Serializable {
private final String value;
private final String name;
private static final long serialVersionUID = 0L;
public KSessionImpl(String v) {
this(v, "");
}
public KSessionImpl(String v, String n) {
this.value = (String) Preconditions.checkNotNull(v, "value");
this.name = (String) Preconditions.checkNotNull(n, "name");
}
public Class extends Annotation> annotationType() {
return KSession.class;
}
public String value() {
return value;
}
public String name() {
return name;
}
public int hashCode() {
return (127 * "value".hashCode() ^ this.value.hashCode()) +
(127 * "name".hashCode() ^ this.name.hashCode());
}
public boolean equals(Object o) {
if (!(o instanceof KSession)) {
return false;
} else {
KSession other = (KSession) o;
return this.value.equals(other.value())
&& this.name.equals(other.name());
}
}
public String toString() {
return String.format("@%s(value=%s, name=%s)", KSession.class.getName(), this.value, this.name);
}
}