Quellcode durchsuchen

HUE-1068 [oozie] Java action should support capture output

Adding some more Oozie information in the dashboard
Fix broken migrations
Fix watch workflow ajax bug
Fix import Java action
Fix import Shell and Ssh action
Romain Rigaux vor 12 Jahren
Ursprung
Commit
c7900e0
24 geänderte Dateien mit 466 neuen und 32 gelöschten Zeilen
  1. 21 7
      apps/oozie/src/oozie/migrations/0018_auto__add_field_workflow_managed.py
  2. 319 0
      apps/oozie/src/oozie/migrations/0019_auto__add_field_java_capture_output.py
  3. 5 0
      apps/oozie/src/oozie/models.py
  4. 14 6
      apps/oozie/src/oozie/templates/dashboard/list_oozie_bundle.mako
  5. 18 5
      apps/oozie/src/oozie/templates/dashboard/list_oozie_coordinator.mako
  6. 8 5
      apps/oozie/src/oozie/templates/dashboard/list_oozie_workflow.mako
  7. 4 0
      apps/oozie/src/oozie/templates/editor/gen/workflow-java.xml.mako
  8. 1 0
      apps/oozie/src/oozie/templates/navigation-bar.mako
  9. 1 0
      apps/oozie/src/oozie/test_data/0.4/test-java.xml
  10. 32 0
      apps/oozie/src/oozie/test_data/0.4/test-shell.xml
  11. 24 0
      apps/oozie/src/oozie/tests.py
  12. 0 2
      apps/oozie/src/oozie/views/dashboard.py
  13. 2 2
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/capture_output.xslt
  14. 1 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/fields/command.xslt
  15. 2 0
      apps/oozie/src/oozie/xslt/0.2.5/nodes/java.xslt
  16. 2 2
      apps/oozie/src/oozie/xslt/0.2/nodes/fields/capture_output.xslt
  17. 1 0
      apps/oozie/src/oozie/xslt/0.2/nodes/fields/command.xslt
  18. 2 0
      apps/oozie/src/oozie/xslt/0.2/nodes/java.xslt
  19. 2 2
      apps/oozie/src/oozie/xslt/0.3/nodes/fields/capture_output.xslt
  20. 1 0
      apps/oozie/src/oozie/xslt/0.3/nodes/fields/command.xslt
  21. 2 0
      apps/oozie/src/oozie/xslt/0.3/nodes/java.xslt
  22. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/capture_output.xslt
  23. 1 0
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/command.xslt
  24. 2 0
      apps/oozie/src/oozie/xslt/0.4/nodes/java.xslt

+ 21 - 7
apps/oozie/src/oozie/migrations/0018_auto__add_field_workflow_managed.py

@@ -22,7 +22,7 @@ class Migration(SchemaMigration):
         'auth.group': {
             'Meta': {'object_name': 'Group'},
             'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'unique': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
             'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
         },
         'auth.permission': {
@@ -46,7 +46,7 @@ class Migration(SchemaMigration):
             'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
             'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
             'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
-            'username': ('django.db.models.fields.CharField', [], {'max_length': '30', 'unique': 'True'})
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
         },
         'contenttypes.contenttype': {
             'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
@@ -55,15 +55,29 @@ class Migration(SchemaMigration):
             'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
             'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
         },
+        'oozie.bundle': {
+            'Meta': {'object_name': 'Bundle', '_ormbases': ['oozie.Job']},
+            'coordinators': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['oozie.Coordinator']", 'through': "orm['oozie.BundledCoordinator']", 'symmetrical': 'False'}),
+            'job_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Job']", 'unique': 'True', 'primary_key': 'True'}),
+            'kick_off_time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 2, 28, 13, 56, 0, 347089)'})
+        },
+        'oozie.bundledcoordinator': {
+            'Meta': {'object_name': 'BundledCoordinator'},
+            'bundle': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Bundle']"}),
+            'coordinator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Coordinator']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'parameters': ('django.db.models.fields.TextField', [], {'default': '\'[{"name":"oozie.use.system.libpath","value":"true"}]\''})
+        },
         'oozie.coordinator': {
             'Meta': {'object_name': 'Coordinator', '_ormbases': ['oozie.Job']},
             'concurrency': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
-            'end': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 2, 15, 11, 54, 39, 423057)'}),
+            'end': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 3, 3, 13, 56, 0, 344924)'}),
             'execution': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
             'frequency_number': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}),
             'frequency_unit': ('django.db.models.fields.CharField', [], {'default': "'days'", 'max_length': '20'}),
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
             'job_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Job']", 'unique': 'True', 'primary_key': 'True'}),
