Skip to content

Commit

Permalink
JBPM-7979 - CaseFileDataLog should take advantage of VariableIndexer …
Browse files Browse the repository at this point in the history
…to allow custom values for variables
  • Loading branch information
mswiderski committed Nov 24, 2018
1 parent 5484d37 commit 12e730e
Show file tree
Hide file tree
Showing 16 changed files with 364 additions and 113 deletions.
Expand Up @@ -29,20 +29,20 @@
* Represents logic behind mechanism to index task variables. * Represents logic behind mechanism to index task variables.
* Supports custom indexers to be loaded dynamically via JDK ServiceLoader * Supports custom indexers to be loaded dynamically via JDK ServiceLoader
* *
* Adds default indexer (org.jbpm.services.task.audit.variable.StringTaskVariableIndexer) as the last indexer * Adds default indexer (org.jbpm.process.audit.variable.StringTaskVariableIndexer) as the last indexer
* as it accepts all types * as it accepts all types
* *
*/ */
public class ProcessIndexerManager { public class ProcessIndexerManager {


private static ServiceLoader<ProcessVariableIndexer> taskVariableIndexers = ServiceLoader.load(ProcessVariableIndexer.class); private static ServiceLoader<ProcessVariableIndexer> processVariableIndexers = ServiceLoader.load(ProcessVariableIndexer.class);


private static ProcessIndexerManager INSTANCE; private static ProcessIndexerManager INSTANCE;


private List<ProcessVariableIndexer> indexers = new ArrayList<ProcessVariableIndexer>(); private List<ProcessVariableIndexer> indexers = new ArrayList<ProcessVariableIndexer>();


private ProcessIndexerManager() { private ProcessIndexerManager() {
for (ProcessVariableIndexer indexer : taskVariableIndexers) { for (ProcessVariableIndexer indexer : processVariableIndexers) {
indexers.add(indexer); indexers.add(indexer);
} }


Expand Down
@@ -0,0 +1,36 @@
/*
* Copyright 2018 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.casemgmt.api.audit;

import java.util.Date;

public interface CaseFileData {

String getCaseId();

String getCaseDefId();

String getItemName();

String getItemValue();

String getItemType();

Date getLastModified();

String getLastModifiedBy();
}
@@ -0,0 +1,27 @@
/*
* Copyright 2018 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.casemgmt.api.audit;

import org.kie.internal.utils.VariableIndexer;

/**
* Dedicated type for custom implementations of VariableIndexer for case variables
*
*/
public interface CaseVariableIndexer extends VariableIndexer<CaseFileData> {

}
Expand Up @@ -27,12 +27,13 @@
import javax.persistence.Temporal; import javax.persistence.Temporal;
import javax.persistence.Transient; import javax.persistence.Transient;


import org.jbpm.casemgmt.api.audit.CaseFileData;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;


@Entity @Entity
@SequenceGenerator(name = "caseFileDataLogIdSeq", sequenceName = "CASE_FILE_DATA_LOG_ID_SEQ", allocationSize = 1) @SequenceGenerator(name = "caseFileDataLogIdSeq", sequenceName = "CASE_FILE_DATA_LOG_ID_SEQ", allocationSize = 1)
public class CaseFileDataLog implements Serializable { public class CaseFileDataLog implements Serializable, CaseFileData {


private static final Logger logger = LoggerFactory.getLogger(CaseFileDataLog.class); private static final Logger logger = LoggerFactory.getLogger(CaseFileDataLog.class);
private static final long serialVersionUID = 7667968668409641210L; private static final long serialVersionUID = 7667968668409641210L;
Expand Down Expand Up @@ -77,6 +78,7 @@ public void setId(long id) {
this.id = id; this.id = id;
} }


@Override
public String getCaseId() { public String getCaseId() {
return caseId; return caseId;
} }
Expand All @@ -85,22 +87,25 @@ public void setCaseId(String caseId) {
this.caseId = caseId; this.caseId = caseId;
} }


@Override
public String getCaseDefId() { public String getCaseDefId() {
return caseDefId; return caseDefId;
} }

public void setCaseDefId(String caseDefId) { public void setCaseDefId(String caseDefId) {
this.caseDefId = caseDefId; this.caseDefId = caseDefId;
} }


@Override
public String getItemName() { public String getItemName() {
return itemName; return itemName;
} }

public void setItemName(String itemName) { public void setItemName(String itemName) {
this.itemName = itemName; this.itemName = itemName;
} }


@Override
public String getItemValue() { public String getItemValue() {
return itemValue; return itemValue;
} }
Expand All @@ -113,6 +118,7 @@ public void setItemValue(String itemValue) {
this.itemValue = itemValue; this.itemValue = itemValue;
} }


@Override
public String getItemType() { public String getItemType() {
return itemType; return itemType;
} }
Expand All @@ -121,6 +127,7 @@ public void setItemType(String itemType) {
this.itemType = itemType; this.itemType = itemType;
} }


@Override
public Date getLastModified() { public Date getLastModified() {
return lastModified; return lastModified;
} }
Expand All @@ -129,6 +136,7 @@ public void setLastModified(Date lastModified) {
this.lastModified = lastModified; this.lastModified = lastModified;
} }


@Override
public String getLastModifiedBy() { public String getLastModifiedBy() {
return lastModifiedBy; return lastModifiedBy;
} }
Expand Down
@@ -0,0 +1,88 @@
/*
* Copyright 2018 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.casemgmt.impl.audit;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ServiceLoader;

import org.jbpm.casemgmt.api.audit.CaseFileData;
import org.jbpm.casemgmt.api.audit.CaseVariableIndexer;
import org.jbpm.casemgmt.api.event.CaseEvent;

/**
* Represents logic behind mechanism to index task variables.
* Supports custom indexers to be loaded dynamically via JDK ServiceLoader
*
* Adds default indexer (org.jbpm.casemgmt.impl.audit.variable.StringTaskVariableIndexer) as the last indexer
* as it accepts all types
*
*/
public class CaseIndexerManager {

private static ServiceLoader<CaseVariableIndexer> caseVariableIndexers = ServiceLoader.load(CaseVariableIndexer.class);

private static CaseIndexerManager INSTANCE;

private List<CaseVariableIndexer> indexers = new ArrayList<>();

private CaseIndexerManager() {
for (CaseVariableIndexer indexer : caseVariableIndexers) {
indexers.add(indexer);
}

// always add at the end the default one
indexers.add(new StringCaseVariableIndexer());
}

public List<CaseFileData> index(CaseEvent caseEvent, String variableName, Object variable) {
for (CaseVariableIndexer indexer : indexers) {
if (indexer.accept(variable)) {
List<CaseFileData> indexed = indexer.index(variableName, variable);

if (indexed != null) {
List<CaseFileData> dataItems = new ArrayList<>();

for (CaseFileData caseVariable : indexed) {
CaseFileDataLog caseFileDataLog = new CaseFileDataLog(caseEvent.getCaseId(), caseEvent.getCaseFile().getDefinitionId(), caseVariable.getItemName());

caseFileDataLog.setItemType(caseVariable.getItemType());
caseFileDataLog.setItemValue(caseVariable.getItemValue());
caseFileDataLog.setLastModified(new Date());
caseFileDataLog.setLastModifiedBy(caseEvent.getUser());

dataItems.add(caseFileDataLog);
}

return dataItems;

}
}
}

return null;
}

public static CaseIndexerManager get() {
if (INSTANCE == null) {
INSTANCE = new CaseIndexerManager();
}

return INSTANCE;
}
}
Expand Up @@ -16,15 +16,23 @@


package org.jbpm.casemgmt.impl.audit; package org.jbpm.casemgmt.impl.audit;


import static org.jbpm.casemgmt.impl.audit.CaseInstanceAuditConstants.DELETE_CASE_DATA_BY_NAME_QUERY;
import static org.jbpm.casemgmt.impl.audit.CaseInstanceAuditConstants.DELETE_CASE_ROLE_ASSIGNMENT_QUERY;
import static org.jbpm.casemgmt.impl.audit.CaseInstanceAuditConstants.FIND_CASE_DATA_BY_NAME_QUERY;
import static org.jbpm.casemgmt.impl.audit.CaseInstanceAuditConstants.FIND_CASE_DATA_QUERY;
import static org.jbpm.casemgmt.impl.audit.CaseInstanceAuditConstants.FIND_CASE_PROCESS_INST_ID_QUERY;
import static org.jbpm.casemgmt.impl.audit.CaseInstanceAuditConstants.UPDATE_CASE_PROCESS_INST_ID_QUERY;

import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;


import org.jbpm.casemgmt.api.audit.CaseFileData;
import org.jbpm.casemgmt.api.auth.AuthorizationManager; import org.jbpm.casemgmt.api.auth.AuthorizationManager;
import org.jbpm.casemgmt.api.event.CaseDataEvent; import org.jbpm.casemgmt.api.event.CaseDataEvent;
import org.jbpm.casemgmt.api.event.CaseEvent;
import org.jbpm.casemgmt.api.event.CaseEventListener; import org.jbpm.casemgmt.api.event.CaseEventListener;
import org.jbpm.casemgmt.api.event.CaseReopenEvent; import org.jbpm.casemgmt.api.event.CaseReopenEvent;
import org.jbpm.casemgmt.api.event.CaseRoleAssignmentEvent; import org.jbpm.casemgmt.api.event.CaseRoleAssignmentEvent;
Expand All @@ -42,15 +50,15 @@
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;


import static org.jbpm.casemgmt.impl.audit.CaseInstanceAuditConstants.*;



public class CaseInstanceAuditEventListener implements CaseEventListener, Cacheable { public class CaseInstanceAuditEventListener implements CaseEventListener, Cacheable {


private static final Logger logger = LoggerFactory.getLogger(CaseInstanceAuditEventListener.class); private static final Logger logger = LoggerFactory.getLogger(CaseInstanceAuditEventListener.class);


private TransactionalCommandService commandService; private TransactionalCommandService commandService;


private CaseIndexerManager indexManager = CaseIndexerManager.get();

public CaseInstanceAuditEventListener(TransactionalCommandService commandService) { public CaseInstanceAuditEventListener(TransactionalCommandService commandService) {
this.commandService = commandService; this.commandService = commandService;
} }
Expand Down Expand Up @@ -89,18 +97,14 @@ public void afterCaseStarted(CaseStartEvent event) {
if (initialData.isEmpty()) { if (initialData.isEmpty()) {
return; return;
} }
List<CaseFileDataLog> insert = new ArrayList<>(); List<CaseFileData> insert = new ArrayList<>();
initialData.forEach((name, value) -> { initialData.forEach((name, value) -> {


if (value != null) { if (value != null) {
CaseFileDataLog caseFileDataLog = new CaseFileDataLog(event.getCaseId(), caseFile.getDefinitionId(), name);
insert.add(caseFileDataLog);


List<CaseFileData> indexedValues = indexManager.index(event, name, value);
insert.addAll(indexedValues);


caseFileDataLog.setItemType(value.getClass().getName());
caseFileDataLog.setItemValue(value.toString());
caseFileDataLog.setLastModified(new Date());
caseFileDataLog.setLastModifiedBy(event.getUser());
} }
}); });
commandService.execute(new PersistObjectCommand(insert.toArray())); commandService.execute(new PersistObjectCommand(insert.toArray()));
Expand All @@ -117,7 +121,7 @@ public void afterCaseReopen(CaseReopenEvent event) {
int updated = commandService.execute(updateCommand); int updated = commandService.execute(updateCommand);
logger.debug("Updated {} role assignment entries for case id {}", updated, event.getCaseId()); logger.debug("Updated {} role assignment entries for case id {}", updated, event.getCaseId());


updateCaseFileItems(event.getData(), event.getCaseId(), event.getCaseDefinitionId(), event.getUser()); updateCaseFileItems(event, event.getData(), event.getCaseId(), event.getCaseDefinitionId(), event.getUser());
} }


@Override @Override
Expand Down Expand Up @@ -152,7 +156,7 @@ public void afterCaseRoleAssignmentRemoved(CaseRoleAssignmentEvent event) {


@Override @Override
public void afterCaseDataAdded(CaseDataEvent event) { public void afterCaseDataAdded(CaseDataEvent event) {
updateCaseFileItems(event.getData(), event.getCaseId(), event.getDefinitionId(), event.getUser()); updateCaseFileItems(event, event.getData(), event.getCaseId(), event.getDefinitionId(), event.getUser());
} }


@Override @Override
Expand Down Expand Up @@ -196,7 +200,7 @@ protected CaseFileDataLog caseFileDataByName(String caseId, String name) {
return caseDataLog.get(0); return caseDataLog.get(0);
} }


protected void updateCaseFileItems(Map<String, Object> addedData, String caseId, String caseDefinitionId, String user) { protected void updateCaseFileItems(CaseEvent event, Map<String, Object> addedData, String caseId, String caseDefinitionId, String user) {


if (addedData.isEmpty()) { if (addedData.isEmpty()) {
return; return;
Expand All @@ -207,24 +211,30 @@ protected void updateCaseFileItems(Map<String, Object> addedData, String caseId,
addedData.forEach((name, value) -> { addedData.forEach((name, value) -> {


if (value != null) { if (value != null) {
CaseFileDataLog caseFileDataLog = null; List<CaseFileData> indexedValues = indexManager.index(event, name, value);
if (currentCaseData.contains(name)) {
logger.debug("Case instance {} has already stored log value for {} thus it's going to be updated", caseId, name); for (CaseFileData item : indexedValues) {
caseFileDataLog = caseFileDataByName(caseId, name);
update.add(caseFileDataLog);
} else {
logger.debug("Case instance {} has no log value for {} thus it's going to be inserted", caseId, name);
caseFileDataLog = new CaseFileDataLog(caseId, caseDefinitionId, name);
insert.add(caseFileDataLog);
}


caseFileDataLog.setItemType(value.getClass().getName()); CaseFileDataLog caseFileDataLog = null;
caseFileDataLog.setItemValue(value.toString()); if (currentCaseData.contains(item.getItemName())) {
caseFileDataLog.setLastModified(new Date()); logger.debug("Case instance {} has already stored log value for {} thus it's going to be updated", caseId, item.getItemName());
caseFileDataLog.setLastModifiedBy(user); caseFileDataLog = caseFileDataByName(caseId, item.getItemName());
update.add(caseFileDataLog);
} else {
logger.debug("Case instance {} has no log value for {} thus it's going to be inserted", caseId, item.getItemName());
caseFileDataLog = new CaseFileDataLog(caseId, caseDefinitionId, item.getItemName());
insert.add(caseFileDataLog);
}
caseFileDataLog.setItemType(item.getItemType());
caseFileDataLog.setItemValue(item.getItemValue());
caseFileDataLog.setLastModified(item.getLastModified());
caseFileDataLog.setLastModifiedBy(item.getLastModifiedBy());
}
} }
}); });
commandService.execute(new PersistObjectCommand(insert.toArray())); commandService.execute(new PersistObjectCommand(insert.toArray()));
commandService.execute(new MergeObjectCommand(update.toArray())); commandService.execute(new MergeObjectCommand(update.toArray()));
} }


} }

0 comments on commit 12e730e

Please sign in to comment.