You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oozie.apache.org by vi...@apache.org on 2012/08/27 07:46:57 UTC

svn commit: r1377572 [2/4] - in /incubator/oozie/trunk: ./ workflowgenerator/ workflowgenerator/src/ workflowgenerator/src/main/ workflowgenerator/src/main/assemblies/ workflowgenerator/src/main/java/ workflowgenerator/src/main/java/org/ workflowgenera...

Added: incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/PropertyTable.java
URL: http://svn.apache.org/viewvc/incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/PropertyTable.java?rev=1377572&view=auto
==============================================================================
--- incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/PropertyTable.java (added)
+++ incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/PropertyTable.java Mon Aug 27 05:46:54 2012
@@ -0,0 +1,602 @@
+package org.apache.oozie.tools.workflowgenerator.client.property;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.oozie.tools.workflowgenerator.client.OozieDiagramController;
+import org.apache.oozie.tools.workflowgenerator.client.widget.NodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.EmailActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.FSActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.JavaActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.MapReduceActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.PigActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.PipesActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.SSHActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.ShellActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.StreamingActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.SubWFActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.DecisionNodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.EndNodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.ForkNodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.JoinNodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.KillNodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.StartNodeWidget;
+import com.google.gwt.cell.client.ButtonCell;
+import com.google.gwt.cell.client.FieldUpdater;
+import com.google.gwt.cell.client.SelectionCell;
+import com.google.gwt.cell.client.TextInputCell;
+import com.google.gwt.event.dom.client.ChangeEvent;
+import com.google.gwt.event.dom.client.ChangeHandler;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.user.cellview.client.CellTable;
+import com.google.gwt.user.cellview.client.Column;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.ScrollPanel;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.view.client.ListDataProvider;
+import com.google.gwt.xml.client.Document;
+import com.google.gwt.xml.client.Element;
+import com.google.gwt.xml.client.Text;
+
+/**
+ * Base abstract class for property table;
+ */
+public abstract class PropertyTable extends ScrollPanel {
+
+    protected NodeWidget current;
+    protected TextBox name;
+    protected ListBox okVal;
+    protected ListBox errorVal;
+    protected TextBox jt;
+    protected TextBox nn;
+    protected List<NodeWidget> widgetDropDown;
+    protected HandlerRegistration handler;
+    protected Grid grid;
+
+    /**
+     * Constructor which records node widget
+     *
+     * @param w node widget
+     */
+    public PropertyTable(NodeWidget w) {
+        super();
+        this.current = w;
+    }
+
+    /**
+     * Update a list of other node widgets shown in "OK" drop-down, excluding
+     * start and kill nodes
+     */
+    public void updateWidgetDropDown() {
+
+        List<NodeWidget> widgetList = current.getGenerator().getWidgets();
+        OozieDiagramController controller = current.getController();
+
+        if (widgetDropDown == null) {
+            widgetDropDown = new ArrayList<NodeWidget>();
+        }
+        else {
+            widgetDropDown.clear();
+        }
+
+        if (widgetList != null) {
+            for (NodeWidget w : widgetList) {
+                if (!(w instanceof KillNodeWidget) && !(w instanceof StartNodeWidget) && w != current) {
+                    widgetDropDown.add(w);
+                }
+            }
+        }
+
+        // if okVal listbox doesn't exist, return
+        if (okVal != null) {
+            okVal.clear();
+        }
+        else {
+            return;
+        }
+        // insert empty option on top
+        okVal.addItem("");
+
+        for (int i = 0; i < widgetDropDown.size(); i++) {
+            NodeWidget w = widgetDropDown.get(i);
+            okVal.addItem(prettyItemString(w));
+            // option selected when this node widget is connected to the
+            // widget in a design panel
+            List<NodeWidget> neigh = controller.getCurrentNeighbor(current);
+            if (neigh != null && neigh.size() > 0 && w == neigh.get(0))
+                okVal.setSelectedIndex(i + 1);
+        }
+
+        // remove previous handler, otherwise, end up having multiple handlers
+        if (handler != null) {
+            handler.removeHandler();
+        }
+
+        handler = okVal.addChangeHandler(new ChangeHandler() {
+            @Override
+            public void onChange(ChangeEvent event) {
+                int selectedIndex = okVal.getSelectedIndex();
+                if (selectedIndex > 0) {
+                    NodeWidget target = widgetDropDown.get(selectedIndex - 1);
+                    current.getController().addConnection(current, target);
+                }
+
+            }
+        });
+    }
+
+    /**
+     * Update "Error" drop-down list, currently only includes default kill node
+     */
+    public void updateErrorDropDown() {
+
+        List<NodeWidget> widgetList = current.getGenerator().getWidgets();
+
+        if (errorVal == null) {
+            errorVal = new ListBox();
+        }
+        else {
+            errorVal.clear();
+        }
+
+        for (NodeWidget w : widgetList) {
+            if (w instanceof KillNodeWidget) {
+                errorVal.addItem(prettyItemString(w));
+                errorVal.setSelectedIndex(0);
+            }
+        }
+    }
+
+    /**
+     * Return an instance of a kill node
+     *
+     * @return
+     */
+    protected NodeWidget getKillNode() {
+
+        List<NodeWidget> widgetList = current.getGenerator().getWidgets();
+        NodeWidget node = null;
+        for (NodeWidget w : widgetList) {
+            if (w instanceof KillNodeWidget)
+                node = w;
+        }
+        return node;
+    }
+
+    /**
+     * Abstract method to generate xml elements and attach them to xml doc
+     *
+     * @param doc xml document
+     * @param root xml element under which generated xml elements are added
+     * @param next next node widget to be executed after this in workflow
+     */
+    public abstract void generateXML(Document doc, Element root, NodeWidget next);
+
+    /**
+     * Append a type of the node widget to its name for readability
+     *
+     * @param w
+     * @return
+     */
+    protected String prettyItemString(NodeWidget w) {
+        StringBuilder s = new StringBuilder();
+        s.append(w.getName());
+        s.append(" ");
+        if (w instanceof EndNodeWidget) {
+            s.append(" (End Node)");
+        }
+        else if (w instanceof ForkNodeWidget) {
+            s.append(" (Fork Node)");
+        }
+        else if (w instanceof JoinNodeWidget) {
+            s.append(" (Join Node)");
+        }
+        else if (w instanceof MapReduceActionWidget) {
+            s.append(" (MR Action)");
+        }
+        else if (w instanceof PigActionWidget) {
+            s.append(" (Pig Action)");
+        }
+        else if (w instanceof StreamingActionWidget) {
+            s.append(" (MR Streaming Action)");
+        }
+        else if (w instanceof PipesActionWidget) {
+            s.append(" (MR Pipes Action)");
+        }
+        else if (w instanceof JavaActionWidget) {
+            s.append(" (Java Action)");
+        }
+        else if (w instanceof FSActionWidget) {
+            s.append(" (FS Action)");
+        }
+        else if (w instanceof DecisionNodeWidget) {
+            s.append(" (Decision Node)");
+        }
+        else if (w instanceof KillNodeWidget) {
+            s.append(" (Kill Node)");
+        }
+        else if (w instanceof SSHActionWidget) {
+            s.append(" (SSH Node)");
+        }
+        else if (w instanceof SubWFActionWidget) {
+            s.append(" (SubWF Node)");
+        }
+        else if (w instanceof EmailActionWidget) {
+            s.append(" (Email Node)");
+        }
+        else if (w instanceof ShellActionWidget) {
+            s.append(" (Shell Node)");
+        }
+        return s.toString();
+    }
+
+    /**
+     * Set the width of widget
+     *
+     * @param w widget
+     * @return
+     */
+    protected Widget formatCell(Widget w) {
+        w.setWidth("300px");
+        return w;
+    }
+
+    /**
+     * Create an expandable sub table as a part of property table
+     *
+     * @param colname1 1st column name
+     * @param colname2 2nd column name
+     * @param data data list
+     * @param options listbox options, if null, text input cell used
+     * @return
+     */
+    protected CellTable<Property> createSubTable(String colname1, String colname2, List<Property> data,
+            List<String> options) {
+
+        final CellTable<Property> table = new CellTable<Property>();
+        final ListDataProvider<Property> dataProvider = new ListDataProvider<Property>();
+        dataProvider.setList(data);
+        dataProvider.addDataDisplay(table);
+
+        // add Name column
+        Column<Property, String> nameCol = null;
+
+        if (options == null) {
+            nameCol = new Column<Property, String>(new TextInputCell()) {
+                @Override
+                public String getValue(Property object) {
+                    return object.getName();
+                }
+            };
+        }
+        else {
+            nameCol = new Column<Property, String>(new SelectionCell(options)) {
+                @Override
+                public String getValue(Property object) {
+                    return object.getName();
+                }
+            };
+        }
+
+        // set event for updating value
+        nameCol.setFieldUpdater(new FieldUpdater<Property, String>() {
+            @Override
+            public void update(int index, Property object, String value) {
+                object.setName(value);
+            }
+        });
+        table.addColumn(nameCol, colname1);
+
+        // Add Value column
+        Column<Property, String> valueCol = new Column<Property, String>(new TextInputCell()) {
+            @Override
+            public String getValue(Property object) {
+                return object.getValue();
+            }
+        };
+
+        valueCol.setFieldUpdater(new FieldUpdater<Property, String>() {
+            @Override
+            public void update(int index, Property object, String value) {
+                object.setValue(value);
+            }
+        });
+        table.addColumn(valueCol, colname2);
+
+        // Button to add row
+        Column<Property, String> addCol = new Column<Property, String>(new ButtonCell()) {
+            @Override
+            public String getValue(Property object) {
+                return " + ";
+            }
+        };
+        addCol.setFieldUpdater(new FieldUpdater<Property, String>() {
+            @Override
+            public void update(int index, Property object, String value) {
+                dataProvider.getList().add(index + 1, new Property("", ""));
+            }
+        });
+
+        table.addColumn(addCol, "");
+
+        // Button to delete row
+        Column<Property, String> delCol = new Column<Property, String>(new ButtonCell()) {
+            @Override
+            public String getValue(Property object) {
+                return " - ";
+            }
+        };
+
+        delCol.setFieldUpdater(new FieldUpdater<Property, String>() {
+
+            @Override
+            public void update(int index, Property object, String value) {
+                List<Property> li = dataProvider.getList();
+                if (li.size() == 1) {
+                    Property p = li.get(0);
+                    p.setName("");
+                    p.setValue("");
+                    table.redraw();
+                }
+                else
+                    dataProvider.getList().remove(index);
+            }
+        });
+
+        table.addColumn(delCol, "");
+
+        return table;
+    }
+
+    /**
+     * Create an add button in a table
+     *
+     * @param table
+     * @return
+     */
+    protected Button createAddButton(Grid table) {
+        Button btn = new Button("+");
+        btn.getElement()
+                .setAttribute("style",
+                        "font-size:20px;margin:0px;padding:0px;-webkit-border-radius:10px;-moz-border-radius:10px;-border-radius:10px;");
+        return btn;
+    }
+
+    /**
+     * create a delete button in a table
+     *
+     * @param table
+     * @return
+     */
+    protected Button createDelButton(Grid table) {
+        Button btn = new Button("-");
+        btn.getElement()
+                .setAttribute("style",
+                        "font-size:20px;margin:0px;padding:0px;-webkit-border-radius:10px;-moz-border-radius:10px;-border-radius:10px;");
+        return btn;
+    }
+
+    /**
+     * Create a label with common format
+     *
+     * @param name
+     * @return
+     */
+    protected Label createLabel(String name) {
+        Label label = new Label(name);
+        label.setWidth("100px");
+        label.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
+        return label;
+    }
+
+    /**
+     * Generate xml elements of configuration
+     *
+     * @param list List of properties
+     * @param root xml element under which configuration tag is added
+     * @param doc xml document
+     */
+    protected void configToXML(List<Property> list, Element root, Document doc) {
+
+        Element confEle = null;
+
+        for (Property prop : list) {
+            if (prop.getName() != null && !prop.getName().matches("\\s*") && prop.getValue() != null
+                    && !prop.getValue().matches("\\s*")) {
+
+                if (confEle == null) {
+                    confEle = doc.createElement("configuration");
+                    root.appendChild(confEle);
+                }
+
+                // create <property>
+                Element propEle = doc.createElement("property");
+                confEle.appendChild(propEle);
+
+                // create <name>
+                Element nameEle = doc.createElement("name");
+                propEle.appendChild(nameEle);
+                nameEle.appendChild(doc.createTextNode(prop.getName()));
+
+                // create <value>
+                Element valEle = doc.createElement("value");
+                propEle.appendChild(valEle);
+                valEle.appendChild(doc.createTextNode(prop.getValue()));
+            }
+        }
+
+    }
+
+    /**
+     * Generate xml elements of prepare tag
+     *
+     * @param list list of properties
+     * @param root xml element under which prepare tag is added
+     * @param doc xml document
+     */
+    protected void prepareToXML(List<Property> list, Element root, Document doc) {
+
+        Element prepareEle = null;
+        for (Property prop : list) {
+            if (prop.getName() != null && !prop.getName().matches("\\s*") && prop.getValue() != null
+                    && !prop.getValue().matches("\\s*")) {
+
+                if (prepareEle == null) {
+                    prepareEle = doc.createElement("prepare");
+                    root.appendChild(prepareEle);
+                }
+
+                // create <delete> or <mkdir>
+                Element ele = null;
+                if (prop.getName().equals("delete")) {
+                    ele = doc.createElement("delete");
+                }
+                else if (prop.getName().equals("mkdir")) {
+                    ele = doc.createElement("mkdir");
+                }
+                ele.setAttribute("path", prop.getValue());
+                prepareEle.appendChild(ele);
+            }
+        }
+    }
+
+    /**
+     * Generate xml elements of specified tag name
+     *
+     * @param list list of properties
+     * @param root xml element under which new elements are added
+     * @param doc xml document
+     * @param key tag name
+     */
+    protected void filterListToXML(List<Property> list, Element root, Document doc, String key) {
+
+        for (Property prop : list) {
+            if (prop.getName() != null && !prop.getName().matches("\\s*") && prop.getValue() != null
+                    && !prop.getValue().matches("\\s*")) {
+                if (prop.getName().equals(key)) {
+                    // create key element
+                    Element nameEle = doc.createElement(key);
+                    root.appendChild(nameEle);
+
+                    // create text node under created element
+                    Text valEle = doc.createTextNode(prop.getValue());
+                    nameEle.appendChild(valEle);
+                }
+            }
+        }
+    }
+
+    /**
+     * Generate xml element of specific tag using content of textbox
+     *
+     * @param doc xml document
+     * @param tag tag name
+     * @param box textbox
+     * @return
+     */
+    protected Element generateElement(Document doc, String tag, TextBox box) {
+        Element ele = doc.createElement(tag);
+        Text t = doc.createTextNode(box.getText());
+        ele.appendChild(t);
+        return ele;
+    }
+
+    /**
+     * Generate xml element of ok
+     *
+     * @param doc xml document
+     * @param next next node widget to be executed after this in workflow
+     * @return
+     */
+    protected Element generateOKElement(Document doc, NodeWidget next) {
+        Element okEle = doc.createElement("ok");
+        okEle.setAttribute("to", next.getName());
+        return okEle;
+    }
+
+    /**
+     * Generate xml element of error
+     *
+     * @param doc xml document
+     * @return
+     */
+    protected Element generateErrorElement(Document doc) {
+        Element errEle = doc.createElement("error");
+        NodeWidget kill = getKillNode();
+        errEle.setAttribute("to", kill == null ? "" : kill.getName());
+        return errEle;
+    }
+
+    /**
+     * Insert a row with textbox into a grid table
+     *
+     * @param grid grid table
+     * @param row row number
+     * @param label name of label
+     * @return
+     */
+    protected TextBox insertTextRow(Grid grid, int row, String label) {
+        grid.setWidget(row, 0, createLabel(label));
+        TextBox box = new TextBox();
+        grid.setWidget(row, 1, formatCell(box));
+        return box;
+    }
+
+    /**
+     * Insert a row for ok into a grid table
+     *
+     * @param grid grid table
+     * @param row row number
+     */
+    protected void insertOKRow(Grid grid, int row) {
+        grid.setWidget(row, 0, createLabel("OK"));
+        okVal = new ListBox();
+        updateWidgetDropDown();
+        grid.setWidget(row, 1, formatCell(okVal));
+    }
+
+    /**
+     * Insert a row for error into a grid table
+     *
+     * @param grid grid table
+     * @param row row number
+     */
+    protected void insertErrorRow(Grid grid, int row) {
+        grid.setWidget(row, 0, createLabel("Error"));
+        errorVal = new ListBox();
+        updateErrorDropDown();
+        grid.setWidget(row, 1, formatCell(errorVal));
+    }
+
+    /**
+     * Return a name of the node widget
+     *
+     * @return
+     */
+    public String getName() {
+        String n = null;
+        if (name != null) {
+            n = name.getText();
+        }
+        else {
+            n = new String("");
+        }
+        return n;
+    }
+
+    /**
+     * Set a name of the node widget
+     *
+     * @param n
+     */
+    public void setName(String n) {
+        if (name != null) {
+            name.setText(n);
+        }
+    }
+
+}

