Преглед изворни кода

HUE-969 [oozie] Automatically infer schema version when importing workflow

Added proper namespacing to XSLTs in order to import by version.
Version is inferred by namespace.
abec пре 13 година
родитељ
комит
04be852
47 измењених фајлова са 140 додато и 90 уклоњено
  1. 0 1
      apps/oozie/src/oozie/forms.py
  2. 26 13
      apps/oozie/src/oozie/import_workflow.py
  3. 1 1
      apps/oozie/src/oozie/templates/editor/import_workflow.mako
  4. 4 0
      apps/oozie/src/oozie/test_data/0.4/test-basic-namespace-missing.xml
  5. 3 3
      apps/oozie/src/oozie/test_data/0.4/test-basic.xml
  6. 26 10
      apps/oozie/src/oozie/tests.py
  7. 5 0
      apps/oozie/src/oozie/utils.py
  8. 1 2
      apps/oozie/src/oozie/views/editor.py
  9. 2 2
      apps/oozie/src/oozie/xslt/0.4/action.xslt
  10. 2 2
      apps/oozie/src/oozie/xslt/0.4/control.xslt
  11. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/distcp.0.1.xslt
  12. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/hive.0.1.xslt
  13. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/hive.0.2.xslt
  14. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/shell.0.1.xslt
  15. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/sqoop.0.1.xslt
  16. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/sqoop.0.2.xslt
  17. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/ssh.0.1.xslt
  18. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/decision.xslt
  19. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/end.xslt
  20. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/archives.xslt
  21. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/args.xslt
  22. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/arguments.xslt
  23. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/capture_output.xslt
  24. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/command.xslt
  25. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/files.xslt
  26. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/host.xslt
  27. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/jar_path.xslt
  28. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/java_opts.xslt
  29. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/job_properties.xslt
  30. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/job_xml.xslt
  31. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/main_class.xslt
  32. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/mapper.xslt
  33. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/params.xslt
  34. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/prepares.xslt
  35. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/reducer.xslt
  36. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/script_path.xslt
  37. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/user.xslt
  38. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/fork.xslt
  39. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/java.xslt
  40. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/join.xslt
  41. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/kill.xslt
  42. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/mapreduce.xslt
  43. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/pig.xslt
  44. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/start.xslt
  45. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/streaming.xslt
  46. 4 4
      apps/oozie/src/oozie/xslt/0.4/workflow.xslt
  47. 14 0
      apps/oozie/src/oozie/xslt/workflow.xslt

+ 0 - 1
apps/oozie/src/oozie/forms.py

@@ -76,7 +76,6 @@ SCHEMA_VERSION_CHOICES = ['0.4']
 
 class ImportWorkflowForm(WorkflowForm):
   definition_file = forms.FileField(label=_t("Local workflow.xml file"))
-  schema_version = forms.ChoiceField(choices=[(version, version) for version in SCHEMA_VERSION_CHOICES])
 
 
 class ImportJobsubDesignForm(forms.Form):

+ 26 - 13
apps/oozie/src/oozie/import_workflow.py

@@ -48,10 +48,14 @@ 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 utils import xml_tag
 
 LOG = logging.getLogger(__name__)
 
+OOZIE_NAMESPACES = ['uri:oozie:workflow:0.1', 'uri:oozie:workflow:0.2', 'uri:oozie:workflow:0.3', 'uri:oozie:workflow:0.4']
+
 LINKS = ('ok', 'error', 'path')
