Index: media_mover_api.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/media_mover/media_mover_api.module,v
retrieving revision 1.1.2.73
diff -u -p -r1.1.2.73 media_mover_api.module
--- media_mover_api.module	18 Apr 2008 12:53:19 -0000	1.1.2.73
+++ media_mover_api.module	27 Apr 2008 11:14:39 -0000
@@ -1,7 +1,7 @@
 <?php
-
 /* $Id: media_mover_api.module,v 1.1.2.73 2008/04/18 12:53:19 arthuregg Exp $ */
 
+include_once ('media_mover_token.inc');
 
 /*
  * This file contains all the generic functions for media_moving.
@@ -606,10 +606,10 @@ function media_mover_api_run_config($con
     // HARVEST  
     $output .= t('Harvesting.... ') .'<br />';
     $files = module_invoke($config->harvest->module, 'media_mover', 'harvest', $config->harvest->action, $config->harvest->configuration, null, $config, $nid);
-            
+    
     // store the harvested files
     if (count($files) > 0 ) {
-      foreach ($files as $harvested_file) {       
+      foreach ($files as $harvested_file) {
        // save harvested file
        media_mover_api_file_db_add($harvested_file, $config, 'harvest', MMA_FILE_STATUS_HARVESTED);
       }
@@ -620,10 +620,14 @@ function media_mover_api_run_config($con
   }
   
   // Harvest is complete, now we can batch process files 
-  $output .= t('processing....') .'<br />';  
+  $output .= t('processing....') .'<br />';
   // PROCESS get all files ready for processing
   $files = media_mover_api_get_files(MMA_FILE_STATUS_HARVESTED, $config->cid, variable_get('mma_process_num', 0));
   foreach($files as $file) {    
+    if (module_exists('mm_workflow_ng')) {
+      //fire the harvest method;
+      workflow_ng_invoke_event('mediamover_harvested_file',$file);
+    }    
     // make sure no one else is trying to operate on this file
     if (media_mover_api_file_lock($file['mmfid'], MMA_FILE_STATUS_HARVESTED, MMA_FILE_STATUS_IN_PROCESS) )  {                
       $file = module_invoke($config->process->module, 'media_mover', 'process', $config->process->action, $config->process->configuration, $file, $config);     
@@ -635,7 +639,11 @@ function media_mover_api_run_config($con
   // STORAGE get all files ready for storage
   $output .= t('storing....') .'<br />';
   $files = media_mover_api_get_files(MMA_FILE_STATUS_PROCESS_COMPLETE, $config->cid, variable_get('mma_storage_num', 0)); 
-  foreach($files as $file) {
+  foreach($files as $file) {        
+    if (module_exists('mm_workflow_ng')) {
+      //fire the process event;
+      workflow_ng_invoke_event('mediamover_process_file',$file);
+    }   
      // make sure no one else is trying to operate on this file
     if (media_mover_api_file_lock($file['mmfid'], MMA_FILE_STATUS_PROCESS_COMPLETE, MMA_FILE_STATUS_IN_STORAGE) )  {
       $file = module_invoke($config->storage->module, 'media_mover', 'storage', $config->storage->action, $config->storage->configuration, $file, $config);
@@ -645,13 +653,25 @@ function media_mover_api_run_config($con
   
   // COMPLETE get all files ready for completion
   $output .= t('completing....') .'<br />';
-  $files = media_mover_api_get_files(MMA_FILE_STATUS_STORAGE_COMPLETE, $config->cid, variable_get('mma_complete_num', 0));  
-  foreach($files as $file) {
+  $files = media_mover_api_get_files(MMA_FILE_STATUS_STORAGE_COMPLETE, $config->cid, variable_get('mma_complete_num', 0));
+  
+  foreach($files as $file) {    
+    if (module_exists('mm_workflow_ng')) {
+      //fire the store event;
+      workflow_ng_invoke_event('mediamover_store_file',$file);
+    }
+    
     // make sure no one else is trying to operate on this file
     if (media_mover_api_file_lock($file['mmfid'], MMA_FILE_STATUS_STORAGE_COMPLETE, MMA_FILE_STATUS_IN_COMPLETE) )  {
       $file = module_invoke($config->complete->module, 'media_mover', 'complete', $config->complete->action, $config->complete->configuration, $file, $config);
       media_mover_api_update_file($file, MMA_FILE_STATUS_COMPLETE_COMPLETE);
     }
+    
+    if (module_exists('mm_workflow_ng')) {
+      //fire the complete event;
+      
+      workflow_ng_invoke_event('mediamover_complete_file',$file);
+    }
   }
     
   // if in debug mode..... 
Index: media_mover_token.inc
===================================================================
RCS file: media_mover_token.inc
diff -N media_mover_token.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ media_mover_token.inc	27 Apr 2008 11:14:39 -0000
@@ -0,0 +1,138 @@
+<?php
+
+function media_mover_token_get_config($cid) {
+   //okay, we need to get the node, file and configuration in.
+  //If there is no node, we'll have to account for that...
+  if ($config = _mm_get_configuration($cid)) {
+    $config_data = _mm_get_configuration_data($cid);  
+    while ($state = db_fetch_array($config_data)) {    
+      $config['states'][$state['verb']] = $state;
+    }
+    return $config;
+  }
+  
+  return false;
+}
+
+/**
+ * Implementation of hook_token_values().
+ */
+function media_mover_api_token_values($type, $object = NULL) {
+  $values = array();
+  switch ($type) {    
+    
+    case 'mm_config':      
+      $config = $object;      
+      foreach ($config as $k => $v) {
+        if ($k == 'status') {
+          //@TODO
+          //$values['status_name'] = media_mover_api_con($v);
+        }
+        if ($k == 'states') {
+          foreach ($v as $verb => $state) {            
+            foreach ($state as $state_key => $state_var) {              
+              if (is_string($state_var)) {
+                $values["{$verb}-{$state_key}"] = $state_var;
+              }
+            }
+            if (function_exists("{$state['module']}_token_values")) {             
+              //Would be nice to have this stuff... but not sure how to integrate nicely without jumbling the interface.              
+              $extra_config_tokens = call_user_func("{$state['module']}_token_values",$type,unserialize($state['configuration']));
+              foreach ($extra_config_tokens as $config_key => $config_val) {
+                $values["{$verb}-{$state_key}-{$config_key}"] = $config_val;   
+              }
+            }
+          }
+        } else {
+          $values[$k] = $v;
+        }
+      }
+      break;
+    case 'mm_file':
+
+      $file = (object)$object;
+      
+      foreach ($file as $key => $v) {
+        
+        if ($k == 'status') {
+          $values['status_name'] = media_mover_api_item_status($v);
+        }
+        if (is_array($v)) {
+          //this handles the data element
+          foreach ($v as $file_key => $file_v) {
+            $values['data-' . $file_key] = $file_v;
+          }
+        } else {
+          $values[$key] = $v;
+        }
+      }
+      break;
+  }
+
+  return $values;
+}
+
+/**
+ * Implementation of hook_token_list().
+ */
+function media_mover_api_token_list($type = 'all') {
+
+  //@TODO: Flesh these out with real descriptions
+  if ($type == 'mm_file' || $type == 'all') {
+    $tokens['Media Mover File'] = array ( 
+    
+    'mmfid' => t('Media Mover File Id'),
+    'nid' => t('Node Id of assocaited node (if any)'),
+    'fid' => t('File Id of associated file type entry (if any)'),
+    'cid' => t('Media Mover configuration from whence this file came'),
+    'harvest_file' => t('Path to harvested file'),
+    'process_file' => t('Path to processed file'),
+    'storage_file' => t('Path to stored file'),
+    'complete_file' => t('Path to completed file'),
+    'url' => t('Url for file access (if any)'),
+    'status' => t('Status code of file'),
+    'status_name' => t('Status name of file'),
+    'date' => t('Date of creation'),
+ );
+ 
+    $tokens['Media Mover File'] = array_merge($tokens['Media Mover File'], 
+    array ( 
+    'data-filesize' => t('Filesize of completed file'),
+    'data-filename' => t('Filename of compelted file'),
+    'data-filepath' => t('Filepath of completed file'),
+    'data-harvest_module' => t('Module used for harvesting'),
+    'data-harvest_action' => t('Action of harvesting Module'),
+    'data-harvest_file' => t('Harvested file'),
+     'data-node' => t('Node??'), )
+    );
+    
+    
+    
+  }
+  
+  if ($type == "mm_config") {
+    $tokens['Media Mover Configuration'] = array ( 
+       'cid' => t('Media Mover Configuration '),
+       'name' => t('Name of Configuration'),
+       'description' => t('Configuration description'),
+       'status' => t('Configuration status'),
+       //@TODO
+       //'status_name' => t('Configuration status name'),
+       'start_time' => t('Configuration start time'),
+       'last_start_time' => t('Configuration last start time'),
+       'rss' => t('is configuration exposed via RSS?'),
+       'cron' => t('is configuration set to run on cron'),
+    );
+    
+    
+    $tokens['Media Mover Configuration']['harvest-module'] = t("Module used for Harvesting");
+    $tokens['Media Mover Configuration']['storage-module'] = t("Module used for Storage");
+    $tokens['Media Mover Configuration']['process-module'] = t("Module used for Processing");
+    $tokens['Media Mover Configuration']['complete-module'] = t("Module used for Completion");
+    
+  }
+
+  return $tokens;
+}
+
+?>
\ No newline at end of file
Index: media_mover_ftp/media_mover_ftp.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/media_mover/media_mover_ftp/Attic/media_mover_ftp.module,v
retrieving revision 1.1.2.4
diff -u -p -r1.1.2.4 media_mover_ftp.module
--- media_mover_ftp/media_mover_ftp.module	25 Apr 2008 13:23:54 -0000	1.1.2.4
+++ media_mover_ftp/media_mover_ftp.module	27 Apr 2008 11:14:39 -0000
@@ -287,4 +287,25 @@ function media_mover_ftp_token_form_subm
     array('@token' => $token))
   );
   return;