Added: incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/PropertyTableFactory.java
URL: http://svn.apache.org/viewvc/incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/PropertyTableFactory.java?rev=1377572&view=auto
==============================================================================
--- incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/PropertyTableFactory.java (added)
+++ incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/PropertyTableFactory.java Mon Aug 27 05:46:54 2012
@@ -0,0 +1,119 @@
+package org.apache.oozie.tools.workflowgenerator.client.property;
+
+import org.apache.oozie.tools.workflowgenerator.client.property.action.EmailPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.action.FSPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.action.JavaPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.action.MapReducePropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.action.PigPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.action.PipesPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.action.SSHPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.action.ShellPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.action.StreamingPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.action.SubWFPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.control.DecisionPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.control.EndPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.control.ForkPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.control.JoinPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.control.KillPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.property.control.StartPropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.widget.NodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.EmailActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.FSActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.JavaActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.MapReduceActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.PigActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.PipesActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.SSHActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.ShellActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.StreamingActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.action.SubWFActionWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.DecisionNodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.EndNodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.ForkNodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.JoinNodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.KillNodeWidget;
+import org.apache.oozie.tools.workflowgenerator.client.widget.control.StartNodeWidget;
+
+/**
+ * Singleton class to instantiate property table corresponding to node widget.
+ */
+public class PropertyTableFactory {
+
+    // Singleton
+    private static PropertyTableFactory factory = new PropertyTableFactory();
+
+    private PropertyTableFactory() {
+    }
+
+    /**
+     * Return PropertyTableFactory instance
+     *
+     * @return PropertyTableFactory
+     */
+    public static PropertyTableFactory getInstance() {
+        return factory;
+    }
+
+    /**
+     * Return property table instance corresponding to node widget given in an
+     * argument
+     *
+     * @param w node widget
+     * @return PropertyTable
+     */
+    public PropertyTable createPropertyTable(NodeWidget w) {
+
+        PropertyTable table = null;
+
+        if (w instanceof MapReduceActionWidget) {
+            table = new MapReducePropertyTable(w);
+        }
+        else if (w instanceof PigActionWidget) {
+            table = new PigPropertyTable(w);
+        }
+        else if (w instanceof JavaActionWidget) {
+            table = new JavaPropertyTable(w);
+        }
+        else if (w instanceof FSActionWidget) {
+            table = new FSPropertyTable(w);
+        }
+        else if (w instanceof PipesActionWidget) {
+            table = new PipesPropertyTable(w);
+        }
+        else if (w instanceof StreamingActionWidget) {
+            table = new StreamingPropertyTable(w);
+        }
+        else if (w instanceof ShellActionWidget) {
+            table = new ShellPropertyTable(w);
+        }
+        else if (w instanceof SSHActionWidget) {
+            table = new SSHPropertyTable(w);
+        }
+        else if (w instanceof EmailActionWidget) {
+            table = new EmailPropertyTable(w);
+        }
+        else if (w instanceof SubWFActionWidget) {
+            table = new SubWFPropertyTable(w);
+        }
+        else if (w instanceof StartNodeWidget) {
+            table = new StartPropertyTable(w);
+        }
+        else if (w instanceof EndNodeWidget) {
+            table = new EndPropertyTable(w);
+        }
+        else if (w instanceof KillNodeWidget) {
+            table = new KillPropertyTable(w);
+        }
+        else if (w instanceof ForkNodeWidget) {
+            table = new ForkPropertyTable(w);
+        }
+        else if (w instanceof JoinNodeWidget) {
+            table = new JoinPropertyTable(w);
+        }
+        else if (w instanceof DecisionNodeWidget) {
+            table = new DecisionPropertyTable(w);
+        }
+
+        return table;
+    }
+}

