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/06/29 12:08:12 UTC

[02/46] incubator-taverna-mobile git commit: load particular details from main workflow on home screen

load particular details from main workflow on home screen


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/fcb08e4d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/tree/fcb08e4d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/diff/fcb08e4d

Branch: refs/heads/master
Commit: fcb08e4dfd6f2b24fa0c22d62afece9d45a50827
Parents: 48731e6
Author: larrytech7 <la...@gmail.com>
Authored: Thu Jun 25 13:27:51 2015 +0100
Committer: larrytech7 <la...@gmail.com>
Committed: Thu Jun 25 13:27:51 2015 +0100

----------------------------------------------------------------------
 .../WorkflowdetailFragmentTest.java             |  26 ++
 .../taverna/mobile/adapters/RunAdapter.java     |   3 +-
 .../mobile/adapters/WorkflowAdapter.java        |   4 +-
 .../taverna/mobile/tavernamobile/User.java      |   9 +
 .../taverna/mobile/tavernamobile/Workflow.java  |  18 ++
 .../taverna/mobile/utils/DetailsLoader.java     |  96 ++++++--
 .../taverna/mobile/utils/WorkflowLoader.java    |   3 +-
 .../utils/xmlparsers/MyExperimentXmlParser.java | 237 ++++++++++++++++---
 .../utils/xmlparsers/WorkflowDetailParser.java  |  47 +++-
 .../mobile/utils/xmlparsers/WorkflowParser.java |   9 +-
 app/src/main/res/layout/fragment_item_grid.xml  |   3 +
 app/src/main/res/layout/fragment_item_list.xml  |   3 +
 .../main/res/layout/fragment_workflow_about.xml |   3 +-
 .../res/layout/fragment_workflow_detail.xml     |   6 +-
 .../res/layout/fragment_workflow_licence.xml    |   3 +-
 15 files changed, 396 insertions(+), 74 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/androidTest/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragmentTest.java
