/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.gses.service;
import com.google.common.base.Function;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import javax.ejb.DependsOn;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import static javax.ejb.TransactionAttributeType.REQUIRED;
@Singleton
@TransactionManagement
@TransactionAttribute(REQUIRED)
@Lock(LockType.READ)
@DependsOn("BaseBean")
public class ActivitiServiceImpl implements ActivitiService {
@Inject
Instance<ProcessEngine> processEngine;
@Override
public <T> T withRepository(final Function<RepositoryService, T> fun) {
return fun.apply(engine().getRepositoryService());
}
@Override
public <T> T withTask(final Function<TaskService, T> fun) {
return fun.apply(engine().getTaskService());
}
@Override
public <T> T withRepository(String userId, Function<RepositoryService, T> fun) {
engine().getIdentityService().setAuthenticatedUserId(userId);
return withRepository(fun);
}
@Override
public <T> T withHistory(Function<HistoryService, T> fun) {
return fun.apply(engine().getHistoryService());
}
@Override
public <T> T withRuntime(Function<RuntimeService, T> fun) {
return fun.apply(engine().getRuntimeService());
}
@Override
public <T> T withEngine(Function<ProcessEngine, T> fun) {
return fun.apply(engine());
}
@Override
public <R> R withEngine(final F0<R> f0) {
return f0.apply(engine());
}
@Override
public <R, A> R withEngine(final F1<R, A> f1, final A arg) {
return f1.apply(engine(), arg);
}
@Override
public <R, A1, A2> R withEngine(final F2<R, A1, A2> f2, final A1 arg1, final A2 arg2) {
return f2.apply(engine(), arg1, arg2);
}
@Override
public <R, A1, A2, A3> R withEngine(final F3<R, A1, A2, A3> f3, final A1 arg1, final A2 arg2, final A3 arg3) {
return f3.apply(engine(), arg1, arg2, arg3);
}
private ProcessEngine engine() {
return processEngine.get();
}
}