Added: incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/EmailPropertyTable.java
URL: http://svn.apache.org/viewvc/incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/EmailPropertyTable.java?rev=1377572&view=auto
==============================================================================
--- incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/EmailPropertyTable.java (added)
+++ incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/EmailPropertyTable.java Mon Aug 27 05:46:54 2012
@@ -0,0 +1,96 @@
+package org.apache.oozie.tools.workflowgenerator.client.property.action;
+
+import org.apache.oozie.tools.workflowgenerator.client.property.PropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.widget.NodeWidget;
+
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.xml.client.Document;
+import com.google.gwt.xml.client.Element;
+
+/**
+ * Class for property table of email action
+ */
+public class EmailPropertyTable extends PropertyTable {
+
+    private TextBox to;
+    private TextBox cc;
+    private TextBox subject;
+    private TextBox body;
+
+    /**
+     * Constructor which records node widget and initializes
+     *
+     * @param w node widget
+     */
+    public EmailPropertyTable(NodeWidget w) {
+        super(w);
+        initWidget();
+    }
+
+    /**
+     * Generate xml elements of email action and attach them to xml doc
+     */
+    public void generateXML(Document doc, Element root, NodeWidget next) {
+
+        Element action = doc.createElement("action");
+        action.setAttribute("name", current.getName());
+
+        // create <email>
+        Element emailEle = doc.createElement("email");
+        action.appendChild(emailEle);
+
+        // create <to>
+        emailEle.appendChild(generateElement(doc, "to", to));
+
+        // create <cc>
+        emailEle.appendChild(generateElement(doc, "cc", cc));
+
+        // create <subject>
+        emailEle.appendChild(generateElement(doc, "subject", subject));
+
+        // create <body>
+        emailEle.appendChild(generateElement(doc, "body", body));
+
+        // create <ok>
+        action.appendChild(generateOKElement(doc, next));
+
+        // create <error>
+        action.appendChild(generateErrorElement(doc));
+
+        root.appendChild(action);
+    }
+
+    /**
+     * Initialize widgets shown in property table
+     */
+    protected void initWidget() {
+
+        grid = new Grid(7, 2);
+        this.add(grid);
+
+        this.setAlwaysShowScrollBars(true);
+        this.setSize("100%", "80%");
+
+        // insert row for Name
+        name = insertTextRow(grid, 0, "Name");
+
+        // insert row for OK
+        insertOKRow(grid, 1);
+
+        // insert row for ERROR
+        insertErrorRow(grid, 2);
+
+        // insert row for TO
+        to = insertTextRow(grid, 3, "To");
+
+        // insert row for CC
+        cc = insertTextRow(grid, 4, "CC");
+
+        // insert row for Subject
+        subject = insertTextRow(grid, 5, "Subject");
+
+        // insert row for Body
+        body = insertTextRow(grid, 6, "Body");
+    }
+}

