| /******************************************************************************* |
| * Copyright (c) 2011, 2012, 2013, 2014 Red Hat, Inc. |
| * All rights reserved. |
| * This program is made available under the terms of the |
| * Eclipse Public License v1.0 which accompanies this distribution, |
| * and is available at http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Red Hat, Inc. - initial API and implementation |
| * |
| * @author Brian Fitzpatrick |
| ******************************************************************************/ |
| package org.eclipse.bpmn2.modeler.runtime.jboss.jbpm5.wid; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| /** |
| * @author bfitzpat |
| * |
| */ |
| public class WIDParser { |
| |
| public enum Section { |
| PARAMETERS, RESULTS, DEPENDENCIES |
| } |
| |
| /** |
| * Takes in the String content of a *.wid/*.conf file and |
| * parses it into a HashMap of WorkItemDefinition classes. |
| * |
| * @param content the String content of a WID definition. |
| * @return a HashMap of the parsed WID definition, indexed by the custom |
| * work item task names. |
| * @throws WIDException |
| */ |
| public static List<WorkItemDefinition> parse(String content) throws WIDException { |
| |
| List<WorkItemDefinition> widMap = new ArrayList<WorkItemDefinition>(); |
| |
| if (content == null) { |
| WIDException widException = |
| new WIDException( |
| "No data passed to WIDHandler.processWorkDefinitionsContent method"); //$NON-NLS-1$ |
| throw widException; |
| } |
| if (widMap != null) { |
| widMap.clear(); |
| } |
| |
| String strings[] = content.split("[\n]+"); //$NON-NLS-1$ |
| int openBrackets = 0; |
| WorkItemDefinition currentWid = new WorkItemDefinitionImpl(); |
| |
| Section current = Section.PARAMETERS; |
| |
| for (int i = 0; i < strings.length; i++) { |
| String trim = strings[i].trim(); |
| if (trim.length() == 0) continue; |
| if (trim.startsWith("import ") || trim.startsWith("import\t")) { |
| // collect "import" statements so we can resolve fully qualified class names |
| // in Parameters and Results types |
| String fullyQualifiedClassName = trim.substring(7, trim.length()-1); |
| currentWid.addImport(fullyQualifiedClassName); |
| } |
| |
| if (trim.startsWith("[") || trim.endsWith("[") || trim.endsWith(":")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ |
| if (trim.endsWith(":") && i < strings.length - 1) { //$NON-NLS-1$ |
| trim = strings[i].trim() + strings[i+1].trim(); |
| } else { |
| openBrackets++; |
| } |
| String[] nameValue = trim.split("[:]+"); //$NON-NLS-1$ |
| if (nameValue.length == 2) { |
| String name = nameValue[0].replace('"', ' ').trim(); |
| if (name.equalsIgnoreCase("parameters")) { //$NON-NLS-1$ |
| current = Section.PARAMETERS; |
| } else if (name.equalsIgnoreCase("results")) { //$NON-NLS-1$ |
| current = Section.RESULTS; |
| } else if (name.equalsIgnoreCase("dependencies")) { //$NON-NLS-1$ |
| current = Section.DEPENDENCIES; |
| } |
| } |
| } |
| if (trim.startsWith("]") || trim.endsWith("]")) { //$NON-NLS-1$ //$NON-NLS-2$ |
| openBrackets--; |
| if (openBrackets == 1) { |
| if (currentWid != null && currentWid.getName() != null) { |
| widMap.add(currentWid); |
| } |
| currentWid = new WorkItemDefinitionImpl(); |
| } |
| } |
| if (trim.contains(":")) { //$NON-NLS-1$ |
| String[] nameValue = trim.split("[:]+"); //$NON-NLS-1$ |
| if (nameValue.length == 2 || nameValue.length == 3) { |
| String name = nameValue[0].replace('"', ' ').trim(); |
| int valueIndex = 1; |
| if (nameValue.length == 3) { |
| valueIndex = 2; |
| name = name + ':' + nameValue[1].replace('"', ' ').trim(); |
| } |
| String stringValue = nameValue[valueIndex].replace('"', ' ').replace(',', ' '). |
| replace('[',' ').trim(); |
| if (openBrackets == 2 && stringValue.trim().length() > 0) { |
| if (name.equalsIgnoreCase("name")) { //$NON-NLS-1$ |
| currentWid.setName(stringValue); |
| } else if (name.equalsIgnoreCase("displayName")) { //$NON-NLS-1$ |
| currentWid.setDispalyName(stringValue); |
| } else if (name.equalsIgnoreCase("description")) { //$NON-NLS-1$ |
| currentWid.setDescription(stringValue); |
| } else if (name.equalsIgnoreCase("category")) { //$NON-NLS-1$ |
| currentWid.setCategory(stringValue); |
| } else if (name.equalsIgnoreCase("icon")) { //$NON-NLS-1$ |
| currentWid.setIcon(stringValue); |
| } else if (name.equalsIgnoreCase("customEditor")) { //$NON-NLS-1$ |
| currentWid.setCustomEditor(stringValue); |
| } else if (name.equalsIgnoreCase("eclipse:customEditor")) { //$NON-NLS-1$ |
| currentWid.setEclipseCustomEditor(stringValue); |
| } |
| } else if (openBrackets == 3 && stringValue.trim().length() > 0) { |
| WorkItemDefinition.Parameter parameter = new WorkItemDefinition.Parameter(); |
| if (stringValue.startsWith("new") && stringValue.indexOf("(")>0) { //$NON-NLS-1$ //$NON-NLS-2$ |
| int index = stringValue.indexOf("("); //$NON-NLS-1$ |
| stringValue = stringValue.substring(3,index).trim(); |
| // look up the DataType in the registry and replace the DataType |
| // name with its Java type equivalent name |
| String fqn = currentWid.findImport(stringValue); |
| if (fqn!=null) |
| parameter.type = fqn; |
| else |
| parameter.type = stringValue; |
| // the parameter's value (a drools-core DataType object) will be constructed |
| // at the time the WorkEditor is created. We can't do it here because we don't |
| // have access to the JavaProject in which the WorkEditor java class is defined. |
| } |
| else { |
| parameter.type = "java.lang.String"; |
| parameter.value = stringValue; |
| } |
| if (current == Section.PARAMETERS) |
| currentWid.getParameters().put(name, parameter); |
| else if (current == Section.RESULTS) |
| currentWid.getResults().put(name, parameter); |
| } |
| } |
| } |
| } |
| |
| return widMap; |
| } |
| |
| } |