+
 def _save_links(workflow, root):
   """
   Iterates over all links in the passed XML doc and creates links.
@@ -82,7 +86,7 @@ def _save_links(workflow, root):
     # Iterate over node members
     # Join nodes have attributes which point to the next node
     # Start node has attribute which points to first node
-    parent = Node.objects.get(workflow=workflow, name=node.attrib.get('name', node.tag)).get_full_node()
+    parent = Node.objects.get(workflow=workflow, name=node.attrib.get('name', xml_tag(node))).get_full_node()
 
     if isinstance(parent, Start):
       workflow.start = parent
@@ -103,7 +107,7 @@ def _save_links(workflow, root):
           to = case.attrib['to']
           child = Node.objects.get(workflow=workflow, name=to)
 
-          if case.tag == 'default':
+          if xml_tag(case) == 'default':
             name = 'default'
             obj = Link.objects.create(name=name, parent=parent, child=child)
 
@@ -117,9 +121,9 @@ def _save_links(workflow, root):
     else:
       for el in node:
         # Links
-        if el.tag in LINKS:
-          name = el.tag
-          if el.tag == 'path':
+        name = xml_tag(el)
+        if name in LINKS:
+          if name == 'path':
             to = el.attrib['start']
             name = 'start'
           else:
@@ -344,18 +348,27 @@ def _save_nodes(workflow, root):
       full_node.save()
 
 
-def import_workflow(workflow, workflow_definition, schema_version=0.4):
-  xslt_definition_fh = open("%(xslt_dir)s/%(schema_version)s/workflow.xslt" % {
-    'xslt_dir': DEFINITION_XSLT_DIR.get(),
-    'schema_version': schema_version
+def import_workflow(workflow, workflow_definition):
+  xslt_definition_fh = open("%(xslt_dir)s/workflow.xslt" % {
+    'xslt_dir': DEFINITION_XSLT_DIR.get()
   })
 
-  # Remove namespace from definition
-  workflow_definition = re.sub(r'\s*xmlns=".*?"', '', workflow_definition, count=1)
-
   # Parse Workflow Definition
   xml = etree.fromstring(workflow_definition)
 
+  if xml is None:
+    raise PopupException(_("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
+  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,
+      'namespaces': ', '.join(OOZIE_NAMESPACES)
+    })
+
   # Get XSLT
   xslt = etree.parse(xslt_definition_fh)
   xslt_definition_fh.close()
@@ -369,5 +382,5 @@ def import_workflow(workflow, workflow_definition, schema_version=0.4):
   _save_links(workflow, xml)
 
   # Update schema_version
-  workflow.schema_version = "uri:oozie:workflow:%s" % schema_version
+  workflow.schema_version = schema_version
   workflow.save()

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

@@ -30,7 +30,7 @@ ${ layout.menubar(section='workflows') }
   <h1>${ _('Import Workflow') }</h1>
 
     <div class="well">
-      <div class="alert alert-info"><h3>${_('Import an Oozie workflow')}</h3>${_("You can import an external Oozie workflow by providing the workflow definition file.")}</div>
+      <p>${_("You can import an external Oozie workflow by providing the workflow definition file.")}</p>
     </div>
 
     <div style="min-height:300px">

+ 4 - 0
apps/oozie/src/oozie/test_data/0.4/test-basic-namespace-missing.xml

@@ -0,0 +1,4 @@
+<workflow-app name="test-workflow">
+    <start to="done"/>
+    <end name="done"/>
+</workflow-app>

+ 3 - 3
apps/oozie/src/oozie/test_data/0.4/test-basic.xml

@@ -1,4 +1,4 @@
-<workflow-app name="test-workflow">
-<start to="done"/>
-<end name="done"/>
+<workflow-app name="test-workflow" xmlns="uri:oozie:workflow:0.4">
+    <start to="done"/>
+    <end name="done"/>
 </workflow-app>

+ 26 - 10
apps/oozie/src/oozie/tests.py

@@ -24,11 +24,12 @@ import re
 import os
 
 from nose.plugins.skip import SkipTest
-from nose.tools import assert_true, assert_false, assert_equal, assert_not_equal
+from nose.tools import raises, assert_true, assert_false, assert_equal, assert_not_equal
 from django.contrib.auth.models import User
 from django.core.urlresolvers import reverse
 
 from desktop.lib.django_test_util import make_logged_in_client
+from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.test_utils import grant_access, add_permission
 from jobsub.management.commands import jobsub_setup
 from jobsub.models import OozieDesign
@@ -1086,6 +1087,21 @@ class TestEditor(OozieMockBase):
     assert_true('checked: capture_output' in response.content, response.content)
 
 
+  @raises(PopupException)
+  def test_import_workflow_namespace_error(self):
+    """
+    Validates import for most basic workflow: start and end.
+    """
+    workflow = Workflow.objects.new_workflow(self.user)
+    workflow.save()
+    f = open('apps/oozie/src/oozie/test_data/0.4/test-basic-namespace-missing.xml')
+    contents = f.read()
+    f.close()
+
+    # Should throw PopupException
+    import_workflow(workflow, contents)
+
+
   def test_import_workflow_basic(self):
     """
     Validates import for most basic workflow: start and end.