Added: incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/FSPropertyTable.java
URL: http://svn.apache.org/viewvc/incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/FSPropertyTable.java?rev=1377572&view=auto
==============================================================================
--- incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/FSPropertyTable.java (added)
+++ incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/FSPropertyTable.java Mon Aug 27 05:46:54 2012
@@ -0,0 +1,459 @@
+package org.apache.oozie.tools.workflowgenerator.client.property.action;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.oozie.tools.workflowgenerator.client.property.PropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.widget.NodeWidget;
+
+import com.google.gwt.cell.client.ButtonCell;
+import com.google.gwt.cell.client.FieldUpdater;
+import com.google.gwt.cell.client.SelectionCell;
+import com.google.gwt.cell.client.TextCell;
+import com.google.gwt.cell.client.Cell.Context;
+import com.google.gwt.cell.client.TextInputCell;
+import com.google.gwt.safehtml.shared.SafeHtml;
+import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
+import com.google.gwt.user.cellview.client.CellTable;
+import com.google.gwt.user.cellview.client.Column;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.VerticalPanel;
+import com.google.gwt.view.client.ListDataProvider;
+import com.google.gwt.xml.client.Document;
+import com.google.gwt.xml.client.Element;
+
+/**
+ * Class for property table of FS action
+ */
+public class FSPropertyTable extends PropertyTable {
+
+    private List<FSActionData> fsdata;
+
+    /**
+     * Constructor which records node widget and initializes
+     *
+     * @param w
+     */
+    public FSPropertyTable(NodeWidget w) {
+        super(w);
+        initConf();
+        initWidget();
+    }
+
+    /**
+     * Initialize configuration
+     */
+    private void initConf() {
+        fsdata = new ArrayList<FSActionData>();
+        fsdata.add(new FSActionData());
+    }
+
+    /**
+     * Initialize widgets shown in property table
+     */
+    protected void initWidget() {
+
+        VerticalPanel vertical = new VerticalPanel();
+        this.add(vertical);
+        grid = new Grid(3, 2);
+        vertical.add(grid);
+
+        this.setAlwaysShowScrollBars(true);
+        this.setSize("100%", "80%");
+
+        // insert row for Name
+        name = insertTextRow(grid, 0, "Name");
+
+        // insert row for OK
+        insertOKRow(grid, 1);
+
+        // insert row for ERROR
+        insertErrorRow(grid, 2);
+
+        // create cell table for FS operation
+        vertical.add(createFSActionTable(fsdata));
+    }
+
+    /**
+     * Create a table showing fs operations
+     *
+     * @param data
+     * @return
+     */
+    protected CellTable<FSActionData> createFSActionTable(List<FSActionData> data) {
+
+        final CellTable<FSActionData> table = new CellTable<FSActionData>();
+        final ListDataProvider<FSActionData> dataProvider = new ListDataProvider<FSActionData>();
+        dataProvider.setList(data);
+        dataProvider.addDataDisplay(table);
+
+        // Add Name column
+        Column<FSActionData, String> nameCol = null;
+
+        nameCol = new Column<FSActionData, String>(new SelectionCell(Arrays.asList("", "delete", "mkdir", "move",
+                "chmod", "touchz"))) {
+            @Override
+            public String getValue(FSActionData object) {
+                return object.getOp();
+            }
+        };
+
+        // set event for updating value
+        nameCol.setFieldUpdater(new FieldUpdater<FSActionData, String>() {
+            @Override
+            public void update(int index, FSActionData object, String value) {
+                FSActionData d = dataProvider.getList().get(index);
+                d.setOp(value);
+                table.redraw();
+            }
+        });
+        table.addColumn(nameCol, "operation");
+
+        Column<FSActionData, String> label1Col = new Column<FSActionData, String>(new TextCell()) {
+            @Override
+            public String getValue(FSActionData object) {
+                String rel = "Path";
+                String op = object.getOp();
+                if (op.equals("move")) {
+                    rel = "Source Path";
+                }
+                return rel;
+            }
+        };
+
+        table.addColumn(label1Col);
+
+        // Add Column for 1st parameter of delete/mkdir/chmod/move/touchz
+        Column<FSActionData, String> param1Col = new Column<FSActionData, String>(new TextInputCell()) {
+            @Override
+            public String getValue(FSActionData object) {
+                String op = object.getOp();
+                if (op.equals("delete") || op.equals("mkdir") || op.equals("chmod") || op.equals("touchz")) {
+                    if (object.getParams().containsKey("path") && object.getParams().get("path") != null)
+                        return object.getParams().get("path");
+                }
+                else if (op.equals("move")) {
+                    if (object.getParams().containsKey("source") && object.getParams().get("source") != null)
+                        return object.getParams().get("source");
+                }
+                return "";
+            }
+        };
+
+        param1Col.setFieldUpdater(new FieldUpdater<FSActionData, String>() {
+            @Override
+            public void update(int index, FSActionData object, String value) {
+                FSActionData d = dataProvider.getList().get(index);
+                String op = d.getOp();
+                if (op.equals("delete") || op.equals("mkdir") || op.equals("chmod") || op.equals("touchz")) {
+                    d.getParams().put("path", value);
+                }
+                else if (op.equals("move")) {
+                    d.getParams().put("source", value);
+                }
+            }
+        });
+        table.addColumn(param1Col, "");
+
+        // Add Label for 2rd parameter of move and chmod
+        Column<FSActionData, String> label2Col = new Column<FSActionData, String>(new TextCell()) {
+
+            public void render(Context context, SafeHtml value, SafeHtmlBuilder sb) {
+                if (value != null) {
+                    FSActionData data = (FSActionData) context.getKey();
+                    if (data.getOp().equals("move") || data.getOp().equals("chmod"))
+                        sb.append(value);
+                }
+            }
+
+            @Override
+            public String getValue(FSActionData object) {
+                String rel = null;
+                String op = object.getOp();
+                if (op.equals("move")) {
+                    rel = "Target Path";
+                }
+                else if (op.equals("chmod")) {
+                    rel = "Permissions";
+                }
+                return rel;
+            }
+        };
+
+        table.addColumn(label2Col);
+
+        // Add Column for 2nd parameter of move and chmod
+        Column<FSActionData, String> param2Col = new Column<FSActionData, String>(new CustomEditTextCell()) {
+            @Override
+            public String getValue(FSActionData object) {
+                String op = object.getOp();
+                if (op.equals("move")) {
+                    if (object.getParams().containsKey("target") && object.getParams().get("target") != null)
+                        return object.getParams().get("target");
+                }
+                else if (op.equals("chmod")) {
+                    if (object.getParams().containsKey("permissions") && object.getParams().get("permissions") != null)
+                        return object.getParams().get("permissions");
+                }
+                return "";
+            }
+        };
+
+        param2Col.setFieldUpdater(new FieldUpdater<FSActionData, String>() {
+            @Override
+            public void update(int index, FSActionData object, String value) {
+                FSActionData d = dataProvider.getList().get(index);
+                String op = d.getOp();
+                if (op.equals("move")) {
+                    d.getParams().put("target", value);
+                }
+                else if (op.equals("chmod")) {
+                    d.getParams().put("permissions", value);
+                }
+            }
+        });
+        table.addColumn(param2Col, "");
+
+        // Add Label for 3rd parameter of chmod
+        Column<FSActionData, String> label3Col = new Column<FSActionData, String>(new TextCell()) {
+
+            public void render(Context context, SafeHtml value, SafeHtmlBuilder sb) {
+                if (value != null) {
+                    FSActionData data = (FSActionData) context.getKey();
+                    if (data.getOp().equals("chmod"))
+                        sb.append(value);
+                }
+            }
+
+            @Override
+            public String getValue(FSActionData object) {
+                String rel = null;
+                String op = object.getOp();
+                if (op.equals("chmod"))
+                    rel = "Chmod files within directory?(dir-files)";
+                return rel;
+            }
+        };
+
+        table.addColumn(label3Col);
+
+        // Add Column for 3rd parameter of chmod
+        // ( Recursive option not implemented in this version. need to add
+        // another column for that. )
+        Column<FSActionData, String> param3Col = new Column<FSActionData, String>(new CustomSelectionCell(
+                Arrays.asList("true", "false"))) {
+            @Override
+            public String getValue(FSActionData object) {
+                String rel = null;
+                String op = object.getOp();
+                if (op.equals("chmod"))
+                    rel = object.getParams().get("dir-files");
+                return rel;
+            }
+        };
+
+        param3Col.setFieldUpdater(new FieldUpdater<FSActionData, String>() {
+            @Override
+            public void update(int index, FSActionData object, String value) {
+                FSActionData d = dataProvider.getList().get(index);
+                String op = d.getOp();
+                if (op.equals("chmod")) {
+                    d.getParams().put("dir-files", value);
+                }
+            }
+        });
+        table.addColumn(param3Col, "");
+
+        // Button to add row
+        Column<FSActionData, String> addCol = new Column<FSActionData, String>(new ButtonCell()) {
+            @Override
+            public String getValue(FSActionData object) {
+                return " + ";
+            }
+        };
+        addCol.setFieldUpdater(new FieldUpdater<FSActionData, String>() {
+            @Override
+            public void update(int index, FSActionData object, String value) {
+                dataProvider.getList().add(index + 1, new FSActionData());
+            }
+        });
+
+        table.addColumn(addCol, "");
+
+        // Button to delete row
+        Column<FSActionData, String> delCol = new Column<FSActionData, String>(new ButtonCell()) {
+            @Override
+            public String getValue(FSActionData object) {
+                return " - ";
+            }
+        };
+
+        delCol.setFieldUpdater(new FieldUpdater<FSActionData, String>() {
+
+            @Override
+            public void update(int index, FSActionData object, String value) {
+                List<FSActionData> li = dataProvider.getList();
+                if (li.size() == 1) {
+                    FSActionData p = li.get(0);
+                    p.clear();
+                    table.redraw();
+                }
+                else {
+                    dataProvider.getList().remove(index);
+                }
+            }
+        });
+
+        table.addColumn(delCol, "");
+
+        return table;
+    }
+
+    class CustomEditTextCell extends TextInputCell {
+
+        @Override
+        public void render(Context context, String value, SafeHtmlBuilder sb) {
+            FSActionData fsdata = (FSActionData) context.getKey();
+            String op = fsdata.getOp();
+            if (op.equals("move") || op.equals("chmod"))
+                super.render(context, value, sb);
+
+        }
+    }
+
+    class CustomSelectionCell extends SelectionCell {
+
+        public CustomSelectionCell(List<String> options) {
+            super(options);
+        }
+
+        @Override
+        public void render(Context context, String value, SafeHtmlBuilder sb) {
+            FSActionData fsdata = (FSActionData) context.getKey();
+            String op = fsdata.getOp();
+            if (op.equals("chmod")) {
+                super.render(context, value, sb);
+            }
+        }
+    }
+
+    /**
+     * Generate xml elements of fs action and attach them to xml doc
+     */
+    public void generateXML(Document doc, Element root, NodeWidget next) {
+
+        Element action = doc.createElement("action");
+        action.setAttribute("name", current.getName());
+
+        Element fsEle = doc.createElement("fs");
+        action.appendChild(fsEle);
+
+        // create <delete>
+        fsDataListToXML(fsdata, fsEle, doc, "delete");
+
+        // create <mkdir>
+        fsDataListToXML(fsdata, fsEle, doc, "mkdir");
+
+        // create <move>
+        fsDataListToXML(fsdata, fsEle, doc, "move");
+
+        // create <chmod>
+        fsDataListToXML(fsdata, fsEle, doc, "chmod");
+
+        // create <touchz>
+        fsDataListToXML(fsdata, fsEle, doc, "touchz");
+
+        // create <ok>
+        action.appendChild(generateOKElement(doc, next));
+
+        // create <error>
+        action.appendChild(generateErrorElement(doc));
+
+        root.appendChild(action);
+
+    }
+
+    /**
+     * Generate xml elements of fs operations
+     *
+     * @param list list of FS operations
+     * @param root xml element under which fs action is added
+     * @param doc xml document
+     * @param key name of fs operation
+     */
+    protected void fsDataListToXML(List<FSActionData> list, Element root, Document doc, String key) {
+
+        for (FSActionData fsdata : list) {
+            String op = fsdata.getOp();
+
+            if (op != null && !op.matches("\\s*") && op.equals(key)) {
+
+                Map<String, String> params = fsdata.getParams();
+
+                boolean flag = true;
+                if (op.equals("delete") && !params.containsKey("path")) {
+                    flag = false;
+                }
+                else if (op.equals("mkdir") && !params.containsKey("path")) {
+                    flag = false;
+                }
+                else if (op.equals("move") && (!params.containsKey("source") || !params.containsKey("target"))) {
+                    flag = false;
+                }
+                else if (op.equals("chmod") && (!params.containsKey("path") || !params.containsKey("permissions"))) {
+                    flag = false;
+                }
+                else if (op.equals("touchz") && (!params.containsKey("path"))) {
+                    flag = false;
+                }
+
+                if (flag) {
+                    // create key element
+                    Element nameele = doc.createElement(key);
+                    root.appendChild(nameele);
+
+                    // set attribute for parameter(s)
+                    for (Map.Entry<String, String> e : params.entrySet()) {
+                        nameele.setAttribute(e.getKey(), e.getValue());
+                    }
+                }
+            }
+        }
+
+    }
+
+    /**
+     * class to store FS operation and relevant parameters
+     */
+    public class FSActionData {
+
+        private String op;
+        private Map<String, String> params;
+
+        public FSActionData() {
+            params = new HashMap<String, String>();
+            op = "";
+        }
+
+        public String getOp() {
+            return op;
+        }
+
+        public void setOp(String s) {
+            this.op = s;
+        }
+
+        public Map<String, String> getParams() {
+            return params;
+        }
+
+        public void clear() {
+            op = "";
+            params.clear();
+        }
+    }
+
+}

