|
What this is
Other links
The source code
/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is NetBeans. The Initial Developer of the Original
* Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.vcs.advanced.commands;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.lang.ref.Reference;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.w3c.dom.*;
import org.openide.ErrorManager;
import org.netbeans.spi.vcs.commands.CommandSupport;
import org.netbeans.modules.vcscore.cmdline.UserCommand;
import org.netbeans.modules.vcscore.cmdline.UserCommandSupport;
import org.netbeans.modules.vcscore.cmdline.exec.StructuredExec;
import org.netbeans.modules.vcscore.commands.VcsCommand;
import org.netbeans.modules.vcscore.commands.CommandExecutionContext;
import org.netbeans.modules.vcscore.commands.CommandExecutorSupport;
import org.netbeans.modules.vcscore.commands.CommandsTree;
import org.netbeans.modules.vcscore.util.VcsUtilities;
import org.netbeans.modules.vcs.advanced.commands.ConditionedCommandsBuilder.ConditionedCommand;
import org.netbeans.modules.vcs.advanced.commands.ConditionedCommandsBuilder.ConditionedPropertiesCommand;
import org.netbeans.modules.vcs.advanced.commands.ConditionedCommandsBuilder.ConditionedProperty;
import org.netbeans.modules.vcs.advanced.conditioned.ConditionedStructuredExec;
import org.netbeans.modules.vcs.advanced.variables.Condition;
import org.netbeans.modules.vcs.advanced.variables.VariableIO;
/**
* This class provides input/output of commands from/to xml file.
*
* @author Martin Entlicher
*/
public class UserCommandIO extends Object {
//public static final String LABEL_TAG = "label";
public static final String COMMANDS_TAG = "commands"; // NOI18N
public static final String GLOBAL_COMMANDS_TAG = "globalCommands"; // NOI18N
public static final String COMMAND_TAG = "command"; // NOI18N
public static final String COMMAND_NAME_ATTR = "name"; // NOI18N
public static final String COMMAND_DISPLAY_NAME_ATTR = "displayName"; // NOI18N
public static final String SEPARATOR_TAG = "separator"; // NOI18N
public static final String PROPERTY_TAG = "property"; // NOI18N
public static final String PROPERTY_NAME_ATTR = "name"; // NOI18N
public static final String PROPERTY_VALUE_TAG = "value"; // NOI18N
public static final String RUN_TAG = "run"; // NOI18N
public static final String RUN_DIR_ATTR = "dir"; // NOI18N
public static final String EXEC_TAG = "executable"; // NOI18N
public static final String EXEC_VALUE_ATTR = "value"; // NOI18N
public static final String ARG_TAG = "arg"; // NOI18N
public static final String ARG_VALUE_ATTR = "value"; // NOI18N
public static final String ARG_LINE_ATTR = "line"; // NOI18N
public static final String IF_ATTR = "if"; // NOI18N
public static final String UNLESS_ATTR = "unless"; // NOI18N
private static final String ROOT_CMD_NAME = "ROOT_CMD"; // NOI18N
/** Creates new UserCommandIO, since it contains only static methods,
* the class should never be instantiated. */
private UserCommandIO() {
}
public static String convertStringArray2String(String[] array) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < array.length; i++) {
String item;
if (array[i] != null) {
item = org.openide.util.Utilities.replaceString(array[i], "/", "//");
} else {
item = "";
}
buf.append(item);
if (i < array.length - 1) buf.append("/");
}
return buf.toString();
}
public static String[] convertString2StringArray(String str) {
ArrayList list = new ArrayList();
for (int index = 0; index < str.length(); ) {
int delim;
int pos = index;
while (true) {
delim = str.indexOf("/", pos);
if (delim < 0) delim = str.length();
else if (delim < str.length() && str.charAt(delim + 1) == '/') {
pos = delim + 2;
continue;
}
break;
}
list.add(org.openide.util.Utilities.replaceString(str.substring(index, delim), "//", "/"));
index = delim + 1;
}
if (list.size() == 0) {
return new String[1];
} else {
return (String[]) list.toArray(new String[0]);
}
}
public static Object getPropertyValue(String[] resourceBundles, String name, String valueStr) {
Class type = CommandNode.getPropertyClass(name);
if (Boolean.TYPE.equals(type)) {
return Boolean.valueOf(valueStr);
} else if (Integer.TYPE.equals(type)) {
Integer intObject;
try {
int intValue = Integer.parseInt(valueStr);
intObject = new Integer(intValue);
} catch (NumberFormatException exc) {
intObject = null;
}
return intObject;
} else if (String.class.equals(type)) {
if (VcsCommand.PROPERTY_INPUT_DESCRIPTOR.equals(name)) {
return valueStr;
} else {
return VcsUtilities.getBundleString(resourceBundles, valueStr);
}
} else if (String[].class.equals(type)) {
return convertString2StringArray(valueStr);
} else return valueStr;
}
private static String getPropertyValueStr(String name, Object value) {
if (name.indexOf(VcsCommand.PROP_NAME_FOR_INTERNAL_USE_ONLY) >= 0) return null;
Class type = CommandNode.getPropertyClass(name);
if (String[].class.equals(type)) {
return convertStringArray2String((String[]) value);
}
return value.toString();
}
/**
* Read the commands definitions from the document and create the tree of commands.
*/
public static ConditionedCommands readCommands(Document doc, CommandExecutionContext fileSystem) throws DOMException {
Element rootElem = doc.getDocumentElement();
if (!VariableIO.CONFIG_ROOT_ELEM.equals(rootElem.getNodeName())) return null;
NodeList labelList = rootElem.getElementsByTagName(VariableIO.LABEL_TAG);
Node labelNode = null;
if (labelList.getLength() > 0) {
labelNode = labelList.item(0);
}
NodeList commandsList = rootElem.getElementsByTagName(COMMANDS_TAG);
if (commandsList.getLength() > 0) {
Node commands = commandsList.item(0);
commandsList = commands.getChildNodes();
//getCommands(children, commandsList);
} else commandsList = null;
return readCommands(labelNode, commandsList, fileSystem);
}
/**
* Read the global commands definitions from the document and create the tree of commands.
*/
public static ConditionedCommands readGlobalCommands(Document doc) throws DOMException {
Element rootElem = doc.getDocumentElement();
if (!VariableIO.CONFIG_ROOT_ELEM.equals(rootElem.getNodeName())) return null;
NodeList labelList = rootElem.getElementsByTagName(VariableIO.LABEL_TAG);
Node labelNode = null;
if (labelList.getLength() > 0) {
labelNode = labelList.item(0);
}
NodeList commandsList = rootElem.getElementsByTagName(GLOBAL_COMMANDS_TAG);
if (commandsList.getLength() > 0) {
Node commands = commandsList.item(0);
commandsList = commands.getChildNodes();
//getCommands(children, commandsList);
} else commandsList = null;
return readCommands(labelNode, commandsList, null);
}
public static ConditionedCommands readCommands(Node labelNode, NodeList commandsList,
CommandExecutionContext execContext) throws DOMException {
CommandsTree rootCommandNode = null;
String label = "";
if (labelNode != null) {
NodeList textList = labelNode.getChildNodes();
if (textList.getLength() > 0) {
Node subNode = textList.item(0);
if (subNode instanceof Text) {
Text textNode = (Text) subNode;
label = VcsUtilities.getBundleString(textNode.getData());
}
}
}
UserCommand rootCmd = new UserCommand();
rootCmd.setName(ROOT_CMD_NAME);
rootCmd.setDisplayName(label);
rootCommandNode = new CommandsTree(new UserCommandSupport(rootCmd, execContext));
ConditionedCommandsBuilder ccb = new ConditionedCommandsBuilder(rootCommandNode);
if (commandsList != null) getCommands(rootCommandNode, ccb, commandsList,
execContext);
return ccb.getConditionedCommands();
}
private static void getCommands(CommandsTree cmdTree, ConditionedCommandsBuilder ccb,
NodeList commandsList, CommandExecutionContext execContext) throws DOMException {
int n = commandsList.getLength();
for (int i = 0; i < n; i++) {
Node commandNode = commandsList.item(i);
if (SEPARATOR_TAG.equals(commandNode.getNodeName())) {
cmdTree.add(CommandsTree.EMPTY);
//children.add(new org.openide.nodes.Node[] { new VcsCommandNode(Children.LEAF, null) });
continue;
}
if (!COMMAND_TAG.equals(commandNode.getNodeName())) continue; // Ignore nodes that does not contain commands
NamedNodeMap attrs = commandNode.getAttributes();
if (attrs.getLength() == 0) continue;
Node nameNode = attrs.getNamedItem(COMMAND_NAME_ATTR);
if (nameNode == null) continue;
UserCommand cmd = new UserCommand();
String name = nameNode.getNodeValue();
cmd.setName(name);
//cmd.setName(nameNode.getNodeValue());
nameNode = attrs.getNamedItem(COMMAND_DISPLAY_NAME_ATTR);
if (nameNode != null) {
String displayName = VcsUtilities.getBundleString(nameNode.getNodeValue());
cmd.setDisplayName(displayName);
} else cmd.setDisplayName(null);
String ifAttr = "";
String unlessAttr = "";
Node ifNode = attrs.getNamedItem(IF_ATTR);
if (ifNode != null) ifAttr = ifNode.getNodeValue();
Node unlessNode = attrs.getNamedItem(UNLESS_ATTR);
if (unlessNode != null) unlessAttr = unlessNode.getNodeValue();
Condition c = VariableIO.createCondition(name, ifAttr, unlessAttr);
NodeList propertiesAndSubCommands = commandNode.getChildNodes();
List conditionedProperties = new ArrayList();
boolean subcommandsExist = getProperties(cmd, propertiesAndSubCommands,
conditionedProperties);
UserCommandSupport cmdSupp = new UserCommandSupport(cmd, execContext);
if (subcommandsExist) {
CommandsTree subTree = new CommandsTree(cmdSupp);
cmdTree.add(subTree);
getCommands(subTree, ccb,
propertiesAndSubCommands, execContext);
} else {
cmdTree.add(new CommandsTree(cmdSupp));
}
if (c != null) ccb.addConditionedCommand(cmdSupp, c);
if (conditionedProperties.size() > 0) {
for (Iterator it = conditionedProperties.iterator(); it.hasNext(); ) {
ConditionedCommandsBuilder.ConditionedProperty property =
(ConditionedCommandsBuilder.ConditionedProperty) it.next();
ccb.addPropertyToCommand(name, c, property);
}
}
}
}
private static boolean getProperties(UserCommand cmd, NodeList propertiesAndSubCommands,
Collection conditionedProperties) {
int m = propertiesAndSubCommands.getLength();
boolean subcommandsExist = false;
for (int j = 0; j < m; j++) {
Node propertyNode = propertiesAndSubCommands.item(j);
String name = propertyNode.getNodeName();
if (PROPERTY_TAG.equals(name)) {
readProperty(propertyNode, cmd, conditionedProperties);
} else if (RUN_TAG.equals(name)) {
readStructuredExec(propertyNode, cmd, conditionedProperties);
} else if (COMMAND_TAG.equals(name)) {
subcommandsExist = true;
}
}
return subcommandsExist;
}
private static void readProperty(Node propertyNode, UserCommand cmd, Collection conditionedProperties) throws DOMException {
String propertyName = null;
NamedNodeMap propAttrs = propertyNode.getAttributes();
if (propAttrs.getLength() > 0) {
Node nameAttr = propAttrs.getNamedItem(PROPERTY_NAME_ATTR);
if (nameAttr != null) {
propertyName = nameAttr.getNodeValue();
}
}
if (propertyName == null) return ;
String ifAttr = "";
String unlessAttr = "";
Node ifNode = propAttrs.getNamedItem(IF_ATTR);
if (ifNode != null) ifAttr = ifNode.getNodeValue();
Node unlessNode = propAttrs.getNamedItem(UNLESS_ATTR);
if (unlessNode != null) unlessAttr = unlessNode.getNodeValue();
Map valuesByConditions = new IdentityHashMap();
Condition c = VariableIO.createCondition(cmd.getName() + "/" + propertyName, ifAttr, unlessAttr);
String propertyValue = "";
NodeList valueList = propertyNode.getChildNodes();
int vln = valueList.getLength();
for (int k = 0; k < vln; k++) {
Node valueNode = valueList.item(k);
if (PROPERTY_VALUE_TAG.equals(valueNode.getNodeName())) {
NodeList textList = valueNode.getChildNodes();
//System.out.println("property = "+propertyName+", textList.getLength() = "+textList.getLength());
for (int itl = 0; itl < textList.getLength(); itl++) {
Node subNode = textList.item(itl);
//System.out.println(" subNode = "+subNode);
if (subNode instanceof Text) {
Text textNode = (Text) subNode;
propertyValue += textNode.getData();
}
if (subNode instanceof EntityReference) {
EntityReference entityNode = (EntityReference) subNode;
//System.out.println("Have EntityReference = "+entityNode+", value = "+entityNode.getNodeValue());
NodeList entityList = entityNode.getChildNodes();
for (int iel = 0; iel < entityList.getLength(); iel++) {
Node entitySubNode = entityList.item(iel);
//System.out.println(" entitySubNode = "+entitySubNode);
if (entitySubNode instanceof Text) {
Text textEntityNode = (Text) entitySubNode;
propertyValue += textEntityNode.getData();
}
}
}
//System.out.println(" propertyValue = "+propertyValue);
}
String valueIfAttr = "";
String valueUnlessAttr = "";
NamedNodeMap valueAttrs = valueNode.getAttributes();
if (valueAttrs != null) {
Node valueIfNode = valueAttrs.getNamedItem(IF_ATTR);
if (valueIfNode != null) valueIfAttr = valueIfNode.getNodeValue();
Node valueUnlessNode = valueAttrs.getNamedItem(UNLESS_ATTR);
if (valueUnlessNode != null) valueUnlessAttr = valueUnlessNode.getNodeValue();
}
Condition vc = VariableIO.createCondition(cmd.getName() + "/" + propertyName, valueIfAttr, valueUnlessAttr);
propertyValue = translateCommandProperty(propertyName, propertyValue);
valuesByConditions.put(vc, getPropertyValue(null, propertyName, propertyValue));
propertyValue = "";
}
}
Object value = valuesByConditions.get(null);
if (value != null) {
Condition cond = c;
if (valuesByConditions.size() > 1) {
cond = VariableIO.createComplementaryCondition(cmd.getName() + "/" + propertyName, c, valuesByConditions.keySet());
}
if (cond != null) {
valuesByConditions.put(cond, value);
valuesByConditions.remove(null);
} else {
valuesByConditions = null;
}
}
if (valuesByConditions == null) {
cmd.setProperty(propertyName, value);
} else {
if (c != null) {
for (Iterator it = valuesByConditions.keySet().iterator(); it.hasNext(); ) {
Condition vc = (Condition) it.next();
if (!vc.equals(c)) {
vc.addCondition(c, true);
}
}
}
conditionedProperties.add(
new ConditionedCommandsBuilder.ConditionedProperty(propertyName,
c,
valuesByConditions));
}
}
private static void readStructuredExec(Node runNode, UserCommand cmd, Collection conditionedProperties) throws DOMException {
String dir = null;
NamedNodeMap dirAttrs = runNode.getAttributes();
if (dirAttrs.getLength() > 0) {
Node dirAttr = dirAttrs.getNamedItem(RUN_DIR_ATTR);
if (dirAttr != null) {
dir = dirAttr.getNodeValue();
}
}
String ifAttr = "";
String unlessAttr = "";
Node ifNode = dirAttrs.getNamedItem(IF_ATTR);
if (ifNode != null) ifAttr = ifNode.getNodeValue();
Node unlessNode = dirAttrs.getNamedItem(UNLESS_ATTR);
if (unlessNode != null) unlessAttr = unlessNode.getNodeValue();
Condition c = VariableIO.createCondition(cmd.getName() + "/" + VcsCommand.PROPERTY_EXEC_STRUCTURED, ifAttr, unlessAttr);
Map execsByConditions = new IdentityHashMap();
//StructuredExec exec = new StructuredExec((dir != null) ? new java.io.File(dir) : null, "", new StructuredExec.Argument[0]);
NodeList execArgsList = runNode.getChildNodes();
int ean = execArgsList.getLength();
for (int k = 0; k < ean; k++) {
Node eaNode = execArgsList.item(k);
if (EXEC_TAG.equals(eaNode.getNodeName())) {
NamedNodeMap execAttributes = eaNode.getAttributes();
if (execAttributes == null) continue;
Node execValue = execAttributes.getNamedItem(EXEC_VALUE_ATTR);
if (execValue == null) continue;
String execStr = execValue.getNodeValue();
StructuredExec exec = new StructuredExec((dir != null) ? new java.io.File(dir) : null, execStr, new StructuredExec.Argument[0]);
String execIfAttr = "";
String execUnlessAttr = "";
Node execIfNode = execAttributes.getNamedItem(IF_ATTR);
if (execIfNode != null) execIfAttr = execIfNode.getNodeValue();
Node execUnlessNode = execAttributes.getNamedItem(UNLESS_ATTR);
if (execUnlessNode != null) execUnlessAttr = execUnlessNode.getNodeValue();
Condition ec = VariableIO.createCondition(cmd.getName() + "/" + VcsCommand.PROPERTY_EXEC_STRUCTURED + "/executor",
execIfAttr, execUnlessAttr);
execsByConditions.put(ec, exec);
} else if (ARG_TAG.equals(eaNode.getNodeName())) {
NamedNodeMap argAttributes = eaNode.getAttributes();
if (argAttributes == null) continue;
Node argValue = argAttributes.getNamedItem(ARG_VALUE_ATTR);
Node argLine = argAttributes.getNamedItem(ARG_LINE_ATTR);
//String argValueStr = null;
String argStr = null;
boolean line = false;
if (argValue != null) {
argStr = argValue.getNodeValue();
} else if (argLine != null) {
argStr = argLine.getNodeValue();
line = true;
}
//if (argValueStr == null && argLineStr == null) continue;
if (argStr == null) continue;
String argIfAttr = "";
String argUnlessAttr = "";
Node argIfNode = argAttributes.getNamedItem(IF_ATTR);
if (argIfNode != null) argIfAttr = argIfNode.getNodeValue();
Node argUnlessNode = argAttributes.getNamedItem(UNLESS_ATTR);
if (argUnlessNode != null) argUnlessAttr = argUnlessNode.getNodeValue();
Condition ac = VariableIO.createCondition(cmd.getName() + "/" + VcsCommand.PROPERTY_EXEC_STRUCTURED + "/arg",
argIfAttr, argUnlessAttr);
StructuredExec.Argument arg;
if (ac == null) {
arg = new StructuredExec.Argument(argStr, line);
} else {
arg = new ConditionedStructuredExec.ConditionedArgument(ac, argStr, line);
}
//for (Iterator it = execsByConditions.values().iterator(); it.hasNext(); ) {
for (Iterator it = execsByConditions.keySet().iterator(); it.hasNext(); ) {
Condition cc = (Condition) it.next();
StructuredExec exec = (StructuredExec) execsByConditions.get(cc);
if (arg instanceof ConditionedStructuredExec.ConditionedArgument &&
!(exec instanceof ConditionedStructuredExec)) {
exec = new ConditionedStructuredExec(exec.getWorking(), exec.getExecutable(), exec.getArguments());
execsByConditions.put(cc, exec);
}
exec.addArgument(arg);
}
}
}
if (execsByConditions.size() == 1 && execsByConditions.get(null) != null) {
cmd.setProperty(VcsCommand.PROPERTY_EXEC_STRUCTURED, execsByConditions.get(null));
} else {
if (c != null) {
for (Iterator it = execsByConditions.keySet().iterator(); it.hasNext(); ) {
Condition vc = (Condition) it.next();
if (!vc.equals(c)) {
vc.addCondition(c, true);
}
}
}
conditionedProperties.add(
new ConditionedCommandsBuilder.ConditionedProperty(VcsCommand.PROPERTY_EXEC_STRUCTURED,
c,
execsByConditions));
}
}
/**
* Write the commands definitions to the document from the tree of commands.
*/
public static boolean writeCommands(Document doc, CommandsTree commands) throws DOMException {
return writeCommands(doc, null, commands);
}
/**
* Write the commands definitions to the document from the tree of commands.
*/
public static boolean writeCommands(Document doc, ConditionedCommands commands) throws DOMException {
return writeCommands(doc, commands, commands.getCommands());
}
private static boolean writeCommands(Document doc, ConditionedCommands commands,
CommandsTree tree) throws DOMException {
Element rootElem = doc.getDocumentElement();
if (!VariableIO.CONFIG_ROOT_ELEM.equals(rootElem.getNodeName())) return false;
Element commandsElm = doc.createElement(COMMANDS_TAG);
putCommands(doc, commandsElm, commands, tree, null);
rootElem.appendChild(commandsElm);
return true;
}
/**
* Write the global commands definitions to the document from the tree of commands.
*/
public static boolean writeGlobalCommands(Document doc, ConditionedCommands commands) throws DOMException {
Element rootElem = doc.getDocumentElement();
if (!VariableIO.CONFIG_ROOT_ELEM.equals(rootElem.getNodeName())) return false;
Element commandsElm = doc.createElement(GLOBAL_COMMANDS_TAG);
putCommands(doc, commandsElm, commands,
commands.getCommands(), null);
rootElem.appendChild(commandsElm);
return true;
}
private static void putCommands(Document doc, org.w3c.dom.Node commands,
ConditionedCommands cc, CommandsTree commandsNode,
Collection notFoundConditions) {
if (notFoundConditions == null) notFoundConditions = new HashSet();
CommandsTree[] commandChildren = commandsNode.children();
for (int i = 0; i < commandChildren.length; i++) {
CommandsTree commandNode = commandChildren[i];
CommandSupport supp = commandNode.getCommandSupport();
//VcsCommand cmd = (VcsCommand) commandNode.getCookie(VcsCommand.class);
if (supp == null || !(supp instanceof UserCommandSupport)) {
Element separatorElem = doc.createElement(SEPARATOR_TAG);
commands.appendChild(separatorElem);
continue;
}
UserCommandSupport uSupport = (UserCommandSupport) supp;
VcsCommand cmd = uSupport.getVcsCommand();
ConditionedCommand ccmd = null;
if (cc != null) {
ccmd = cc.getConditionedCommand(cmd.getName());
}
if (ccmd != null) {
Condition[] conditions = ccmd.getConditions();
for (int ic = 0; ic < conditions.length; ic++) {
ConditionedPropertiesCommand cpcmd = ccmd.getCommandFor(conditions[ic]);
// Test the command so that we find the right one!
if (!uSupport.equals(cpcmd.getCommand())) continue;
Element commandElm = doc.createElement(COMMAND_TAG);
commandElm.setAttribute(COMMAND_NAME_ATTR, cmd.getName());
String displayName = cmd.getDisplayName();
if (displayName != null) commandElm.setAttribute(COMMAND_DISPLAY_NAME_ATTR, displayName);
if (conditions[ic] != null) VariableIO.setConditionAttributes(commandElm, conditions[ic]);
putProperties(doc, commandElm, cpcmd);
if (commandNode.hasChildren()) putCommands(doc, commandElm, cc, commandNode, notFoundConditions);
commands.appendChild(commandElm);
}
} else {
Element commandElm = doc.createElement(COMMAND_TAG);
commandElm.setAttribute(COMMAND_NAME_ATTR, cmd.getName());
String displayName = cmd.getDisplayName();
if (displayName != null) commandElm.setAttribute(COMMAND_DISPLAY_NAME_ATTR, displayName);
putProperties(doc, commandElm, cmd);
if (commandNode.hasChildren()) putCommands(doc, commandElm, cc, commandNode, notFoundConditions);
commands.appendChild(commandElm);
}
}
}
private static void putProperties(Document doc, Element commandElm, VcsCommand cmd) throws DOMException {
String[] properties = cmd.getPropertyNames();
Arrays.sort(properties);
for (int j = 0; j < properties.length; j++) {
Object value = cmd.getProperty(properties[j]);
if (value == null) continue;
if (VcsCommand.PROPERTY_EXEC_STRUCTURED.equals(properties[j])) {
putStructuredExec(doc, commandElm, (StructuredExec) value);
continue;
}
String valueStr = getPropertyValueStr(properties[j], value);
if (valueStr == null) continue;
Element propertiesElm = doc.createElement(PROPERTY_TAG);
propertiesElm.setAttribute(PROPERTY_NAME_ATTR, properties[j]);
Element propValueElem = doc.createElement(PROPERTY_VALUE_TAG);
Text valueText = doc.createTextNode(valueStr);
propValueElem.appendChild(valueText);
propValueElem.setAttribute("xml:space","preserve"); // To preserve new lines (see issue #14163)
propertiesElm.appendChild(propValueElem);
commandElm.appendChild(propertiesElm);
}
}
private static void putProperties(Document doc, Element commandElm,
ConditionedPropertiesCommand cpcmd) throws DOMException {
VcsCommand cmd = cpcmd.getCommand().getVcsCommand();
String[] allProperties;
ConditionedProperty[] cproperties = cpcmd.getConditionedProperties();
Map conditionedPropertiesByNames;
if (cproperties != null) {
List properties = new ArrayList(Arrays.asList(cmd.getPropertyNames()));
conditionedPropertiesByNames = new HashMap();
for (int i = 0; i < cproperties.length; i++) {
String name = cproperties[i].getName();
if (!properties.contains(name)) properties.add(name);
conditionedPropertiesByNames.put(name, cproperties[i]);
}
allProperties = (String[]) properties.toArray(new String[properties.size()]);
} else {
conditionedPropertiesByNames = Collections.EMPTY_MAP;
allProperties = cmd.getPropertyNames();
}
Arrays.sort(allProperties);
for (int i = 0; i < allProperties.length; i++) {
ConditionedProperty property =
(ConditionedProperty) conditionedPropertiesByNames.get(allProperties[i]);
if (property != null) {
Condition c = property.getCondition();
Element propertyElm;
if (VcsCommand.PROPERTY_EXEC_STRUCTURED.equals(allProperties[i])) {
propertyElm = putStructuredExec(doc, commandElm, c,
property.getValuesByConditions());
} else {
propertyElm = putProperty(doc, commandElm, allProperties[i], c,
property.getValuesByConditions());
}
if (c != null) {
VariableIO.setConditionAttributes(propertyElm, c);
}
} else {
Object value = cmd.getProperty(allProperties[i]);
if (value == null) continue;
if (VcsCommand.PROPERTY_EXEC_STRUCTURED.equals(allProperties[i])) {
putStructuredExec(doc, commandElm, (StructuredExec) value);
continue;
}
String valueStr = getPropertyValueStr(allProperties[i], value);
if (valueStr == null) continue;
putProperty(doc, commandElm, allProperties[i], valueStr);
}
}
}
private static Element putProperty(Document doc, Element commandElm,
String name, String value) throws DOMException {
Element propertyElm = doc.createElement(PROPERTY_TAG);
propertyElm.setAttribute(PROPERTY_NAME_ATTR, name);
addPropertyValue(doc, propertyElm, value);
commandElm.appendChild(propertyElm);
return propertyElm;
}
private static Element putProperty(Document doc, Element commandElm, String name,
Condition c, Map valuesByConditions) throws DOMException {
Element propertyElm = doc.createElement(PROPERTY_TAG);
propertyElm.setAttribute(PROPERTY_NAME_ATTR, name);
for (Iterator it = valuesByConditions.keySet().iterator(); it.hasNext(); ) {
Condition vc = (Condition) it.next();
Object value = valuesByConditions.get(vc);
String valueStr = getPropertyValueStr(name, value);
if (valueStr == null) continue;
Element valueElem = addPropertyValue(doc, propertyElm, valueStr);
if (vc != null && !vc.equals(c)) VariableIO.setConditionAttributes(valueElem, vc);
}
commandElm.appendChild(propertyElm);
return propertyElm;
}
private static Element addPropertyValue(Document doc, Element propertyElm, String value) {
Element propValueElem = doc.createElement(PROPERTY_VALUE_TAG);
Text valueNode = doc.createTextNode(value);
propValueElem.appendChild(valueNode);
propValueElem.setAttribute("xml:space","preserve"); // To preserve new lines (see issue #14163)
propertyElm.appendChild(propValueElem);
return propValueElem;
}
private static Element putStructuredExec(Document doc, Element commandElm, StructuredExec exec) throws DOMException {
Element runElm = doc.createElement(RUN_TAG);
if (exec.getWorking() != null) {
runElm.setAttribute(RUN_DIR_ATTR, exec.getWorking().getPath());
}
Element execElm = doc.createElement(EXEC_TAG);
execElm.setAttribute(EXEC_VALUE_ATTR, exec.getExecutable());
runElm.appendChild(execElm);
addArguments(doc, runElm, exec.getArguments());
commandElm.appendChild(runElm);
return runElm;
}
private static Element putStructuredExec(Document doc, Element commandElm,
Condition c, Map execsByConditions) throws DOMException {
Element runElm = doc.createElement(RUN_TAG);
if (execsByConditions.size() == 0) return runElm;
String working = ((StructuredExec) execsByConditions.values().iterator().next()).getWorking().getPath();
runElm.setAttribute(RUN_DIR_ATTR, working);
for (Iterator it = execsByConditions.keySet().iterator(); it.hasNext(); ) {
Condition ec = (Condition) it.next();
StructuredExec exec = (StructuredExec) execsByConditions.get(ec);
Element execElm = doc.createElement(EXEC_TAG);
execElm.setAttribute(EXEC_VALUE_ATTR, exec.getExecutable());
runElm.appendChild(execElm);
if (ec != null && !ec.equals(c)) VariableIO.setConditionAttributes(execElm, ec);
addArguments(doc, runElm, exec.getArguments());
commandElm.appendChild(runElm);
}
return runElm;
}
private static void addArguments(Document doc, Element runElm, StructuredExec.Argument[] args) throws DOMException {
for (int i = 0; i < args.length; i++) {
Element argElm = doc.createElement(ARG_TAG);
if (args[i].isLine()) {
argElm.setAttribute(ARG_LINE_ATTR, args[i].getArgument());
} else {
argElm.setAttribute(ARG_VALUE_ATTR, args[i].getArgument());
}
if (args[i] instanceof ConditionedStructuredExec.ConditionedArgument) {
Condition c = ((ConditionedStructuredExec.ConditionedArgument) args[i]).getCondition();
VariableIO.setConditionAttributes(argElm, c);
}
runElm.appendChild(argElm);
}
}
/**
* Perform a translation of command's property value. Currently just class names
* are translated according to a translation table.
*/
public static String translateCommandProperty(String propertyName, String propertyValue) {
if (UserCommand.PROPERTY_EXEC.equals(propertyName)) {
int classIndex = propertyValue.indexOf(".class");
if (classIndex > 0) {
int begin;
for (begin = classIndex; begin >= 0; begin--) {
char c = propertyValue.charAt(begin);
if (!Character.isJavaIdentifierPart(c) && c != '.') break;
}
begin++;
if (begin < classIndex) {
String classNameOrig = propertyValue.substring(begin, classIndex);
String classNameNew = translateExecClass(classNameOrig);
if (!classNameOrig.equals(classNameNew)) {
propertyValue = propertyValue.substring(0, begin) + classNameNew + propertyValue.substring(classIndex);
}
}
}
}
return propertyValue;
}
private static Reference translateMapRef = new SoftReference(null);
private static final Object MAP_LOCK = new Object();
/**
* Translates an old class name (starting with "vcs.*") to the new class name
* ("org.netbeans.modules.vcs.profiles.*") according to the translation table
* at org/netbeans/modules/vcs/advanced/commands/cmdPackageTranslations
*/
public static String translateExecClass(String className) {
String[][] map;
synchronized (MAP_LOCK) {
map = (String[][]) translateMapRef.get();
if (map == null) {
try {
map = loadTranslateClassMap();
} catch (IOException ioex) {
if (ErrorManager.getDefault() != null) {
ErrorManager.getDefault().notify (ErrorManager.INFORMATIONAL, ioex);
} else {
ioex.printStackTrace();
}
}
translateMapRef = new SoftReference(map);
}
}
// search for "the" name
final int mapsize = map.length;
for (int i = 0; i < mapsize; i++) {
if (className.startsWith(map[i][0])) {
String newClassName;
//if (arrayPrefix < 0) {
newClassName = map[i][1] + className.substring(map[i][0].length());
//} else {
// newClassName = className.substring(0, arrayPrefix) + map[i][1] + name.substring(map[i][0].length());
//}
className = newClassName;
}
}/* catch (IOException e) {
if (ErrorManager.getDefault() != null) {
ErrorManager.getDefault().notify (ErrorManager.INFORMATIONAL, e);
} else {
e.printStackTrace();
}
} */
// default
return className;
}
private static String[][] loadTranslateClassMap() throws IOException {
URL table = UserCommandIO.class.getResource("cmdPackageTranslations.txt"); //NOI18N
ArrayList chunks = new ArrayList();
loadTranslationFile(table, chunks);
// post process
Collections.sort(chunks, new StringArrayComparator());
final int pairslen = chunks.size();
String[][] mapping = new String[pairslen][2];
for (int i = 0; i < pairslen; i++) {
String[] chunk = (String[]) chunks.get(i);
mapping[i][0] = chunk[0];
mapping[i][1] = chunk[1];
}
return mapping;
}
/**
* Load single translation file.
* @param resource URL identifiing transaction table
* @param chunks output parameter accepting loaded data
*/
private static void loadTranslationFile(URL resource, List chunks) throws IOException {
BufferedReader reader =
new BufferedReader(new InputStreamReader( resource.openStream(), "UTF8")); // use explicit encoding //NOI18N
for (;;) {
String line = reader.readLine();
String[] pair = parseLine(line);
if (pair == null) { // EOF
break;
}
chunks.add(pair);
}
}
private static String[] parseLine(final String line) {
if (line == null) {
return null;
}
final int slen = line.length();
int space = line.indexOf(' ');
if (space <= 0 || (space == slen - 1)) {
return null;
}
String[] chunk = new String[] {line.substring(0, space), null};
space++;
int c;
while ((space < slen) && (line.charAt(space++) == ' '));
if (space == slen) {
return null;
}
String token = line.substring(--space);
token = token.trim();
chunk[1] = token;
return chunk;
}
/** Compares to object by length of String returned by toString(). */
private static final class StringArrayComparator implements Comparator {
public boolean equals(Object o) {
return super.equals(o);
}
public int compare(Object o1, Object o2) {
String[] s1 = (String[]) o1;
String[] s2 = (String[]) o2;
return (s2[0].length() - s1[0].length());
}
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.