/*
* 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.jbpm.process.audit.variable;
import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;
import org.jbpm.process.audit.event.AuditEventBuilder;
import org.kie.api.event.process.ProcessVariableChangedEvent;
import org.kie.api.runtime.manager.audit.VariableInstanceLog;
import org.kie.internal.process.ProcessVariableIndexer;
/**
* Represents logic behind mechanism to index task variables.
* Supports custom indexers to be loaded dynamically via JDK ServiceLoader
*
* Adds default indexer (org.jbpm.services.task.audit.variable.StringTaskVariableIndexer) as the last indexer
* as it accepts all types
*
*/
public class ProcessIndexerManager {
private static ServiceLoader<ProcessVariableIndexer> taskVariableIndexers = ServiceLoader.load(ProcessVariableIndexer.class);
private static ProcessIndexerManager INSTANCE;
private List<ProcessVariableIndexer> indexers = new ArrayList<ProcessVariableIndexer>();
private ProcessIndexerManager() {
for (ProcessVariableIndexer indexer : taskVariableIndexers) {
indexers.add(indexer);
}
// always add at the end the default one
indexers.add(new StringProcessVariableIndexer());
}
public List<VariableInstanceLog> index(AuditEventBuilder builder, ProcessVariableChangedEvent event) {
String variableName = event.getVariableId();
Object variable = event.getNewValue();
for (ProcessVariableIndexer indexer : indexers) {
if (indexer.accept(variable)) {
List<VariableInstanceLog> indexed = indexer.index(variableName, variable);
if (indexed != null) {
// populate all indexed variables with task information
for (VariableInstanceLog processVariable : indexed) {
VariableInstanceLog log = (VariableInstanceLog) builder.buildEvent(event);
((org.jbpm.process.audit.VariableInstanceLog)processVariable).setProcessId(log.getProcessId());
((org.jbpm.process.audit.VariableInstanceLog)processVariable).setProcessInstanceId(log.getProcessInstanceId());
((org.jbpm.process.audit.VariableInstanceLog)processVariable).setDate(log.getDate());
((org.jbpm.process.audit.VariableInstanceLog)processVariable).setExternalId(log.getExternalId());
((org.jbpm.process.audit.VariableInstanceLog)processVariable).setOldValue(log.getOldValue());
((org.jbpm.process.audit.VariableInstanceLog)processVariable).setVariableInstanceId(log.getVariableInstanceId());
}
return indexed;
}
}
}
return null;
}
public static ProcessIndexerManager get() {
if (INSTANCE == null) {
INSTANCE = new ProcessIndexerManager();
}
return INSTANCE;
}
}