Added: incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/JavaPropertyTable.java
URL: http://svn.apache.org/viewvc/incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/JavaPropertyTable.java?rev=1377572&view=auto
==============================================================================
--- incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/JavaPropertyTable.java (added)
+++ incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/JavaPropertyTable.java Mon Aug 27 05:46:54 2012
@@ -0,0 +1,171 @@
+package org.apache.oozie.tools.workflowgenerator.client.property.action;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.oozie.tools.workflowgenerator.client.property.Property;
+import org.apache.oozie.tools.workflowgenerator.client.property.PropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.widget.NodeWidget;
+
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.HasVerticalAlignment;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.RadioButton;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.xml.client.Document;
+import com.google.gwt.xml.client.Element;
+
+/**
+ * Class for property table of java action
+ */
+public class JavaPropertyTable extends PropertyTable {
+
+    private List<Property> configs;
+    private List<Property> prepare;
+    private List<Property> others;
+    private RadioButton rby;
+    private RadioButton rbn;
+    private TextBox mainClass;
+
+    /**
+     * Constructor which records node widget and initializes
+     *
+     * @param w node widget
+     */
+    public JavaPropertyTable(NodeWidget w) {
+
+        super(w);
+        initConf();
+        initWidget();
+    }
+
+    /**
+     * Initialize configuration
+     */
+    private void initConf() {
+        configs = new ArrayList<Property>();
+        configs.add(new Property("mapred.job.queue.name", ""));
+
+        prepare = new ArrayList<Property>();
+        prepare.add(new Property("", ""));
+
+        others = new ArrayList<Property>();
+        others.add(new Property("", ""));
+    }
+
+    /**
+     * Initialize widgets shown in property table
+     */
+    protected void initWidget() {
+
+        grid = new Grid(10, 2);
+        this.add(grid);
+
+        this.setAlwaysShowScrollBars(true);
+        this.setSize("100%", "80%");
+
+        // insert row for Name
+        name = insertTextRow(grid, 0, "Name");
+
+        // insert row for OK
+        insertOKRow(grid, 1);
+
+        // insert row for ERROR
+        insertErrorRow(grid, 2);
+
+        // insert row for JobTracker
+        jt = insertTextRow(grid, 3, "JobTracker");
+
+        // insert row for NameNode
+        nn = insertTextRow(grid, 4, "NameNode");
+
+        // insert row for Configuration
+        grid.setWidget(5, 0, createLabel("Configuration"));
+        grid.setWidget(5, 1, createSubTable("Property Name", "Value", configs, null));
+
+        // insert row for Main Class
+        mainClass = insertTextRow(grid, 6, "Main Class");
+
+        // insert row for prepare
+        grid.setWidget(7, 0, createLabel("Prepare"));
+        grid.setWidget(7, 1, createSubTable("Operation", "Path", prepare, Arrays.asList("", "delete", "mkdir")));
+
+        // insert row for others
+        grid.setWidget(8, 0, createLabel("Others"));
+        grid.setWidget(
+                8,
+                1,
+                createSubTable("Tag", "value", others,
+                        Arrays.asList("", "job-xml", "java-opts", "arg", "file", "archive")));
+
+        // insert row for Capture Output
+        grid.setWidget(9, 0, createLabel("Capture Output"));
+        HorizontalPanel btnpanel = new HorizontalPanel();
+        btnpanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM);
+        rbn = new RadioButton("outputGroup", "false");
+        rby = new RadioButton("outputGroup", "true");
+        rbn.setChecked(true);
+        btnpanel.add(rby);
+        btnpanel.add(rbn);
+        grid.setWidget(9, 1, btnpanel);
+
+    }
+
+    /**
+     * Generate xml elements of java action and attach them to xml doc
+     */
+    public void generateXML(Document doc, Element root, NodeWidget next) {
+
+        Element action = doc.createElement("action");
+        action.setAttribute("name", current.getName());
+
+        // create <java>
+        Element javaEle = doc.createElement("java");
+        action.appendChild(javaEle);
+
+        // create <job-tracker>
+        javaEle.appendChild(generateElement(doc, "job-tracker", jt));
+
+        // create <name-node>
+        javaEle.appendChild(generateElement(doc, "name-node", nn));
+
+        // create <prepare>
+        prepareToXML(prepare, javaEle, doc);
+
+        // create <job-xml>
+        filterListToXML(others, javaEle, doc, "job-xml");
+
+        // create <configuration>
+        configToXML(configs, javaEle, doc);
+
+        // create <main-class>
+        javaEle.appendChild(generateElement(doc, "main-class", mainClass));
+
+        // create <java-opts>
+        filterListToXML(others, javaEle, doc, "java-opts");
+
+        // create <arg>
+        filterListToXML(others, javaEle, doc, "arg");
+
+        // create <file>
+        filterListToXML(others, javaEle, doc, "file");
+
+        // create <archive>
+        filterListToXML(others, javaEle, doc, "archive");
+
+        // create <capture-output>
+        if (rby.getValue()) {
+            Element outputele = doc.createElement("capture-output");
+            javaEle.appendChild(outputele);
+        }
+
+        // create <ok>
+        action.appendChild(generateOKElement(doc, next));
+
+        // create <error>
+        action.appendChild(generateErrorElement(doc));
+
+        root.appendChild(action);
+    }
+}

