ARIA java binding initial

Change-Id: I806c879f7eddadec396adbb72f3fc2117dccbeb5
Issue-id: SO-77
Signed-off-by: DeWayne Filppi <dewayne@gigaspaces.com>
diff --git a/aria/aria-rest-java-client/pom.xml b/aria/aria-rest-java-client/pom.xml
new file mode 100755
index 0000000..12019f0
--- /dev/null
+++ b/aria/aria-rest-java-client/pom.xml
@@ -0,0 +1,43 @@
+<!--
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END====================================================
+*/
+-->
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>aria-client</groupId>
+    <artifactId>aria-client</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.glassfish.jersey.core</groupId>
+            <artifactId>jersey-client</artifactId>
+            <version>2.26-b03</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-json-jackson1</artifactId>
+            <version>2.26-b03</version>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaClient.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaClient.java
new file mode 100755
index 0000000..d6e9f24
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaClient.java
@@ -0,0 +1,201 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+import com.gigaspaces.aria.rest.client.exceptions.StorageException;

+import com.gigaspaces.aria.rest.client.exceptions.ValidationException;

+

+import java.util.List;

+import java.util.Map;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public interface AriaClient {

+

+    /**

+     * Installs a service template

+     *

+     * @param template

+     * @throws ValidationException

+     * @throws StorageException

+     */

+    public void install_service_template(ServiceTemplate template)throws ValidationException, StorageException, Exception;

+

+    /**

+     * Validate a service template

+     * @param template

+     * @return

+     */

+    public ValidationResult validate_service_template(ServiceTemplate template)throws Exception;

+

+    /**

+     * Fetch a list of stored service templates

+     *

+     * @return

+     */

+    public List<? extends ServiceTemplate> list_service_templates();

+

+    /**

+     * Delete an existing template

+     *

+     * @param template_id

+     * @throws IllegalArgumentException

+     */

+    public void delete_service_template(int template_id) throws IllegalArgumentException, Exception;

+

+    /**

+     * Returns a list of node templates for a given service template

+     * @param template_id

+     * @return

+     */

+    List<? extends NodeTemplate> list_nodes(int template_id);

+

+    /**

+     * Fetch a given node template

+     *

+     * @param node_id

+     * @return

+     * @throws IllegalArgumentException

+     */

+    public NodeTemplate get_node( int node_id) throws IllegalArgumentException;

+

+    /**

+     * List all services

+     *

+     * @return

+     */

+    public List<? extends Service> list_services();

+

+    /**

+     * Fetch the specified service

+     *

+     * @param service_id

+     * @return

+     * @throws IllegalArgumentException

+     */

+    public Service get_service(int service_id) throws IllegalArgumentException;

+

+    /**

+     * Fetch the outputs of the specified service

+     *

+     * @param service_id

+     * @return

+     * @throws IllegalArgumentException

+     */

+    public List<? extends Output> list_service_outputs(int service_id) throws IllegalArgumentException;

+

+    /**

+     * Fetch the inputs of the specified service

+     *

+     * @param service_id

+     * @return

+     * @throws IllegalArgumentException

+     */

+    public List<? extends Input> list_service_inputs(int service_id) throws IllegalArgumentException;

+

+    /**

+     * Create a service

+     *

+     * @param template_id

+     * @param service_name

+     * @param inputs

+     * @throws Exception

+     */

+    public void create_service(int template_id, String service_name, List<Input> inputs)throws Exception;

+

+    /**

+     * Delete the specified service

+     *

+     * @param service_id

+     * @throws IllegalArgumentException

+     */

+    public void delete_service(int service_id)throws Exception;

+

+    /**

+     * List workflows for the provided service

+     *

+     * @param service_id

+     * @return

+     * @throws IllegalArgumentException

+     */

+    public List<? extends Workflow> list_workflows(int service_id)throws IllegalArgumentException;

+

+    /**

+     * Fetch the specified workflow

+     *

+     * @param workflow_id

+     * @return the requested Workflow

+     * @throws IllegalArgumentException when the workflow_id doesn't exist

+     */

+    public Workflow get_workflow(int workflow_id)throws IllegalArgumentException;

+

+    /**

+     * List all executions

+     *

+     * @return

+     * @throws Exception

+     */

+    public List<? extends Execution> list_executions()throws Exception;

+

+    /**

+     * List executions for provided service

+     *

+     * @param service_id

+     * @return

+     * @throws Exception

+     */

+    public List<? extends Execution> list_executions(int service_id)throws Exception;

+

+    /**

+     * Fetch the specified execution

+     *

+     * @param execution_id

+     * @return

+     * @throws IllegalArgumentException

+     */

+    public Execution get_execution(int execution_id)throws IllegalArgumentException;

+

+    /**

+     * Starts an execution

+     *

+     * @param service_id

+     * @param workflow_name

+     * @param details

+     * @return the execution id

+     * @throws Exception

+     */

+    public int start_execution(int service_id, String workflow_name, ExecutionDetails details)throws Exception;

+

+    /**

+     * Resumes an interrupted execution

+     *

+     * @param execution_id

+     * @param details

+     * @throws IllegalArgumentException

+     */

+    public void resume_execution(int execution_id, ExecutionDetails details)throws IllegalArgumentException;

+

+    /**

+     * Cancels the specified execution

+     *

+     * @param execution_id

+     * @throws IllegalArgumentException

+     */

+    public void cancel_execution(int execution_id)throws Exception;

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaClientFactory.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaClientFactory.java
new file mode 100755
index 0000000..a97384e
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaClientFactory.java
@@ -0,0 +1,31 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+

+package com.gigaspaces.aria.rest.client;

+

+import java.net.URL;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public class AriaClientFactory {

+

+    AriaClient createRestClient(String protocol, String address, int port, String version){

+        return new AriaRestClient(protocol, address, port, version);

+    }

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaRestClient.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaRestClient.java
new file mode 100755
index 0000000..a4e4533
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/AriaRestClient.java
@@ -0,0 +1,336 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+import com.gigaspaces.aria.rest.client.exceptions.StorageException;

+import com.gigaspaces.aria.rest.client.exceptions.ValidationException;

+import org.codehaus.jackson.JsonFactory;

+import org.codehaus.jackson.JsonNode;

+import org.codehaus.jackson.jaxrs.JacksonJsonProvider;

+import org.codehaus.jackson.map.ObjectMapper;

+import sun.reflect.generics.reflectiveObjects.NotImplementedException;

+

+import javax.ws.rs.client.Client;

+import javax.ws.rs.client.ClientBuilder;

+import javax.ws.rs.client.Entity;

+import javax.ws.rs.client.WebTarget;

+import javax.ws.rs.core.GenericType;

+import javax.ws.rs.core.MediaType;

+import javax.ws.rs.core.Response;

+import java.net.URI;

+import java.util.ArrayList;

+import java.util.List;

+

+import static javax.ws.rs.client.Entity.entity;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public class AriaRestClient implements AriaClient {

+    private Client client=null;

+    private WebTarget base_target=null;

+

+    /**

+     * Construct an Aria REST client

+     *

+     * @param protocol either http or https

+     * @param address the IP address or host name

+     * @param port the port of the service

+     * @param version the api version

+     */

+    public AriaRestClient(String protocol, String address, int port, String version){

+        this.client = ClientBuilder.newBuilder().register(JacksonJsonProvider.class).build();

+        base_target = client.target(protocol+"://"+address+":"+port+"/api/"+version);

+    }

+

+    /**

+     * Installs a service template

+     *

+     * @param template the template object

+     * @throws ValidationException

+     * @throws StorageException

+     */

+    public void install_service_template(ServiceTemplate template) throws ValidationException, StorageException, Exception {

+

+        Response response = base_target.path("templates/"+template.getName()).request(MediaType.APPLICATION_JSON).put(Entity.entity(

+                "{\"service-template-path\":\""+template.getURI().toString()+"\""+

+                        ",\"service-template-filename\":\""+template.getFilename()+"\"", MediaType.APPLICATION_JSON));

+

+        if(response.getStatus() == 500){

+            throw new StorageException(response.readEntity(String.class));

+        }

+        else if(response.getStatus() == 400){

+            throw new ValidationException(response.readEntity(String.class));

+        }

+        else if(response.getStatus()>199 && response.getStatus() <300){

+            return;

+        }

+        else{

+            throw new Exception("Error installing template: "+response.getStatus()+" "+ response.readEntity(String.class));

+        }

+    }

+

+    public ValidationResult validate_service_template(ServiceTemplate template)throws Exception{

+        Response response = base_target.path("templates").request(MediaType.APPLICATION_JSON).post(Entity.entity(

+                "{\"service-template-path\":\""+template.getURI().toString()+"\""+

+                ",\"service-template-filename\":\""+template.getFilename()+"\"}", MediaType.APPLICATION_JSON));

+

+        ValidationResultImpl result = new ValidationResultImpl();

+        if(response.getStatus() >= 200 && response.getStatus() < 300){

+            result.setFailed(false);

+        }

+        else if(response.getStatus()==400){

+            result.setFailed(true);

+        }

+        else{

+            throw new Exception("received error response '"+ response.getStatus()+"':"+response.readEntity(String.class));

+        }

+        return result;

+

+    }

+

+    /**

+     *

+     * @return a list of service templates

+     */

+    public List<? extends ServiceTemplate> list_service_templates(){

+        List<? extends ServiceTemplate> templates = base_target.path("templates").request(MediaType.APPLICATION_JSON).get(new GenericType<List<ServiceTemplateImpl>>(){});

+

+        return templates;

+    }

+

+

+    /**

+     * Deletes the specified template.

+     *

+     * TODO: Error handling is a little blunt. Need to describe failures better

+     *

+     * @param template_id the template id to delete

+     * @throws IllegalArgumentException thrown when the template can't be deleted

+     * @throws Exception other server side errors

+     */

+    public void delete_service_template(int template_id) throws IllegalArgumentException, Exception{

+        Response response = base_target.path("templates/"+template_id).request(MediaType.APPLICATION_JSON).delete();

+

+        if(response.getStatus()>=200 && response.getStatus()<300){

+            return;

+        }

+        else if(response.getStatus()==400){

+            throw new IllegalArgumentException("Error deleting template '"+template_id+"'");

+        }

+        else{

+            throw new Exception("Error processing request. Return code = "+response.getStatus());

+        }

+    }

+

+    /**

+     * List the node templates for a given template id

+     *

+     * @param template_id

+     * @return

+     */

+    public List<? extends NodeTemplate> list_nodes(int template_id) {

+        List<? extends NodeTemplate> nodes = base_target.path("templates/"+template_id+"/nodes").request(MediaType.APPLICATION_JSON).get(new GenericType<List<NodeTemplateImpl>>(){});

+        return nodes;

+    }

+

+    /**

+     * Get a specific node by id

+     *

+     * @param node_id the node id

+     * @return

+     * @throws IllegalArgumentException

+     */

+    public NodeTemplate get_node(int node_id) throws IllegalArgumentException {

+        NodeTemplate node = base_target.path("nodes/"+node_id).request(MediaType.APPLICATION_JSON).get(NodeTemplateImpl.class);

+        return node;

+    }

+

+    public List<? extends Service> list_services() {

+        List<? extends Service> services = base_target.path("services").request(MediaType.APPLICATION_JSON).get(new GenericType<List<ServiceImpl>>(){});

+        return services;

+    }

+

+    public Service get_service(int service_id) throws IllegalArgumentException {

+        throw new NotImplementedException();

+    }

+

+    public List<? extends Output> list_service_outputs(int service_id) throws IllegalArgumentException {

+        List<? extends Output> outputs = base_target.path("services").request(MediaType.APPLICATION_JSON).get(new GenericType<List<OutputImpl>>(){});

+        return outputs;

+    }

+

+    public List<? extends Input> list_service_inputs(int service_id) throws IllegalArgumentException {

+        List<? extends Input> inputs = base_target.path("services").request(MediaType.APPLICATION_JSON).get(new GenericType<List<InputImpl>>(){});

+        return inputs;

+    }

+

+    /**

+     * Create a service based on the supplied template

+     *

+     * @param template_id the template to create the service for

+     * @param service_name a name for the service

+     * @param inputs an optional list of inputs for the service (can be null)

+     * @throws Exception

+     */

+    public void create_service(int template_id, String service_name, List<Input> inputs) throws Exception {

+

+        String json="{"+inputsToJson(inputs)+"}";

+

+        Response response = base_target.path("templates/"+template_id+"/services/"+service_name).

+                request(MediaType.APPLICATION_JSON).post(

+                Entity.entity(json, MediaType.APPLICATION_JSON)

+        );

+

+        if( response.getStatus()< 200 || response.getStatus()>299){

+            throw new Exception("create service failed:"+response.getStatus()+" "+ response.readEntity(String.class));

+        }

+    }

+

+    public void delete_service(int service_id) throws Exception {

+        Response response = base_target.path("services/"+service_id).request(MediaType.APPLICATION_JSON).delete();

+        if(!responseOK(response)){

+            throw new Exception("delete service failed: "+response.getStatus()+" "+ response.readEntity(String.class));

+        }

+    }

+

+    /**

+     * List user workflows for supplied service

+     *

+     * @param service_id

+     * @return

+     * @throws IllegalArgumentException

+     */

+    public List<? extends Workflow> list_workflows(int service_id) throws IllegalArgumentException {

+        List<? extends Workflow> workflows = base_target.path("services/"+service_id+"/workflows").request(MediaType.APPLICATION_JSON).get(new GenericType<List<WorkflowImpl>>(){});

+        return workflows;

+    }

+

+    public Workflow get_workflow(int workflow_id) throws IllegalArgumentException {

+        throw new NotImplementedException();

+    }

+

+    /**

+     * List all executions

+     *

+     * @return

+     * @throws Exception

+     */

+    public List<? extends Execution> list_executions() throws Exception {

+        List<? extends Execution> executions = base_target.path("executions").request(MediaType.APPLICATION_JSON).get(new GenericType<List<ExecutionImpl>>(){});

+        return executions;

+    }

+

+    /**

+     * List executions for specified service

+     *

+     * @param service_id

+     * @return

+     * @throws Exception

+     */

+    public List<? extends Execution> list_executions(int service_id) throws Exception {

+        List<? extends Execution> executions = base_target.path("services/"+service_id+"/executions").request(MediaType.APPLICATION_JSON).get(new GenericType<List<ExecutionImpl>>(){});

+        return executions;

+    }

+

+    /**

+     * Get details about a specified execution

+     *

+     * @param execution_id

+     * @return

+     * @throws IllegalArgumentException

+     */

+    public Execution get_execution(int execution_id) throws IllegalArgumentException {

+        Execution execution = base_target.path("executions/"+execution_id).request(MediaType.APPLICATION_JSON).get(ExecutionImpl.class);

+        return execution;

+    }

+

+    /**

+     * Start an execution for the specified service

+     *

+     * @param service_id the service to run the execution for

+     * @param workflow_name the name of the workflow to execute

+     * @param details details controlling execution operation

+     * @return the execution id

+     * @throws Exception

+     */

+    public int start_execution(int service_id, String workflow_name, ExecutionDetails details) throws Exception {

+        StringBuilder json=new StringBuilder("{");

+        if(details.getExecutor().length()>0){

+            json.append("\"executor\":\"").append(details.getExecutor()).append("\",");

+        }

+        if(details.getInputs()!=null){

+            json.append(inputsToJson(details.getInputs()));

+        }

+        json.append("\"task_max_attempts\":").append(details.getTaskMaxAttempts()).append(",");

+        json.append("\"task_retry_interval\":").append(details.getTaskRetryInterval()).append("}");

+

+        System.out.println("JSON="+json.toString());

+

+        Response response = base_target.path("services/"+service_id+"/executions/"+workflow_name).request(MediaType.APPLICATION_JSON).

+                post(Entity.entity(json.toString(), MediaType.APPLICATION_JSON));

+

+        if(!responseOK(response)){

+            throw new Exception("start execution failed: "+response.getStatus()+" "+response.readEntity(String.class));

+        }

+

+        ObjectMapper mapper = new ObjectMapper(new JsonFactory());

+        JsonNode rootNode = mapper.readTree(response.readEntity(String.class));

+        int id=rootNode.get("id").asInt(-1);

+        return id;

+    }

+

+    public void resume_execution(int execution_id, ExecutionDetails details) throws IllegalArgumentException {

+        StringBuilder json=new StringBuilder("{");

+        if(details.getExecutor().length()>0){

+            json.append("\"executor\":\"").append(details.getExecutor()).append("\",");

+        }

+        json.append("\"retry_failed_tasks\":").append(details.isRetry_failed_tasks()).append("}");

+        Response response = base_target.path("executions/"+execution_id).request(MediaType.APPLICATION_JSON).

+                post(Entity.entity(json.toString(), MediaType.APPLICATION_JSON));

+    }

+

+    public void cancel_execution(int execution_id) throws Exception {

+        Response response = base_target.path("executions/"+execution_id).request(MediaType.APPLICATION_JSON).delete();

+        if(!responseOK(response)){

+            throw new Exception("delete service failed: "+response.getStatus()+" "+ response.readEntity(String.class));

+        }

+    }

+

+    /**

+     * -----

+     * ----- PRIVATE METHODS

+     * -----

+     */

+

+    private boolean responseOK(Response response){

+        return response.getStatus()>199 && response.getStatus()<300;

+    }

+

+    private String inputsToJson(List<Input> inputs){

+        if(inputs==null)return null;

+

+        StringBuilder sb=new StringBuilder("\"inputs\":{");

+        for(Input input:inputs){

+            sb.append("\"").append(input.getName()).append("\":\"").append(input.getValue()).append("\",");

+        }

+        if(inputs.size()>0)sb.deleteCharAt(sb.length()-1); //trim comma

+

+        return sb.toString();

+    }

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Execution.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Execution.java
new file mode 100755
index 0000000..ab74283
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Execution.java
@@ -0,0 +1,29 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public interface Execution {

+    int getExecutionId();

+    String getWorkflowName();

+    String getServiceTemplateName();

+    String getServiceName();

+    String getStatus();

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ExecutionDetails.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ExecutionDetails.java
new file mode 100755
index 0000000..e7685a2
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ExecutionDetails.java
@@ -0,0 +1,73 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+import java.util.List;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public class ExecutionDetails {

+    private String executor="";  //default

+    private int task_max_attempts=30;

+    private int task_retry_interval=30;

+    private List<Input> inputs=null;

+    private boolean retry_failed_tasks=false;

+

+    public ExecutionDetails(){}

+

+    public ExecutionDetails(String executor){

+        this.executor=executor;

+    }

+

+    public ExecutionDetails(String executor, int task_max_attempts, int task_retry_interval, boolean retry_failed_tasks,

+                            List<Input> inputs){

+        this.executor=executor;

+        this.task_max_attempts=task_max_attempts;

+        this.task_retry_interval=task_retry_interval;

+        this.retry_failed_tasks = retry_failed_tasks;

+        this.inputs=inputs;

+    }

+    public String getExecutor(){

+        return executor;

+    }

+    public void setExecutor(String executor){

+        this.executor=executor;

+    }

+    public int getTaskMaxAttempts(){

+        return task_max_attempts;

+    }

+    public void setTaskMaxAttempts(int max){

+        this.task_max_attempts=max;

+    }

+    public int getTaskRetryInterval(){

+        return task_retry_interval;

+    }

+    public void setTaskRetryInterval(int interval){

+        this.task_retry_interval=interval;

+    }

+    public List<Input> getInputs(){

+        return inputs;

+    }

+    public void setInputs(List<Input> inputs){

+        this.inputs=inputs;

+    }

+    public boolean isRetry_failed_tasks() {return retry_failed_tasks;}

+    public void setRetry_failed_tasks(boolean retry_failed_tasks) {this.retry_failed_tasks = retry_failed_tasks;}

+

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ExecutionImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ExecutionImpl.java
new file mode 100755
index 0000000..8e420cc
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ExecutionImpl.java
@@ -0,0 +1,54 @@
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END====================================================
+*/
+package com.gigaspaces.aria.rest.client;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * Created by DeWayne on 7/17/2017.
+ */
+public class ExecutionImpl implements Execution {
+    @JsonProperty("execution_id")
+    int execution_id;
+    @JsonProperty("workflow_name")
+    String workflow_name;
+    @JsonProperty("service_template_name")
+    String service_template_name;
+    @JsonProperty("service_name")
+    String service_name;
+    String status;
+
+    public int getExecutionId() {
+        return execution_id;
+    }
+    public String getWorkflowName() {
+        return workflow_name;
+    }
+
+    public String getServiceTemplateName() {
+        return service_template_name;
+    }
+
+    public String getServiceName() {
+        return service_name;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+}
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Input.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Input.java
new file mode 100755
index 0000000..595dfb1
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Input.java
@@ -0,0 +1,27 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public interface Input {

+    String getName();

+    String getDescription();

+    String getValue();

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/InputImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/InputImpl.java
new file mode 100755
index 0000000..3002b7b
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/InputImpl.java
@@ -0,0 +1,49 @@
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END====================================================
+*/
+package com.gigaspaces.aria.rest.client;
+
+/**
+ * Created by DeWayne on 7/17/2017.
+ */
+public class InputImpl implements Input {
+    private String name, description, value;
+
+    public InputImpl(){}
+
+    public InputImpl(String name,String value,String description){
+        if(name==null || value==null){
+            throw new IllegalArgumentException("null argument supplied");
+        }
+        this.name=name;
+        this.value=value;
+        if(description!=null)this.description=description;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+}
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/NodeTemplate.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/NodeTemplate.java
new file mode 100755
index 0000000..bc46d7f
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/NodeTemplate.java
@@ -0,0 +1,29 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public interface NodeTemplate {

+    int getId();

+    String getName();

+    String getDescription();

+    int getServiceTemplateId();

+    String getTypeName();

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/NodeTemplateImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/NodeTemplateImpl.java
new file mode 100755
index 0000000..43338c9
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/NodeTemplateImpl.java
@@ -0,0 +1,68 @@
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END====================================================
+*/
+package com.gigaspaces.aria.rest.client;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * Created by DeWayne on 7/18/2017.
+ */
+public class NodeTemplateImpl implements NodeTemplate {
+    private int id;
+    private String name;
+    private String description="";
+    @JsonProperty("service_template_id")
+    private int service_template_id;
+    @JsonProperty("type_name")
+    private String type_name="";
+
+    public NodeTemplateImpl(){}
+
+    public NodeTemplateImpl(int id, String name, String description, int service_template_id, String type_name){
+        this.id=id;
+        this.description=description;
+        this.service_template_id=service_template_id;
+        this.type_name=type_name;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public int getServiceTemplateId() {
+        return service_template_id;
+    }
+
+    public String getTypeName() {
+        return type_name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+
+}
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Output.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Output.java
new file mode 100755
index 0000000..83363ba
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Output.java
@@ -0,0 +1,27 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public interface Output {

+    String getName();

+    String getDescription();

+    String getValue();

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/OutputImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/OutputImpl.java
new file mode 100755
index 0000000..0a6cecc
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/OutputImpl.java
@@ -0,0 +1,37 @@
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END====================================================
+*/
+package com.gigaspaces.aria.rest.client;
+
+/**
+ * Created by DeWayne on 7/17/2017.
+ */
+public class OutputImpl implements Output {
+    private String name, description, value;
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public String getValue() {
+        return value;
+    }
+}
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Service.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Service.java
new file mode 100755
index 0000000..9cf86ec
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Service.java
@@ -0,0 +1,32 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+import java.util.Date;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public interface Service {

+    int getId();

+    String getDescription();

+    String getName();

+    String getServiceTemplate();

+    Date getCreated();

+    Date getUpdated();

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplate.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplate.java
new file mode 100755
index 0000000..0df6d60
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplate.java
@@ -0,0 +1,31 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+import java.net.URI;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public interface ServiceTemplate {

+    String getName();

+    URI getURI();

+    int getId();

+    String getFilename();

+    String getDescription();

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplateImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplateImpl.java
new file mode 100755
index 0000000..9e158a2
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ServiceTemplateImpl.java
@@ -0,0 +1,81 @@
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END====================================================
+*/
+package com.gigaspaces.aria.rest.client;
+
+import java.net.URI;
+
+/**
+ * CSAR based implementation
+ *
+ * Created by DeWayne on 7/17/2017.
+ */
+public class ServiceTemplateImpl implements ServiceTemplate {
+    public static final String DEFAULT_TEMPLATE_NAME = "service-template.yaml";
+    private String name;
+    private int id;
+    private URI uri;
+    private String filename = DEFAULT_TEMPLATE_NAME;
+    private String description;
+
+    public ServiceTemplateImpl(){}
+
+    public ServiceTemplateImpl(String name, URI uri){
+        this.name=name;
+        this.uri=uri;
+    }
+
+    /**
+     * Construct an instance
+     * @param name a textual name for the template
+     * @param uri a URI to a CSAR
+     * @param filename the filename in the CSAR representing main yaml template
+     */
+    public ServiceTemplateImpl(String name, URI uri, String filename, String description){
+        this.name=name;
+        this.uri=uri;
+        this.filename=filename;
+        this.description=description;
+    }
+
+    public int getId(){
+        return id;
+    }
+    public void setId(int id){
+        this.id=id;
+    }
+    public String getName() {
+        return name;
+    }
+    public void setName(String name){
+        this.name=name;
+    }
+    public URI getURI() {
+        return uri;
+    }
+    public void setPath(String path){
+        this.uri=uri;
+    }
+    public String getFilename() {
+        return filename;
+    }
+    public void setFilename(String filename){
+        this.filename=filename;
+    }
+
+    public String getDescription(){ return description;}
+}
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ValidationResult.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ValidationResult.java
new file mode 100755
index 0000000..3d40dfa
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ValidationResult.java
@@ -0,0 +1,26 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public interface ValidationResult {

+

+    boolean getFailed();

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ValidationResultImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ValidationResultImpl.java
new file mode 100755
index 0000000..22e34eb
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/ValidationResultImpl.java
@@ -0,0 +1,32 @@
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END====================================================
+*/
+package com.gigaspaces.aria.rest.client;
+
+/**
+ * Created by DeWayne on 7/17/2017.
+ */
+public class ValidationResultImpl implements ValidationResult {
+    private boolean failed=false;
+
+    public void setFailed(boolean failed){
+        this.failed=failed;
+    }
+    public boolean getFailed() {
+        return failed;
+    }
+}
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Workflow.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Workflow.java
new file mode 100755
index 0000000..7dbab18
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/Workflow.java
@@ -0,0 +1,25 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public interface Workflow {

+    String getName();

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/WorkflowImpl.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/WorkflowImpl.java
new file mode 100755
index 0000000..41105df
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/WorkflowImpl.java
@@ -0,0 +1,29 @@
+/*
+ * ============LICENSE_START===================================================
+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.
+ * ===================================================================
+ * Licensed 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.
+ * ============LICENSE_END====================================================
+*/
+package com.gigaspaces.aria.rest.client;
+
+/**
+ * Created by DeWayne on 7/17/2017.
+ */
+public class WorkflowImpl implements Workflow{
+    String name;
+
+    public String getName() {
+        return name;
+    }
+}
diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/exceptions/StorageException.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/exceptions/StorageException.java
new file mode 100755
index 0000000..50ff38d
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/exceptions/StorageException.java
@@ -0,0 +1,27 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client.exceptions;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public class StorageException extends Exception {

+    public StorageException(String message){

+        super(message);

+    }

+}

diff --git a/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/exceptions/ValidationException.java b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/exceptions/ValidationException.java
new file mode 100755
index 0000000..cbcee31
--- /dev/null
+++ b/aria/aria-rest-java-client/src/main/java/com/gigaspaces/aria/rest/client/exceptions/ValidationException.java
@@ -0,0 +1,27 @@
+/*

+ * ============LICENSE_START===================================================

+ * Copyright (c) 2017 Cloudify.co.  All rights reserved.

+ * ===================================================================

+ * Licensed 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.

+ * ============LICENSE_END====================================================

+*/

+package com.gigaspaces.aria.rest.client.exceptions;

+

+/**

+ * Created by DeWayne on 7/12/2017.

+ */

+public class ValidationException extends Exception {

+    public ValidationException(String message){

+        super(message);

+    }

+}