Эх сурвалжийг харах

[oozie] Import workflow with Subworkflow action and rudimentary support for all oozie schema version

Added a test case validating Subworkflow import.
In order to resolve foreign key dependency on workflow,
searching for deployment directory in HDFS, then iterating over
all workflows in DB. If one is found, the import will succeed.
Other wise, import will fail.
Made all oozie schema versions available for import.
The only major difference is in 0.1 where SSH action is not
an extension. It is a built in node.
abec 13 жил өмнө
parent
commit
dea826a
100 өөрчлөгдсөн 2323 нэмэгдсэн , 58 устгасан
  1. 95 23
      apps/oozie/src/oozie/import_workflow.py
  2. 3 3
      apps/oozie/src/oozie/templates/editor/create_workflow.mako
  3. 3 3
      apps/oozie/src/oozie/templates/editor/import_workflow.mako
  4. 21 0
      apps/oozie/src/oozie/test_data/0.4/test-subworkflow.xml
  5. 76 28
      apps/oozie/src/oozie/tests.py
  6. 1 1
      apps/oozie/src/oozie/views/editor.py
  7. 39 0
      apps/oozie/src/oozie/xslt/0.1/action.xslt
  8. 30 0
      apps/oozie/src/oozie/xslt/0.1/control.xslt
  9. 37 0
      apps/oozie/src/oozie/xslt/0.1/extensions/distcp.0.1.xslt
  10. 30 0
      apps/oozie/src/oozie/xslt/0.1/extensions/email.0.1.xslt
  11. 30 0
      apps/oozie/src/oozie/xslt/0.1/extensions/hive.0.1.xslt
  12. 30 0
      apps/oozie/src/oozie/xslt/0.1/extensions/hive.0.2.xslt
  13. 32 0
      apps/oozie/src/oozie/xslt/0.1/extensions/shell.0.1.xslt
  14. 30 0
      apps/oozie/src/oozie/xslt/0.1/extensions/sqoop.0.1.xslt
  15. 31 0
      apps/oozie/src/oozie/xslt/0.1/extensions/sqoop.0.2.xslt
  16. 13 0
      apps/oozie/src/oozie/xslt/0.1/nodes/decision.xslt
  17. 13 0
      apps/oozie/src/oozie/xslt/0.1/nodes/end.xslt
  18. 20 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/archives.xslt
  19. 18 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/args.xslt
  20. 24 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/arguments.xslt
  21. 21 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/capture_output.xslt
  22. 39 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/chmods.xslt
  23. 14 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/command.xslt
  24. 23 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/deletes.xslt
  25. 20 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/files.xslt
  26. 14 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/host.xslt
  27. 14 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/jar_path.xslt
  28. 13 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/java_opts.xslt
  29. 24 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/job_properties.xslt
  30. 13 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/job_xml.xslt
  31. 14 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/main_class.xslt
  32. 14 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/mapper.xslt
  33. 23 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/mkdirs.xslt
  34. 35 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/moves.xslt
  35. 24 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/params.xslt
  36. 26 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/prepares.xslt
  37. 21 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/propagate_configuration.xslt
  38. 14 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/reducer.xslt
  39. 14 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/script_path.xslt
  40. 23 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/touchzs.xslt
  41. 14 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/user.xslt
  42. 28 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fields/xml.xslt
  43. 13 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fork.xslt
  44. 26 0
      apps/oozie/src/oozie/xslt/0.1/nodes/fs.xslt
  45. 18 0
      apps/oozie/src/oozie/xslt/0.1/nodes/generic.xslt
  46. 34 0
      apps/oozie/src/oozie/xslt/0.1/nodes/java.xslt
  47. 13 0
      apps/oozie/src/oozie/xslt/0.1/nodes/join.xslt
  48. 13 0
      apps/oozie/src/oozie/xslt/0.1/nodes/kill.xslt
  49. 28 0
      apps/oozie/src/oozie/xslt/0.1/nodes/mapreduce.xslt
  50. 30 0
      apps/oozie/src/oozie/xslt/0.1/nodes/pig.xslt
  51. 24 0
      apps/oozie/src/oozie/xslt/0.1/nodes/ssh.xslt
  52. 14 0
      apps/oozie/src/oozie/xslt/0.1/nodes/start.xslt
  53. 26 0
      apps/oozie/src/oozie/xslt/0.1/nodes/streaming.xslt
  54. 20 0
      apps/oozie/src/oozie/xslt/0.1/nodes/subworkflow.xslt
  55. 20 0
      apps/oozie/src/oozie/xslt/0.1/workflow.xslt
  56. 39 0
      apps/oozie/src/oozie/xslt/0.2.5/action.xslt
  57. 30 0
      apps/oozie/src/oozie/xslt/0.2.5/control.xslt
  58. 37 0
      apps/oozie/src/oozie/xslt/0.2.5/extensions/distcp.0.1.xslt
  59. 30 0
      apps/oozie/src/oozie/xslt/0.2.5/extensions/email.0.1.xslt
  60. 30 0
      apps/oozie/src/oozie/xslt/0.2.5/extensions/hive.0.1.xslt
  61. 30 0
      apps/oozie/src/oozie/xslt/0.2.5/extensions/hive.0.2.xslt
  62. 32 0
      apps/oozie/src/oozie/xslt/0.2.5/extensions/shell.0.1.xslt
  63. 30 0
      apps/oozie/src/oozie/xslt/0.2.5/extensions/sqoop.0.1.xslt
  64. 31 0
      apps/oozie/src/oozie/xslt/0.2.5/extensions/sqoop.0.2.xslt
  65. 26 0
      apps/oozie/src/oozie/xslt/0.2.5/extensions/ssh.0.1.xslt
  66. 13 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/decision.xslt
  67. 13 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/end.xslt
  68. 20 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/archives.xslt
  69. 18 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/args.xslt
  70. 24 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/arguments.xslt
  71. 21 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/capture_output.xslt
  72. 39 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/chmods.xslt
  73. 14 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/command.xslt
  74. 23 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/deletes.xslt
  75. 20 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/files.xslt
  76. 14 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/host.xslt
  77. 14 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/jar_path.xslt
  78. 13 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/java_opts.xslt
  79. 24 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/job_properties.xslt
  80. 13 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/job_xml.xslt
  81. 14 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/main_class.xslt
  82. 14 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/mapper.xslt
  83. 23 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/mkdirs.xslt
  84. 35 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/moves.xslt
  85. 24 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/params.xslt
  86. 26 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/prepares.xslt
  87. 21 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/propagate_configuration.xslt
  88. 14 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/reducer.xslt
  89. 14 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/script_path.xslt
  90. 23 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/touchzs.xslt
  91. 14 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/user.xslt
  92. 28 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/xml.xslt
  93. 13 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fork.xslt
  94. 26 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fs.xslt
  95. 18 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/generic.xslt
  96. 34 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/java.xslt
  97. 13 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/join.xslt
  98. 13 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/kill.xslt
  99. 28 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/mapreduce.xslt
  100. 30 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/pig.xslt

+ 95 - 23
apps/oozie/src/oozie/import_workflow.py

@@ -42,10 +42,8 @@ from lxml import etree
 from django.core import serializers
 from django.utils.translation import ugettext as _
 
-from desktop.lib.exceptions_renderable import PopupException
-
 from conf import DEFINITION_XSLT_DIR
-from models import Node, Link, Start, End, Decision, DecisionEnd, Fork, Join
+from models import Workflow, Node, Link, Start, End, Decision, DecisionEnd, Fork, Join
 from utils import xml_tag
 
 LOG = logging.getLogger(__name__)