----------------------------------------------------------------------
diff --git a/app/src/androidTest/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragmentTest.java b/app/src/androidTest/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragmentTest.java
new file mode 100644
index 0000000..634d105
--- /dev/null
+++ b/app/src/androidTest/java/org/apache/taverna/mobile/fragments/workflowdetails/WorkflowdetailFragmentTest.java
@@ -0,0 +1,26 @@
+package org.apache.taverna.mobile.fragments.workflowdetails;
+
+import junit.framework.TestCase;
+
+public class WorkflowdetailFragmentTest extends TestCase {
+
+    public void testOnResume() throws Exception {
+
+    }
+
+    public void testOnCreateLoader() throws Exception {
+
+    }
+
+    public void testOnLoadFinished() throws Exception {
+
+    }
+
+    public void testOnLoaderReset() throws Exception {
+
+    }
+
+    public void testSetWorkflowDetails() throws Exception {
+
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/java/org/apache/taverna/mobile/adapters/RunAdapter.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/adapters/RunAdapter.java b/app/src/main/java/org/apache/taverna/mobile/adapters/RunAdapter.java
index 6302c12..74152df 100644
--- a/app/src/main/java/org/apache/taverna/mobile/adapters/RunAdapter.java
+++ b/app/src/main/java/org/apache/taverna/mobile/adapters/RunAdapter.java
@@ -130,7 +130,8 @@ public class RunAdapter extends RecyclerView.Adapter<RunAdapter.RunHolder> {
      */
     @Override
     public int getItemCount() {
-        return runList.size();
+        return 0;
+///        return runList.size();
     }
 
     public static class RunHolder extends RecyclerView.ViewHolder {

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/java/org/apache/taverna/mobile/adapters/WorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/adapters/WorkflowAdapter.java b/app/src/main/java/org/apache/taverna/mobile/adapters/WorkflowAdapter.java
index ce4e4c9..c2c55eb 100644
--- a/app/src/main/java/org/apache/taverna/mobile/adapters/WorkflowAdapter.java
+++ b/app/src/main/java/org/apache/taverna/mobile/adapters/WorkflowAdapter.java
@@ -101,6 +101,7 @@ public class WorkflowAdapter extends RecyclerView.Adapter<WorkflowAdapter.ViewHo
         final String author = workflow.get(i).getWorkflow_author();
         final String title = workflow.get(i).getWorkflow_title();
         String description  = workflow.get(i).getWorkflow_description();
+        String uri = workflow.get(i).getWorkflow_details_url();
         final String desc_full = description;
         ArrayList<Object> mfav = new ArrayList<Object>();
 
@@ -115,7 +116,8 @@ public class WorkflowAdapter extends RecyclerView.Adapter<WorkflowAdapter.ViewHo
         final String wkflow_url = workflow.get(j).getWorkflow_remote_url();
         final Intent it = new Intent();
         it.setClass(context, WorkflowDetailActivity.class);
-        it.putExtra("workflowid", workflow.get(i).getId());
+//        it.putExtra("workflowid", workflow.get(i).getId());
+        it.putExtra("uri",uri);
         WorkflowdetailFragment.WORKFLO_ID = workflow.get(i).getId();
 
         viewHolder.btn_view_workflow.setOnClickListener(new View.OnClickListener() {

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/java/org/apache/taverna/mobile/tavernamobile/User.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/tavernamobile/User.java b/app/src/main/java/org/apache/taverna/mobile/tavernamobile/User.java
index fa61075..e352913 100644
--- a/app/src/main/java/org/apache/taverna/mobile/tavernamobile/User.java
+++ b/app/src/main/java/org/apache/taverna/mobile/tavernamobile/User.java
@@ -56,6 +56,7 @@ public class User {
     protected String country;
     @Element(required = false)
     protected String website;
+    protected String details_uri;
 
     protected List<Workflow> user_workflows; //a list of workflows owned by this user
 
@@ -71,6 +72,14 @@ public class User {
         this.created_at = created_at;
     }
 
+    public String getDetails_uri() {
+        return this.details_uri;
+    }
+
+    public void setDetails_uri(String details_uri) {
+        this.details_uri = details_uri;
+    }
+
     public String getName() {
         return name;
     }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/java/org/apache/taverna/mobile/tavernamobile/Workflow.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/tavernamobile/Workflow.java b/app/src/main/java/org/apache/taverna/mobile/tavernamobile/Workflow.java
index 6beada5..7868450 100644
--- a/app/src/main/java/org/apache/taverna/mobile/tavernamobile/Workflow.java
+++ b/app/src/main/java/org/apache/taverna/mobile/tavernamobile/Workflow.java
@@ -38,6 +38,7 @@ import java.util.List;
  */
 public class Workflow {
     private Context context;
+    private User uploader;
     private String workflow_author;
     private String workflow_title;
     private String workflow_description, about, policy;
@@ -46,6 +47,7 @@ public class Workflow {
     private WorkflowComponent workflowComponent;
     private String workflow_remote_url; //provides a link to download the workflow. Equivalent to content-uri in the xml form
     private String workflow_web_url; //a string containing the workflow resource that can be loaded in  browser
+    private String workflow_details_url;//used to refer to the details of the workflow
     private List<Runs> workflow_runs;
     private int workflow_input;
     private long id;
@@ -110,6 +112,22 @@ public class Workflow {
         this.workflow_remote_url = workflow_remote_url;
     }
 
+    public String getWorkflow_details_url() {
+        return this.workflow_details_url;
+    }
+
+    public User getUploader() {
+        return this.uploader;
+    }
+
+    public void setUploader(User uploader) {
+        this.uploader = uploader;
+    }
+
+    public void setWorkflow_details_url(String workflow_details_url) {
+        this.workflow_details_url = workflow_details_url;
+    }
+
     public String getPolicy() {
         return this.policy;
     }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/java/org/apache/taverna/mobile/utils/DetailsLoader.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/DetailsLoader.java b/app/src/main/java/org/apache/taverna/mobile/utils/DetailsLoader.java
index f0998fc..a73d10d 100644
--- a/app/src/main/java/org/apache/taverna/mobile/utils/DetailsLoader.java
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/DetailsLoader.java
@@ -29,9 +29,13 @@ import android.content.Context;
 import android.util.Base64;
 import android.util.Log;
 
+import com.thebuzzmedia.sjxp.rule.IRule;
+
 import org.apache.taverna.mobile.tavernamobile.Runs;
 import org.apache.taverna.mobile.tavernamobile.TavernaPlayerAPI;
 import org.apache.taverna.mobile.tavernamobile.Workflow;
+import org.apache.taverna.mobile.utils.xmlparsers.MyExperimentXmlParser;
+import org.apache.taverna.mobile.utils.xmlparsers.WorkflowDetailParser;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
@@ -48,34 +52,38 @@ import java.net.URL;
 import static org.apache.taverna.mobile.utils.DetailsLoader.LOAD_TYPE.*;
 
 /**
- * Created by root on 6/14/15.
+ * Loads workflow details from the myexperiment API and presents them on the UI .The class is generic and can be used to load the
+ * different details sections of the app.
+ * Created by Larry Akah on 6/14/15.
  */
 public class DetailsLoader extends AsyncTaskLoader<Workflow> {
 
     public static enum LOAD_TYPE {TYPE_WORKFLOW_DETAIL, TYPE_RUN_HISTORY,  TYPE_POLICY, TYPE_ABOUT_WORKFLOW};
     private LOAD_TYPE lt;
-    private long wid;
+    private String uri;
     private Workflow workflow;
     private Context context;
 
-    public DetailsLoader(Context context, LOAD_TYPE load_type, long id) {
+    public DetailsLoader(Context context, LOAD_TYPE load_type, String detailsRUI) {
         super(context);
         this.context = context;
         this.lt = load_type;
-        this.wid = id;
+        this.uri = detailsRUI;
+        workflow = new Workflow();
     }
 
     @Override
     public Workflow loadInBackground() {
         //start a network request to fetch user's workflow details
         try {
+            Log.i("LOADER STARTED", "loading data");
             //for password protected urls use the user's credentials
             Authenticator.setDefault(new TavernaPlayerAPI.Authenticator("taverna", "taverna"));
             URL workflowurl;
 
             switch (this.lt){
                 case TYPE_WORKFLOW_DETAIL:
-                    workflowurl = new URL(new TavernaPlayerAPI(this.context).PLAYER_WORKFLOW_URL+this.wid);
+                    workflowurl = new URL(this.uri);
                     break;
                 case TYPE_RUN_HISTORY:
                     workflowurl = new URL(new TavernaPlayerAPI(this.context).PLAYER_RUN_URL);
@@ -94,8 +102,8 @@ public class DetailsLoader extends AsyncTaskLoader<Workflow> {
             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 ("Authorization", basicAuth);
+           // connection.setRequestProperty("Accept", "application/json");
             connection.setRequestMethod("GET");
             // connection.setDoInput(true);
             //  connection.setDoOutput(true);
@@ -111,23 +119,33 @@ public class DetailsLoader extends AsyncTaskLoader<Workflow> {
             while((jsonData = br.readLine()) != null){
                 sb.append(jsonData);
             }
-            dis.close();
-            br.close();
+
             switch(this.lt) {
                 case TYPE_WORKFLOW_DETAIL: {
-                    JSONObject js = new JSONObject(sb.toString());
-                        Log.i("JSON ", js.toString(2));
-                        String created_at = js.getString("created_at");
-                        String updated_at = js.getString("updated_at");
-                        JSONObject user = js.getJSONObject("user");
-                    workflow = new Workflow(this.context, js.getString("title"),
-                            user.getString("name"),
-                            js.getString("description"),
-                            js.getInt("id"),
-                            js.getString("url"));
-                    workflow.setWorkflow_datecreated(created_at);
-                    workflow.setWorkflow_datemodified(updated_at);
+                    //make rules and apply the parser
+                    IRule workfl = new MyExperimentXmlParser.WorkflowDetailRule(IRule.Type.ATTRIBUTE,
+                            "/workflow", "uri","resource", "id","version");
+                    IRule title = new MyExperimentXmlParser.TitleRule(IRule.Type.CHARACTER,"/workflow/title");
+                    IRule description = new MyExperimentXmlParser.DescriptionRule(IRule.Type.CHARACTER, "/workflow/description");
+                    IRule type = new MyExperimentXmlParser.TypeRule(IRule.Type.CHARACTER, "/workflow/type");
+                    IRule attrType = new MyExperimentXmlParser.TypeRule(IRule.Type.ATTRIBUTE, "/workflow/type", "resource", "uri","id");
+                    IRule uploader = new MyExperimentXmlParser.UploaderRule(IRule.Type.CHARACTER, "/workflow/uploader");
+                    IRule attrUploader = new MyExperimentXmlParser.UploaderRule(IRule.Type.ATTRIBUTE, "/workflow/uploader",  "resource", "uri","id");
+                    IRule date = new MyExperimentXmlParser.DateRule(IRule.Type.CHARACTER, "/workflow/created-at");
+                    IRule preview = new MyExperimentXmlParser.PreviewRule(IRule.Type.CHARACTER, "/workflow/preview");
+                    IRule licetype = new MyExperimentXmlParser.LicenceTypeRule(IRule.Type.CHARACTER, "/workflow/licence-type");
+                    IRule attrlicetype = new MyExperimentXmlParser.LicenceTypeRule(IRule.Type.ATTRIBUTE,"/workflow/licence-type", "resource", "uri","id");
+                    IRule contenturi = new MyExperimentXmlParser.ContentUriRule(IRule.Type.CHARACTER, "/workflow/content-uri");
+                    IRule contentType = new MyExperimentXmlParser.ContentTypeRule(IRule.Type.CHARACTER, "/workflow/content-type");
+                    IRule tags = new MyExperimentXmlParser.TagsRule(IRule.Type.CHARACTER, "/workflow/tags/tag");
+                    IRule attrTags = new MyExperimentXmlParser.TagsRule(IRule.Type.ATTRIBUTE, "/workflow/tags/tag", "resource", "uri","id");
+
+                    WorkflowDetailParser parser = new WorkflowDetailParser(new IRule[]{workfl,title,description,type,
+                            attrlicetype,attrType, uploader,attrUploader,date,preview,licetype,contenturi,contentType,tags,attrTags});
+                    parser.parse(dis, workflow);
                 }
+                dis.close();
+                br.close();
                     return workflow;
                 case TYPE_RUN_HISTORY:{
                     workflow = new Workflow(this.context);
@@ -141,7 +159,7 @@ public class DetailsLoader extends AsyncTaskLoader<Workflow> {
                         String started = jsonObject.getString("start_time");
                         String ended = jsonObject.getString("finish_time");
                         String state = jsonObject.getString("state");
-
+/*
                         if(workflow_id == this.wid) {
                             Runs mrun = new Runs(name,started,ended,state);
                             mrun.setRun_id(id);
@@ -149,6 +167,7 @@ public class DetailsLoader extends AsyncTaskLoader<Workflow> {
 
                             workflow.addWorkflowRun(mrun);
                         }
+                        */
                     }
 
                 }
@@ -162,8 +181,11 @@ public class DetailsLoader extends AsyncTaskLoader<Workflow> {
                 }
                     return workflow;
                 default:
+                    dis.close();
+                    br.close();
                     return workflow;
             }
+
         } catch (MalformedURLException e) {
             e.printStackTrace();
         } catch (IOException e) {
@@ -175,12 +197,24 @@ public class DetailsLoader extends AsyncTaskLoader<Workflow> {
     }
 
     @Override
+    public boolean isStarted() {
+        return super.isStarted();
+    }
+
+    @Override
     protected void onStartLoading() {
-        if(workflow != null){
+      /*  if(workflow != null){
             deliverResult(workflow);
         }else{
             forceLoad();
-        }
+        }*/
+        forceLoad();
+        Log.i("Loading State","loading started");
+    }
+
+    @Override
+    protected void onStopLoading() {
+        Log.i("Loading State","loading stopped");
     }
 
     @Override
@@ -190,3 +224,17 @@ public class DetailsLoader extends AsyncTaskLoader<Workflow> {
         }
     }
 }
+/**
+ * JSONObject js = new JSONObject(sb.toString());
+ Log.i("JSON ", js.toString(2));
+ String created_at = js.getString("created_at");
+ String updated_at = js.getString("updated_at");
+ JSONObject user = js.getJSONObject("user");
+ workflow = new Workflow(this.context, js.getString("title"),
+ user.getString("name"),
+ js.getString("description"),
+ js.getInt("id"),
+ js.getString("url"));
+ workflow.setWorkflow_datecreated(created_at);
+ workflow.setWorkflow_datemodified(updated_at);
+ **/
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowLoader.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowLoader.java b/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowLoader.java
index 3eb272f..e08de2a 100644
--- a/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowLoader.java
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/WorkflowLoader.java
@@ -26,7 +26,6 @@ package org.apache.taverna.mobile.utils;
 import android.content.Context;
 import android.os.AsyncTask;
 import android.support.v4.widget.SwipeRefreshLayout;
-import android.support.v7.widget.RecyclerView;
 import android.util.Log;
 
 import com.thebuzzmedia.sjxp.rule.IRule;
@@ -184,6 +183,6 @@ public class WorkflowLoader extends AsyncTask<Object, Object, Object>{ //Workflo
     @Override
     protected void onPostExecute(Object o) {
         refreshLayout.setRefreshing(false);
-        System.out.println("Workflow Count: "+this.userWorkflows.size());
+//        System.out.println("Workflow Count: "+this.userWorkflows.size());
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParser.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParser.java b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParser.java
index 69791d5..46250eb 100644
--- a/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParser.java
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/MyExperimentXmlParser.java
@@ -24,11 +24,17 @@ package org.apache.taverna.mobile.utils.xmlparsers;
  * under the License.
  */
 
+import android.annotation.TargetApi;
+import android.os.Build;
+import android.text.Html;
+
 import com.thebuzzmedia.sjxp.XMLParser;
 import com.thebuzzmedia.sjxp.rule.DefaultRule;
 
+import org.apache.taverna.mobile.tavernamobile.User;
 import org.apache.taverna.mobile.tavernamobile.Workflow;
 import org.apache.taverna.mobile.utils.WorkflowLoader;
+import org.simpleframework.xml.Default;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -38,51 +44,217 @@ import java.util.List;
  */
 public class MyExperimentXmlParser {
 
+    public static Workflow mWorkflow = new Workflow();
+
+    public MyExperimentXmlParser(){
+    }
+
+    public Workflow getWorkflowHere(){
+        return mWorkflow;
+    }
     //parse a single workflow from myexperiment
-    public static final class WorkflowItemRule extends DefaultRule{
-
-        /**
-         * Create a new rule with the given values.
-         *
-         * @param type           The type of the rule.
-         * @param locationPath   The location path of the element to target in the XML.
-         * @param attributeNames An optional list of attribute names to parse values for if the
-         *                       type of this rule is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#ATTRIBUTE}.
-         * @throws IllegalArgumentException if <code>type</code> is <code>null</code>, if
-         *                                            <code>locationPath</code> is <code>null</code> or empty, if
-         *                                            <code>type</code> is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#ATTRIBUTE} and
-         *                                            <code>attributeNames</code> is <code>null</code> or empty or
-         *                                            if <code>type</code> is {@link com.thebuzzmedia.sjxp.rule.IRule.Type#CHARACTER} and
-         *                                            <code>attributeNames</code> <strong>is not</strong>
-         *                                            <code>null</code> or empty.
-         */
-        public WorkflowItemRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
-            super(Type.CHARACTER, "http://www.myexperiment.org/workflows.xml", "workflow");
-        }
-
-        /**
-         * Default no-op implementation. Please override with your own logic.
-         *
-         * @param parser
-         * @param index
-         * @param value
-         * @param userObject
-         * @see com.thebuzzmedia.sjxp.rule.IRule#handleParsedAttribute(com.thebuzzmedia.sjxp.XMLParser, int, String, Object)
-         */
+    public static class WorkflowDetailRule extends DefaultRule{
+
+        public WorkflowDetailRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+        }
+
         @Override
         public void handleParsedAttribute(XMLParser parser, int index, String value, Object userObject) {
             switch(index){
+                case 0: //uri
+                mWorkflow.setWorkflow_details_url(value);
+                    ((Workflow)userObject).setWorkflow_details_url(value);
+                    break;
+                case 1: //resource
+                    mWorkflow.setWorkflow_web_url(value);
+                    ((Workflow)userObject).setWorkflow_web_url(value);
+                    break;
+                case 2: //id
+                    mWorkflow.setId(Integer.parseInt(value));
+                    ((Workflow)userObject).setId(Integer.parseInt(value));
+                    break;
+                case 3://version
+                    mWorkflow.setWorkflow_versions(value);
+                    ((Workflow)userObject).setWorkflow_versions(value);
+                    break;
+            }
+        }
+    }
+
+    public static class TitleRule extends DefaultRule{
+
+        public TitleRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+        }
+
+        @Override
+        public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
+            mWorkflow.setWorkflow_title(text);
+            ((Workflow)userObject).setWorkflow_title(text);
+        }
+    }
+
+    public static class DescriptionRule extends DefaultRule{
+
+        public DescriptionRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+        }
+
+        @Override
+        public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
+
+            mWorkflow.setWorkflow_description(String.valueOf(Html.fromHtml(text)));
+            ((Workflow)userObject).setWorkflow_description(String.valueOf(Html.fromHtml(text)));
+        }
+    }
+
+    public static class TypeRule extends DefaultRule{
+
+        public TypeRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+        }
+
+        @Override
+        public void handleParsedAttribute(XMLParser parser, int index, String value, Object userObject) {
+            switch (index){
                 case 0:
                     break;
                 case 1:
                     break;
                 case 2:
                     break;
-                case 3:
-                    break;
 
             }
         }
+
+        @Override
+        public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
+            mWorkflow.setWorkflow_Type(text);
+            ((Workflow)userObject).setWorkflow_Type(text);
+        }
+    }
+
+    public static class UploaderRule extends DefaultRule{
+
+        User muser;
+        public UploaderRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+            muser = new User();
+        }
+
+        @Override
+        public void handleParsedAttribute(XMLParser parser, int index, String value, Object userObject) {
+            switch(index){
+                case 0:
+                    muser.setWebsite(value);
+                    break;
+                case 1:
+                    muser.setDetails_uri(value);
+                    break;
+                case 2:
+                    muser.setId(value);
+                    break;
+            }
+        }
+
+        @Override
+        public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
+           muser.setName(text);
+           mWorkflow.setUploader(muser);
+            ((Workflow)userObject).setUploader(muser);
+        }
+    }
+//rule for the date the workflow was created/uploaded
+    public static class DateRule extends DefaultRule{
+
+        public DateRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+        }
+
+    @Override
+    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
+        mWorkflow.setWorkflow_datecreated(text);
+        ((Workflow)userObject).setWorkflow_datecreated(text);
+
+    }
+}
+
+    public static class PreviewRule extends DefaultRule{
+
+        public PreviewRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+        }
+
+        @Override
+        public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
+            mWorkflow.setWorkflow_preview(text);
+            ((Workflow)userObject).setWorkflow_preview(text);
+        }
+    }
+
+    public static class LicenceTypeRule extends DefaultRule{
+
+        public LicenceTypeRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+        }
+
+        @Override
+        public void handleParsedAttribute(XMLParser parser, int index, String value, Object userObject) {
+            super.handleParsedAttribute(parser, index, value, userObject);
+        }
+
+        @Override
+        public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
+            mWorkflow.setWorkflow_licence_type("Licence By "+text);
+            ((Workflow)userObject).setWorkflow_licence_type("Licence By "+text);
+        }
+    }
+//set download link for the workflow
+    public static class ContentUriRule extends DefaultRule{
+
+        public ContentUriRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+        }
+
+        @Override
+        public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
+            mWorkflow.setWorkflow_remote_url(text);
+            ((Workflow)userObject).setWorkflow_remote_url(text);
+        }
+    }
+
+    public static class ContentTypeRule extends DefaultRule{
+
+        public ContentTypeRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+        }
+
+        @Override
+        public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
+            mWorkflow.setWorkflow_content_type(text);
+            ((Workflow)userObject).setWorkflow_content_type(text);
+        }
+    }
+
+    public static class TagsRule extends DefaultRule{
+
+        public TagsRule(Type type, String locationPath, String... attributeNames) throws IllegalArgumentException {
+            super(type, locationPath, attributeNames);
+        }
+
+        @Override
+        public void handleParsedAttribute(XMLParser parser, int index, String value, Object userObject) {
+            super.handleParsedAttribute(parser, index, value, userObject);
+            System.out.println(value);
+        }
+
+        @Override
+        public void handleParsedCharacters(XMLParser parser, String text, Object userObject) {
+            mWorkflow.setWorkflow_tags(new ArrayList<String>(){});
+            ((Workflow)userObject).setWorkflow_tags(new ArrayList<String>(){});
+            System.out.println(text);
+        }
     }
 
     /**
@@ -132,6 +304,7 @@ public class MyExperimentXmlParser {
         public void handleParsedCharacters(XMLParser parser, String text, Object workflowListObject) {
             //add the  workflow to the workflow list
             this.workflow = new Workflow("", desc, id, url);
+            this.workflow.setWorkflow_details_url(uri);
             this.workflow.setWorkflow_title(text);
             this.workflow.setWorkflow_author("");
             wlist.add(this.workflow);

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowDetailParser.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowDetailParser.java b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowDetailParser.java
index 08a482e..964c6af 100644
--- a/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowDetailParser.java
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowDetailParser.java
@@ -1,7 +1,50 @@
 package org.apache.taverna.mobile.utils.xmlparsers;
 
+import com.thebuzzmedia.sjxp.XMLParser;
+import com.thebuzzmedia.sjxp.XMLParserException;
+import com.thebuzzmedia.sjxp.rule.IRule;
+
+import org.apache.taverna.mobile.fragments.workflowdetails.WorkflowdetailFragment;
+import org.apache.taverna.mobile.tavernamobile.Workflow;
+
 /**
- * Created by root on 6/24/15.
+ * Apache Taverna Mobile
+ * Copyright 2015 The Apache Software Foundation
+
+ * This product includes software developed at
+ * The Apache Software Foundation (http://www.apache.org/).
+
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
  */
-public class WorkflowDetailParser {
+
+/**
+ * Parse details from the xml output of myexperiment API
+ * Created by Larry Akah on 6/24/15.
+ */
+public class WorkflowDetailParser extends XMLParser {
+
+    public WorkflowDetailParser(IRule[] rules) throws IllegalArgumentException, XMLParserException {
+        super(rules);
+    }
+
+    //deliver results when parsing has completed and all the information required has been retrieved
+    @Override
+    protected void doEndDocument(Object userObject) {
+        WorkflowdetailFragment.setWorkflowDetails((Workflow) userObject);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowParser.java
----------------------------------------------------------------------
diff --git a/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowParser.java b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowParser.java
index f349805..a50bc41 100644
--- a/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowParser.java
+++ b/app/src/main/java/org/apache/taverna/mobile/utils/xmlparsers/WorkflowParser.java
@@ -15,7 +15,7 @@ import java.util.List;
  * Created by Larry Akah on 6/24/15.
  */
 
-public class WorkflowParser extends XMLParser implements WorkflowDataCallback {
+public class WorkflowParser extends XMLParser {
 
     public WorkflowParser(IRule[] rules) throws IllegalArgumentException, XMLParserException {
         super(rules);
@@ -25,11 +25,4 @@ public class WorkflowParser extends XMLParser implements WorkflowDataCallback {
     protected void doEndDocument(Object userObject) {
         WorkflowItemFragment.updateWorkflowUI((List<Workflow>) userObject);
     }
-
-    @Override
-    public void onWorkflowDataReady(List<Workflow> data) {
-        for(Workflow w:data){
-            System.out.println(w.getId());
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/res/layout/fragment_item_grid.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/fragment_item_grid.xml b/app/src/main/res/layout/fragment_item_grid.xml
index 31600d2..ba85aa9 100644
--- a/app/src/main/res/layout/fragment_item_grid.xml
+++ b/app/src/main/res/layout/fragment_item_grid.xml
@@ -33,6 +33,9 @@ limitations under the License.
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:background="@color/button_material_light"
+            android:scrollbars="vertical"
+            android:scrollbarStyle="insideOverlay"
+            android:fadeScrollbars="true"
             ></android.support.v7.widget.RecyclerView>
        <!-- </GridView>-->
 </android.support.v4.widget.SwipeRefreshLayout>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/res/layout/fragment_item_list.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/fragment_item_list.xml b/app/src/main/res/layout/fragment_item_list.xml
index 19aa79e..92e0ff1 100644
--- a/app/src/main/res/layout/fragment_item_list.xml
+++ b/app/src/main/res/layout/fragment_item_list.xml
@@ -38,6 +38,9 @@ limitations under the License.
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:background="@color/button_material_light"
+        android:scrollbars="vertical"
+        android:scrollbarStyle="insideOverlay"
+        android:fadeScrollbars="true"
         >
 
     </android.support.v7.widget.RecyclerView>

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/res/layout/fragment_workflow_about.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/fragment_workflow_about.xml b/app/src/main/res/layout/fragment_workflow_about.xml
index 865241f..fb78aed 100644
--- a/app/src/main/res/layout/fragment_workflow_about.xml
+++ b/app/src/main/res/layout/fragment_workflow_about.xml
@@ -20,7 +20,8 @@ limitations under the License.
 <FrameLayout 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"
-    tools:context="org.apache.taverna.mobile.fragments.workflowdetails.WorkflowAboutFragment">
+    tools:context="org.apache.taverna.mobile.fragments.workflowdetails.WorkflowAboutFragment"
+    android:background="@color/button_material_light">
 
     <TextView android:layout_width="match_parent"
         android:layout_height="match_parent"

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/res/layout/fragment_workflow_detail.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/fragment_workflow_detail.xml b/app/src/main/res/layout/fragment_workflow_detail.xml
index 55aa533..946e5ed 100644
--- a/app/src/main/res/layout/fragment_workflow_detail.xml
+++ b/app/src/main/res/layout/fragment_workflow_detail.xml
@@ -23,7 +23,8 @@ limitations under the License.
     android:layout_height="match_parent"
     tools:context="org.apache.taverna.mobile.activities.WorkflowDetailActivity$PlaceholderFragment"
     android:orientation="vertical"
-    android:padding="5dp">
+    android:padding="5dp"
+    android:background="@color/button_material_light">
 
     <TextView android:id="@+id/wkf_author"
         android:layout_width="match_parent"
@@ -74,7 +75,8 @@ limitations under the License.
                 android:textAppearance="?android:attr/textAppearanceLarge"
                 android:id="@+id/wdescription"
                 android:layout_marginTop="5dp"
-                android:minLines="3" />
+                android:minLines="3"
+                android:hint="@string/description" />
 
             <ImageView
                 android:layout_width="match_parent"

http://git-wip-us.apache.org/repos/asf/incubator-taverna-mobile/blob/fcb08e4d/app/src/main/res/layout/fragment_workflow_licence.xml
----------------------------------------------------------------------
diff --git a/app/src/main/res/layout/fragment_workflow_licence.xml b/app/src/main/res/layout/fragment_workflow_licence.xml
index 05f408b..9b15538 100644
--- a/app/src/main/res/layout/fragment_workflow_licence.xml
+++ b/app/src/main/res/layout/fragment_workflow_licence.xml
@@ -20,7 +20,8 @@ limitations under the License.
 <FrameLayout 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"
-    tools:context="org.apache.taverna.mobile.fragments.workflowdetails.WorkflowLicenceFragment">
+    tools:context="org.apache.taverna.mobile.fragments.workflowdetails.WorkflowLicenceFragment"
+    android:background="@color/button_material_light">
 
     <!-- TODO: Update blank fragment layout -->
     <TextView android:layout_width="match_parent"