-            'start': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 2, 12, 11, 54, 39, 423001)'}),
+            'start': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 2, 28, 13, 56, 0, 344893)'}),
             'throttle': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
             'timeout': ('django.db.models.fields.SmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
             'timezone': ('django.db.models.fields.CharField', [], {'default': "'America/Los_Angeles'", 'max_length': '24'}),
@@ -95,7 +109,7 @@ class Migration(SchemaMigration):
             'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
             'instance_choice': ('django.db.models.fields.CharField', [], {'default': "'default'", 'max_length': '10'}),
             'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
-            'start': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 2, 12, 11, 54, 39, 423990)'}),
+            'start': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 2, 28, 13, 56, 0, 345574)'}),
             'timezone': ('django.db.models.fields.CharField', [], {'default': "'America/Los_Angeles'", 'max_length': '24'}),
             'uri': ('django.db.models.fields.CharField', [], {'default': "'/data/${YEAR}${MONTH}${DAY}'", 'max_length': '1024'})
         },
@@ -291,13 +305,13 @@ class Migration(SchemaMigration):
         },
         'oozie.workflow': {
             'Meta': {'object_name': 'Workflow', '_ormbases': ['oozie.Job']},
-            'end': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'end_workflow'", 'blank': 'True', 'null': 'True', 'to': "orm['oozie.End']"}),
+            'end': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'end_workflow'", 'null': 'True', 'to': "orm['oozie.End']"}),
             'is_single': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
             'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
             'job_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Job']", 'unique': 'True', 'primary_key': 'True'}),
             'job_xml': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '512', 'blank': 'True'}),
             'managed': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
-            'start': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'start_workflow'", 'blank': 'True', 'null': 'True', 'to': "orm['oozie.Start']"})
+            'start': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'start_workflow'", 'null': 'True', 'to': "orm['oozie.Start']"})
         }
     }
 

+ 319 - 0
apps/oozie/src/oozie/migrations/0019_auto__add_field_java_capture_output.py