@@ -211,7 +209,7 @@ def _resolve_decision_relationships(workflow):
       if node_temp.id == decision.id and parent.node_type != Decision.node_type:
         links = Link.objects.filter(parent=parent).exclude(name__in=['related', 'kill', 'error'])
         if len(links) != 1:
-          raise PopupException(_('Cannot import workflows that have decision DAG leaf nodes with multiple children or no children.'))
+          raise RuntimeError(_('Cannot import workflows that have decision DAG leaf nodes with multiple children or no children.'))
         link = links[0]
         link.child = decision_end
         link.save()
@@ -247,7 +245,7 @@ def _resolve_decision_relationships(workflow):
     # A single end means that we've found a unique end for this decision.
     # Multiple ends mean that we've found a bad decision.
     if len(ends) > 1:
-      raise PopupException(_('Cannot import workflows that have decisions paths with multiple terminal nodes that converge on a single terminal node.'))
+      raise RuntimeError(_('Cannot import workflows that have decisions paths with multiple terminal nodes that converge on a single terminal node.'))
     elif len(ends) == 1:
       end = ends.pop()
       # Branch count will vary with each call if we have multiple decision nodes embedded within decision paths.
@@ -275,9 +273,9 @@ def _resolve_decision_relationships(workflow):
         # Can do this because we've replace all its parents with a single DecisionEnd node.
         return helper(end)
       else:
-        raise PopupException(_('Cannot import workflows that have decisions paths with multiple terminal nodes that converge on a single terminal node.'))
+        raise RuntimeError(_('Cannot import workflows that have decisions paths with multiple terminal nodes that converge on a single terminal node.'))
     else:
-      raise PopupException(_('Cannot import workflows that have decisions paths that never end.'))
+      raise RuntimeError(_('Cannot import workflows that have decisions paths that never end.'))
 
     return None
 
@@ -289,7 +287,7 @@ def _resolve_decision_relationships(workflow):
     # Will not be a kill node because we skip error links.
     # Error links should not go to a regular node.
     if node.get_parent_links().filter(name='error').exists():
-      raise PopupException(_('Error links cannot point to an ordinary node.'))
+      raise RuntimeError(_('Error links cannot point to an ordinary node.'))
 
     # Multiple parents means that we've found an end.
     # Joins will always have more than one parent.
@@ -307,7 +305,7 @@ def _resolve_decision_relationships(workflow):
         temp = helper(child)
         end = end or temp
         if end != temp:
-          raise PopupException(_('Different ends found in fork.'))
+          raise RuntimeError(_('Different ends found in fork.'))
       return end
     elif children:
       return helper(children.pop())
@@ -318,13 +316,14 @@ def _resolve_decision_relationships(workflow):
   helper(workflow.start.get_full_node())
 
 
-def _save_nodes(workflow, root):
+def _prepare_nodes(workflow, root):
   # Deserialize
   objs = serializers.deserialize('xml', etree.tostring(root))
 
   # First pass is a list of nodes and their types respectively.
   # Must link up nodes with their respective full nodes.
   node = None
+  nodes = []
   for obj in objs:
     obj.object.workflow = workflow
     if type(obj.object) is Node:
@@ -340,30 +339,101 @@ def _save_nodes(workflow, root):
       full_node.node_ptr_id = None
       full_node.id = None
 
-      if full_node.node_type is 'start':
-        full_node.name = 'start'
+      nodes.append(full_node)
+
+  return nodes
 
-      full_node.save()
+
+def _preprocess_nodes(workflow, transformed_root, workflow_definition_root, nodes, fs=None):
+  """
+  preprocess nodes
+  Resolve start name and subworkflow dependencies.
+  Looks at path and interrogates all workflows until the proper deployment path is found.
+  If the proper deployment path is never found, then 
+  """
+  for full_node in nodes:
+    if full_node.node_type is 'start':
+      full_node.name = 'start'
+    elif full_node.node_type is 'subworkflow':
+      app_path = None
+      for action_el in workflow_definition_root:
+        if 'name' in action_el.attrib and action_el.attrib['name'] == full_node.name:
+          for subworkflow_el in action_el:
+            if xml_tag(subworkflow_el) == 'sub-workflow':
+              for property_el in subworkflow_el:
+                if xml_tag(property_el) == 'app-path':
+                  app_path = property_el.text
+
+      if app_path is None:
+        raise RuntimeError(_("Could not find app-path for subworkflow %s") % full_node.name)
+
+      subworkflow = _resolve_subworkflow_from_deployment_dir(fs, workflow, app_path)
+      if subworkflow:
+        full_node.sub_workflow = subworkflow
+      else:
+        raise RuntimeError(_("Could not find subworkflow with deployment directory: %s") % app_path)
 
 
-def import_workflow(workflow, workflow_definition):
+def _resolve_subworkflow_from_deployment_dir(fs, workflow, app_path):
+  """
+  Resolves subworkflow in a subworkflow node
+  Looks at path and interrogates all workflows until the proper deployment path is found.
+  If the proper deployment path is never found, then 
+  """
+  if not fs:
+    raise RuntimeError(_("No hadoop file system to operate on."))
+
+  if app_path.endswith('/'):
+    app_path = app_path[:-1]
+  if app_path.startswith('hdfs://'):
+    app_path = app_path[7:]
+
+  try:
+    f = fs.open('%s/workflow.xml' % app_path)
+    root = etree.parse(f)
+    f.close()
+    return Workflow.objects.get(name=root.attrib['name'])
+  except IOError:
+    pass
+  except (KeyError, AttributeError), e:
+    raise RuntimeError(_("Could not find workflow name when resolving subworkflow."))
+  except Workflow.DoesNotExist, e:
+    raise RuntimeError(_("Could not find workflow with name %s extracted from subworkflow path %s") % (root.attrib['name'], app_path))
+  except Exception, e:
+    raise RuntimeError(_("Could not find workflow at path %s") % app_path)
+
+  for subworkflow in Workflow.objects.all():
+    if subworkflow.deployment_dir == app_path:
+      if workflow.owner.id != subworkflow.owner.id:
+        raise RuntimeError(_("Subworkflow is not owned by %s") % workflow.owner)
+      return subworkflow
+
+  return None
+
+
+def _save_nodes(nodes):
+  for node in nodes:
+    node.save()
+
+
+def import_workflow(workflow, workflow_definition, fs=None):
   xslt_definition_fh = open("%(xslt_dir)s/workflow.xslt" % {
     'xslt_dir': DEFINITION_XSLT_DIR.get()
   })
 
   # Parse Workflow Definition
-  xml = etree.fromstring(workflow_definition)
+  workflow_definition_root = etree.fromstring(workflow_definition)
 
-  if xml is None:
-    raise PopupException(_("Could not find any nodes in Workflow definition. Maybe it's malformed?"))
+  if workflow_definition_root is None:
+    raise RuntimeError(_("Could not find any nodes in Workflow definition. Maybe it's malformed?"))
 
-  ns = xml.tag[:-12] # Remove workflow-app from tag in order to get proper namespace prefix
+  ns = workflow_definition_root.tag[:-12] # Remove workflow-app from tag in order to get proper namespace prefix
   schema_version = ns and ns[1:-1] or None
 
   # Ensure namespace exists
   if schema_version not in OOZIE_NAMESPACES:
