You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@taverna.apache.org by ia...@apache.org on 2015/07/13 14:54:42 UTC

[24/34] incubator-taverna-mobile git commit: Implementing workflow run from external storage

Implementing workflow run from external storage


Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/commit/ca95c34a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/tree/ca95c34a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/diff/ca95c34a

Branch: refs/heads/master
Commit: ca95c34a1e51c1a2a401d4618e3258f6b2c091c4
Parents: 9c895c8
Author: larrytech7 <la...@gmail.com>
Authored: Sat Jul 11 17:36:40 2015 +0100
Committer: larrytech7 <la...@gmail.com>
Committed: Sat Jul 11 17:36:40 2015 +0100

----------------------------------------------------------------------
 .../activities/DashboardMainActivity.java       |   2 +
 .../fragments/workflowdetails/RunFragment.java  |  12 +-
 .../workflowdetails/WorkflowdetailFragment.java |  83 +-----
 .../apache/taverna/mobile/utils/RunTask.java    |  93 ++++++
 .../taverna/mobile/utils/WorkflowOpen.java      | 289 +++++++++++++++++++
 5 files changed, 403 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/ca95c34a/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java b/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java
index e5f245b..8a90059 100644
--- a/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java
+++ b/app/src/main/java/org/apache/taverna/mobile/activities/DashboardMainActivity.java
@@ -54,6 +54,7 @@ import org.apache.taverna.mobile.R;
 import org.apache.taverna.mobile.fragments.FavoriteFragment;
 import org.apache.taverna.mobile.fragments.NavigationDrawerFragment;
 import org.apache.taverna.mobile.fragments.WorkflowItemFragment;
+import org.apache.taverna.mobile.utils.WorkflowOpen;
 
 import java.io.File;
 