Added: incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/MapReducePropertyTable.java
URL: http://svn.apache.org/viewvc/incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/MapReducePropertyTable.java?rev=1377572&view=auto
==============================================================================
--- incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/MapReducePropertyTable.java (added)
+++ incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/MapReducePropertyTable.java Mon Aug 27 05:46:54 2012
@@ -0,0 +1,138 @@
+package org.apache.oozie.tools.workflowgenerator.client.property.action;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.oozie.tools.workflowgenerator.client.property.Property;
+import org.apache.oozie.tools.workflowgenerator.client.property.PropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.widget.NodeWidget;
+
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.xml.client.Document;
+import com.google.gwt.xml.client.Element;
+
+/**
+ * Class for property table of MR action
+ */
+public class MapReducePropertyTable extends PropertyTable {
+
+    protected List<Property> configs;
+    protected List<Property> prepare;
+    protected List<Property> others;
+
+    /**
+     * Constructor which records node widget and initializes
+     *
+     * @param w node widget
+     */
+    public MapReducePropertyTable(NodeWidget w) {
+        super(w);
+        init();
+    }
+
+    /**
+     * Initialize a property table
+     */
+    protected void init() {
+        initConf();
+        initWidget();
+    }
+
+    /**
+     * Initialize configuration
+     */
+    protected void initConf() {
+        configs = new ArrayList<Property>();
+        configs.add(new Property("mapred.mapper.class", ""));
+        configs.add(new Property("mapred.reduce.class", ""));
+        configs.add(new Property("mapred.job.queue.name", ""));
+
+        prepare = new ArrayList<Property>();
+        prepare.add(new Property("", ""));
+
+        others = new ArrayList<Property>();
+        others.add(new Property("", ""));
+    }
+
+    /**
+     * Generate xml elements of mr action and attach them to xml doc
+     */
+    public void generateXML(Document doc, Element root, NodeWidget next) {
+
+        Element action = doc.createElement("action");
+        action.setAttribute("name", current.getName());
+
+        // create <map-reduce>
+        Element mrEle = doc.createElement("map-reduce");
+        action.appendChild(mrEle);
+
+        // create <job-tracker>
+        mrEle.appendChild(generateElement(doc, "job-tracker", jt));
+
+        // create <name-node>
+        mrEle.appendChild(generateElement(doc, "name-node", nn));
+
+        // create <prepare>
+        prepareToXML(prepare, mrEle, doc);
+
+        // create <job-xml>
+        filterListToXML(others, mrEle, doc, "job-xml");
+
+        // create <configuration>
+        configToXML(configs, mrEle, doc);
+
+        // create <file>
+        filterListToXML(others, mrEle, doc, "file");
+
+        // create <archive>
+        filterListToXML(others, mrEle, doc, "archive");
+
+        // create <ok>
+        action.appendChild(generateOKElement(doc, next));
+
+        // create <error>
+        action.appendChild(generateErrorElement(doc));
+
+        root.appendChild(action);
+    }
+
+    /**
+     * Initialize widgets shown in property table
+     */
+    protected void initWidget() {
+
+        grid = new Grid(8, 2);
+        this.add(grid);
+
+        this.setAlwaysShowScrollBars(true);
+        this.setSize("100%", "80%");
+
+        // insert row for Name
+        name = insertTextRow(grid, 0, "Name");
+
+        // insert row for OK
+        insertOKRow(grid, 1);
+
+        // insert row for ERROR
+        insertErrorRow(grid, 2);
+
+        // insert row for JobTracker
+        jt = insertTextRow(grid, 3, "JobTracker");
+
+        // insert row for NameNode
+        nn = insertTextRow(grid, 4, "NameNode");
+
+        // insert row for prepare
+        grid.setWidget(5, 0, createLabel("Prepare"));
+        grid.setWidget(5, 1, createSubTable("Operation", "Path", prepare, Arrays.asList("", "delete", "mkdir")));
+
+        // insert row for Configuration
+        grid.setWidget(6, 0, createLabel("Configuration"));
+        grid.setWidget(6, 1, createSubTable("Property Name", "Value", configs, null));
+
+        // insert row for others
+        grid.setWidget(7, 0, createLabel("Others"));
+        grid.setWidget(7, 1, createSubTable("Tag", "value", others, Arrays.asList("", "job-xml", "file", "archive")));
+    }
+}

Added: incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/PigPropertyTable.java
URL: http://svn.apache.org/viewvc/incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/PigPropertyTable.java?rev=1377572&view=auto
==============================================================================
--- incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/PigPropertyTable.java (added)
+++ incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/PigPropertyTable.java Mon Aug 27 05:46:54 2012
@@ -0,0 +1,150 @@
+package org.apache.oozie.tools.workflowgenerator.client.property.action;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.oozie.tools.workflowgenerator.client.property.Property;
+import org.apache.oozie.tools.workflowgenerator.client.property.PropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.widget.NodeWidget;
+
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.xml.client.Document;
+import com.google.gwt.xml.client.Element;
+
+/**
+ * Class for property table of pig action
+ */
+public class PigPropertyTable extends PropertyTable {
+
+    private List<Property> configs;
+    private List<Property> prepare;
+    private List<Property> others;
+    private TextBox script;
+
+    /**
+     * Constructor which records node widget and initializes
+     *
+     * @param w node widget
+     */
+    public PigPropertyTable(NodeWidget w) {
+
+        super(w);
+        initConf();
+        initWidget();
+    }
+
+    /**
+     * Initialize configuration
+     */
+    private void initConf() {
+        configs = new ArrayList<Property>();
+        configs.add(new Property("mapred.job.queue.name", ""));
+
+        prepare = new ArrayList<Property>();
+        prepare.add(new Property("", ""));
+
+        others = new ArrayList<Property>();
+        others.add(new Property("", ""));
+    }
+
+    /**
+     * Initialize widgets shown in property table
+     */
+    protected void initWidget() {
+
+        grid = new Grid(9, 2);
+        this.add(grid);
+
+        this.setAlwaysShowScrollBars(true);
+        this.setSize("100%", "80%");
+
+        // insert row for Name
+        name = insertTextRow(grid, 0, "Name");
+
+        // insert row for OK
+        insertOKRow(grid, 1);
+
+        // insert row for ERROR
+        insertErrorRow(grid, 2);
+
+        // insert row for Script
+        script = insertTextRow(grid, 3, "Script");
+
+        // insert row for JobTracker
+        jt = insertTextRow(grid, 4, "JobTracker");
+
+        // insert row for NameNode
+        nn = insertTextRow(grid, 5, "NameNode");
+
+        // insert row for Configuration
+        grid.setWidget(6, 0, createLabel("Configuration"));
+        grid.setWidget(6, 1, createSubTable("Property Name", "Value", configs, null));
+
+        // insert row for prepare
+        grid.setWidget(7, 0, createLabel("Prepare"));
+        grid.setWidget(7, 1, createSubTable("Operation", "Path", prepare, Arrays.asList("", "delete", "mkdir")));
+
+        // insert row for others
+        grid.setWidget(8, 0, createLabel("Others"));
+        grid.setWidget(
+                8,
+                1,
+                createSubTable("Tag", "value", others,
+                        Arrays.asList("", "job-xml", "argument", "param", "file", "archive")));
+
+    }
+
+    /**
+     * Generate xml elements of pig action and attach them to xml doc
+     */
+    public void generateXML(Document doc, Element root, NodeWidget next) {
+
+        Element action = doc.createElement("action");
+        action.setAttribute("name", current.getName());
+
+        // create <pig>
+        Element pigEle = doc.createElement("pig");
+        action.appendChild(pigEle);
+
+        // create <job-tracker>
+        pigEle.appendChild(generateElement(doc, "job-tracker", jt));
+
+        // create <name-node>
+        pigEle.appendChild(generateElement(doc, "name-node", nn));
+
+        // create <prepare>
+        prepareToXML(prepare, pigEle, doc);
+
+        // create <job-xml>
+        filterListToXML(others, pigEle, doc, "job-xml");
+
+        // create <configuration>
+        configToXML(configs, pigEle, doc);
+
+        // create <script>
+        pigEle.appendChild(generateElement(doc, "script", script));
+
+        // create <param>
+        filterListToXML(others, pigEle, doc, "param");
+
+        // create <argument>
+        filterListToXML(others, pigEle, doc, "argument");
+
+        // create <file>
+        filterListToXML(others, pigEle, doc, "file");
+
+        // create <archive>
+        filterListToXML(others, pigEle, doc, "archive");
+
+        // create <ok>
+        action.appendChild(generateOKElement(doc, next));
+
+        // create <error>
+        action.appendChild(generateErrorElement(doc));
+
+        root.appendChild(action);
+
+    }
+}

