/*
* Copyright 2014 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.jbpm.executor.impl.jpa;
import org.drools.core.command.impl.ExecutableCommand;
import org.jbpm.executor.ExecutorServiceFactory;
import org.jbpm.executor.impl.event.ExecutorEventSupport;
import org.kie.api.executor.ErrorInfo;
import org.kie.api.executor.ExecutorStoreService;
import org.kie.api.executor.RequestInfo;
import org.kie.api.executor.STATUS;
import org.kie.api.runtime.CommandExecutor;
import org.kie.api.runtime.Context;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import java.util.HashMap;
import java.util.Map;
/**
*
* IMPORTANT: please keep all classes from package org.jbpm.shared.services.impl as FQCN
* inside method body to avoid exception logged by CDI when used with in memory mode
*/
public class JPAExecutorStoreService implements ExecutorStoreService{
private EntityManagerFactory emf;
private CommandExecutor commandService;
private ExecutorEventSupport eventSupport = new ExecutorEventSupport();
public JPAExecutorStoreService(boolean active) {
}
public void setEventSupport(ExecutorEventSupport eventSupport) {
this.eventSupport = eventSupport;
}
public void setCommandService(CommandExecutor commandService ) {
this.commandService = commandService;
}
public void setEmf(EntityManagerFactory emf) {
this.emf = emf;
}
@Override
public void persistRequest(RequestInfo request) {
commandService.execute(new org.jbpm.shared.services.impl.commands.PersistObjectCommand(request));
}
@Override
public void updateRequest(RequestInfo request) {
commandService.execute(new org.jbpm.shared.services.impl.commands.MergeObjectCommand(request));
}
@Override
public RequestInfo removeRequest(Long requestId) {
return commandService.execute(new LockAndCancelRequestInfoCommand(requestId));
}
@Override
public RequestInfo findRequest(Long id) {
return commandService.execute(new org.jbpm.shared.services.impl.commands.FindObjectCommand<org.jbpm.executor.entities.RequestInfo>(id, org.jbpm.executor.entities.RequestInfo.class));
}
@Override
public void persistError(ErrorInfo error) {
commandService.execute(new org.jbpm.shared.services.impl.commands.PersistObjectCommand(error));
}
@Override
public void updateError(ErrorInfo error) {
commandService.execute(new org.jbpm.shared.services.impl.commands.MergeObjectCommand(error));
}
@Override
public ErrorInfo removeError(Long errorId) {
ErrorInfo error = findError(errorId);
commandService.execute(new org.jbpm.shared.services.impl.commands.RemoveObjectCommand(error));
return error;
}
@Override
public ErrorInfo findError(Long id) {
return commandService.execute(new org.jbpm.shared.services.impl.commands.FindObjectCommand<ErrorInfo>(id, ErrorInfo.class));
}
@Override
public Runnable buildExecutorRunnable() {
return ExecutorServiceFactory.buildRunable(emf, eventSupport);
}
private class LockAndCancelRequestInfoCommand implements ExecutableCommand<RequestInfo> {
private static final long serialVersionUID = 8670412133363766161L;
private Long requestId;
LockAndCancelRequestInfoCommand(Long requestId) {
this.requestId = requestId;
}
@Override
public RequestInfo execute(Context context) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("id", requestId);
params.put("firstResult", 0);
params.put("maxResults", 1);
RequestInfo request = null;
try {
org.jbpm.shared.services.impl.JpaPersistenceContext ctx = (org.jbpm.shared.services.impl.JpaPersistenceContext) context;
request = ctx.queryAndLockWithParametersInTransaction("PendingRequestById",params, true, RequestInfo.class);
if (request != null) {
request.setStatus(STATUS.CANCELLED);
ctx.merge(request);
}
} catch (NoResultException e) {
}
return request;
}
}
}