@@ -1093,7 +1109,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-basic.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(2, len(Node.objects.filter(workflow=workflow)))
@@ -1109,7 +1125,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-decision.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(12, len(Node.objects.filter(workflow=workflow)))
@@ -1125,7 +1141,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-decision-complex.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(14, len(Node.objects.filter(workflow=workflow)))
@@ -1144,7 +1160,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-distcp.0.1.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(4, len(Node.objects.filter(workflow=workflow)))
@@ -1157,7 +1173,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-forks.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(12, len(Node.objects.filter(workflow=workflow)))
@@ -1175,7 +1191,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-mapreduce.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(4, len(Node.objects.filter(workflow=workflow)))
@@ -1191,7 +1207,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-pig.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     node = Node.objects.get(workflow=workflow, node_type='pig').get_full_node()
@@ -1209,7 +1225,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-sqoop.0.2.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(4, len(Node.objects.filter(workflow=workflow)))
@@ -1227,7 +1243,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-java.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(5, len(Node.objects.filter(workflow=workflow)))

+ 5 - 0
apps/oozie/src/oozie/utils.py

@@ -16,6 +16,7 @@
 # limitations under the License.
 
 import logging
+import re
 
 from django.utils.translation import ugettext as _
 
@@ -63,3 +64,7 @@ def smart_path(path):
     path = '%(nameNode)s%(path)s' % {'nameNode': '${nameNode}', 'path': path}
 
   return path
+
+
+def xml_tag(element):
+  return re.sub(r'^\{.+\}', '', element.tag)

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

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

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/action.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="extensions/distcp.0.1.xslt"/>
 <xsl:import href="extensions/hive.0.1.xslt"/>
@@ -14,7 +14,7 @@
 <xsl:import href="nodes/pig.xslt"/>
 <xsl:import href="nodes/streaming.xslt"/>
 
-<xsl:template match="action">
+<xsl:template match="workflow:action" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.node" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/control.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="nodes/decision.xslt"/>
 <xsl:import href="nodes/end.xslt"/>
@@ -9,7 +9,7 @@
 <xsl:import href="nodes/kill.xslt"/>
 <xsl:import href="nodes/start.xslt"/>
 
-<xsl:template match="start | end | decision | fork | join | kill">
+<xsl:template match="workflow:start | workflow:end | workflow:decision | workflow:fork | workflow:join | workflow:kill">
 
   <object model="oozie.node" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/distcp.0.1.xslt

@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" 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" xmlns:distcp="uri:oozie:distcp-action:0.1">
+<xsl:template match="distcp:distcp">
 
   <object model="oozie.distcp" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/hive.0.1.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" 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"/>
@@ -10,7 +10,7 @@
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 <xsl:import href="../nodes/fields/script_path.xslt"/>
 
-<xsl:template match="hive:hive" xmlns:hive="uri:oozie:hive-action:0.1">
+<xsl:template match="hive:hive">
 
   <object model="oozie.hive" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/hive.0.2.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" 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"/>
@@ -10,7 +10,7 @@
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 <xsl:import href="../nodes/fields/script_path.xslt"/>
 
-<xsl:template match="hive:hive" xmlns:hive="uri:oozie:hive-action:0.2">
+<xsl:template match="hive:hive">
 
   <object model="oozie.hive" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/shell.0.1.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" 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"/>