Added: incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/PipesPropertyTable.java
URL: http://svn.apache.org/viewvc/incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/PipesPropertyTable.java?rev=1377572&view=auto
==============================================================================
--- incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/PipesPropertyTable.java (added)
+++ incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/PipesPropertyTable.java Mon Aug 27 05:46:54 2012
@@ -0,0 +1,189 @@
+package org.apache.oozie.tools.workflowgenerator.client.property.action;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.oozie.tools.workflowgenerator.client.property.Property;
+import org.apache.oozie.tools.workflowgenerator.client.widget.NodeWidget;
+
+import com.google.gwt.xml.client.Text;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.xml.client.Document;
+import com.google.gwt.xml.client.Element;
+
+/**
+ * Class for property table of MR pipes action
+ */
+public class PipesPropertyTable extends MapReducePropertyTable {
+
+    private List<Property> pipes;
+
+    /**
+     * Constructor which records node widget and initializes
+     *
+     * @param w node widget
+     */
+    public PipesPropertyTable(NodeWidget w) {
+        super(w);
+    }
+
+    /**
+     * Initialize a property table
+     */
+    @Override
+    protected void init() {
+        initConf();
+        initWidget();
+    }
+
+    /**
+     * Initialize configuration
+     */
+    @Override
+    protected void initConf() {
+        configs = new ArrayList<Property>();
+        configs.add(new Property("mapred.job.queue.name", ""));
+
+        prepare = new ArrayList<Property>();
+        prepare.add(new Property("", ""));
+
+        others = new ArrayList<Property>();
+        others.add(new Property("", ""));
+
+        pipes = new ArrayList<Property>();
+        pipes.add(new Property("", ""));
+    }
+
+    /**
+     * Generate xml elements of pipes action and attach them to xml doc
+     */
+    public void generateXML(Document doc, Element root, NodeWidget next) {
+
+        Element action = doc.createElement("action");
+        action.setAttribute("name", current.getName());
+
+        // create <map-reduce>
+        Element mrEle = doc.createElement("map-reduce");
+        action.appendChild(mrEle);
+
+        // create <job-tracker>
+        mrEle.appendChild(generateElement(doc, "job-tracker", jt));
+
+        // create <name-node>
+        mrEle.appendChild(generateElement(doc, "name-node", nn));
+
+        // create <prepare>
+        prepareToXML(prepare, mrEle, doc);
+
+        // create <pipes>
+        Element pipesEle = null;
+        pipesEle = filterListToXML(pipes, mrEle, pipesEle, doc, "map");
+        pipesEle = filterListToXML(pipes, mrEle, pipesEle, doc, "reduce");
+        pipesEle = filterListToXML(pipes, mrEle, pipesEle, doc, "inputformat");
+        pipesEle = filterListToXML(pipes, mrEle, pipesEle, doc, "partitioner");
+        pipesEle = filterListToXML(pipes, mrEle, pipesEle, doc, "writer");
+        pipesEle = filterListToXML(pipes, mrEle, pipesEle, doc, "program");
+
+        // create <job-xml>
+        filterListToXML(others, mrEle, doc, "job-xml");
+
+        // create <configuration>
+        configToXML(configs, mrEle, doc);
+
+        // create <file>
+        filterListToXML(others, mrEle, doc, "file");
+
+        // create <archive>
+        filterListToXML(others, mrEle, doc, "archive");
+
+        // create <ok>
+        action.appendChild(generateOKElement(doc, next));
+
+        // create <error>
+        action.appendChild(generateErrorElement(doc));
+
+        root.appendChild(action);
+    }
+
+    /**
+     * Create xml element of specified tag name
+     *
+     * @param list list of properties
+     * @param root xml element under which new elements are added
+     * @param pipes pipes element
+     * @param doc xml doc
+     * @param key tag name
+     * @return
+     */
+    protected Element filterListToXML(List<Property> list, Element root, Element pipes, Document doc, String key) {
+
+        for (Property prop : list) {
+            if (prop.getName() != null && !prop.getName().matches("\\s*") && prop.getValue() != null
+                    && !prop.getValue().matches("\\s*")) {
+                if (prop.getName().equals(key)) {
+                    if (pipes == null) {
+                        pipes = doc.createElement("pipes");
+                        root.appendChild(pipes);
+                    }
+                    // create key element
+                    Element nameele = doc.createElement(key);
+                    pipes.appendChild(nameele);
+
+                    // create text node under created element
+                    Text valele = doc.createTextNode(prop.getValue());
+                    nameele.appendChild(valele);
+                }
+            }
+        }
+        return pipes;
+    }
+
+    /**
+     * Initialize widgets shown in property table
+     */
+    protected void initWidget() {
+
+        grid = new Grid(9, 2);
+        this.add(grid);
+
+        this.setAlwaysShowScrollBars(true);
+        this.setSize("100%", "80%");
+
+        // insert row for Name
+        name = insertTextRow(grid, 0, "Name");
+
+        // insert row for OK
+        insertOKRow(grid, 1);
+
+        // insert row for ERROR
+        insertErrorRow(grid, 2);
+
+        // insert row for Pipes setting
+        grid.setWidget(3, 0, createLabel("Pipes Setting"));
+        grid.setWidget(
+                3,
+                1,
+                createSubTable("Tag", "value", pipes,
+                        Arrays.asList("", "map", "reduce", "inputformat", "partitioner", "writer", "program")));
+
+        // insert row for JobTracker
+        jt = insertTextRow(grid, 4, "JobTracker");
+
+        // insert row for NameNode
+        nn = insertTextRow(grid, 5, "NameNode");
+
+        // insert row for prepare
+        grid.setWidget(6, 0, createLabel("Prepare"));
+        grid.setWidget(6, 1, createSubTable("Operation", "Path", prepare, Arrays.asList("", "delete", "mkdir")));
+
+        // insert row for Configuration
+        grid.setWidget(7, 0, createLabel("Configuration"));
+        grid.setWidget(7, 1, createSubTable("Property Name", "Value", configs, null));
+
+        // insert row for others
+        grid.setWidget(8, 0, createLabel("Others"));
+        grid.setWidget(8, 1, createSubTable("Tag", "value", others, Arrays.asList("", "job-xml", "file", "archive")));
+
+    }
+}

