/*
* Copyright 2016 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.core.fluent.impl;
import org.drools.core.command.*;
import org.kie.api.command.Command;
import org.kie.api.runtime.builder.ContextFluent;
import org.kie.api.runtime.builder.Scope;
public class BaseBatchFluent<T, E> implements ContextFluent<T, E> {
protected ExecutableImpl fluentCtx;
public BaseBatchFluent(ExecutableImpl fluentCtx) {
this.fluentCtx = fluentCtx;
}
public ExecutableImpl getFluentContext() {
return fluentCtx;
}
public T addCommand(Command command) {
fluentCtx.addCommand(command);
return (T) this;
}
public T after(long distance) {
fluentCtx.addBatch(new BatchImpl(distance));
return (T) this;
}
public T relativeAfter(long duration) {
return (T) this;
}
@Override
public T out() {
fluentCtx.addCommand( new OutCommand<Object>());
return (T) this;
}
@Override
public T out(String name) {
fluentCtx.addCommand( new OutCommand<Object>(name));
return (T) this;
}
@Override
public T set(String name, Scope scope) {
fluentCtx.addCommand( new SetCommand<Object>(name, scope));
return (T) this;
}
@Override
public T set(String name) {
fluentCtx.addCommand( new SetCommand<Object>(name));
return (T) this;
}
@Override
public T get(String name) {
fluentCtx.addCommand( new GetCommand(name));
return (T) this;
}
@Override
public T get(String name, Scope scope) {
fluentCtx.addCommand( new GetCommand(name, scope));
return (T) this;
}
@Override
public <K> K get(String name, Class<K> cls) {
String fluentTarget = getFluentContext().getFactory().getFluentTarget(cls.getName());
addCommand(new SetVarAsRegistryEntry(fluentTarget, name));
K object = null;
try {
// @TODO We really should use a component factory for these, but for now use impl lookup
Class imlpCls = getFluentContext().getFactory().getImplClass(cls.getName());
object = (K) imlpCls.getDeclaredConstructor(ExecutableImpl.class).newInstance(getFluentContext());
} catch (Exception e) {
throw new RuntimeException("Unable to instantiate fluent " + cls.getName(), e) ;
}
return object;
}
@Override
public T newApplicationContext(String name) {
addCommand(new NewContextCommand(name));
return (T) this;
}
@Override
public T getApplicationContext(String name) {
addCommand(new GetContextCommand(name));
return (T) this;
}
@Override
public T startConversation() {
fluentCtx.addCommand(new StartConversationCommand());
return (T) this;
}
@Override
public T joinConversation(String uuid) {
fluentCtx.addCommand(new JoinConversationCommand(uuid));
return (T) this;
}
@Override
public T leaveConversation() {
fluentCtx.addCommand(new LeaveConversationCommand());
return (T) this;
}
@Override
public T endConversation(String uuid) {
fluentCtx.addCommand(new EndConversationCommand(uuid));
return (T) this;
}
@Override
public E end() {
return (E) fluentCtx.getExecutableBuilder();
}
}