+}
+
+/**
+ * Implementation of hook_token_values().
+ */
+function media_mover_ftp_token_values($type, $object = NULL) {
+  $values = array();
+  switch ($type) {    
+    
+    case 'mm_config':
+      if (!is_array($object)) {
+        return array();
+      }
+      $config = $object;
+      foreach ($config as $k => $v) {
+        $values[$k] = $v;
+      }
+     break;
+      
+  }
+  return $values;
 }
\ No newline at end of file
Index: mm_node/mm_node.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/media_mover/mm_node/mm_node.module,v
retrieving revision 1.1.2.37
diff -u -p -r1.1.2.37 mm_node.module
--- mm_node/mm_node.module	30 Mar 2008 03:18:37 -0000	1.1.2.37
+++ mm_node/mm_node.module	27 Apr 2008 11:14:40 -0000
@@ -274,6 +274,8 @@ function mm_node_complete( $configuratio
     $options = implode(", ", $options);
     db_query("UPDATE node SET $options WHERE nid = %d", $file['nid']);
   }
+  $file['complete_file'] = $file['storage_file'];
+  return $file;
 }
 
 
Index: mm_workflow_ng/mm_workflow_ng.info
===================================================================
RCS file: mm_workflow_ng/mm_workflow_ng.info
diff -N mm_workflow_ng/mm_workflow_ng.info
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ mm_workflow_ng/mm_workflow_ng.info	27 Apr 2008 11:14:40 -0000
@@ -0,0 +1,4 @@
+name = Media Mover Workflow-NG
+description = Allowes Workflow-ng to react to media mover events.  Also provides some conditions for evaluating media mover actions in workflow-ng sans tokens
+dependencies = media_mover_api workflow_ng
+package = Media Mover
Index: mm_workflow_ng/mm_workflow_ng.module
===================================================================
RCS file: mm_workflow_ng/mm_workflow_ng.module
diff -N mm_workflow_ng/mm_workflow_ng.module
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ mm_workflow_ng/mm_workflow_ng.module	27 Apr 2008 11:14:40 -0000
@@ -0,0 +1,241 @@
+<?php
+
+include 'mm_workflow_ng_sample_cfg.inc';
+
+function mm_workflow_ng_event_info() {
+  return array(
+    'mediamover_complete_file' => array(
+      '#label' => t('Media has finished being added'),
+      '#module' => t('Media Mover'), 
+      '#arguments' => workflow_ng_events_hook_media_mover_arguments('complete'),     
+      '#redirect' => TRUE,
+    ),
+    
+    'mediamover_processed_file' => array(
+      '#label' => t('Media has been processed'),
+      '#module' => t('Media Mover'), 
+      '#arguments' => workflow_ng_events_hook_media_mover_arguments('process'),     
+      '#redirect' => TRUE,
+    ),
+    
+    'mediamover_harvested_file' => array(
+      '#label' => t('Media has been harvested'),
+      '#module' => t('Media Mover'), 
+      '#arguments' => workflow_ng_events_hook_media_mover_arguments('harvest'),     
+      '#redirect' => TRUE,
+    ),
+    
+    'mediamover_stored_file' => array(
+      '#label' => t('Media has been stored'),
+      '#module' => t('Media Mover'), 
+      '#arguments' => workflow_ng_events_hook_media_mover_arguments('store'),     
+      '#redirect' => TRUE,
+    ),
+  );
+}
+
+
+/*
+ * Returns some arguments suitable for hook comment
+ */
+function workflow_ng_events_hook_media_mover_arguments($type) {
+  
+  $args = array (
+    'mm_file' => array('#entity' => 'mm_file', '#label' => t('New Media Mover file')),
+    'mm_config' => array('#entity' => 'mm_config', '#label' => t('Media Mover Configuration'), '#handler' => 'media_mover_workflow_ng_config_argument_handler'),
+  );
+  
+  
+  switch ($type) {
+    case 'complete':      
+      $args['node'] = array ('#entity' => 'node', '#label' => t('New Media Mover Node'), '#handler' => 'media_mover_workflow_ng_node_argument_handler');
+      $args['user'] = array ('#entity' => 'user', '#label' => t('Uploading User (if avail)'), '#handler' => 'media_mover_workflow_ng_user_argument_handler');
+      break;
+  }
+  
+  return $args;
+}
+
+
+function mm_workflow_ng_complete($configuration,$file) {
+  //workflow_ng_invoke_event('mediamover_completed_file',$file);
+  return $file;
+}
+
+function media_mover_workflow_ng_config_argument_handler($file) {
+  if ($config = media_mover_token_get_config($file['cid']) ) {
+    return $config;
+  }
+}
+
+function media_mover_workflow_ng_node_argument_handler($file) {
+  if ($node = node_load(array('nid' => $file['nid']))) {    
+    return $node;
+  }
+  return new stdClass();
+}
+
+function media_mover_workflow_ng_user_argument_handler($file) {  
+  if ($node = node_load(array('nid' => $file['nid']))) {
+    return user_load(array('uid' => $node->uid));
+  }
+}
+
+
+/*
+ * Implementation of hook_action_info()
+ */
+function mm_workflow_ng_action_info() {
+  return array(
+    'workflow_ng_action_mm_run_config_with_node' => array(
+      '#label' => t('DEBUG_ONLY: Run a Media Mover config with completed node'),
+      '#arguments' => array(
+        'node' => array('#entity' => 'node', '#label' => t('Node')),
+      ),
+      '#module' => t('Media Mover'),
+    )
+  );
+}
+
+function workflow_ng_action_mm_run_config_with_node($node, $settings, &$arguments, &$log) {
+  //first sanity check to make sure we aren't running a workflow_ng complete enabled config
+  //This is dicey... will write later.
+  
+  if ( ($config = _mm_get_configuration($settings['configuration']) ) && $node->nid) {
+    $cmd = "media_mover_api_run_config(" . var_export($config,1) . ",false,$node->nid);";
+    dpr('I would have ran' . $cmd);
+  }
+}
+
+function workflow_ng_action_mm_run_config_with_node_form($settings = array(), $argument_info) {
+  $form = array();
+  
+  $form['configuration'] = _mm_workflow_ng_configuration_select_elem();
+  $form['configuration']['#description'] = t('Select the Media Mover Configuration you would like to feed the new node into');
+  $form['configuration']['#default_value'] = $settings['configuration'];
+  
+  return $form;
+}
+
+function workflow_ng_action_mm_run_config_with_node_submit($form_id, $form_values) {
+  return array ('configuration' => $form_values['configuration']);
+}
+/*
+ * Implementation of hook_condition_info()
+ */
+function mm_workflow_ng_condition_info() {
+  return array(
+    'workflow_ng_condition_mm_configuration_is' => array(
+      '#label' => t('Media Mover Configuration is'),
+      '#arguments' => array(
+        'mm_config' => array('#entity' => 'mm_config', '#label' => t('Media Mover configuration being run')),
+      ),
+      '#description' => t('Evaluates to TRUE, if the given configuration selected is the one being run.'),
+      '#module' => t('Media Mover'),
+    ),
+    
+    'workflow_ng_condition_mm_file_type_is' => array(
+      '#label' => t('Media Mover file type is'),
+      '#arguments' => array(
+        'mm_file' => array('#entity' => 'mm_file', '#label' => t('Media Mover file being sent through')),
+      ),
+      '#description' => t('Evaluates to TRUE, if the file type selected is the same as the one being used.'),
+      '#module' => t('Media Mover'),
+    ),
+  );
+}
+
+/*
+ * Condition: Check for selected content types
+ */
+function workflow_ng_condition_mm_configuration_is($config, $settings) {
+  return in_array($config['cid'], $settings['configuration']);
+}
+
+/*
+ *  Check for content types - Configuration form
+ */
+function workflow_ng_condition_mm_configuration_is_form($settings = array()) {
+  
+  $form['configuration'] = _mm_workflow_ng_configuration_select_elem();
+  $form['configuration']['#description'] = t('Select the Media Mover Configuration');
+  $form['configuration']['#default_value'] = $settings['configuration'];
+  $form['configuration']['#multiple'] = true;
+  $form['configuration']['#size'] = 6;
+  
+  return $form;
+}
+
+function workflow_ng_condition_mm_configuration_is_submit($form_id, $form_values) {
+  return array('configuration' => $form_values['configuration']);
+}
+
+/*
+ * Condition: Check for selected content types
+ */
+function workflow_ng_condition_mm_file_type_is($file, $settings) {
+  //dpr("testing " . $config['cid'] . " against " . var_export($settings['configuration'],1));
+  $states = array(
+	    MMA_FILE_STATUS_HARVESTED => 'harvest',
+	    MMA_FILE_STATUS_IN_PROCESS => 'process',
+	    MMA_FILE_STATUS_PROCESS_COMPLETE => 'process',
+	    MMA_FILE_STATUS_IN_STORAGE => 'storage',
+	    MMA_FILE_STATUS_STORAGE_COMPLETE => 'storage',
+	    MMA_FILE_STATUS_IN_COMPLETE => 'complete',
+	    MMA_FILE_STATUS_COMPLETE_COMPLETE => 'complete',
+	  );
+      $file_path = $file[$states[$file['status']] .'_file'];
+      $_pinfo = pathinfo($file_path);
+      //Get rid of spaces
+      $allowed_ext = explode(',',str_replace(array(' ','.'),'',$settings['extensions']));
+    return in_array($_pinfo['extension'], $allowed_ext);
+}
+
+function trim_value(&$value)
+{
+   $value = trim($value);
+}
+
+/*
+ *  Check for content types - Configuration form
+ */
+function workflow_ng_condition_mm_file_type_is_form($settings = array()) {
+  
+  $form['extensions'] = array (
+    '#type' => 'textfield',
+    '#title' => t('Extensions'),
+    '#required' => true,
+    '#description' => t('Input a comma separated list of extensions to evaluate against (e.g. avi,mpeg,m4v)'),
+    '#default_value' => $settings['extensions'],
+  );
+  
+  return $form;
+}
+
+function workflow_ng_condition_mm_file_type_is_submit($form_id, $form_values) {
+  return array('extensions' => $form_values['extensions']);
+}
+
+/**
+ * Util
+ */
+
+function _mm_workflow_ng_configuration_select_elem() {
+  $configs = _mm_get_active_configurations();
+  foreach ($configs as $config) {
+    $config_options[$config->cid] = $config->name;
+  }
+  
+  $configuration_elem = array (
+    "#type" => "select",
+    '#title' => t('Media Mover Configuration'),
+    '#description' => t('Select the Media Mover Configuration you would like to feed the new node into'),
+    "#multiple" => 0,
+    "#size" => 1,    
+    '#options' => $config_options,
+  );
+  
+  return $configuration_elem;
+}
+
+?>
\ No newline at end of file
Index: mm_workflow_ng/mm_workflow_ng_sample_cfg.inc
===================================================================
RCS file: mm_workflow_ng/mm_workflow_ng_sample_cfg.inc
diff -N mm_workflow_ng/mm_workflow_ng_sample_cfg.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ mm_workflow_ng/mm_workflow_ng_sample_cfg.inc	27 Apr 2008 11:14:40 -0000
@@ -0,0 +1,173 @@
+<?php
+
+function mm_workflow_ng_configuration() {
+$configurations = array (
+  'cfg_13' => 
+  array (
+    '#type' => 'configuration',
+    '#altered' => false,
+    '#event' => 'mediamover_harvested_file',
+    '#label' => 'Media Mover Harvest Log Test',
+    '#active' => 0,
+    '#module' => 'workflow-ng',
+    0 => 
+    array (
+      '#type' => 'condition',
+      '#name' => 'workflow_ng_condition_mm_file_type_is',
+      '#argument map' => 
+      array (
+        'mm_file' => 'mm_file',
+      ),
+      '#label' => 'Media Mover file type is',
+      '#settings' => 
+      array (
+        'extensions' => 'avi',
+      ),
+    ),
+    1 => 
+    array (
+      '#type' => 'action',
+      '#name' => 'workflow_ng_action_watchdog',
+      '#settings' => 
+      array (
+        'severity' => '0',
+        'type' => 'workflow-ng',
+        'message' => '[mm_file:data-filename] made it to this step',
+        'message_args' => 
+        array (
+          0 => 'mm_file',
+        ),
+        'link' => '',
+        'link_args' => 
+        array (
+        ),
+      ),
+    ),
+    '#name' => 'cfg_13',
+  ),
+  'cfg_15' => 
+  array (
+    '#type' => 'configuration',
+    '#altered' => false,
+    '#event' => 'mediamover_complete_file',
+    '#label' => 'Notify Admin abount newly processed files over 500k',
+    '#active' => 0,
+    '#module' => 'workflow-ng',
+    0 => 
+    array (
+      '#type' => 'condition',
+      '#name' => 'workflow_ng_condition_token_numeric',
+      '#settings' => 
+      array (
+        'text1' => '[mm_file:data-filesize]',
+        'text1_args' => 
+        array (
+          0 => 'mm_file',
+        ),
+        'text2' => '500000',
+        'text2_args' => 
+        array (
+        ),
+        'operation' => 'less',
+      ),
+      '#label' => 'File Size > 500k',
+    ),
+    1 => 
+    array (
+      '#type' => 'action',
+      '#name' => 'workflow_ng_action_mail',
+      '#settings' => 
+      array (
+        'to' => '[node:site-mail]',
+        'to_args' => 
+        array (
+          0 => 'node',
+        ),
+        'from' => '[node:site-mail]',
+        'from_args' => 
+        array (
+          0 => 'node',
+        ),
+        'subject' => '[user:user] Just uploaded [mm_file:data-filename] of [mm_file:data-filesize]',
+        'subject_args' => 
+        array (
+          0 => 'mm_file',
+          1 => 'user',
+        ),
+        'message' => 'This came in from:
+[mm_config:name]
+which started at: [mm_config:start_time]
+
+If you are lazy, [mm_config:name] uses:
+
+[mm_config:harvest-module] for harvesting
+[mm_config:process-module] for processing
+[mm_config:storage-module] for storage
+[mm_config:complete-module] for completion
+
+Adios!
+
+"The token programmer"',
+        'message_args' => 
+        array (
+          0 => 'mm_config',
+        ),
+      ),
+      '#label' => 'Send a mail to an arbitrary mail address',
+    ),
+    2 => 
+    array (
+      '#type' => 'action',
+      '#name' => 'workflow_ng_action_watchdog',
+      '#settings' => 
+      array (
+        'severity' => '0',
+        'type' => 'workflow-ng',
+        'message' => 'sent a mail to [user:mail] because of [mm_file:data-filesize] file',
+        'message_args' => 
+        array (
+          0 => 'mm_file',
+          1 => 'user',
+        ),
+        'link' => '',
+        'link_args' => 
+        array (
+        ),
+      ),
+      '#label' => 'Log to watchdog',
+    ),
+    3 => 
+    array (
+      '#type' => 'action',
+      '#name' => 'workflow_ng_action_drupal_message',
+      '#settings' => 
+      array (
+        'message' => 'This came in from:
+[mm_config:name]
+which started at: [mm_config:start_time]
+
+If you are lazy, [mm_config:name] uses:
+
+[mm_config:harvest-module] for harvesting
+[mm_config:process-module] for processing
+[mm_config:storage-module] for storage
+[mm_config:complete-module] for completion
+
+Adios!
+
+"The token programmer"',
+        'message_args' => 
+        array (
+          0 => 'mm_config',
+        ),
+        'error' => 0,
+      ),
+    ),
+    '#name' => 'cfg_15',
+  ),
+);
+
+return $configurations;
+
+}
+?>
\ No newline at end of file