-    raise PopupException(_("Tag with namespace %(namespace)s is not a valid. Please use one of the following namespaces: %(namespaces)s") % {
-      'namespace': xml.tag,
+    raise RuntimeError(_("Tag with namespace %(namespace)s is not a valid. Please use one of the following namespaces: %(namespaces)s") % {
+      'namespace': workflow_definition_root.tag,
       'namespaces': ', '.join(OOZIE_NAMESPACES)
     })
 
@@ -373,11 +443,13 @@ def import_workflow(workflow, workflow_definition):
   transform = etree.XSLT(xslt)
 
   # Transform XML using XSLT
-  root = transform(xml)
+  transformed_root = transform(workflow_definition_root)
 
   # Resolve workflow dependencies and node types and link dependencies
-  _save_nodes(workflow, root)
-  _save_links(workflow, xml)
+  nodes = _prepare_nodes(workflow, transformed_root)
+  _preprocess_nodes(workflow, transformed_root, workflow_definition_root, nodes, fs)
+  _save_nodes(nodes)
+  _save_links(workflow, workflow_definition_root)
 
   # Update schema_version
   workflow.schema_version = schema_version

+ 3 - 3
apps/oozie/src/oozie/templates/editor/create_workflow.mako

@@ -62,9 +62,9 @@ ${ layout.menubar(section='workflows') }
            </div>
 
            <div class="hide">
-             ${ workflow_form['schema_version'] }
-             ${ workflow_form['job_properties'] }
-             ${ workflow_form['parameters'] }
+             ${ workflow_form['schema_version'] | n,unicode }
+             ${ workflow_form['job_properties'] | n,unicode }
+             ${ workflow_form['parameters'] | n,unicode }
          </div>
          </fieldset>
 

+ 3 - 3
apps/oozie/src/oozie/templates/editor/import_workflow.mako

@@ -65,9 +65,9 @@ ${ layout.menubar(section='workflows') }
            </div>
 
            <div class="hide">
-             ${ workflow_form['schema_version'] }
-             ${ workflow_form['job_properties'] }
-             ${ workflow_form['parameters'] }
+             ${ workflow_form['schema_version'] | n,unicode }
+             ${ workflow_form['job_properties'] | n,unicode }
+             ${ workflow_form['parameters'] | n,unicode }
          </div>
          </fieldset>
 

+ 21 - 0
apps/oozie/src/oozie/test_data/0.4/test-subworkflow.xml

@@ -0,0 +1,21 @@
+<workflow-app name="Subworkflow" xmlns="uri:oozie:workflow:0.4">
+    <start to="Subworkflow"/>
+    <action name="Subworkflow">
+        <sub-workflow>
+            <app-path>/user/hue/oozie/workspaces/sleep</app-path>
+            <propagate-configuration/>
+            <configuration>
+                <property>
+                    <name>test</name>
+                    <value>test</value>
+                </property>
+            </configuration>
+        </sub-workflow>
+        <ok to="end"/>
+        <error to="kill"/>
+    </action>
+    <kill name="kill">
+        <message>Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
+    </kill>
+    <end name="end"/>
+</workflow-app>

+ 76 - 28
apps/oozie/src/oozie/tests.py

@@ -579,8 +579,8 @@ class TestEditor(OozieMockBase):
 
 
   def test_workflow_has_cycle(self):
-    action1 = Node.objects.get(name='action-name-1')
-    action3 = Node.objects.get(name='action-name-3')
+    action1 = Node.objects.get(workflow=self.wf, name='action-name-1')
+    action3 = Node.objects.get(workflow=self.wf, name='action-name-3')
 
     assert_false(self.wf.has_cycle())
 
@@ -1076,7 +1076,7 @@ class TestEditor(OozieMockBase):
 
 
   def test_workflow_prepare(self):
-    action1 = Node.objects.get(name='action-name-1').get_full_node()
+    action1 = Node.objects.get(workflow=self.wf, name='action-name-1').get_full_node()
 
     action1.prepares = json.dumps([
                            {"type": "delete","value": "${output}"},
@@ -1114,10 +1114,39 @@ class TestEditor(OozieMockBase):
     assert_true('checked: capture_output' in response.content, response.content)
 
 
-  @raises(PopupException)
+  def test_xss_escape_js(self):
+    escaped = '[{"name": "oozie.use.system.libpath", "value": "true"}, {"name": "123\\\\u0022\\\\u003E\\\\u003Cscript\\\\u003Ealert(1)\\\\u003C/script\\\\u003E", "value": "hacked"}]'
+    hacked = '[{"name":"oozie.use.system.libpath","value":"true"}, {"name": "123\\"><script>alert(1)</script>", "value": "hacked"}]'
+
+    self.wf.job_properties = hacked
+    self.wf.parameters = hacked
+
+    assert_equal(escaped, self.wf._escapejs_parameters_list(hacked))
+    assert_equal(escaped, self.wf.job_properties_escapejs)
+    assert_equal(escaped, self.wf.parameters_escapejs)
+
+
+  def test_xss_html_escaping(self):
+    data = WORKFLOW_DICT.copy()
+    data['description'] = [u'"><script>alert(1);</script>']
+
+    self.wf = create_workflow(self.c, workflow_dict=data)
+
+    resp = self.c.get('/oozie/list_workflows/')
+    assert_false('"><script>alert(1);</script>' in resp.content, resp.content)
+    assert_true('&quot;&gt;&lt;script&gt;alert(1);&lt;/script&gt;' in resp.content, resp.content)
+
+
+class TestImportWorkflow04(OozieMockBase):
+
+  def setUp(self):
+    super(TestImportWorkflow04, self).setUp()
+    self.setup_simple_workflow()
+
+  @raises(RuntimeError)
   def test_import_workflow_namespace_error(self):
     """
-    Validates import for most basic workflow: start and end.
+    Validates import for most basic workflow with an error.
     """
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
@@ -1142,6 +1171,7 @@ class TestEditor(OozieMockBase):
     assert_equal(2, len(Node.objects.filter(workflow=workflow)))
     assert_equal(1, len(Link.objects.filter(parent__workflow=workflow)))
     assert_equal('done', Node.objects.get(workflow=workflow, node_type='end').name)
+    assert_equal('uri:oozie:workflow:0.4', workflow.schema_version)
     workflow.delete()
 
 
@@ -1342,29 +1372,6 @@ class TestEditor(OozieMockBase):
     workflow.delete()
 
 
-  def test_xss_escape_js(self):
-    escaped = '[{"name": "oozie.use.system.libpath", "value": "true"}, {"name": "123\\\\u0022\\\\u003E\\\\u003Cscript\\\\u003Ealert(1)\\\\u003C/script\\\\u003E", "value": "hacked"}]'
-    hacked = '[{"name":"oozie.use.system.libpath","value":"true"}, {"name": "123\\"><script>alert(1)</script>", "value": "hacked"}]'
-
-    self.wf.job_properties = hacked
-    self.wf.parameters = hacked
-
-    assert_equal(escaped, self.wf._escapejs_parameters_list(hacked))
-    assert_equal(escaped, self.wf.job_properties_escapejs)
-    assert_equal(escaped, self.wf.parameters_escapejs)
-
-
-  def test_xss_html_escaping(self):
-    data = WORKFLOW_DICT.copy()
-    data['description'] = [u'"><script>alert(1);</script>']
-
-    self.wf = create_workflow(self.c, workflow_dict=data)
-
-    resp = self.c.get('/oozie/list_workflows/')
-    assert_false('"><script>alert(1);</script>' in resp.content, resp.content)
-    assert_true('&quot;&gt;&lt;script&gt;alert(1);&lt;/script&gt;' in resp.content, resp.content)
-
-
 class TestPermissions(OozieBase):
 
   def setUp(self):
@@ -1625,6 +1632,8 @@ class TestPermissions(OozieBase):
 class TestEditorWithOozie(OozieBase):
 
   def setUp(self):
+    OozieBase.setUp(self)
+
     self.c = make_logged_in_client()
     self.wf = create_workflow(self.c)
     self.setup_simple_workflow()
@@ -1680,6 +1689,45 @@ class TestEditorWithOozie(OozieBase):
     assert_equal(workflow_count + 1, Workflow.objects.count(), response)
 
 
+
+class TestImportWorkflow04WithOozie(OozieBase):
+
+  def setUp(self):
+    OozieBase.setUp(self)
+
+    self.c = make_logged_in_client()
+    self.wf = create_workflow(self.c)
+    self.setup_simple_workflow()
+
+    # in order to reference examples in Subworkflow, must be owned by current user.
+    Workflow.objects.update(owner=self.user)
+
+
+  def tearDown(self):
+    self.wf.delete()
+
+    # Make sure examples are owned by Hue.
+    # This user is created by OozieBase.
+    Workflow.objects.update(owner=User.objects.get(username='hue'))
+
+
+  def test_import_workflow_subworkflow(self):
+    """
+    Validates import for subworkflow node: propagate_configuration.
+    """
+    workflow = Workflow.objects.new_workflow(self.user)
+    workflow.save()
+    f = open('apps/oozie/src/oozie/test_data/0.4/test-subworkflow.xml')
+    import_workflow(workflow, f.read(), self.cluster.fs)
+    f.close()
+    workflow.save()
+    assert_equal(4, len(Node.objects.filter(workflow=workflow)))
+    assert_equal(3, len(Link.objects.filter(parent__workflow=workflow)))
+    node = Node.objects.get(workflow=workflow, node_type='subworkflow').get_full_node()
+    assert_equal(True, node.propagate_configuration)
+    workflow.delete()
+
+
 class TestOozieSubmissions(OozieBase):
 
   def test_submit_mapreduce_action(self):

+ 1 - 1
apps/oozie/src/oozie/views/editor.py

@@ -124,7 +124,7 @@ def import_workflow(request):
       workflow_definition = workflow_form.cleaned_data['definition_file'].read()
 
       try:
-        _import_workflow(workflow=workflow, workflow_definition=workflow_definition)
+        _import_workflow(fs=request.fs, workflow=workflow, workflow_definition=workflow_definition)
         request.info(_('Workflow imported'))
         return redirect(reverse('oozie:edit_workflow', kwargs={'workflow': workflow.id}))
 

+ 39 - 0
apps/oozie/src/oozie/xslt/0.1/action.xslt

@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:import href="extensions/distcp.0.1.xslt"/>
+<xsl:import href="extensions/email.0.1.xslt"/>
+<xsl:import href="extensions/hive.0.1.xslt"/>
+<xsl:import href="extensions/hive.0.2.xslt"/>
+<xsl:import href="extensions/shell.0.1.xslt"/>
+<xsl:import href="extensions/sqoop.0.1.xslt"/>
+<xsl:import href="extensions/sqoop.0.2.xslt"/>
+<xsl:import href="nodes/fs.xslt"/>
+<xsl:import href="nodes/java.xslt"/>
+<xsl:import href="nodes/mapreduce.xslt"/>
+<xsl:import href="nodes/pig.xslt"/>
+<xsl:import href="nodes/streaming.xslt"/>
+<xsl:import href="nodes/generic.xslt"/>
+<xsl:import href="nodes/ssh.xslt"/>
+<xsl:import href="nodes/subworkflow.xslt"/>
+
+<xsl:template match="workflow:action" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.node" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+    <field name="node_type" type="CharField">
+      <xsl:value-of select="name(*)"/>
+    </field>
+
+  </object>
+
+  <xsl:apply-templates select="*"/>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.1/control.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:import href="nodes/decision.xslt"/>
+<xsl:import href="nodes/end.xslt"/>
+<xsl:import href="nodes/fork.xslt"/>
+<xsl:import href="nodes/join.xslt"/>
+<xsl:import href="nodes/kill.xslt"/>
+<xsl:import href="nodes/start.xslt"/>
+
+<xsl:template match="workflow:start | workflow:end | workflow:decision | workflow:fork | workflow:join | workflow:kill">
+
+  <object model="oozie.node" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+    <field name="node_type" type="CharField">
+      <xsl:value-of select="name(.)"/>
+    </field>
+
+  </object>
+
+  <xsl:apply-imports/>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 37 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/distcp.0.1.xslt

@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" xmlns:distcp="uri:oozie:distcp-action:0.1" exclude-result-prefixes="workflow distcp">
+
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+
+<xsl:template match="distcp:distcp">
+
+  <object model="oozie.distcp" pk="0">
+
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <field name="params" type="CharField">
+      <xsl:text>[</xsl:text>
+      <xsl:for-each select="*[local-name()='arg']">
+        <xsl:choose>
+          <xsl:when test="position() &lt; last()">
+            <xsl:text><![CDATA[{"type":"arg","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["},]]></xsl:text>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:text><![CDATA[{"type":"arg","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["}]]></xsl:text>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:for-each>
+      <xsl:text>]</xsl:text>
+    </field>
+    <xsl:call-template name="prepares"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/email.0.1.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" xmlns:email="uri:oozie:email-action:0.1" exclude-result-prefixes="workflow email">
+
+<xsl:template match="email:email">
+
+  <object model="oozie.email" pk="0">
+
+    <field name="to" type="CharField">
+      <xsl:value-of select="*[local-name()='to']"/>
+    </field>
+
+    <field name="cc" type="CharField">
+      <xsl:value-of select="*[local-name()='cc']"/>
+    </field>
+
+    <field name="subject" type="CharField">
+      <xsl:value-of select="*[local-name()='subject']"/>
+    </field>
+
+    <field name="body" type="CharField">
+      <xsl:value-of select="*[local-name()='body']"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/hive.0.1.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" xmlns:hive="uri:oozie:hive-action:0.1" exclude-result-prefixes="workflow hive">
+
+<xsl:import href="../nodes/fields/archives.xslt"/>
+<xsl:import href="../nodes/fields/files.xslt"/>
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+<xsl:import href="../nodes/fields/script_path.xslt"/>
+
+<xsl:template match="hive:hive">
+
+  <object model="oozie.hive" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="prepares"/>
+    <xsl:call-template name="script_path"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/hive.0.2.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" xmlns:hive="uri:oozie:hive-action:0.2" exclude-result-prefixes="workflow hive">
+
+<xsl:import href="../nodes/fields/archives.xslt"/>
+<xsl:import href="../nodes/fields/files.xslt"/>
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+<xsl:import href="../nodes/fields/script_path.xslt"/>
+
+<xsl:template match="hive:hive">
+
+  <object model="oozie.hive" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="prepares"/>
+    <xsl:call-template name="script_path"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 32 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/shell.0.1.xslt

@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" xmlns:shell="uri:oozie:shell-action:0.1" exclude-result-prefixes="workflow shell">
+
+<xsl:import href="../nodes/fields/archives.xslt"/>
+<xsl:import href="../nodes/fields/capture_output.xslt"/>
+<xsl:import href="../nodes/fields/command.xslt"/>
+<xsl:import href="../nodes/fields/files.xslt"/>
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+
+<xsl:template match="shell:shell">
+
+  <object model="oozie.shell" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="capture_output"/>
+    <xsl:call-template name="command"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="prepares"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/sqoop.0.1.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" xmlns:sqoop="uri:oozie:sqoop-action:0.1" exclude-result-prefixes="workflow sqoop">
+
+<xsl:import href="../nodes/fields/archives.xslt"/>
+<xsl:import href="../nodes/fields/files.xslt"/>
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+<xsl:import href="../nodes/fields/script_path.xslt"/>
+
+<xsl:template match="sqoop:sqoop">
+
+  <object model="oozie.sqoop" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="prepares"/>
+    <xsl:call-template name="script_path"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 31 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/sqoop.0.2.xslt

@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" xmlns:sqoop="uri:oozie:sqoop-action:0.2" exclude-result-prefixes="workflow sqoop">
+
+<xsl:import href="../nodes/fields/archives.xslt"/>
+<xsl:import href="../nodes/fields/files.xslt"/>
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+
+<xsl:template match="sqoop:sqoop">
+
+  <object model="oozie.sqoop" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="prepares"/>
+    <field name="script_path" type="CharField">
+      <xsl:value-of select="*[local-name()='command']"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/decision.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:decision" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.decision" pk="0">
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/end.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:end" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.end" pk="0">
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 20 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/archives.xslt

@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="archives">
+
+  <field name="archives" type="TextField">
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='archive']">
+      <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["]]></xsl:text>
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/args.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="args">
+
+  <field name="args" type="CharField">
+    <xsl:for-each select="*[local-name()='arg']">
+      <xsl:value-of select="." />
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text> </xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 24 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/arguments.xslt

@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="arguments">
+
+  <field name="params" type="TextField">
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='argument']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 21 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/capture_output.xslt

@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="capture_output">
+
+  <field name="capture_output" type="BooleanField">
+    <xsl:choose>
+      <xsl:when test="*[local-name()='exec']">
+        True
+      </xsl:when>
+      <xsl:otherwise>
+        False
+      </xsl:otherwise>
+    </xsl:choose>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 39 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/chmods.xslt

@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="chmods">
+
+  <field name="chmods" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='chmod']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"path":"]]></xsl:text>
+          <xsl:value-of select="@path" />
+          <xsl:text><![CDATA[","permissions":"]]></xsl:text>
+          <xsl:value-of select="@permissions" />
+          <xsl:text><![CDATA[","recursive":"]]></xsl:text>
+          <xsl:value-of select="@dir-files" />
+          <xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"path":"]]></xsl:text>
+          <xsl:value-of select="@path" />
+          <xsl:text><![CDATA[","permissions":"]]></xsl:text>
+          <xsl:value-of select="@permissions" />
+          <xsl:text><![CDATA[","recursive":"]]></xsl:text>
+          <xsl:value-of select="@dir-files" />
+          <xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/command.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="command">
+
+  <field name="command" type="CharField">
+    <xsl:value-of select="*[local-name()='command']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 23 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/deletes.xslt

@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="deletes">
+
+  <field name="deletes" type="TextField">
+
+      <xsl:text>[</xsl:text>
+      <xsl:for-each select="*[local-name()='delete']">
+        <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["]]></xsl:text>
+        <xsl:if  test="position() &lt; last()">
+          <xsl:text>,</xsl:text>
+        </xsl:if>
+      </xsl:for-each>
+      <xsl:text>]</xsl:text>
+
+    </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 20 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/files.xslt

@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="files">
+
+  <field name="files" type="TextField">
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='file']">
+      <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["]]></xsl:text>
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/host.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="host">
+
+  <field name="host" type="CharField">
+    <xsl:value-of select="*[local-name()='host']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/jar_path.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="jar_path">
+
+  <field name="jar_path" type="CharField">
+    <xsl:value-of select="*[local-name()='jar-path']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/java_opts.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="java_opts">
+
+  <field name="java_opts" type="CharField">
+    <xsl:value-of select="*[local-name()='java-opts']"/>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 24 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/job_properties.xslt

@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="job_properties">
+
+  <field name="job_properties" type="TextField">
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='configuration']/*[local-name()='property']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"name":"]]></xsl:text><xsl:value-of select="*[local-name()='name']" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="*[local-name()='value']" /><xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"name":"]]></xsl:text><xsl:value-of select="*[local-name()='name']" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="*[local-name() ='value']" /><xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/job_xml.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="job_xml">
+
+  <field name="job_xml" type="CharField">
+    <xsl:value-of select="*[local-name()='job-xml']"/>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/main_class.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="main_class">
+
+  <field name="main_class" type="CharField">
+    <xsl:value-of select="*[local-name()='main-class']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/mapper.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="mapper">
+
+  <field name="mapper" type="CharField">
+    <xsl:value-of select="*[local-name()='streaming']/*[local-name()='mapper']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 23 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/mkdirs.xslt

@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="mkdirs">
+
+  <field name="mkdirs" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='mkdir']">
+      <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["]]></xsl:text>
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 35 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/moves.xslt

@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="moves">
+
+  <field name="moves" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='move']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"source":"]]></xsl:text>
+          <xsl:value-of select="@source" />
+          <xsl:text><![CDATA[","destination":"]]></xsl:text>
+          <xsl:value-of select="@target" />
+          <xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"source":"]]></xsl:text>
+          <xsl:value-of select="@source" />
+          <xsl:text><![CDATA[","destination":"]]></xsl:text>
+          <xsl:value-of select="@target" />
+          <xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 24 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/params.xslt

@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="params">
+
+  <field name="params" type="TextField">
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='param']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 26 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/prepares.xslt

@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="prepares">
+
+  <field name="prepares" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='prepare']/*">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 21 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/propagate_configuration.xslt

@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="propagate_configuration">
+
+  <field name="propagate_configuration" type="BooleanField">
+    <xsl:choose>
+      <xsl:when test="*[local-name()='propagate-configuration']">
+        <xsl:text>True</xsl:text>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:text>False</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/reducer.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="reducer">
+
+  <field name="reducer" type="CharField">
+    <xsl:value-of select="*[local-name()='streaming']/*[local-name()='reducer']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/script_path.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="script_path">
+
+  <field name="script_path" type="CharField">
+    <xsl:value-of select="*[local-name()='script']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 23 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/touchzs.xslt

@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="touchzs">
+
+  <field name="touchzs" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='touchz']">
+      <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["]]></xsl:text>
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/user.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template name="user">
+
+  <field name="user" type="CharField">
+    <xsl:value-of select="*[local-name()='user']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 28 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/xml.xslt

@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+
+<xsl:template match="*" mode="copy-no-namespaces">
+    <xsl:element name="{local-name()}">
+        <xsl:copy-of select="@*"/>
+        <xsl:apply-templates select="node()" mode="copy-no-namespaces"/>
+    </xsl:element>
+</xsl:template>
+
+<xsl:template match="comment()| processing-instruction()" mode="copy-no-namespaces">
+    <xsl:copy/>
+</xsl:template>
+
+<xsl:template name="xml">
+
+  <field name="xml" type="TextField">
+    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
+    <xsl:apply-templates  select="current()" mode="copy-no-namespaces"/>
+    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fork.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:fork" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.fork" pk="0">
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 26 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fs.xslt

@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/chmods.xslt"/>
+<xsl:import href="fields/deletes.xslt"/>
+<xsl:import href="fields/mkdirs.xslt"/>
+<xsl:import href="fields/moves.xslt"/>
+<xsl:import href="fields/touchzs.xslt"/>
+
+<xsl:template match="workflow:fs" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.fs" pk="0">
+
+    <xsl:call-template name="chmods"/>
+    <xsl:call-template name="deletes"/>
+    <xsl:call-template name="mkdirs"/>
+    <xsl:call-template name="moves"/>
+    <xsl:call-template name="touchzs"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/generic.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/xml.xslt"/>
+
+<xsl:template match="workflow:*[local-name()!='decision' and local-name()!='end' and local-name()!='fork' and local-name()!='fs' and local-name()!='java' and local-name()!='join' and local-name()!='kill' and local-name()!='map-reduce' and local-name()!='pig' and local-name()!='start' and local-name()!='streaming' and local-name()!='subworkflow' and local-name()!='distcp' and local-name()!='email' and local-name()!='hive' and local-name()!='shell' and local-name()!='sqoop' and local-name()!='ssh' and local-name()!='ok' and local-name()!='error']" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.generic" pk="0">
+
+    <xsl:call-template name="xml"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 34 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/java.xslt

@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/archives.xslt"/>
+<xsl:import href="fields/args.xslt"/>
+<xsl:import href="fields/files.xslt"/>
+<xsl:import href="fields/job_xml.xslt"/>
+<xsl:import href="fields/java_opts.xslt"/>
+<xsl:import href="fields/jar_path.xslt"/>
+<xsl:import href="fields/job_properties.xslt"/>
+<xsl:import href="fields/main_class.xslt"/>
+<xsl:import href="fields/prepares.xslt"/>
+
+<xsl:template match="workflow:java" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.java" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="args"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="jar_path"/>
+    <xsl:call-template name="java_opts"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="main_class"/>
+    <xsl:call-template name="prepares"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/join.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:join" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.join" pk="0">
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/kill.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:kill" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.kill" pk="0">
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 28 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/mapreduce.xslt

@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/archives.xslt"/>
+<xsl:import href="fields/files.xslt"/>
+<xsl:import href="fields/jar_path.xslt"/>
+<xsl:import href="fields/job_properties.xslt"/>
+<xsl:import href="fields/job_xml.xslt"/>
+<xsl:import href="fields/prepares.xslt"/>
+
+<xsl:template match="workflow:map-reduce" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.mapreduce" pk="0">
+
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="jar_path"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="prepares"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/pig.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/archives.xslt"/>
+<xsl:import href="fields/arguments.xslt"/>
+<xsl:import href="fields/files.xslt"/>
+<xsl:import href="fields/job_properties.xslt"/>
+<xsl:import href="fields/job_xml.xslt"/>
+<xsl:import href="fields/prepares.xslt"/>
+<xsl:import href="fields/script_path.xslt"/>
+
+<xsl:template match="workflow:pig" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.pig" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="arguments"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="prepares"/>
+    <xsl:call-template name="script_path"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 24 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/ssh.xslt

@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:import href="../nodes/fields/capture_output.xslt"/>
+<xsl:import href="../nodes/fields/command.xslt"/>
+<xsl:import href="../nodes/fields/host.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+
+<xsl:template match="workflow:ssh">
+
+  <object model="oozie.ssh" pk="0">
+
+    <xsl:call-template name="capture_output"/>
+    <xsl:call-template name="command"/>
+    <xsl:call-template name="host"/>
+    <xsl:call-template name="params"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/start.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:start">
+
+  <object model="oozie.start" pk="0">
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 26 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/streaming.xslt

@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/archives.xslt"/>
+<xsl:import href="fields/files.xslt"/>
+<xsl:import href="fields/job_properties.xslt"/>
+<xsl:import href="fields/mapper.xslt"/>
+<xsl:import href="fields/reducer.xslt"/>
+
+<xsl:template match="workflow:streaming" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.streaming" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="mapper"/>
+    <xsl:call-template name="reducer"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 20 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/subworkflow.xslt

@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/job_properties.xslt"/>
+<xsl:import href="fields/propagate_configuration.xslt"/>
+
+<xsl:template match="workflow:sub-workflow" xmlns:workflow="uri:oozie:workflow:0.1">
+
+  <object model="oozie.subworkflow" pk="0">
+
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="propagate_configuration"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 20 - 0
apps/oozie/src/oozie/xslt/0.1/workflow.xslt

@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.1" exclude-result-prefixes="workflow">
+
+<xsl:include href="action.xslt"/>
+<xsl:include href="control.xslt"/>
+
+<xsl:template match="/workflow:workflow-app">
+
+  <django-objects version="1.0">
+
+    <xsl:apply-templates select="workflow:action"/>
+    <xsl:apply-templates select="workflow:start | workflow:end | workflow:decision | workflow:fork | workflow:join | workflow:kill"/>
+
+  </django-objects>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 39 - 0
apps/oozie/src/oozie/xslt/0.2.5/action.xslt

@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:import href="extensions/distcp.0.1.xslt"/>
+<xsl:import href="extensions/email.0.1.xslt"/>
+<xsl:import href="extensions/hive.0.1.xslt"/>
+<xsl:import href="extensions/hive.0.2.xslt"/>
+<xsl:import href="extensions/shell.0.1.xslt"/>
+<xsl:import href="extensions/sqoop.0.1.xslt"/>
+<xsl:import href="extensions/sqoop.0.2.xslt"/>
+<xsl:import href="extensions/ssh.0.1.xslt"/>
+<xsl:import href="nodes/fs.xslt"/>
+<xsl:import href="nodes/java.xslt"/>
+<xsl:import href="nodes/mapreduce.xslt"/>
+<xsl:import href="nodes/pig.xslt"/>
+<xsl:import href="nodes/streaming.xslt"/>
+<xsl:import href="nodes/generic.xslt"/>
+<xsl:import href="nodes/subworkflow.xslt"/>
+
+<xsl:template match="workflow:action" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.node" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+    <field name="node_type" type="CharField">
+      <xsl:value-of select="name(*)"/>
+    </field>
+
+  </object>
+
+  <xsl:apply-templates select="*"/>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.2.5/control.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:import href="nodes/decision.xslt"/>
+<xsl:import href="nodes/end.xslt"/>
+<xsl:import href="nodes/fork.xslt"/>
+<xsl:import href="nodes/join.xslt"/>
+<xsl:import href="nodes/kill.xslt"/>
+<xsl:import href="nodes/start.xslt"/>
+
+<xsl:template match="workflow:start | workflow:end | workflow:decision | workflow:fork | workflow:join | workflow:kill">
+
+  <object model="oozie.node" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+    <field name="node_type" type="CharField">
+      <xsl:value-of select="name(.)"/>
+    </field>
+
+  </object>
+
+  <xsl:apply-imports/>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 37 - 0
apps/oozie/src/oozie/xslt/0.2.5/extensions/distcp.0.1.xslt

@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" xmlns:distcp="uri:oozie:distcp-action:0.1" exclude-result-prefixes="workflow distcp">
+
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+
+<xsl:template match="distcp:distcp">
+
+  <object model="oozie.distcp" pk="0">
+
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <field name="params" type="CharField">
+      <xsl:text>[</xsl:text>
+      <xsl:for-each select="*[local-name()='arg']">
+        <xsl:choose>
+          <xsl:when test="position() &lt; last()">
+            <xsl:text><![CDATA[{"type":"arg","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["},]]></xsl:text>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:text><![CDATA[{"type":"arg","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["}]]></xsl:text>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:for-each>
+      <xsl:text>]</xsl:text>
+    </field>
+    <xsl:call-template name="prepares"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.2.5/extensions/email.0.1.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" xmlns:email="uri:oozie:email-action:0.1" exclude-result-prefixes="workflow email">
+
+<xsl:template match="email:email">
+
+  <object model="oozie.email" pk="0">
+
+    <field name="to" type="CharField">
+      <xsl:value-of select="*[local-name()='to']"/>
+    </field>
+
+    <field name="cc" type="CharField">
+      <xsl:value-of select="*[local-name()='cc']"/>
+    </field>
+
+    <field name="subject" type="CharField">
+      <xsl:value-of select="*[local-name()='subject']"/>
+    </field>
+
+    <field name="body" type="CharField">
+      <xsl:value-of select="*[local-name()='body']"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.2.5/extensions/hive.0.1.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" xmlns:hive="uri:oozie:hive-action:0.1" exclude-result-prefixes="workflow hive">
+
+<xsl:import href="../nodes/fields/archives.xslt"/>
+<xsl:import href="../nodes/fields/files.xslt"/>
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+<xsl:import href="../nodes/fields/script_path.xslt"/>
+
+<xsl:template match="hive:hive">
+
+  <object model="oozie.hive" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="prepares"/>
+    <xsl:call-template name="script_path"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.2.5/extensions/hive.0.2.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" xmlns:hive="uri:oozie:hive-action:0.2" exclude-result-prefixes="workflow hive">
+
+<xsl:import href="../nodes/fields/archives.xslt"/>
+<xsl:import href="../nodes/fields/files.xslt"/>
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+<xsl:import href="../nodes/fields/script_path.xslt"/>
+
+<xsl:template match="hive:hive">
+
+  <object model="oozie.hive" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="prepares"/>
+    <xsl:call-template name="script_path"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 32 - 0
apps/oozie/src/oozie/xslt/0.2.5/extensions/shell.0.1.xslt

@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" xmlns:shell="uri:oozie:shell-action:0.1" exclude-result-prefixes="workflow shell">
+
+<xsl:import href="../nodes/fields/archives.xslt"/>
+<xsl:import href="../nodes/fields/capture_output.xslt"/>
+<xsl:import href="../nodes/fields/command.xslt"/>
+<xsl:import href="../nodes/fields/files.xslt"/>
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+
+<xsl:template match="shell:shell">
+
+  <object model="oozie.shell" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="capture_output"/>
+    <xsl:call-template name="command"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="prepares"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.2.5/extensions/sqoop.0.1.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" xmlns:sqoop="uri:oozie:sqoop-action:0.1" exclude-result-prefixes="workflow sqoop">
+
+<xsl:import href="../nodes/fields/archives.xslt"/>
+<xsl:import href="../nodes/fields/files.xslt"/>
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+<xsl:import href="../nodes/fields/script_path.xslt"/>
+
+<xsl:template match="sqoop:sqoop">
+
+  <object model="oozie.sqoop" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="prepares"/>
+    <xsl:call-template name="script_path"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 31 - 0
apps/oozie/src/oozie/xslt/0.2.5/extensions/sqoop.0.2.xslt

@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" xmlns:sqoop="uri:oozie:sqoop-action:0.2" exclude-result-prefixes="workflow sqoop">
+
+<xsl:import href="../nodes/fields/archives.xslt"/>
+<xsl:import href="../nodes/fields/files.xslt"/>
+<xsl:import href="../nodes/fields/job_properties.xslt"/>
+<xsl:import href="../nodes/fields/job_xml.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/prepares.xslt"/>
+
+<xsl:template match="sqoop:sqoop">
+
+  <object model="oozie.sqoop" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="prepares"/>
+    <field name="script_path" type="CharField">
+      <xsl:value-of select="*[local-name()='command']"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 26 - 0
apps/oozie/src/oozie/xslt/0.2.5/extensions/ssh.0.1.xslt

@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" xmlns:ssh="uri:oozie:ssh-action:0.1" exclude-result-prefixes="workflow ssh">
+
+<xsl:import href="../nodes/fields/capture_output.xslt"/>
+<xsl:import href="../nodes/fields/command.xslt"/>
+<xsl:import href="../nodes/fields/host.xslt"/>
+<xsl:import href="../nodes/fields/params.xslt"/>
+<xsl:import href="../nodes/fields/user.xslt"/>
+
+<xsl:template match="ssh:ssh">
+
+  <object model="oozie.ssh" pk="0">
+
+    <xsl:call-template name="capture_output"/>
+    <xsl:call-template name="command"/>
+    <xsl:call-template name="host"/>
+    <xsl:call-template name="params"/>
+    <xsl:call-template name="user"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/decision.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:decision" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.decision" pk="0">
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/end.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:end" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.end" pk="0">
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 20 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/archives.xslt

@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="archives">
+
+  <field name="archives" type="TextField">
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='archive']">
+      <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["]]></xsl:text>
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/args.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="args">
+
+  <field name="args" type="CharField">
+    <xsl:for-each select="*[local-name()='arg']">
+      <xsl:value-of select="." />
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text> </xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 24 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/arguments.xslt

@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="arguments">
+
+  <field name="params" type="TextField">
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='argument']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 21 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/capture_output.xslt

@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="capture_output">
+
+  <field name="capture_output" type="BooleanField">
+    <xsl:choose>
+      <xsl:when test="*[local-name()='exec']">
+        True
+      </xsl:when>
+      <xsl:otherwise>
+        False
+      </xsl:otherwise>
+    </xsl:choose>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 39 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/chmods.xslt

@@ -0,0 +1,39 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="chmods">
+
+  <field name="chmods" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='chmod']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"path":"]]></xsl:text>
+          <xsl:value-of select="@path" />
+          <xsl:text><![CDATA[","permissions":"]]></xsl:text>
+          <xsl:value-of select="@permissions" />
+          <xsl:text><![CDATA[","recursive":"]]></xsl:text>
+          <xsl:value-of select="@dir-files" />
+          <xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"path":"]]></xsl:text>
+          <xsl:value-of select="@path" />
+          <xsl:text><![CDATA[","permissions":"]]></xsl:text>
+          <xsl:value-of select="@permissions" />
+          <xsl:text><![CDATA[","recursive":"]]></xsl:text>
+          <xsl:value-of select="@dir-files" />
+          <xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/command.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="command">
+
+  <field name="command" type="CharField">
+    <xsl:value-of select="*[local-name()='command']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 23 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/deletes.xslt

@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="deletes">
+
+  <field name="deletes" type="TextField">
+
+      <xsl:text>[</xsl:text>
+      <xsl:for-each select="*[local-name()='delete']">
+        <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["]]></xsl:text>
+        <xsl:if  test="position() &lt; last()">
+          <xsl:text>,</xsl:text>
+        </xsl:if>
+      </xsl:for-each>
+      <xsl:text>]</xsl:text>
+
+    </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 20 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/files.xslt

@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="files">
+
+  <field name="files" type="TextField">
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='file']">
+      <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["]]></xsl:text>
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/host.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="host">
+
+  <field name="host" type="CharField">
+    <xsl:value-of select="*[local-name()='host']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/jar_path.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="jar_path">
+
+  <field name="jar_path" type="CharField">
+    <xsl:value-of select="*[local-name()='jar-path']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/java_opts.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="java_opts">
+
+  <field name="java_opts" type="CharField">
+    <xsl:value-of select="*[local-name()='java-opts']"/>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 24 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/job_properties.xslt

@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="job_properties">
+
+  <field name="job_properties" type="TextField">
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='configuration']/*[local-name()='property']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"name":"]]></xsl:text><xsl:value-of select="*[local-name()='name']" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="*[local-name()='value']" /><xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"name":"]]></xsl:text><xsl:value-of select="*[local-name()='name']" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="*[local-name() ='value']" /><xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/job_xml.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="job_xml">
+
+  <field name="job_xml" type="CharField">
+    <xsl:value-of select="*[local-name()='job-xml']"/>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/main_class.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="main_class">
+
+  <field name="main_class" type="CharField">
+    <xsl:value-of select="*[local-name()='main-class']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/mapper.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="mapper">
+
+  <field name="mapper" type="CharField">
+    <xsl:value-of select="*[local-name()='streaming']/*[local-name()='mapper']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 23 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/mkdirs.xslt

@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="mkdirs">
+
+  <field name="mkdirs" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='mkdir']">
+      <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["]]></xsl:text>
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 35 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/moves.xslt

@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="moves">
+
+  <field name="moves" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='move']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"source":"]]></xsl:text>
+          <xsl:value-of select="@source" />
+          <xsl:text><![CDATA[","destination":"]]></xsl:text>
+          <xsl:value-of select="@target" />
+          <xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"source":"]]></xsl:text>
+          <xsl:value-of select="@source" />
+          <xsl:text><![CDATA[","destination":"]]></xsl:text>
+          <xsl:value-of select="@target" />
+          <xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 24 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/params.xslt

@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="params">
+
+  <field name="params" type="TextField">
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='param']">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="." /><xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 26 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/prepares.xslt

@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="prepares">
+
+  <field name="prepares" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='prepare']/*">
+      <xsl:choose>
+        <xsl:when test="position() &lt; last()">
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["},]]></xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text><![CDATA[{"type":"]]></xsl:text><xsl:value-of select="local-name()" /><xsl:text><![CDATA[","value":"]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["}]]></xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+</xsl:stylesheet>

+ 21 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/propagate_configuration.xslt

@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="propagate_configuration">
+
+  <field name="propagate_configuration" type="BooleanField">
+    <xsl:choose>
+      <xsl:when test="*[local-name()='propagate-configuration']">
+        <xsl:text>True</xsl:text>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:text>False</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/reducer.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="reducer">
+
+  <field name="reducer" type="CharField">
+    <xsl:value-of select="*[local-name()='streaming']/*[local-name()='reducer']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/script_path.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="script_path">
+
+  <field name="script_path" type="CharField">
+    <xsl:value-of select="*[local-name()='script']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 23 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/touchzs.xslt

@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="touchzs">
+
+  <field name="touchzs" type="TextField">
+
+    <xsl:text>[</xsl:text>
+    <xsl:for-each select="*[local-name()='touchz']">
+      <xsl:text><![CDATA["]]></xsl:text><xsl:value-of select="@path" /><xsl:text><![CDATA["]]></xsl:text>
+      <xsl:if  test="position() &lt; last()">
+        <xsl:text>,</xsl:text>
+      </xsl:if>
+    </xsl:for-each>
+    <xsl:text>]</xsl:text>
+
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 14 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/user.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template name="user">
+
+  <field name="user" type="CharField">
+    <xsl:value-of select="*[local-name()='user']"/>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 28 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/xml.xslt

@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+
+<xsl:template match="*" mode="copy-no-namespaces">
+    <xsl:element name="{local-name()}">
+        <xsl:copy-of select="@*"/>
+        <xsl:apply-templates select="node()" mode="copy-no-namespaces"/>
+    </xsl:element>
+</xsl:template>
+
+<xsl:template match="comment()| processing-instruction()" mode="copy-no-namespaces">
+    <xsl:copy/>
+</xsl:template>
+
+<xsl:template name="xml">
+
+  <field name="xml" type="TextField">
+    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
+    <xsl:apply-templates  select="current()" mode="copy-no-namespaces"/>
+    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
+  </field>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fork.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:fork" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.fork" pk="0">
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 26 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/fs.xslt

@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/chmods.xslt"/>
+<xsl:import href="fields/deletes.xslt"/>
+<xsl:import href="fields/mkdirs.xslt"/>
+<xsl:import href="fields/moves.xslt"/>
+<xsl:import href="fields/touchzs.xslt"/>
+
+<xsl:template match="workflow:fs" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.fs" pk="0">
+
+    <xsl:call-template name="chmods"/>
+    <xsl:call-template name="deletes"/>
+    <xsl:call-template name="mkdirs"/>
+    <xsl:call-template name="moves"/>
+    <xsl:call-template name="touchzs"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/generic.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/xml.xslt"/>
+
+<xsl:template match="workflow:*[local-name()!='decision' and local-name()!='end' and local-name()!='fork' and local-name()!='fs' and local-name()!='java' and local-name()!='join' and local-name()!='kill' and local-name()!='map-reduce' and local-name()!='pig' and local-name()!='start' and local-name()!='streaming' and local-name()!='subworkflow' and local-name()!='distcp' and local-name()!='email' and local-name()!='hive' and local-name()!='shell' and local-name()!='sqoop' and local-name()!='ssh' and local-name()!='ok' and local-name()!='error']" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.generic" pk="0">
+
+    <xsl:call-template name="xml"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 34 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/java.xslt

@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/archives.xslt"/>
+<xsl:import href="fields/args.xslt"/>
+<xsl:import href="fields/files.xslt"/>
+<xsl:import href="fields/job_xml.xslt"/>
+<xsl:import href="fields/java_opts.xslt"/>
+<xsl:import href="fields/jar_path.xslt"/>
+<xsl:import href="fields/job_properties.xslt"/>
+<xsl:import href="fields/main_class.xslt"/>
+<xsl:import href="fields/prepares.xslt"/>
+
+<xsl:template match="workflow:java" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.java" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="args"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="jar_path"/>
+    <xsl:call-template name="java_opts"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="main_class"/>
+    <xsl:call-template name="prepares"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/join.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:join" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.join" pk="0">
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 13 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/kill.xslt

@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:template match="workflow:kill" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.kill" pk="0">
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 28 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/mapreduce.xslt

@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/archives.xslt"/>
+<xsl:import href="fields/files.xslt"/>
+<xsl:import href="fields/jar_path.xslt"/>
+<xsl:import href="fields/job_properties.xslt"/>
+<xsl:import href="fields/job_xml.xslt"/>
+<xsl:import href="fields/prepares.xslt"/>
+
+<xsl:template match="workflow:map-reduce" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.mapreduce" pk="0">
+
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="jar_path"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="prepares"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 30 - 0
apps/oozie/src/oozie/xslt/0.2.5/nodes/pig.xslt

@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.2.5" exclude-result-prefixes="workflow">
+
+<xsl:import href="fields/archives.xslt"/>
+<xsl:import href="fields/arguments.xslt"/>
+<xsl:import href="fields/files.xslt"/>
+<xsl:import href="fields/job_properties.xslt"/>
+<xsl:import href="fields/job_xml.xslt"/>
+<xsl:import href="fields/prepares.xslt"/>
+<xsl:import href="fields/script_path.xslt"/>
+
+<xsl:template match="workflow:pig" xmlns:workflow="uri:oozie:workflow:0.2.5">
+
+  <object model="oozie.pig" pk="0">
+
+    <xsl:call-template name="archives"/>
+    <xsl:call-template name="arguments"/>
+    <xsl:call-template name="files"/>
+    <xsl:call-template name="job_properties"/>
+    <xsl:call-template name="job_xml"/>
+    <xsl:call-template name="prepares"/>
+    <xsl:call-template name="script_path"/>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно