implementing workflow run over the taverna player
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/6e202551 Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/tree/6e202551 Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/diff/6e202551 Branch: refs/heads/master Commit: 6e202551a1cf5231fc5d2e0b1e725df69bf01ae8 Parents: 57164b1 Author: larrytech7 <larrya...@gmail.com> Authored: Wed Jul 8 15:19:02 2015 +0100 Committer: larrytech7 <larrya...@gmail.com> Committed: Wed Jul 8 15:19:02 2015 +0100 ---------------------------------------------------------------------- .../taverna/mobile/activities/RunResult.java | 67 ++++++++++++++++ .../workflowdetails/WorkflowdetailFragment.java | 79 ++++++++++++------- app/src/main/res/layout/activity_run_result.xml | 4 + app/src/main/res/layout/fragment_run_result.xml | 12 +++ app/src/main/res/menu/run_result.xml | 7 ++ simple-xml-2.7.1/simple-xml-2.7.1.iml | 16 ---- simple-xml-2.7.1/simple-xml-2.7.1.jar | Bin 427590 -> 0 bytes 7 files changed, 142 insertions(+), 43 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/6e202551/app/src/main/java/org/apache/taverna/mobile/activities/RunResult.java ---------------------------------------------------------------------- diff --git a/app/src/main/java/org/apache/taverna/mobile/activities/RunResult.java b/app/src/main/java/org/apache/taverna/mobile/activities/RunResult.java new file mode 100644 index 0000000..2ae1a53 --- /dev/null +++ b/app/src/main/java/org/apache/taverna/mobile/activities/RunResult.java @@ -0,0 +1,67 @@ +package org.apache.taverna.mobile.activities; + +import android.support.v7.app.ActionBarActivity; +import android.support.v7.app.ActionBar; +import android.support.v4.app.Fragment; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.os.Build; + +import org.apache.taverna.mobile.R; + +public class RunResult extends ActionBarActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_run_result); + if (savedInstanceState == null) { + getSupportFragmentManager().beginTransaction() + .add(R.id.container, new PlaceholderFragment()) + .commit(); + } + } + + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.run_result, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.action_settings) { + return true; + } + + return super.onOptionsItemSelected(item); + } + + /** + * A placeholder fragment containing a simple view. + */ + public static class PlaceholderFragment extends Fragment { + + public PlaceholderFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_run_result, container, false); + return rootView; + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/6e202551/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 68ebf09..8e6419e 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 @@ -49,6 +49,7 @@ import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; +import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; import android.widget.ZoomControls; @@ -72,11 +73,12 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.nio.charset.CharsetEncoder; /** * Created by Larry Akah on 6/9/15. */ -public class WorkflowdetailFragment extends Fragment implements View.OnClickListener, LoaderManager.LoaderCallbacks<Workflow>{ +public class WorkflowdetailFragment extends Fragment implements View.OnClickListener,LoaderManager.LoaderCallbacks<Workflow>{ /** * The fragment argument representing the section number for this * fragment. @@ -106,6 +108,9 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList fragment.setArguments(args); return fragment; } + public static WorkflowdetailFragment getInstance(){ + return WorkflowdetailFragment.getInstance(); + } public WorkflowdetailFragment() { } @@ -122,8 +127,8 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList zoomin = AnimationUtils.loadAnimation(getActivity(), R.anim.zoomin); zoomout = AnimationUtils.loadAnimation(getActivity(), R.anim.zoomout); zoomControls = (ZoomControls) rootView.findViewById(R.id.zoomControls); - zoomControls.setOnZoomInClickListener(this); - zoomControls.setOnZoomOutClickListener(this); + zoomControls.setOnClickListener(this); + // zoomControls.setOnZoomOutClickListener(this); Button createRun = (Button) rootView.findViewById(R.id.run_wk); createRun.setOnClickListener(this); @@ -149,9 +154,10 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList public void onClick(View view) { switch(view.getId()){ case R.id.run_wk: - //TODO implement functionality to issue a run request to the Taverna PLAYER to run the current workflow - //new WorkflowRunTask(getActivity()).execute(""+WORKFLO_ID); - new WorkflowProcessTask(getActivity()).execute(download_url); + if (((TextView)rootView.findViewById(R.id.wtype)).getText().toString().contains("Taverna 2")) + new WorkflowProcessTask(getActivity()).execute(download_url); + else + Toast.makeText(getActivity(), "Sorry! only Type 2 workflows can be run as of now.", Toast.LENGTH_LONG).show(); break; case R.id.download_wk: // start the android Download manager to start downloading a remote workflow file @@ -169,9 +175,13 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList //TODO mark a workflow as important and launch task to store the entry into the local database break; case R.id.zoomControls: + zoomin.reset(); zoomin.startNow(); Toast.makeText(getActivity(), "Zooming", Toast.LENGTH_SHORT).show(); break; + case R.id.wkf_image: + view.setAnimation(zoomin); + break; } } @@ -227,18 +237,18 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList } public static void setWorkflowDetails(final Workflow wk){ + final TextView author = (TextView) rootView.findViewById(R.id.wkf_author); + final TextView updated = (TextView) rootView.findViewById(R.id.wupdatedat); + final TextView type = (TextView) rootView.findViewById(R.id.wtype); + final TextView title = (TextView) rootView.findViewById(R.id.wtitle); + final TextView desc = (TextView) rootView.findViewById(R.id.wdescription); + final TextView createdat = (TextView) rootView.findViewById(R.id.wcreatedat); + final ImageView preview = (ImageView) rootView.findViewById(R.id.wkf_image); ((Activity)cont).runOnUiThread(new Runnable() { @Override public void run() { //load necessary widgets - TextView author = (TextView) rootView.findViewById(R.id.wkf_author); - TextView updated = (TextView) rootView.findViewById(R.id.wupdatedat); - TextView type = (TextView) rootView.findViewById(R.id.wtype); - TextView title = (TextView) rootView.findViewById(R.id.wtitle); - TextView desc = (TextView) rootView.findViewById(R.id.wdescription); - TextView createdat = (TextView) rootView.findViewById(R.id.wcreatedat); - final ImageView preview = (ImageView) rootView.findViewById(R.id.wkf_image); //set widget data User uploader = wk.getUploader(); @@ -295,6 +305,7 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList progressDialog.dismiss(); } }); + // preview.setOnClickListener(WorkflowdetailFragment.getInstance()); } private static class LoadImageThread extends AsyncTask<String, Void, Bitmap>{ @@ -405,7 +416,9 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList //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 @@ -420,10 +433,10 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList } alertDialogBuilder = new AlertDialog.Builder(ctx); - alertDialogBuilder.setView(ll); + alertDialogBuilder.setView(sv); // alertDialogBuilder.setMessage(result); alertDialogBuilder.setIcon(ctx.getResources().getDrawable(R.mipmap.ic_launcher)); - alertDialogBuilder.setTitle("New Run"); + alertDialogBuilder.setTitle("New Workflow Run"); alertDialogBuilder.setPositiveButton("Execute", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { @@ -444,7 +457,8 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList try { json.put("inputs_attributes", attr_array); Log.i("RUN FRAMEWORK", json.toString(2)); - new RunTask(ctx).execute(json.toString()); + //start a run task to execute the run. + // new RunTask(ctx).execute(json.toString()); } catch (JSONException e) { e.printStackTrace(); } @@ -518,10 +532,9 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList sb.append(str); //in this string builder we have read the workflow( as .t2flow or .xml) workflow from remote resource. Now we need to post that to the player. bufferedReader.close(); wconn.disconnect(); -//PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHM6c2N1ZmwgeG1sbnM6cz0iaHR0cDovL29yZy5lbWJsLmViaS5lc2NpZW5jZS94c2N1ZmwvMC4xYWxwaGEiIHZlcnNpb249IjAuMiIgbG9nPSIwIj4KICA8czp3b3JrZmxvd2Rlc2NyaXB0aW9uIGxzaWQ9InVybjpsc2lkOnd3dy5teWdyaWQub3JnLnVrOm9wZXJhdGlvbjpLNlpDRzZJV05TMCIgYXV0aG9yPSIiIHRpdGxlPSIiIC8+CiAgPHM6cHJvY2Vzc29yIG5hbWU9IlN0cmluZ19Db25zdGFudCIgYm9yaW5nPSJ0cnVlIj4KICAgIDxzOnN0cmluZ2NvbnN0YW50Pmh0dHA6Ly93d3cuY3MubWFuLmFjLnVrL35nb2RlcmlzYS9QaG90by5qcGc8L3M6c3RyaW5nY29uc3RhbnQ+CiAgPC9zOnByb2Nlc3Nvcj4KICA8czpwcm9jZXNzb3IgbmFtZT0iR2V0X2ltYWdlX2Zyb21fVVJMIj4KICAgIDxzOmxvY2FsPm9yZy5lbWJsLmViaS5lc2NpZW5jZS5zY3VmbHdvcmtlcnMuamF2YS5XZWJJbWFnZUZldGNoZXI8L3M6bG9jYWw+CiAgPC9zOnByb2Nlc3Nvcj4KICA8czpsaW5rIHNvdXJjZT0iU3RyaW5nX0NvbnN0YW50OnZhbHVlIiBzaW5rPSJHZXRfaW1hZ2VfZnJvbV9VUkw6dXJsIiAvPgogIDxzOmxpbmsgc291cmNlPSJHZXRfaW1hZ2VfZnJvbV9VUkw6aW1hZ2UiIHNpbms9InZpeiIgLz4KICA8czpzaW5rIG5hbWU9InZpeiIgLz4KPC9zOnNjdWZsPgoKCg== - // Base64.encodeToString(sb.toString().getBytes("UTF-8"), Base64.DEFAULT) + String data = "{\"document\":\"data:application/octet-stream;base64," + - Base64.encodeToString(sb.toString().getBytes("UTF-8"), Base64.URL_SAFE|Base64.NO_WRAP)+"\"}"; + 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); @@ -529,25 +542,23 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList connection.setRequestMethod("POST"); connection.setRequestProperty("Authorization", basicAuth); connection.setRequestProperty("Accept", "*/*"); - // connection.setRequestProperty("Content-Length", "10165"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Content-Encoding", "UTF-8"); - connection.setRequestProperty("Accept-Charset", "UTF-8"); connection.setUseCaches (false); connection.setDoOutput(true); - // connection.setDoInput(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);*/ + sb.append(str); System.out.println("Post Response Code: "+connection.getResponseCode()); System.out.println("Post response message: "+connection.getResponseMessage()); connection.disconnect(); @@ -555,17 +566,32 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList 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) { - System.out.println(s); progressDialog.dismiss(); + System.out.println(s); + s = s.substring(1, s.length()); + try { + JSONObject workflowJson = new JSONObject(s); + new WorkflowRunTask(getActivity()).execute(workflowJson.getString("id")); + + } catch (JSONException e) { + e.printStackTrace(); + } + } } /** - * creates a new workflow run from the + * creates a new workflow run from the workflow on the player */ private class RunTask extends AsyncTask<String, Void, String>{ @@ -617,7 +643,6 @@ public class WorkflowdetailFragment extends Fragment implements View.OnClickList br.close(); Log.i("RESPONSE Code", "" + connection.getResponseCode()); Log.i("RESPONSE Messsage", "" + connection.getResponseMessage()); - Log.i("Authorization ", "" + connection.getRequestProperty("Authorization")); return sb.toString(); http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/6e202551/app/src/main/res/layout/activity_run_result.xml ---------------------------------------------------------------------- diff --git a/app/src/main/res/layout/activity_run_result.xml b/app/src/main/res/layout/activity_run_result.xml new file mode 100644 index 0000000..027aa67 --- /dev/null +++ b/app/src/main/res/layout/activity_run_result.xml @@ -0,0 +1,4 @@ +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" + android:layout_width="match_parent" android:layout_height="match_parent" + tools:context="org.apache.taverna.mobile.activities.RunResult" tools:ignore="MergeRootFrame" /> http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/6e202551/app/src/main/res/layout/fragment_run_result.xml ---------------------------------------------------------------------- diff --git a/app/src/main/res/layout/fragment_run_result.xml b/app/src/main/res/layout/fragment_run_result.xml new file mode 100644 index 0000000..ccb985c --- /dev/null +++ b/app/src/main/res/layout/fragment_run_result.xml @@ -0,0 +1,12 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" + android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" + android:paddingRight="@dimen/activity_horizontal_margin" + android:paddingTop="@dimen/activity_vertical_margin" + android:paddingBottom="@dimen/activity_vertical_margin" + tools:context="org.apache.taverna.mobile.activities.RunResult$PlaceholderFragment"> + + <TextView android:text="@string/hello_world" android:layout_width="wrap_content" + android:layout_height="wrap_content" /> + +</RelativeLayout> http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/6e202551/app/src/main/res/menu/run_result.xml ---------------------------------------------------------------------- diff --git a/app/src/main/res/menu/run_result.xml b/app/src/main/res/menu/run_result.xml new file mode 100644 index 0000000..35d088f --- /dev/null +++ b/app/src/main/res/menu/run_result.xml @@ -0,0 +1,7 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + tools:context="org.apache.taverna.mobile.activities.RunResult"> + <item android:id="@+id/action_settings" android:title="@string/action_settings" + android:orderInCategory="100" app:showAsAction="never" /> +</menu> http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/6e202551/simple-xml-2.7.1/simple-xml-2.7.1.iml ---------------------------------------------------------------------- diff --git a/simple-xml-2.7.1/simple-xml-2.7.1.iml b/simple-xml-2.7.1/simple-xml-2.7.1.iml deleted file mode 100644 index 07735a7..0000000 --- a/simple-xml-2.7.1/simple-xml-2.7.1.iml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="TavernaMobile2" external.system.module.version="unspecified" type="JAVA_MODULE" version="4"> - <component name="FacetManager"> - <facet type="android-gradle" name="Android-Gradle"> - <configuration> - <option name="GRADLE_PROJECT_PATH" value=":simple-xml-2.7.1" /> - </configuration> - </facet> - </component> - <component name="NewModuleRootManager" inherit-compiler-output="true"> - <exclude-output /> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - </component> -</module> - http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/6e202551/simple-xml-2.7.1/simple-xml-2.7.1.jar ---------------------------------------------------------------------- diff --git a/simple-xml-2.7.1/simple-xml-2.7.1.jar b/simple-xml-2.7.1/simple-xml-2.7.1.jar deleted file mode 100644 index 913725d..0000000 Binary files a/simple-xml-2.7.1/simple-xml-2.7.1.jar and /dev/null differ