/*
* 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.
*
* 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.workitem;
import java.net.URL;
import java.util.*;
import org.drools.core.process.core.ParameterDefinition;
import org.drools.core.process.core.datatype.DataType;
import org.drools.core.process.core.impl.ParameterDefinitionImpl;
import org.drools.core.util.ConfFileUtils;
import org.drools.core.util.MVELSafeHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class WorkItemRepository {
private static final Logger logger = LoggerFactory.getLogger(WorkItemRepository.class);
public static Map<String, WorkDefinitionImpl> getWorkDefinitions(String path) {
return getWorkDefinitions(path, null);
}
public static Map<String, WorkDefinitionImpl> getWorkDefinitions(String path, String[] definitionNames) {
Map<String, WorkDefinitionImpl> workDefinitions = new HashMap<String, WorkDefinitionImpl>();
List<Map<String, Object>> workDefinitionsMaps = getAllWorkDefinitionsMap(path);
for (Map<String, Object> workDefinitionMap : workDefinitionsMaps) {
if (workDefinitionMap != null) {
WorkDefinitionImpl workDefinition = new WorkDefinitionImpl();
workDefinition.setName((String) workDefinitionMap.get("name"));
workDefinition.setDisplayName((String) workDefinitionMap.get("displayName"));
workDefinition.setIcon((String) workDefinitionMap.get("icon"));
workDefinition.setCustomEditor((String) workDefinitionMap.get("customEditor"));
workDefinition.setCategory((String) workDefinitionMap.get("category"));
workDefinition.setPath((String) workDefinitionMap.get("path"));
workDefinition.setFile((String) workDefinitionMap.get("file"));
workDefinition.setDocumentation((String) workDefinitionMap.get("documentation"));
Set<ParameterDefinition> parameters = new HashSet<ParameterDefinition>();
Map<String, DataType> parameterMap = (Map<String, DataType>) workDefinitionMap.get("parameters");
if (parameterMap != null) {
for (Map.Entry<String, DataType> entry : parameterMap.entrySet()) {
parameters.add(new ParameterDefinitionImpl(entry.getKey(), entry.getValue()));
}
}
workDefinition.setParameters(parameters);
if(workDefinitionMap.get("parameterValues") != null) {
workDefinition.setParameterValues( (Map<String, Object>) workDefinitionMap.get("parameterValues") );
}
Set<ParameterDefinition> results = new HashSet<ParameterDefinition>();
Map<String, DataType> resultMap = (Map<String, DataType>) workDefinitionMap.get("results");
if (resultMap != null) {
for (Map.Entry<String, DataType> entry : resultMap.entrySet()) {
results.add(new ParameterDefinitionImpl(entry.getKey(), entry.getValue()));
}
}
workDefinition.setResults(results);
workDefinition.setDefaultHandler((String) workDefinitionMap.get("defaultHandler"));
if(workDefinitionMap.get("dependencies") != null) {
workDefinition.setDependencies(((List<String>) workDefinitionMap.get("dependencies")).toArray(new String[0]));
}
if(workDefinitionMap.get("mavenDependencies") != null) {
workDefinition.setMavenDependencies(((List<String>) workDefinitionMap.get("mavenDependencies")).toArray(new String[0]));
}
if(workDefinitionMap.get("version") != null) {
workDefinition.setVersion((String) workDefinitionMap.get("version"));
}
if(workDefinitionMap.get("description") != null) {
workDefinition.setDescription((String) workDefinitionMap.get("description"));
}
if(workDefinitionMap.get("widType") != null) {
workDefinition.setWidType((String) workDefinitionMap.get("widType"));
}
workDefinitions.put(workDefinition.getName(), workDefinition);
}
}
if(definitionNames!= null) {
if(definitionNames.length > 0) {
workDefinitions.keySet().retainAll(new HashSet(Arrays.asList(definitionNames)));
} else {
return new HashMap<String, WorkDefinitionImpl>();
}
}
return workDefinitions;
}
private static List<Map<String, Object>> getAllWorkDefinitionsMap(String directory) {
List<Map<String, Object>> workDefinitions = new ArrayList<Map<String, Object>>();
for (String s: getDirectories(directory)) {
try {
workDefinitions.addAll(getAllWorkDefinitionsMap(directory + "/" + s));
} catch (Throwable t) {
t.printStackTrace();
}
workDefinitions.addAll(getWorkDefinitionsMap(directory, s));
}
return workDefinitions;
}
private static String[] getDirectories(String path) {
String content = null;
try {
content = ConfFileUtils.URLContentsToString(
new URL(path + "/index.conf"));
} catch (Exception e) {
// Do nothing
}
if (content == null) {
return new String[0];
}
return content.split("\n");
}
private static List<Map<String, Object>> getWorkDefinitionsMap(String parentPath, String file) {
String path = parentPath + "/" + file + "/" + file + ".wid";
String content = null;
try {
content = ConfFileUtils.URLContentsToString(new URL(path));
} catch (Exception e) {
// Do nothing
}
if (content == null) {
return new ArrayList();
}
try {
List<Map<String, Object>> result = (List<Map<String, Object>>) MVELSafeHelper.getEvaluator().eval(content, new HashMap());
for (Map<String, Object> wid: result) {
wid.put("path", parentPath + "/" + file);
wid.put("file", file + ".wid");
wid.put("widType", "mvel");
}
return result;
} catch (Throwable t) {
logger.warn("Could not parse work definition as mvel. Trying as json.");
try {
List<Map<String, Object>> result = JsonWorkItemParser.parse(content);
for (Map<String, Object> wid: result) {
wid.put("path", parentPath + "/" + file);
wid.put("file", file + ".wid");
wid.put("widType", "json");
}
return result;
} catch( Throwable tt) {
logger.error("Error occured while loading work definitions " + path, tt);
throw new RuntimeException("Could not parse work definitions " + path + ": " + tt.getMessage());
}
}
}
}