@@ -168,6 +169,7 @@ public class DashboardMainActivity extends ActionBarActivity
             if(requestCode == SELECT_WORKFLOW){
                 String workflowPath = data.getData().getPath();
                 Toast.makeText(getBaseContext(), "Path: "+workflowPath, Toast.LENGTH_LONG).show();
+                new WorkflowOpen(this).execute(workflowPath);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/ca95c34a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/RunFragment.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/RunFragment.java b/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/RunFragment.java
index a55eed6..3b232c3 100644
--- a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/RunFragment.java
+++ b/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/RunFragment.java
@@ -96,6 +96,12 @@ public class RunFragment extends Fragment implements View.OnClickListener{
     }
 
     @Override
+    public void onPause() {
+        super.onPause();
+        getActivity().finish();
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         String runresult = getActivity().getIntent().getStringExtra("runresult");
@@ -147,12 +153,14 @@ public class RunFragment extends Fragment implements View.OnClickListener{
             reloadRunResult();
             return true;
         }
+        if(id == android.R.id.home){
+           getActivity().finish();
+        }
 
         return super.onOptionsItemSelected(item);
     }
 
     private void reloadRunResult(){
-        //TODO reload the run results when refreshed
         Timer t = new Timer();
         t.scheduleAtFixedRate(new RunTimerTask(getActivity(), run_id), 0, 5000);
     }
@@ -163,7 +171,7 @@ public class RunFragment extends Fragment implements View.OnClickListener{
     }
 
     public void updateRun(final JSONObject runInfo){
-
+        if(null != runInfo)
         getActivity().runOnUiThread(new Runnable() {
             @Override
             public void run() {

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/ca95c34a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragment.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragment.java b/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragment.java
index 54325f4..5a5ee09 100644
--- a/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragment.java
+++ b/app/src/main/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragment.java
@@ -62,6 +62,7 @@ import org.apache.taverna.mobile.tavernamobile.TavernaPlayerAPI;
 import org.apache.taverna.mobile.tavernamobile.User;
 import org.apache.taverna.mobile.tavernamobile.Workflow;
 import org.apache.taverna.mobile.utils.DetailsLoader;
+import org.apache.taverna.mobile.utils.RunTask;
 import org.apache.taverna.mobile.utils.WorkflowDownloadManager;
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -99,6 +100,7 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
     static Animation zoomin;
     static Animation zoomout;
     public boolean isZoomIn;
+    public static String workflow_uri ;
 
     /**
      * Returns a new instance of this fragment for the given section
@@ -201,8 +203,10 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
     @Override
     public void onResume() {
         super.onResume();
-     //   if(!LOAD_STATE)
-            getActivity().getLoaderManager().initLoader(1, null, this).forceLoad();
+        if(!LOAD_STATE)
+        workflow_uri = getActivity().getIntent().getStringExtra("uri");
+
+        getActivity().getLoaderManager().initLoader(1, null, this).forceLoad();
     }
 
     @Override
@@ -216,7 +220,7 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
         progressDialog.show();
         return new DetailsLoader(getActivity(),
                 DetailsLoader.LOAD_TYPE.TYPE_WORKFLOW_DETAIL,
-                getActivity().getIntent().getStringExtra("uri"));
+                workflow_uri);
     }
 
     @Override
@@ -454,6 +458,8 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
                             new RunTask(ctx).execute(json.toString());
                         } catch (JSONException e) {
                             e.printStackTrace();
+                        }catch (Exception ex){
+                            ex.printStackTrace();
                         }
 
                     }
@@ -583,76 +589,5 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList
 
         }
     }
-    /**
-     * creates a new workflow run from the workflow on the player
-     */
-    private class RunTask extends AsyncTask<String, Void, String>{
-
-        private Context context;
-
-        private RunTask(Context ctx) {
-            this.context = ctx;
-        }
-
-        @Override
-        protected void onPreExecute() {
-            super.onPreExecute();
-            progressDialog.setMessage("Creating new run for the workflow");
-            progressDialog.show();
-        }
-
-        @Override
-        protected String doInBackground(String... params) {
-            StringBuffer sb = new StringBuffer();
-            try {
-
-                URL workflowurl = new URL(new TavernaPlayerAPI(this.context).PLAYER_RUN_URL);
-                HttpURLConnection connection = (HttpURLConnection) workflowurl.openConnection();
-                String userpass = "icep603@gmail.com" + ":" + "creationfox";
-                String basicAuth = "Basic " + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT);
-
-                connection.setRequestProperty("Authorization", basicAuth);
-                connection.setRequestProperty("Accept", "application/json");
-                connection.setRequestProperty("Content-Type", "application/json");
-                connection.setRequestMethod("POST");
-                connection.connect(); //send request
 
-                DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
-                dos.writeBytes(params[0]);//write post data which is a formatted json data representing inputs to a run
-
-                dos.flush();
-                dos.close();
-
-                InputStream dis = connection.getInputStream();
-                BufferedReader br = new BufferedReader(new InputStreamReader(dis));
-
-                String jsonData = "";
-                while ((jsonData = br.readLine()) != null) {
-                    sb.append(jsonData);
-                    //
-                }
-                dis.close();
-                br.close();
-                Log.i("Run RESPONSE Code", "" + connection.getResponseCode());
-                Log.i("Run RESPONSE Messsage", "" + connection.getResponseMessage());
-
-                return sb.toString();
-
-            }catch (IOException ex){
-                ex.printStackTrace();
-            }
-            return sb.toString();
-        }
-
-        @Override
-        protected void onPostExecute(String s) {
-            Log.i("RUN OutPut", s);
-            progressDialog.dismiss();
-            //TODO startup the runActivity to display the run results
-            Intent runIntent = new Intent();
-            runIntent.setClass(this.context, RunResult.class);
-            runIntent.putExtra("runresult", s);
-            startActivity(runIntent);
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/ca95c34a/app/src/main/java/org/apache/taverna/mobile/utils/RunTask.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/RunTask.java b/app/src/main/java/org/apache/taverna/mobile/utils/RunTask.java
new file mode 100644
index 0000000..14e0939
--- /dev/null
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/RunTask.java
@@ -0,0 +1,93 @@
+package org.apache.taverna.mobile.utils;
+
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.Intent;
+import android.os.AsyncTask;
+import android.util.Base64;
+import android.util.Log;
+
+import org.apache.taverna.mobile.activities.RunResult;
+import org.apache.taverna.mobile.tavernamobile.TavernaPlayerAPI;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+/**
+ * Created by root on 7/11/15.
+ */
+public class RunTask extends AsyncTask<String, Void, String> {
+
+    private Context context;
+    private ProgressDialog progressDialog;
+
+    public RunTask(Context ctx) {
+        this.context = ctx;
+        progressDialog = new ProgressDialog(this.context);
+    }
+
+    @Override
+    protected void onPreExecute() {
+        super.onPreExecute();
+            progressDialog.setMessage("Creating new run for the workflow");
+            progressDialog.show();
+    }
+
+    @Override
+    protected String doInBackground(String... params) {
+        StringBuffer sb = new StringBuffer();
+        try {
+
+            URL workflowurl = new URL(new TavernaPlayerAPI(this.context).PLAYER_RUN_URL);
+            HttpURLConnection connection = (HttpURLConnection) workflowurl.openConnection();
+            String userpass = "icep603@gmail.com" + ":" + "creationfox";
+            String basicAuth = "Basic " + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT);
+
+            connection.setRequestProperty("Authorization", basicAuth);
+            connection.setRequestProperty("Accept", "application/json");
+            connection.setRequestProperty("Content-Type", "application/json");
+            connection.setRequestMethod("POST");
+            // connection.setDoInput(true);
+            //  connection.setDoOutput(true);
+            connection.connect(); //send request
+
+            DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
+            dos.writeBytes(params[0]);//write post data which is a formatted json data representing inputs to a run
+
+            dos.flush();
+            dos.close();
+
+            InputStream dis = connection.getInputStream();
+            BufferedReader br = new BufferedReader(new InputStreamReader(dis));
+
+            String jsonData = "";
+            while ((jsonData = br.readLine()) != null) {
+                sb.append(jsonData);
+                //
+            }
+            dis.close();
+            br.close();
+
+            return sb.toString();
+
+        }catch (IOException ex){
+            ex.printStackTrace();
+        }
+        return sb.toString();
+    }
+
+    @Override
+    protected void onPostExecute(String s) {
+        Log.i("RUN OutPut", s);
+//            progressDialog.dismiss();
+        Intent runIntent = new Intent();
+        runIntent.setClass(this.context, RunResult.class);
+        runIntent.putExtra("runresult", s);
+        this.context.startActivity(runIntent);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/ca95c34a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowOpen.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowOpen.java b/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowOpen.java
new file mode 100644
index 0000000..aaa13ff
--- /dev/null
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowOpen.java
@@ -0,0 +1,289 @@
+package org.apache.taverna.mobile.utils;
+
+/**
+ * Created by Larry Akah on 7/11/15.
+ */
+
+import android.app.AlertDialog;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.AsyncTask;
+import android.util.Base64;
+import android.util.Log;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.ScrollView;
+import android.widget.TextView;
+
+import org.apache.taverna.mobile.R;
+import org.apache.taverna.mobile.tavernamobile.TavernaPlayerAPI;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+/**
+ *Read the selected xml file from storage and upload to player to generate workflowRun
+ */
+public class WorkflowOpen extends AsyncTask<String, Void, String> {
+
+    private Context context;
+    private ProgressDialog progressDialog;
+
+    public WorkflowOpen(Context context) {
+        this.context = context;
+        progressDialog = new ProgressDialog(this.context);
+    }
+        @Override
+        protected void onPreExecute() {
+
+            progressDialog.setMessage("Uploading Workflow ... ");
+            progressDialog.show();
+        }
+
+    /**
+     *
+     * @param params path to workflow file to upload to player
+     * @return run framework used to create a new workflow run
+     */
+    @Override
+    protected String doInBackground(String... params) {
+        StringBuffer sb = new StringBuffer();
+        String str = "";
+        try {
+             //prepare connection requests
+            File objectFile = new File(params[0]); //the resource xml file representing the workflow to be uploaded to the player
+            String playerurl = new TavernaPlayerAPI(this.context).PLAYER_BASE_URL+"workflows.json";
+            URL posturl = new URL(playerurl);
+            HttpURLConnection connection = (HttpURLConnection) posturl.openConnection();
+
+            String user = "icep603@gmail.com" + ":" + "creationfox";
+            String basicAuth = "Basic " + Base64.encodeToString(user.getBytes(), Base64.DEFAULT);
+            //read the file from remote resource and encode the stream with a base64 algorithm
+
+            try {
+                BufferedReader br = new BufferedReader(new FileReader(objectFile));
+
+                while ((str = br.readLine()) != null) {
+                    sb.append(str);
+                    sb.append('\n');
+                }
+                br.close();
+            }
+            catch (IOException e) {
+                e.printStackTrace();
+            }
+
+            String data = "{\"document\":\"data:application/octet-stream;base64," +
+                    Base64.encodeToString(sb.toString().getBytes("UTF-8"), Base64.URL_SAFE|Base64.NO_WRAP).replace('-','+')+"\"}";
+            String post = "{\"workflow\":"+data+"}";
+            //clear sb so that we can use it again to fetch results from this post request
+            sb.delete(0,sb.length()-1);
+            System.out.println("BODY=>"+post);
+            connection.setRequestMethod("POST");
+            connection.setRequestProperty("Authorization", basicAuth);
+            connection.setRequestProperty("Accept", "*/*");
+            connection.setRequestProperty("Content-Type", "application/json");
+            connection.setRequestProperty("Content-Encoding", "UTF-8");
+            connection.setUseCaches (false);
+            connection.setDoOutput(true);
+            connection.connect(); //send request
+
+            DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
+
+            dos.writeBytes(post);//write post data which is a formatted json data representing body of workflow
+
+            dos.flush();
+            dos.close();
+
+            InputStream dis = connection.getInputStream();
+            BufferedReader br = new BufferedReader(new InputStreamReader(dis));
+            while ((str = br.readLine())!= null)
+                sb.append(str);
+            System.out.println("Post Response Code: "+connection.getResponseCode());
+            System.out.println("Post response message: "+connection.getResponseMessage());
+            connection.disconnect();
+        }catch (IOException e){
+            e.printStackTrace();
+            sb.append("Error reading remote workflow. Please try again later");
+        }
+
+        return sb.toString();
+    }
+
+    /**
+     * Receives a result from the player as a json describing the workflow that has just been uploaded along with key components that
+     * can be used to generate a run from thw workflow. A run is started that would fetch and build a sample UI for a workflow run to be executed
+     * @param s the json result that describes the uploaded workflow
+     */
+    @Override
+    protected void onPostExecute(String s) {
+            progressDialog.dismiss();
+        System.out.println(s);
+        s = s.substring(1, s.length());
+        try {
+            JSONObject workflowJson = new JSONObject(s);
+            new WorkflowRunTask(this.context).execute(workflowJson.getString("id"));
+
+        } catch (JSONException e) {
+            e.printStackTrace();
+        }
+
+    }
+
+    //create and return a new TextView
+    public TextView createTextView(Context mcontext, String placeholder){
+        TextView tv = new TextView(mcontext);
+        tv.setText(placeholder);
+        tv.setMinLines(2);
+
+        return tv;
+    }
+
+    //create and return a new EdiText view
+    public EditText createEditText(Context ctx, int i){
+        EditText edt;
+        edt = new EditText(ctx);
+        edt.setHint("Enter Value");
+        edt.setMinLines(1);
+        edt.setId(i);
+        return edt;
+    }
+
+    private class WorkflowRunTask extends AsyncTask<String, Void, String>{
+
+        private Context context;
+        private AlertDialog.Builder alertDialogBuilder;
+        private AlertDialog runDialog;
+
+        private WorkflowRunTask(Context context) {
+            this.context = context;
+        }
+
+        @Override
+        protected void onPreExecute() {
+            super.onPreExecute();
+            progressDialog.setMessage(this.context.getResources().getString(R.string.fetchrun));
+            progressDialog.show();
+        }
+
+        @Override
+        protected String doInBackground(String... params) {
+            StringBuffer sb = new StringBuffer();
+            try {
+
+                URL workflowurl = new URL(new TavernaPlayerAPI(this.context).PLAYER_RUN_FRAMEWORK_URL+params[0]);
+                HttpURLConnection connection = (HttpURLConnection) workflowurl.openConnection();
+                String userpass = "icep603@gmail.com" + ":" + "creationfox";
+                String basicAuth = "Basic " + Base64.encodeToString(userpass.getBytes(), Base64.DEFAULT);
+
+                connection.setRequestProperty("Authorization", basicAuth);
+                connection.setRequestProperty("Accept", "application/json");
+                connection.setRequestMethod("GET");
+                connection.connect(); //send request
+                Log.i("RESPONSE Code", "" + connection.getResponseCode());
+                Log.i("RESPONSE Messsage", "" + connection.getResponseMessage());
+                Log.i("Authorization ", "" + connection.getRequestProperty("Authorization"));
+
+                InputStream dis = connection.getInputStream();
+                BufferedReader br = new BufferedReader(new InputStreamReader(dis));
+
+                String jsonData = "";
+                while ((jsonData = br.readLine()) != null) {
+                    sb.append(jsonData);
+                }
+                dis.close();
+                br.close();
+                return sb.toString();
+
+            }catch (IOException ex){
+                ex.printStackTrace();
+            }
+            return sb.toString();
+        }
+
+        @Override
+        protected void onPostExecute(String result) {
+            //show the skeleton to the user in a dialog box
+            final Context ctx = this.context;
+            final LinearLayout ll = new LinearLayout(ctx);
+            ScrollView sv = new ScrollView(ctx);
+            ll.setOrientation(LinearLayout.VERTICAL);
+            sv.addView(ll);
+
+            try {
+                final JSONObject json = new JSONObject(result); //main server response json
+                JSONObject mjson = json.getJSONObject("run"); //main framework response json
+                String name = mjson.getString("name"); //a name that can be configured or edited for the new run to be created
+                ll.addView(createTextView(ctx, name));
+                final JSONArray attr_array = mjson.getJSONArray("inputs_attributes");
+                for(int i=0; i<attr_array.length(); i++){
+                    JSONObject obj = attr_array.getJSONObject(i);
+                    ll.addView(createTextView(ctx, obj.getString("name")));
+                    ll.addView(createEditText(ctx, i));
+                }
+
+                alertDialogBuilder = new AlertDialog.Builder(ctx);
+                alertDialogBuilder.setView(sv);
+                //               alertDialogBuilder.setMessage(result);
+                alertDialogBuilder.setIcon(ctx.getResources().getDrawable(R.mipmap.ic_launcher));
+                alertDialogBuilder.setTitle("New Workflow Run");
+                alertDialogBuilder.setPositiveButton("Execute", new DialogInterface.OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialogInterface, int i) {
+                        int n = attr_array.length();
+                        for(int j=0; j<n; j++){
+                            try {
+                                EditText inputText = (EditText) ll.findViewById(j);
+                                String value = inputText.getText().toString();//get input entry entered by the user
+                                JSONObject jojb = attr_array.getJSONObject(j); //get the input attributes provided by the skeleton
+                                jojb.put("value", value); //replace value field in object with the entry provided by the user
+                                attr_array.put(j, jojb); //replace the input entry with the new name/input json object
+
+                            } catch (JSONException e) {
+                                e.printStackTrace();
+                            }
+
+                        }
+                        try {
+                            json.put("inputs_attributes", attr_array);
+                            Log.i("RUN FRAMEWORK", json.toString(2));
+                            //start a run task to execute the run.
+                            new RunTask(ctx).execute(json.toString());
+                        } catch (JSONException e) {
+                            e.printStackTrace();
+                        }
+
+                    }
+                });
+                alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+
+                    @Override
+                    public void onClick(DialogInterface dialogInterface, int i) {
+                        dialogInterface.dismiss();
+                    }
+                });
+
+                runDialog = alertDialogBuilder.create();
+
+            } catch (JSONException e) {
+                e.printStackTrace();
+            }
+            progressDialog.dismiss();
+            runDialog.show();
+        }
+    }
+}
+
+
+