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);
+
+ }
+}