@@ -11,7 +11,7 @@
 <xsl:import href="../nodes/fields/params.xslt"/>
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 
-<xsl:template match="shell:shell" xmlns:shell="uri:oozie:shell-action:0.1">
+<xsl:template match="shell:shell">
 
   <object model="oozie.shell" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/sqoop.0.1.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" 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"/>
@@ -10,7 +10,7 @@
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 <xsl:import href="../nodes/fields/script_path.xslt"/>
 
-<xsl:template match="sqoop:sqoop" xmlns:sqoop="uri:oozie:sqoop-action:0.1">
+<xsl:template match="sqoop:sqoop">
 
   <object model="oozie.sqoop" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/sqoop.0.2.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" 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"/>
@@ -9,7 +9,7 @@
 <xsl:import href="../nodes/fields/params.xslt"/>
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 
-<xsl:template match="sqoop:sqoop" xmlns:sqoop="uri:oozie:sqoop-action:0.2">
+<xsl:template match="sqoop:sqoop">
 
   <object model="oozie.sqoop" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/ssh.0.1.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" 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"/>
@@ -8,7 +8,7 @@
 <xsl:import href="../nodes/fields/params.xslt"/>
 <xsl:import href="../nodes/fields/user.xslt"/>
 
-<xsl:template match="ssh:ssh" xmlns:ssh="uri:oozie:ssh-action:0.1">
+<xsl:template match="ssh:ssh">
 
   <object model="oozie.ssh" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/decision.xslt

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

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/end.xslt

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

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/archives.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="archives">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/args.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="args">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/arguments.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="arguments">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/capture_output.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="capture_output">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/command.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="command">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/files.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="files">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/host.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="host">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/jar_path.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="jar_path">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/java_opts.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="java_opts">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/job_properties.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="job_properties">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/job_xml.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="job_xml">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/main_class.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="main_class">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/mapper.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="mapper">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/params.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="params">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/prepares.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="prepares">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/reducer.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="reducer">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/script_path.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="script_path">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/user.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="user">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/fork.xslt

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

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/java.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="fields/archives.xslt"/>
 <xsl:import href="fields/args.xslt"/>
@@ -12,7 +12,7 @@
 <xsl:import href="fields/main_class.xslt"/>
 <xsl:import href="fields/prepares.xslt"/>
 
-<xsl:template match="java">
+<xsl:template match="workflow:java" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.java" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/join.xslt

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

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/kill.xslt

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

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/mapreduce.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="fields/archives.xslt"/>
 <xsl:import href="fields/files.xslt"/>
@@ -9,7 +9,7 @@
 <xsl:import href="fields/job_xml.xslt"/>
 <xsl:import href="fields/prepares.xslt"/>
 
-<xsl:template match="map-reduce">
+<xsl:template match="workflow:map-reduce" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.mapreduce" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/pig.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="fields/archives.xslt"/>
 <xsl:import href="fields/arguments.xslt"/>
@@ -10,7 +10,7 @@
 <xsl:import href="fields/prepares.xslt"/>
 <xsl:import href="fields/script_path.xslt"/>
 
-<xsl:template match="pig">
+<xsl:template match="workflow:pig" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.pig" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/start.xslt

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

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/streaming.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="fields/archives.xslt"/>
 <xsl:import href="fields/files.xslt"/>
@@ -8,7 +8,7 @@
 <xsl:import href="fields/mapper.xslt"/>
 <xsl:import href="fields/reducer.xslt"/>
 
-<xsl:template match="streaming">
+<xsl:template match="workflow:streaming" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.streaming" pk="0">
 

+ 4 - 4
apps/oozie/src/oozie/xslt/0.4/workflow.xslt

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

+ 14 - 0
apps/oozie/src/oozie/xslt/workflow.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.4" exclude-result-prefixes="workflow">
+
+<xsl:include href="0.4/workflow.xslt"/>
+
+<xsl:template match="/">
+
+    <xsl:apply-templates select="*"/>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>