Added: incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/SSHPropertyTable.java
URL: http://svn.apache.org/viewvc/incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/SSHPropertyTable.java?rev=1377572&view=auto
==============================================================================
--- incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/SSHPropertyTable.java (added)
+++ incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/SSHPropertyTable.java Mon Aug 27 05:46:54 2012
@@ -0,0 +1,216 @@
+package org.apache.oozie.tools.workflowgenerator.client.property.action;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.oozie.tools.workflowgenerator.client.property.PropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.widget.NodeWidget;
+
+import com.google.gwt.cell.client.ButtonCell;
+import com.google.gwt.cell.client.FieldUpdater;
+import com.google.gwt.cell.client.TextInputCell;
+import com.google.gwt.xml.client.Text;
+import com.google.gwt.user.cellview.client.CellTable;
+import com.google.gwt.user.cellview.client.Column;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.HasVerticalAlignment;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.RadioButton;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.view.client.ListDataProvider;
+import com.google.gwt.xml.client.Document;
+import com.google.gwt.xml.client.Element;
+
+/**
+ * Class for property table of SSH action
+ */
+public class SSHPropertyTable extends PropertyTable {
+
+    private List<String> args;
+    private TextBox host;
+    private TextBox command;
+    private RadioButton rby;
+    private RadioButton rbn;
+
+    /**
+     * Constructor which records node widget and initializes
+     *
+     * @param w node widget
+     */
+    public SSHPropertyTable(NodeWidget w) {
+        super(w);
+        initConf();
+        initWidget();
+    }
+
+    /**
+     * Initialize configuration
+     */
+    protected void initConf() {
+        args = new ArrayList<String>();
+        args.add("");
+    }
+
+    /**
+     * Generate xml elements of ssh action and attach them to xml doc
+     */
+    public void generateXML(Document doc, Element root, NodeWidget next) {
+
+        Element action = doc.createElement("action");
+        action.setAttribute("name", current.getName());
+
+        // create <ssh>
+        Element sshEle = doc.createElement("ssh");
+        action.appendChild(sshEle);
+
+        // create <host>
+        sshEle.appendChild(generateElement(doc, "host", host));
+
+        // create <command>
+        sshEle.appendChild(generateElement(doc, "command", command));
+
+        // create <args>
+        for (String arg : args) {
+            Element argsEle = doc.createElement("args");
+            Text n = doc.createTextNode(arg);
+            argsEle.appendChild(n);
+            sshEle.appendChild(argsEle);
+
+        }
+
+        // create <capture-output>
+        if (rby.getValue()) {
+            Element outputele = doc.createElement("capture-output");
+            sshEle.appendChild(outputele);
+        }
+
+        // create <ok>
+        action.appendChild(generateOKElement(doc, next));
+
+        // create <error>
+        action.appendChild(generateErrorElement(doc));
+
+        root.appendChild(action);
+    }
+
+    /**
+     * initialize widgets shown in property table
+     */
+    protected void initWidget() {
+
+        grid = new Grid(7, 2);
+        this.add(grid);
+
+        this.setAlwaysShowScrollBars(true);
+        this.setSize("100%", "80%");
+
+        // insert row for Name
+        name = insertTextRow(grid, 0, "Name");
+
+        // insert row for OK
+        insertOKRow(grid, 1);
+
+        // insert row for ERROR
+        insertErrorRow(grid, 2);
+
+        // insert row for Host
+        host = insertTextRow(grid, 3, "Host");
+
+        // insert row for Command
+        command = insertTextRow(grid, 4, "Command");
+
+        // insert row for Arguments
+        grid.setWidget(5, 0, createLabel("Args"));
+        grid.setWidget(5, 1, createArgsTable(args));
+
+        // insert row for Capture Output
+        grid.setWidget(6, 0, createLabel("Capture Output"));
+        HorizontalPanel btnpanel = new HorizontalPanel();
+        btnpanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM);
+        rbn = new RadioButton("outputGroup", "false");
+        rby = new RadioButton("outputGroup", "true");
+        rbn.setChecked(true);
+        btnpanel.add(rby);
+        btnpanel.add(rbn);
+        grid.setWidget(6, 1, btnpanel);
+
+    }
+
+    /**
+     * Create a table showing list of arguments added by a user
+     *
+     * @param data
+     * @return
+     */
+    protected CellTable<String> createArgsTable(List<String> data) {
+        final CellTable<String> table = new CellTable<String>();
+        final ListDataProvider<String> dataProvider = new ListDataProvider<String>();
+        dataProvider.setList(data);
+        dataProvider.addDataDisplay(table);
+
+        // Add Name column
+        Column<String, String> argCol = null;
+
+        // when editText is used for name column
+
+        argCol = new Column<String, String>(new TextInputCell()) {
+            @Override
+            public String getValue(String object) {
+                return object;
+            }
+        };
+
+        // set event for updating value
+        argCol.setFieldUpdater(new FieldUpdater<String, String>() {
+            @Override
+            public void update(int index, String object, String value) {
+                List<String> li = dataProvider.getList();
+                li.remove(index);
+                li.add(index, value);
+            }
+        });
+        table.addColumn(argCol, "");
+
+        // Button to add row
+        Column<String, String> addCol = new Column<String, String>(new ButtonCell()) {
+            @Override
+            public String getValue(String object) {
+                return " + ";
+            }
+        };
+        addCol.setFieldUpdater(new FieldUpdater<String, String>() {
+            @Override
+            public void update(int index, String object, String value) {
+                List<String> li = dataProvider.getList();
+                li.add(index + 1, new String(" "));
+            }
+        });
+
+        table.addColumn(addCol, "");
+
+        // Button to delete row
+        Column<String, String> delCol = new Column<String, String>(new ButtonCell()) {
+            @Override
+            public String getValue(String object) {
+                return " - ";
+            }
+        };
+
+        delCol.setFieldUpdater(new FieldUpdater<String, String>() {
+            @Override
+            public void update(int index, String object, String value) {
+                List<String> li = dataProvider.getList();
+                li.remove(index);
+                if (li.size() == 0) {
+                    li.add(" ");
+                    table.redraw();
+                }
+            }
+        });
+
+        table.addColumn(delCol, "");
+
+        return table;
+
+    }
+}

Added: incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/ShellPropertyTable.java
URL: http://svn.apache.org/viewvc/incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/ShellPropertyTable.java?rev=1377572&view=auto
==============================================================================
--- incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/ShellPropertyTable.java (added)
+++ incubator/oozie/trunk/workflowgenerator/src/main/java/org/apache/oozie/tools/workflowgenerator/client/property/action/ShellPropertyTable.java Mon Aug 27 05:46:54 2012
@@ -0,0 +1,172 @@
+package org.apache.oozie.tools.workflowgenerator.client.property.action;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.oozie.tools.workflowgenerator.client.property.Property;
+import org.apache.oozie.tools.workflowgenerator.client.property.PropertyTable;
+import org.apache.oozie.tools.workflowgenerator.client.widget.NodeWidget;
+
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.HasVerticalAlignment;
+import com.google.gwt.user.client.ui.HorizontalPanel;
+import com.google.gwt.user.client.ui.RadioButton;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.xml.client.Document;
+import com.google.gwt.xml.client.Element;
+
+/**
+ * Class for property table of shell action
+ */
+public class ShellPropertyTable extends PropertyTable {
+
+    private TextBox jt;
+    private TextBox nn;
+    private TextBox exec;
+    private List<Property> configs;
+    private List<Property> prepare;
+    private List<Property> others;
+    private RadioButton rby;
+    private RadioButton rbn;
+
+    /**
+     * Constructor which records node widget and initializes
+     *
+     * @param w
+     */
+    public ShellPropertyTable(NodeWidget w) {
+        super(w);
+        initConf();
+        initWidget();
+    }
+
+    /**
+     * Initialize configuration
+     */
+    protected void initConf() {
+        configs = new ArrayList<Property>();
+        configs.add(new Property("mapred.job.queue.name", ""));
+
+        prepare = new ArrayList<Property>();
+        prepare.add(new Property("", ""));
+
+        others = new ArrayList<Property>();
+        others.add(new Property("", ""));
+    }
+
+    /**
+     * Generate xml elements of shell action and attach them to xml doc
+     */
+    public void generateXML(Document doc, Element root, NodeWidget next) {
+
+        Element action = doc.createElement("action");
+        action.setAttribute("name", current.getName());
+
+        // create <shell>
+        Element shellEle = doc.createElement("shell");
+        action.appendChild(shellEle);
+
+        // create <job-tracker>
+        shellEle.appendChild(generateElement(doc, "job-tracker", jt));
+
+        // create <name-node>
+        shellEle.appendChild(generateElement(doc, "name-node", nn));
+
+        // create <prepare>
+        prepareToXML(prepare, shellEle, doc);
+
+        // create <job-xml>
+        filterListToXML(others, shellEle, doc, "job-xml");
+
+        // create <configuration>
+        configToXML(configs, shellEle, doc);
+
+        // create <exec>
+        shellEle.appendChild(generateElement(doc, "exec", exec));
+
+        // create <argument>
+        filterListToXML(others, shellEle, doc, "argument");
+
+        // create <env-var>
+        filterListToXML(others, shellEle, doc, "env-var");
+
+        // create <file>
+        filterListToXML(others, shellEle, doc, "file");
+
+        // create <archive>
+        filterListToXML(others, shellEle, doc, "archive");
+
+        // create <capture-output>
+        if (rby.getValue()) {
+            Element outputele = doc.createElement("capture-output");
+            shellEle.appendChild(outputele);
+        }
+
+        // create <ok>
+        action.appendChild(generateOKElement(doc, next));
+
+        // create <error>
+        action.appendChild(generateErrorElement(doc));
+
+        root.appendChild(action);
+    }
+
+    /**
+     * Initialize widgets shown in property table
+     */
+    protected void initWidget() {
+
+        grid = new Grid(10, 2);
+        this.add(grid);
+
+        this.setAlwaysShowScrollBars(true);
+        this.setSize("100%", "80%");
+
+        // insert row for Name
+        name = insertTextRow(grid, 0, "Name");
+
+        // insert row for OK
+        insertOKRow(grid, 1);
+
+        // insert row for ERROR
+        insertErrorRow(grid, 2);
+
+        // insert row for JobTracker
+        jt = insertTextRow(grid, 3, "JobTracker");
+
+        // insert row for NameNode
+        nn = insertTextRow(grid, 4, "NameNode");
+
+        // insert row for Exec
+        exec = insertTextRow(grid, 5, "Exec");
+
+        // insert row for Parameter
+        grid.setWidget(6, 0, createLabel("Parameter"));
+        grid.setWidget(
+                6,
+                1,
+                createSubTable("Tag", "value", others,
+                        Arrays.asList("", "argument", "job-xml", "env-var", "file", "archive")));
+
+        // insert row for Configuration
+        grid.setWidget(7, 0, createLabel("Configuration"));
+        grid.setWidget(7, 1, createSubTable("Property Name", "Value", configs, null));
+
+        // insert row for prepare
+        grid.setWidget(8, 0, createLabel("Prepare"));
+        grid.setWidget(8, 1, createSubTable("Operation", "Path", prepare, Arrays.asList("", "delete", "mkdir")));
+
+        // insert row for Capture output
+        grid.setWidget(9, 0, createLabel("Capture Output"));
+        HorizontalPanel btnpanel = new HorizontalPanel();
+        btnpanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM);
+        rbn = new RadioButton("outputGroup", "false");
+        rby = new RadioButton("outputGroup", "true");
+        rbn.setChecked(true);
+        btnpanel.add(rby);
+        btnpanel.add(rbn);
+        grid.setWidget(9, 1, btnpanel);
+
+    }
+}