@@ -0,0 +1,319 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+
+        # Adding field 'Java.capture_output'
+        db.add_column('oozie_java', 'capture_output', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True), keep_default=False)
+
+
+    def backwards(self, orm):
+
+        # Deleting field 'Java.capture_output'
+        db.delete_column('oozie_java', 'capture_output')
+
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'oozie.bundle': {
+            'Meta': {'object_name': 'Bundle', '_ormbases': ['oozie.Job']},
+            'coordinators': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['oozie.Coordinator']", 'through': "orm['oozie.BundledCoordinator']", 'symmetrical': 'False'}),
+            'job_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Job']", 'unique': 'True', 'primary_key': 'True'}),
+            'kick_off_time': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 2, 28, 13, 57, 24, 603543)'})
+        },
+        'oozie.bundledcoordinator': {
+            'Meta': {'object_name': 'BundledCoordinator'},
+            'bundle': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Bundle']"}),
+            'coordinator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Coordinator']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'parameters': ('django.db.models.fields.TextField', [], {'default': '\'[{"name":"oozie.use.system.libpath","value":"true"}]\''})
+        },
+        'oozie.coordinator': {
+            'Meta': {'object_name': 'Coordinator', '_ormbases': ['oozie.Job']},
+            'concurrency': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'end': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 3, 3, 13, 57, 24, 601593)'}),
+            'execution': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
+            'frequency_number': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}),
+            'frequency_unit': ('django.db.models.fields.CharField', [], {'default': "'days'", 'max_length': '20'}),
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Job']", 'unique': 'True', 'primary_key': 'True'}),
+            'start': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 2, 28, 13, 57, 24, 601562)'}),
+            'throttle': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'timeout': ('django.db.models.fields.SmallIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'timezone': ('django.db.models.fields.CharField', [], {'default': "'America/Los_Angeles'", 'max_length': '24'}),
+            'workflow': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Workflow']", 'null': 'True'})
+        },
+        'oozie.datainput': {
+            'Meta': {'object_name': 'DataInput'},
+            'coordinator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Coordinator']"}),
+            'dataset': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Dataset']", 'unique': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '40'})
+        },
+        'oozie.dataoutput': {
+            'Meta': {'object_name': 'DataOutput'},
+            'coordinator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Coordinator']"}),
+            'dataset': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Dataset']", 'unique': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '40'})
+        },
+        'oozie.dataset': {
+            'Meta': {'object_name': 'Dataset'},
+            'advanced_end_instance': ('django.db.models.fields.CharField', [], {'default': "'0'", 'max_length': '128', 'blank': 'True'}),
+            'advanced_start_instance': ('django.db.models.fields.CharField', [], {'default': "'0'", 'max_length': '128'}),
+            'coordinator': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Coordinator']"}),
+            'description': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}),
+            'done_flag': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64', 'blank': 'True'}),
+            'frequency_number': ('django.db.models.fields.SmallIntegerField', [], {'default': '1'}),
+            'frequency_unit': ('django.db.models.fields.CharField', [], {'default': "'days'", 'max_length': '20'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'instance_choice': ('django.db.models.fields.CharField', [], {'default': "'default'", 'max_length': '10'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+            'start': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2013, 2, 28, 13, 57, 24, 602148)'}),
+            'timezone': ('django.db.models.fields.CharField', [], {'default': "'America/Los_Angeles'", 'max_length': '24'}),
+            'uri': ('django.db.models.fields.CharField', [], {'default': "'/data/${YEAR}${MONTH}${DAY}'", 'max_length': '1024'})
+        },
+        'oozie.decision': {
+            'Meta': {'object_name': 'Decision'},
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'oozie.decisionend': {
+            'Meta': {'object_name': 'DecisionEnd'},
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'oozie.distcp': {
+            'Meta': {'object_name': 'DistCp'},
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_xml': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '512', 'blank': 'True'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'params': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'prepares': ('django.db.models.fields.TextField', [], {'default': "'[]'"})
+        },
+        'oozie.email': {
+            'Meta': {'object_name': 'Email'},
+            'body': ('django.db.models.fields.TextField', [], {'default': "''"}),
+            'cc': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'subject': ('django.db.models.fields.TextField', [], {'default': "''"}),
+            'to': ('django.db.models.fields.TextField', [], {'default': "''"})
+        },
+        'oozie.end': {
+            'Meta': {'object_name': 'End'},
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'oozie.fork': {
+            'Meta': {'object_name': 'Fork'},
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'oozie.fs': {
+            'Meta': {'object_name': 'Fs'},
+            'chmods': ('django.db.models.fields.TextField', [], {'default': "'[]'", 'blank': 'True'}),
+            'deletes': ('django.db.models.fields.TextField', [], {'default': "'[]'", 'blank': 'True'}),
+            'mkdirs': ('django.db.models.fields.TextField', [], {'default': "'[]'", 'blank': 'True'}),
+            'moves': ('django.db.models.fields.TextField', [], {'default': "'[]'", 'blank': 'True'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'touchzs': ('django.db.models.fields.TextField', [], {'default': "'[]'", 'blank': 'True'})
+        },
+        'oozie.generic': {
+            'Meta': {'object_name': 'Generic'},
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'xml': ('django.db.models.fields.TextField', [], {'default': "''"})
+        },
+        'oozie.history': {
+            'Meta': {'object_name': 'History'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'job': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Job']"}),
+            'oozie_job_id': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'properties': ('django.db.models.fields.TextField', [], {}),
+            'submission_date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
+            'submitter': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+        },
+        'oozie.hive': {
+            'Meta': {'object_name': 'Hive'},
+            'archives': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'files': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': '\'[{"name":"oozie.hive.defaults","value":"hive-site.xml"}]\''}),
+            'job_xml': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '512', 'blank': 'True'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'params': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'prepares': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'script_path': ('django.db.models.fields.CharField', [], {'max_length': '256'})
+        },
+        'oozie.java': {
+            'Meta': {'object_name': 'Java'},
+            'archives': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'args': ('django.db.models.fields.CharField', [], {'max_length': '4096', 'blank': 'True'}),
+            'capture_output': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'files': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'jar_path': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
+            'java_opts': ('django.db.models.fields.CharField', [], {'max_length': '256', 'blank': 'True'}),
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_xml': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '512', 'blank': 'True'}),
+            'main_class': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'prepares': ('django.db.models.fields.TextField', [], {'default': "'[]'"})
+        },
+        'oozie.job': {
+            'Meta': {'object_name': 'Job'},
+            'deployment_dir': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'description': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_shared': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'db_index': 'True', 'blank': 'True'}),
+            'last_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}),
+            'parameters': ('django.db.models.fields.TextField', [], {'default': '\'[{"name":"oozie.use.system.libpath","value":"true"}]\''}),
+            'schema_version': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'oozie.join': {
+            'Meta': {'object_name': 'Join'},
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'oozie.kill': {
+            'Meta': {'object_name': 'Kill'},
+            'message': ('django.db.models.fields.CharField', [], {'default': "'Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]'", 'max_length': '256'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'})
+        },
+        'oozie.link': {
+            'Meta': {'object_name': 'Link'},
+            'child': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'parent_node'", 'to': "orm['oozie.Node']"}),
+            'comment': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+            'parent': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'child_node'", 'to': "orm['oozie.Node']"})
+        },
+        'oozie.mapreduce': {
+            'Meta': {'object_name': 'Mapreduce'},
+            'archives': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'files': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'jar_path': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_xml': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '512', 'blank': 'True'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True'}),
+            'prepares': ('django.db.models.fields.TextField', [], {'default': "'[]'"})
+        },
+        'oozie.node': {
+            'Meta': {'object_name': 'Node'},
+            'children': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'parents'", 'symmetrical': 'False', 'through': "orm['oozie.Link']", 'to': "orm['oozie.Node']"}),
+            'description': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '40'}),
+            'node_type': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'workflow': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Workflow']"})
+        },
+        'oozie.pig': {
+            'Meta': {'object_name': 'Pig'},
+            'archives': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'files': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_xml': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '512', 'blank': 'True'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'params': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'prepares': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'script_path': ('django.db.models.fields.CharField', [], {'max_length': '256'})
+        },
+        'oozie.shell': {
+            'Meta': {'object_name': 'Shell'},
+            'archives': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'capture_output': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'command': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+            'files': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_xml': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '512', 'blank': 'True'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'params': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'prepares': ('django.db.models.fields.TextField', [], {'default': "'[]'"})
+        },
+        'oozie.sqoop': {
+            'Meta': {'object_name': 'Sqoop'},
+            'archives': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'files': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_xml': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '512', 'blank': 'True'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'params': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'prepares': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'script_path': ('django.db.models.fields.TextField', [], {'default': "''", 'blank': 'True'})
+        },
+        'oozie.ssh': {
+            'Meta': {'object_name': 'Ssh'},
+            'capture_output': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'command': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+            'host': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'params': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'user': ('django.db.models.fields.CharField', [], {'max_length': '64'})
+        },
+        'oozie.start': {
+            'Meta': {'object_name': 'Start'},
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True'})
+        },
+        'oozie.streaming': {
+            'Meta': {'object_name': 'Streaming'},
+            'archives': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'files': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'mapper': ('django.db.models.fields.CharField', [], {'max_length': '512'}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'reducer': ('django.db.models.fields.CharField', [], {'max_length': '512'})
+        },
+        'oozie.subworkflow': {
+            'Meta': {'object_name': 'SubWorkflow'},
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'node_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Node']", 'unique': 'True', 'primary_key': 'True'}),
+            'propagate_configuration': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'sub_workflow': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['oozie.Workflow']"})
+        },
+        'oozie.workflow': {
+            'Meta': {'object_name': 'Workflow', '_ormbases': ['oozie.Job']},
+            'end': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'end_workflow'", 'null': 'True', 'to': "orm['oozie.End']"}),
+            'is_single': ('django.db.models.fields.BooleanField', [], {'default': 'False', 'blank': 'True'}),
+            'job_properties': ('django.db.models.fields.TextField', [], {'default': "'[]'"}),
+            'job_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['oozie.Job']", 'unique': 'True', 'primary_key': 'True'}),
+            'job_xml': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '512', 'blank': 'True'}),
+            'managed': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'start': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'start_workflow'", 'null': 'True', 'to': "orm['oozie.Start']"})
+        }
+    }
+
+    complete_apps = ['oozie']

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

@@ -734,6 +734,11 @@ class Java(Action):
                              help_text=_t('Refer to a Hadoop JobConf job.xml file bundled in the workflow deployment directory. '
                                           'Properties specified in the Job Properties element override properties specified in the '
                                           'files specified in the Job XML element.'))
+  capture_output = models.BooleanField(default=False, verbose_name=_t('Capture output'),
+                              help_text=_t('Capture output of the stdout of the %(program)s command execution. The %(program)s '
+                                           'command output must be in Java Properties file format and it must not exceed 2KB. '
+                                           'From within the workflow definition, the output of an %(program)s action node is accessible '
+                                           'via the String action:output(String node, String key) function') % {'program': node_type.title()})
 
   def get_properties(self):
     return json.loads(self.job_properties)

+ 14 - 6
apps/oozie/src/oozie/templates/dashboard/list_oozie_bundle.mako

@@ -61,8 +61,8 @@ ${ layout.menubar(section='dashboard') }
         <li class="nav-header">${ _('Kick off time') }</li>
         <li>${ oozie_bundle.kickoffTime }</li>
 
-        <li class="nav-header">${ _('Created time') }</li>
-        <li>${ oozie_bundle.createdTime }</li>
+        <li class="nav-header">${ _('Id') }</li>
+        <li>${ oozie_bundle.id }</li>
 
         % if bundle:
             <li class="nav-header">${ _('Coordinators') }</li>
@@ -130,6 +130,7 @@ ${ layout.menubar(section='dashboard') }
     <ul class="nav nav-tabs">
       <li class="active"><a href="#calendar" data-toggle="tab">${ _('Coordinators') }</a></li>
       <li><a href="#actions" data-toggle="tab">${ _('Actions') }</a></li>
+      <li><a href="#details" data-toggle="tab">${ _('Details') }</a></li>
       <li><a href="#configuration" data-toggle="tab">${ _('Configuration') }</a></li>
       <li><a href="#log" data-toggle="tab">${ _('Log') }</a></li>
       <li><a href="#definition" data-toggle="tab">${ _('Definition') }</a></li>
@@ -243,6 +244,17 @@ ${ layout.menubar(section='dashboard') }
         </tr>
       </script>
 
+      <div class="tab-pane" id="details">
+        <table class="table table-condensed">
+          <tbody>
+            <tr>
+              <td>${ _('Created time') }</td>
+              <td>${ oozie_bundle.createdTime }</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+
       <div class="tab-pane" id="configuration">
         ${ utils.display_conf(oozie_bundle.conf_dict) }
       </div>
@@ -264,10 +276,6 @@ ${ layout.menubar(section='dashboard') }
 </div>
 
 
-
-
-
-
 </div>
 
 <div id="confirmation" class="modal hide">

+ 18 - 5
apps/oozie/src/oozie/templates/dashboard/list_oozie_coordinator.mako

@@ -69,11 +69,8 @@ ${ layout.menubar(section='dashboard') }
         <li class="nav-header">${ _('Next Materialized Time') }</li>
         <li id="nextTime">${ utils.format_time(oozie_coordinator.nextMaterializedTime) }</li>
 
-        <li class="nav-header">${ _('Start time') }</li>
-        <li>${ utils.format_time(oozie_coordinator.startTime) }</li>
-
-        <li class="nav-header">${ _('End time') }</li>
-        <li id="endTime">${ utils.format_time(oozie_coordinator.endTime) }</li>
+        <li class="nav-header">${ _('Id') }</li>
+        <li>${ oozie_coordinator.id }</li>
 
         % if coordinator:
             <li class="nav-header">${ _('Datasets') }</li>
@@ -139,6 +136,7 @@ ${ layout.menubar(section='dashboard') }
     <ul class="nav nav-tabs">
       <li class="active"><a href="#calendar" data-toggle="tab">${ _('Calendar') }</a></li>
       <li><a href="#actions" data-toggle="tab">${ _('Actions') }</a></li>
+      <li><a href="#details" data-toggle="tab">${ _('Details') }</a></li>
       <li><a href="#configuration" data-toggle="tab">${ _('Configuration') }</a></li>
       <li><a href="#log" data-toggle="tab">${ _('Log') }</a></li>
       <li><a href="#definition" data-toggle="tab">${ _('Definition') }</a></li>
@@ -246,6 +244,21 @@ ${ layout.menubar(section='dashboard') }
         </tr>
       </script>
 
+      <div class="tab-pane" id="details">
+        <table class="table table-condensed">
+          <tbody>
+            <tr>
+              <td>${ _('Start time') }</td>
+              <td>${ utils.format_time(oozie_coordinator.startTime) }</td>
+            </tr>
+            <tr>
+              <td>${ _('End time') }</td>
+              <td>${ utils.format_time(oozie_coordinator.endTime) }</td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+
       <div class="tab-pane" id="configuration">
         ${ utils.display_conf(oozie_coordinator.conf_dict) }
       </div>

+ 8 - 5
apps/oozie/src/oozie/templates/dashboard/list_oozie_workflow.mako

@@ -73,8 +73,8 @@ ${ layout.menubar(section='dashboard') }
             </div>
           </li>
 
-          <li class="nav-header">${ _('Last Modification time') }</li>
-          <li>${  utils.format_time(oozie_workflow.lastModTime) }</li>
+          <li class="nav-header">${ _('Id') }</li>
+          <li>${  oozie_workflow.id }</li>
 
           % if parameters and len(parameters) < 10:
               <li class="nav-header">${ _('Variables') }</li>
@@ -244,6 +244,10 @@ ${ layout.menubar(section='dashboard') }
               <td>${ _('External Id') }</td>
               <td>${ oozie_workflow.externalId or '-' }</td>
             </tr>
+            <tr>
+              <td>${ _('Last Modification time') }</td>
+              <td>${ utils.format_time(oozie_workflow.lastModTime) }</td>
+            </tr>
             <tr>
               <td>${ _('Start Time') }</td>
               <td>${ utils.format_time(oozie_workflow.startTime) }</td>
@@ -337,8 +341,7 @@ ${ layout.menubar(section='dashboard') }
       errorMessage: action.errorMessage,
       errorCode: action.errorCode,
       transition: action.transition,
-      data: action.data,
-      lastModTime: action.lastModTime
+      data: action.data
     }
   }
 
@@ -457,7 +460,7 @@ ${ layout.menubar(section='dashboard') }
     var logsAtEnd = true;
 
     function refreshView() {
-      $.getJSON(window.location.href + "?format=json", function (data) {
+      $.getJSON("${ oozie_workflow.get_absolute_url() }" + "?format=json", function (data) {
 
         if (data.actions){
           viewModel.actions(ko.utils.arrayMap(data.actions, function (action) {

+ 4 - 0
apps/oozie/src/oozie/templates/editor/gen/workflow-java.xml.mako

@@ -38,6 +38,10 @@
             % endfor
 
             ${ common.distributed_cache(node.get_files(), node.get_archives()) }
+
+            % if node.capture_output:
+            <capture-output/>
+            % endif
         </java>
         <ok to="${ node.get_oozie_child('ok') }"/>
         <error to="${ node.get_oozie_child('error') }"/>

+ 1 - 0
apps/oozie/src/oozie/templates/navigation-bar.mako

@@ -30,6 +30,7 @@
         <li class="${utils.is_selected(section, 'coordinators')}"><a href="${url('oozie:list_coordinators')}">${ _('Coordinators') }</a></li>
         <li class="${utils.is_selected(section, 'bundles')}"><a href="${url('oozie:list_bundles')}">${ _('Bundles') }</a></li>
         <li class="${utils.is_selected(section, 'history')}"><a href="${url('oozie:list_history')}">${ _('History') }</a></li>
+        <li><a href="http://oozie.apache.org/docs/3.3.0/index.html" target="_blank">${ _('Documentation') }</a></li>
       </ul>
     </div>
   </div>

+ 1 - 0
apps/oozie/src/oozie/test_data/0.4/test-java.xml

@@ -7,6 +7,7 @@
             <main-class>org.apache.hadoop.examples.terasort.TeraGen</main-class>
             <arg>${records}</arg>
             <arg>${output_dir}/teragen</arg>
+            <capture-output/>
         </java>
         <ok to="TeraSort"/>
         <error to="kill"/>

+ 32 - 0
apps/oozie/src/oozie/test_data/0.4/test-shell.xml

@@ -0,0 +1,32 @@
+<workflow-app name="Shells" xmlns="uri:oozie:workflow:0.4">
+    <start to="shell-1"/>
+    <action name="shell-1">
+        <shell xmlns="uri:oozie:shell-action:0.1">
+            <job-tracker>${jobTracker}</job-tracker>
+            <name-node>${nameNode}</name-node>
+              <job-xml>my-job.xml</job-xml>
+            <exec>hello.py</exec>
+              <argument>World!</argument>
+            <file>hello.py#hello.py</file>
+              <capture-output/>
+        </shell>
+        <ok to="shell-2"/>
+        <error to="kill"/>
+    </action>
+    <action name="shell-2">
+        <shell xmlns="uri:oozie:shell-action:0.1">
+            <job-tracker>${jobTracker}</job-tracker>
+            <name-node>${nameNode}</name-node>
+              <job-xml>my-job.xml</job-xml>
+            <exec>hello.py</exec>
+              <argument>World!</argument>
+            <file>hello.py#hello.py</file>
+        </shell>
+        <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>

+ 24 - 0
apps/oozie/src/oozie/tests.py

@@ -717,6 +717,7 @@ class TestEditor(OozieMockBase):
         "jar_path":"/user/hue/oozie/workspaces/lib/hadoop-examples.jar",
         "prepares":"[]",
         "archives":"[]",
+        "capture_output": "on",
     })
     Link(parent=action1, child=self.wf.end, name="ok").save()
 
@@ -731,6 +732,7 @@ class TestEditor(OozieMockBase):
             <java-opts>-Dexample-property=natty</java-opts>
             <arg>1000</arg>
             <arg>${output_dir}/teragen</arg>
+            <capture-output/>
         </java>
         <ok to="end"/>
         <error to="kill"/>
@@ -1554,6 +1556,28 @@ class TestImportWorkflow04(OozieMockBase):
     assert_equal('${records} ${output_dir}/teragen', nodes[0].args)
     assert_equal('org.apache.hadoop.examples.terasort.TeraSort', nodes[1].main_class)
     assert_equal('${output_dir}/teragen ${output_dir}/terasort', nodes[1].args)
+    assert_true(nodes[0].capture_output)
+    assert_false(nodes[1].capture_output)
+    workflow.delete()
+
+
+  def test_import_workflow_shell(self):
+    workflow = Workflow.objects.new_workflow(self.user)
+    workflow.save()
+    f = open('apps/oozie/src/oozie/test_data/0.4/test-shell.xml')
+    import_workflow(workflow, f.read())
+    f.close()
+    workflow.save()
+    assert_equal(5, len(Node.objects.filter(workflow=workflow)))
+    assert_equal(5, len(Link.objects.filter(parent__workflow=workflow)))
+    nodes = [Node.objects.filter(workflow=workflow, node_type='shell')[0].get_full_node(),
+             Node.objects.filter(workflow=workflow, node_type='shell')[1].get_full_node()]
+    assert_equal('shell-1', nodes[0].name)
+    assert_equal('shell-2', nodes[1].name)
+    assert_equal('my-job.xml', nodes[0].job_xml)
+    assert_equal('hello.py', nodes[0].command)
+    assert_true(nodes[0].capture_output)
+    assert_false(nodes[1].capture_output)
     workflow.delete()
 
 

+ 0 - 2
apps/oozie/src/oozie/views/dashboard.py

@@ -516,8 +516,6 @@ def massaged_workflow_actions_for_json(workflow_actions, oozie_coordinator, oozi
       'errorMessage': escapejs(action.errorMessage),
       'transition': action.transition,
       'data': escapejs(action.data),
-      'lastModTime': format_time(action.lastModTime),
-      'run': action.run,
     }
     actions.append(massaged_action)
 

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

@@ -1,12 +1,12 @@
 <?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: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">
 
   <field name="capture_output" type="BooleanField">
     <xsl:choose>
-      <xsl:when test="*[local-name()='exec']">
+      <xsl:when test="*[local-name()='capture-output']">
         True
       </xsl:when>
       <xsl:otherwise>

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

@@ -6,6 +6,7 @@
 
   <field name="command" type="CharField">
     <xsl:value-of select="*[local-name()='command']"/>
+    <xsl:value-of select="*[local-name()='exec']"/>
   </field>
 
 </xsl:template>

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

@@ -11,6 +11,7 @@
 <xsl:import href="fields/job_properties.xslt"/>
 <xsl:import href="fields/main_class.xslt"/>
 <xsl:import href="fields/prepares.xslt"/>
+<xsl:import href="fields/capture_output.xslt"/>
 
 <xsl:template match="workflow:java" xmlns:workflow="uri:oozie:workflow:0.2.5">
 
@@ -25,6 +26,7 @@
     <xsl:call-template name="job_xml"/>
     <xsl:call-template name="main_class"/>
     <xsl:call-template name="prepares"/>
+    <xsl:call-template name="capture_output"/>
 
   </object>
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.2/nodes/fields/capture_output.xslt

@@ -1,12 +1,12 @@
 <?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" exclude-result-prefixes="workflow">
+<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">
 
   <field name="capture_output" type="BooleanField">
     <xsl:choose>
-      <xsl:when test="*[local-name()='exec']">
+      <xsl:when test="*[local-name()='capture-output']">
         True
       </xsl:when>
       <xsl:otherwise>

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

@@ -6,6 +6,7 @@
 
   <field name="command" type="CharField">
     <xsl:value-of select="*[local-name()='command']"/>
+    <xsl:value-of select="*[local-name()='exec']"/>
   </field>
 
 </xsl:template>

+ 2 - 0
apps/oozie/src/oozie/xslt/0.2/nodes/java.xslt

@@ -11,6 +11,7 @@
 <xsl:import href="fields/job_properties.xslt"/>
 <xsl:import href="fields/main_class.xslt"/>
 <xsl:import href="fields/prepares.xslt"/>
+<xsl:import href="fields/capture_output.xslt"/>
 
 <xsl:template match="workflow:java" xmlns:workflow="uri:oozie:workflow:0.2">
 
@@ -25,6 +26,7 @@
     <xsl:call-template name="job_xml"/>
     <xsl:call-template name="main_class"/>
     <xsl:call-template name="prepares"/>
+    <xsl:call-template name="capture_output"/>
 
   </object>
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.3/nodes/fields/capture_output.xslt

@@ -1,12 +1,12 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.3" exclude-result-prefixes="workflow">
+<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">
 
   <field name="capture_output" type="BooleanField">
     <xsl:choose>
-      <xsl:when test="*[local-name()='exec']">
+      <xsl:when test="*[local-name()='capture-output']">
         True
       </xsl:when>
       <xsl:otherwise>

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

@@ -6,6 +6,7 @@
 
   <field name="command" type="CharField">
     <xsl:value-of select="*[local-name()='command']"/>
+    <xsl:value-of select="*[local-name()='exec']"/>
   </field>
 
 </xsl:template>

+ 2 - 0
apps/oozie/src/oozie/xslt/0.3/nodes/java.xslt

@@ -11,6 +11,7 @@
 <xsl:import href="fields/job_properties.xslt"/>
 <xsl:import href="fields/main_class.xslt"/>
 <xsl:import href="fields/prepares.xslt"/>
+<xsl:import href="fields/capture_output.xslt"/>
 
 <xsl:template match="workflow:java" xmlns:workflow="uri:oozie:workflow:0.3">
 
@@ -25,6 +26,7 @@
     <xsl:call-template name="job_xml"/>
     <xsl:call-template name="main_class"/>
     <xsl:call-template name="prepares"/>
+    <xsl:call-template name="capture_output"/>
 
   </object>
 

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

@@ -6,7 +6,7 @@
 
   <field name="capture_output" type="BooleanField">
     <xsl:choose>
-      <xsl:when test="*[local-name()='exec']">
+      <xsl:when test="*[local-name()='capture-output']">
         True
       </xsl:when>
       <xsl:otherwise>

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

@@ -6,6 +6,7 @@
 
   <field name="command" type="CharField">
     <xsl:value-of select="*[local-name()='command']"/>
+    <xsl:value-of select="*[local-name()='exec']"/>
   </field>
 
 </xsl:template>

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

@@ -11,6 +11,7 @@
 <xsl:import href="fields/job_properties.xslt"/>
 <xsl:import href="fields/main_class.xslt"/>
 <xsl:import href="fields/prepares.xslt"/>
+<xsl:import href="fields/capture_output.xslt"/>
 
 <xsl:template match="workflow:java" xmlns:workflow="uri:oozie:workflow:0.4">
 
@@ -25,6 +26,7 @@
     <xsl:call-template name="job_xml"/>
     <xsl:call-template name="main_class"/>
     <xsl:call-template name="prepares"/>
+    <xsl:call-template name="capture_output"/>
 
   </object>