You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sa...@apache.org on 2015/01/22 15:52:18 UTC
[5/9] airavata git commit: Revert "removing previous airavata client
API - AIRAVATA-1371"
http://git-wip-us.apache.org/repos/asf/airavata/blob/2654424b/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowManagerImpl.java
----------------------------------------------------------------------
diff --git a/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowManagerImpl.java b/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowManagerImpl.java
new file mode 100644
index 0000000..4596e42
--- /dev/null
+++ b/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowManagerImpl.java
@@ -0,0 +1,535 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+package org.apache.airavata.client.impl;
+
+import org.apache.airavata.client.AiravataClient;
+import org.apache.airavata.client.api.WorkflowManager;
+import org.apache.airavata.client.api.exception.AiravataAPIInvocationException;
+import org.apache.airavata.client.api.exception.WorkflowAlreadyExistsException;
+import org.apache.airavata.common.utils.XMLUtil;
+import org.apache.airavata.workflow.model.wf.Workflow;
+import org.apache.airavata.workflow.model.wf.WorkflowData;
+import org.apache.airavata.workflow.model.wf.WorkflowInput;
+
+import java.net.URI;
+import java.util.List;
+import java.util.Map;
+
+public class WorkflowManagerImpl implements WorkflowManager {
+ private AiravataClient client;
+
+ public WorkflowManagerImpl(AiravataClient client) {
+ setClient(client);
+ }
+
+ public AiravataClient getClient() {
+ return client;
+ }
+
+ public void setClient(AiravataClient client) {
+ this.client = client;
+ }
+
+ @Override
+ public boolean saveWorkflow(String workflowAsString, String owner)
+ throws AiravataAPIInvocationException {
+ return saveWorkflow(getWorkflowFromString(workflowAsString), workflowAsString, owner);
+ }
+
+ @Override
+ public void addOwnerWorkflow (String workflowAsString, String owner)
+ throws AiravataAPIInvocationException, WorkflowAlreadyExistsException {
+ addWorkflow(getWorkflowFromString(workflowAsString), workflowAsString, owner);
+ }
+
+ @Override
+ public void updateOwnerWorkflow (String workflowAsString, String owner)
+ throws AiravataAPIInvocationException {
+ updateWorkflow(getWorkflowFromString(workflowAsString), workflowAsString, owner);
+ }
+
+ @Override
+ public void addOwnerWorkflow (URI workflowPath, String owner)
+ throws AiravataAPIInvocationException, WorkflowAlreadyExistsException {
+ Workflow workflow = getWorkflowFromURI(workflowPath);
+ addWorkflow(workflow, XMLUtil.xmlElementToString(workflow.toXML()), owner);
+ }
+
+ @Override
+ public void updateOwnerWorkflow (URI workflowPath, String owner)
+ throws AiravataAPIInvocationException {
+ Workflow workflow = getWorkflowFromURI(workflowPath);
+ updateWorkflow(workflow, XMLUtil.xmlElementToString(workflow.toXML()), owner);
+ }
+
+ @Override
+ public boolean saveWorkflow(Workflow workflow, String owner)
+ throws AiravataAPIInvocationException {
+ return saveWorkflow(workflow, XMLUtil.xmlElementToString(workflow.toXML()), owner);
+ }
+
+ @Override
+ public void addOwnerWorkflow (Workflow workflow, String owner) throws WorkflowAlreadyExistsException,
+ AiravataAPIInvocationException{
+ addWorkflow(workflow, XMLUtil.xmlElementToString(workflow.toXML()), owner);
+ }
+
+ @Override
+ public void updateOwnerWorkflow (Workflow workflow, String owner) throws AiravataAPIInvocationException {
+ updateWorkflow(workflow, XMLUtil.xmlElementToString(workflow.toXML()), owner);
+ }
+
+ private void addWorkflow(Workflow workflow, String workflowAsString, String owner)
+ throws WorkflowAlreadyExistsException, AiravataAPIInvocationException {
+// try {
+// getClient().getRegistryClient().addWorkflow(workflow.getName(), workflowAsString);
+// } catch (UserWorkflowAlreadyExistsException e) {
+// throw new WorkflowAlreadyExistsException("Workflow " +
+// workflow.getName()
+// + " already exists in the system.", e);
+// } catch (RegException e) {
+// throw new AiravataAPIInvocationException("An internal error occurred while adding workflow " +
+// workflow.getName(), e);
+// } catch (AiravataConfigurationException e) {
+// throw new AiravataAPIInvocationException("Error retrieving registry client for workflow " +
+// workflow.getName(), e);
+// }
+
+// if (owner == null) {
+// try {
+// getClient().getRegistryClient().publishWorkflow(workflow.getName());
+// } catch (RegException e) {
+// throw new AiravataAPIInvocationException("An internal error occurred while adding workflow " +
+// workflow.getName(), e);
+// } catch (AiravataConfigurationException e) {
+// throw new AiravataAPIInvocationException("Error retrieving registry client for workflow " +
+// workflow.getName(), e);
+// }
+// }
+ }
+
+ private void updateWorkflow(Workflow workflow, String workflowAsString, String owner)
+ throws AiravataAPIInvocationException {
+// try {
+// getClient().getRegistryClient().updateWorkflow(workflow.getName(), workflowAsString);
+// } catch (RegException e) {
+// throw new AiravataAPIInvocationException("An internal error occurred while adding workflow " +
+// workflow.getName(), e);
+// } catch (AiravataConfigurationException e) {
+// throw new AiravataAPIInvocationException("Error retrieving registry client for workflow " +
+// workflow.getName(), e);
+// }
+//
+// if (owner == null) {
+// try {
+// getClient().getRegistryClient().publishWorkflow(workflow.getName());
+// } catch (RegException e) {
+// throw new AiravataAPIInvocationException("An internal error occurred while adding workflow " +
+// workflow.getName(), e);
+// } catch (AiravataConfigurationException e) {
+// throw new AiravataAPIInvocationException("Error retrieving registry client for workflow " +
+// workflow.getName(), e);
+// }
+// }
+ }
+
+ // Remove once deprecated methods are removed from the API
+ @Deprecated
+ private boolean saveWorkflow(Workflow workflow, String workflowAsString,String owner)
+ throws AiravataAPIInvocationException {
+// try {
+//
+// if (getClient().getRegistryClient().isWorkflowExists(workflow.getName())) {
+// getClient().getRegistryClient().updateWorkflow(workflow.getName(),workflowAsString);
+// }else{
+// getClient().getRegistryClient().addWorkflow(workflow.getName(),workflowAsString);
+// }
+// if (owner==null){
+// getClient().getRegistryClient().publishWorkflow(workflow.getName());
+// }
+// return true;
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return false;
+ }
+
+ @Override
+ public List<Workflow> getWorkflows(String owner)
+ throws AiravataAPIInvocationException {
+// try {
+// List<Workflow> workflows=new ArrayList<Workflow>();
+// Map<String, String> workflowMap = getClient().getRegistryClient().getWorkflows();
+// for(String workflowStr:workflowMap.values()){
+// workflows.add(getWorkflowFromString(workflowStr));
+// }
+// return workflows;
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return null;
+ }
+
+ @Override
+ public List<String> getWorkflowTemplateIds(String owner)
+ throws AiravataAPIInvocationException {
+// try {
+// List<String> workflowList = new ArrayList<String>();
+// Map<String, String> workflows;
+// workflows = getClient().getRegistryClient().getWorkflows();
+// for (String name : workflows.keySet()) {
+// workflowList.add(name);
+// }
+// return workflowList;
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return null;
+ }
+
+ @Override
+ public Workflow getWorkflow(String workflowName, String owner)
+ throws AiravataAPIInvocationException {
+ return getWorkflowFromString(getWorkflowAsString(workflowName, owner));
+ }
+
+ @Override
+ public String getWorkflowAsString(String workflowName, String owner)
+ throws AiravataAPIInvocationException {
+// try {
+// return getClient().getRegistryClient().getWorkflowGraphXML(workflowName);
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return null;
+ }
+
+ @Override
+ public boolean deleteWorkflow(String workflowName, String owner)
+ throws AiravataAPIInvocationException {
+// try {
+// getClient().getRegistryClient().removeWorkflow(workflowName);
+// return true;
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return false;
+ }
+
+ @Override
+ public boolean saveWorkflow(String workflowAsString)
+ throws AiravataAPIInvocationException {
+ return saveWorkflow(workflowAsString, getCurrentUser());
+ }
+
+ @Override
+ public void addWorkflow (String workflowAsString) throws WorkflowAlreadyExistsException,
+ AiravataAPIInvocationException {
+ addOwnerWorkflow(workflowAsString, getCurrentUser());
+ }
+
+ @Override
+ public void updateWorkflow (String workflowAsString) throws AiravataAPIInvocationException {
+ updateOwnerWorkflow(workflowAsString, getCurrentUser());
+ }
+
+ @Override
+ public boolean saveWorkflowAsPublic(String workflowAsString)
+ throws AiravataAPIInvocationException {
+ return saveWorkflow(workflowAsString, null);
+ }
+
+ @Override
+ public void addWorkflowAsPublic (String workflowAsString) throws AiravataAPIInvocationException,
+ WorkflowAlreadyExistsException {
+ addOwnerWorkflow (workflowAsString, null);
+ }
+
+ @Override
+ public void updateWorkflowAsPublic (String workflowAsString) throws AiravataAPIInvocationException {
+ updateOwnerWorkflow(workflowAsString, null);
+ }
+
+ @Override
+ public void addWorkflowAsPublic (URI workflowPath) throws AiravataAPIInvocationException,
+ WorkflowAlreadyExistsException {
+ addOwnerWorkflow (getWorkflowFromURI(workflowPath), null);
+ }
+
+ @Override
+ public void updateWorkflowAsPublic (URI workflowPath) throws AiravataAPIInvocationException {
+ updateOwnerWorkflow(getWorkflowFromURI(workflowPath), null);
+ }
+
+ @Override
+ public boolean saveWorkflow(Workflow workflow)
+ throws AiravataAPIInvocationException {
+ return saveWorkflow(workflow, getCurrentUser());
+ }
+
+ @Override
+ public void addWorkflow (Workflow workflow) throws WorkflowAlreadyExistsException,
+ AiravataAPIInvocationException{
+ addOwnerWorkflow(workflow, getCurrentUser());
+ }
+
+ @Override
+ public void updateWorkflow (Workflow workflow) throws AiravataAPIInvocationException {
+ updateOwnerWorkflow(workflow, getCurrentUser());
+ }
+
+ @Override
+ public void addWorkflow (URI workflowPath) throws AiravataAPIInvocationException,
+ WorkflowAlreadyExistsException {
+ addOwnerWorkflow(getWorkflowFromURI(workflowPath), getCurrentUser());
+ }
+
+ @Override
+ public void updateWorkflow (URI workflowPath) throws AiravataAPIInvocationException {
+ updateOwnerWorkflow(getWorkflowFromURI(workflowPath), getCurrentUser());
+ }
+
+ private String getCurrentUser() {
+ return getClient().getCurrentUser();
+ }
+
+ @Override
+ public boolean saveWorkflowAsPublic(Workflow workflow)
+ throws AiravataAPIInvocationException {
+ return saveWorkflow(workflow, null);
+ }
+
+ @Override
+ public List<Workflow> getWorkflows() throws AiravataAPIInvocationException {
+ return getWorkflows(getCurrentUser());
+ }
+
+ @Override
+ public List<String> getWorkflowTemplateIds()
+ throws AiravataAPIInvocationException {
+ return getWorkflowTemplateIds(getCurrentUser());
+ }
+
+ @Override
+ public Workflow getWorkflow(String workflowName)
+ throws AiravataAPIInvocationException {
+ return getWorkflow(workflowName, getCurrentUser());
+ }
+
+ @Override
+ public String getWorkflowAsString(String workflowName)
+ throws AiravataAPIInvocationException {
+ return getWorkflowAsString(workflowName, getCurrentUser());
+ }
+
+ @Override
+ public boolean deleteWorkflow(String workflowName)
+ throws AiravataAPIInvocationException {
+ return deleteWorkflow(workflowName, getCurrentUser());
+ }
+
+ @Override
+ public Workflow getWorkflowFromString(String workflowAsString)
+ throws AiravataAPIInvocationException {
+ try {
+ return new Workflow(workflowAsString);
+ } catch (Exception e) {
+ throw new AiravataAPIInvocationException(e);
+ }
+ }
+
+ @Override
+ public Workflow getWorkflowFromURI(URI workflowPath) throws AiravataAPIInvocationException {
+ try {
+ return new Workflow(workflowPath);
+ } catch (Exception e) {
+ throw new AiravataAPIInvocationException(e);
+ }
+ }
+
+ @Override
+ public String getWorkflowAsString(Workflow workflow)
+ throws AiravataAPIInvocationException {
+ return XMLUtil.xmlElementToString(workflow.toXML());
+ }
+
+ @Override
+ public List<String> getWorkflowServiceNodeIDs(String templateID) throws AiravataAPIInvocationException{
+ return getWorkflow(templateID).getWorkflowServiceNodeIDs();
+ }
+
+ @Override
+ public boolean isPublishedWorkflowExists(String workflowName)
+ throws AiravataAPIInvocationException {
+// try {
+// return getClient().getRegistryClient().isPublishedWorkflowExists(workflowName);
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return false;
+ }
+
+ @Override
+ public void publishWorkflow(String workflowName, String publishWorkflowName)
+ throws AiravataAPIInvocationException {
+// try {
+// getClient().getRegistryClient().publishWorkflow(workflowName, publishWorkflowName);
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ }
+
+ @Override
+ public void publishWorkflow(String workflowName)
+ throws AiravataAPIInvocationException {
+// try {
+// getClient().getRegistryClient().publishWorkflow(workflowName);
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ }
+
+ @Override
+ public String getPublishedWorkflowGraphXML(String workflowName)
+ throws AiravataAPIInvocationException {
+// try {
+// return getClient().getRegistryClient().getPublishedWorkflowGraphXML(workflowName);
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return null;
+ }
+
+ @Override
+ public Workflow getPublishedWorkflow(String workflowName)
+ throws AiravataAPIInvocationException {
+ return getWorkflowFromString(getPublishedWorkflowGraphXML(workflowName));
+ }
+
+ @Override
+ public List<String> getPublishedWorkflowNames()
+ throws AiravataAPIInvocationException {
+// try {
+// return getClient().getRegistryClient().getPublishedWorkflowNames();
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return null;
+ }
+
+ @Override
+ public Map<String, Workflow> getPublishedWorkflows()
+ throws AiravataAPIInvocationException {
+// try {
+// Map<String, Workflow> workflows=new HashMap<String, Workflow>();
+// Map<String, String> publishedWorkflows = getClient().getRegistryClient().getPublishedWorkflows();
+// for (String name : publishedWorkflows.keySet()) {
+// workflows.put(name, getWorkflowFromString(publishedWorkflows.get(name)));
+// }
+// return workflows;
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return null;
+ }
+
+ @Override
+ public void removePublishedWorkflow(String workflowName)
+ throws AiravataAPIInvocationException {
+// try {
+// getClient().getRegistryClient().removePublishedWorkflow(workflowName);
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ }
+
+ @Override
+ public List<WorkflowInput> getWorkflowInputs(String workflowName) throws AiravataAPIInvocationException {
+ try {
+ return getWorkflow(workflowName).getWorkflowInputs();
+ } catch (Exception e) {
+ throw new AiravataAPIInvocationException(e);
+ }
+ }
+
+ @Override
+ public List<WorkflowInput> getWorkflowInputs(WorkflowData workflowData) throws AiravataAPIInvocationException {
+// try {
+// if (workflowData.isPublished()){
+// return getWorkflowFromString(getClient().getRegistryClient().getPublishedWorkflowGraphXML(workflowData.getName())).getWorkflowInputs();
+// }else{
+// return getWorkflowInputs(workflowData.getName());
+// }
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return null;
+ }
+
+ @Override
+ public List<WorkflowData> getAllWorkflows() throws AiravataAPIInvocationException {
+// List<WorkflowData> list = new ArrayList<WorkflowData>();
+// List<String> workflowTemplateIds = getWorkflowTemplateIds();
+// try {
+// for (String id : workflowTemplateIds) {
+// list.add(new WorkflowData(id,null,false));
+// }
+// List<String> publishedWorkflowNames = getClient().getRegistryClient().getPublishedWorkflowNames();
+// for (String id : publishedWorkflowNames) {
+// list.add(new WorkflowData(id,null,false));
+// }
+// return list;
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return null;
+ }
+
+ @Override
+ public boolean isWorkflowExists(String workflowName) throws AiravataAPIInvocationException {
+// try {
+// return getClient().getRegistryClient().isWorkflowExists(workflowName);
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ return false;
+ }
+
+ @Override
+ public void updateWorkflow(String workflowName, String workflowGraphXml) throws AiravataAPIInvocationException {
+// try {
+// getClient().getRegistryClient().updateWorkflow(workflowName, workflowGraphXml);
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ }
+
+ @Override
+ public void removeWorkflow(String workflowName) throws AiravataAPIInvocationException {
+// try {
+// getClient().getRegistryClient().removeWorkflow(workflowName);
+// } catch (Exception e) {
+// throw new AiravataAPIInvocationException(e);
+// }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/airavata/blob/2654424b/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowOutputDataSettingsImpl.java
----------------------------------------------------------------------
diff --git a/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowOutputDataSettingsImpl.java b/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowOutputDataSettingsImpl.java
new file mode 100644
index 0000000..98e24ea
--- /dev/null
+++ b/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowOutputDataSettingsImpl.java
@@ -0,0 +1,78 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+package org.apache.airavata.client.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.airavata.client.api.OutputDataSettings;
+import org.apache.airavata.client.api.WorkflowOutputDataSettings;
+
+public class WorkflowOutputDataSettingsImpl implements
+ WorkflowOutputDataSettings {
+ private List<OutputDataSettings> outputDataSettingsList;
+
+ private List<OutputDataSettings> getOutputDataSettingsListArray(){
+ if (outputDataSettingsList==null){
+ outputDataSettingsList=new ArrayList<OutputDataSettings>();
+ }
+ return outputDataSettingsList;
+ }
+
+ @Override
+ public OutputDataSettings[] getOutputDataSettingsList() {
+ return getOutputDataSettingsListArray().toArray(new OutputDataSettings[]{});
+ }
+
+ @Override
+ public OutputDataSettings addNewOutputDataSettings(String nodeId,
+ String outputDataDirectory, String dataRegistryURL,
+ Boolean isDataPersistent) {
+ addNewOutputDataSettings(new ApplicationOutputDataSettingsImpl(nodeId, outputDataDirectory, dataRegistryURL, isDataPersistent));
+ return getOutputDataSettingsListArray().get(getOutputDataSettingsListArray().size()-1);
+ }
+
+ @Override
+ public void addNewOutputDataSettings(
+ OutputDataSettings... outputDataSettings) {
+ getOutputDataSettingsListArray().addAll(Arrays.asList(outputDataSettings));
+ }
+
+ @Override
+ public void removeOutputDataSettings(OutputDataSettings outputDataSettings) {
+ if (getOutputDataSettingsListArray().contains(outputDataSettings)){
+ getOutputDataSettingsListArray().remove(outputDataSettings);
+ }
+ }
+
+ @Override
+ public void removeAllOutputDataSettings() {
+ getOutputDataSettingsListArray().clear();
+ }
+
+ @Override
+ public OutputDataSettings addNewOutputDataSettings(String nodeId) {
+ return addNewOutputDataSettings(nodeId,null,null,null);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/airavata/blob/2654424b/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowSchedulingSettingsImpl.java
----------------------------------------------------------------------
diff --git a/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowSchedulingSettingsImpl.java b/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowSchedulingSettingsImpl.java
new file mode 100644
index 0000000..a439066
--- /dev/null
+++ b/modules/airavata-client/src/main/java/org/apache/airavata/client/impl/WorkflowSchedulingSettingsImpl.java
@@ -0,0 +1,97 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+package org.apache.airavata.client.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.airavata.client.api.NodeSettings;
+import org.apache.airavata.client.api.WorkflowSchedulingSettings;
+
+public class WorkflowSchedulingSettingsImpl implements
+ WorkflowSchedulingSettings {
+
+ private List<NodeSettings> nodeSettingsList;
+
+ private List<NodeSettings> getNodeSettingsListArray(){
+ if (nodeSettingsList==null){
+ nodeSettingsList=new ArrayList<NodeSettings>();
+ }
+ return nodeSettingsList;
+ }
+
+ @Override
+ public NodeSettings[] getNodeSettingsList() {
+ return getNodeSettingsListArray().toArray(new NodeSettings[]{});
+ }
+
+ @Override
+ public NodeSettings addNewNodeSettings(String nodeId) {
+ getNodeSettingsListArray().add(new NodeSettingsImpl(nodeId));
+ return getNodeSettingsListArray().get(getNodeSettingsListArray().size()-1);
+ }
+
+ @Override
+ public NodeSettings addNewNodeSettings(String nodeId, String serviceId,
+ int cpuCount, int nodeCount) {
+ NodeSettingsImpl nodeSettings = new NodeSettingsImpl(nodeId, serviceId);
+ nodeSettings.getHPCSettings().setCPUCount(cpuCount);
+ nodeSettings.getHPCSettings().setNodeCount(nodeCount);
+ addNewNodeSettings(nodeSettings);
+ return nodeSettings;
+ }
+
+ @Override
+ public void addNewNodeSettings(NodeSettings... newNodeSettingsList) {
+ getNodeSettingsListArray().addAll(Arrays.asList(newNodeSettingsList));
+ }
+
+ @Override
+ public boolean hasNodeSettings(String nodeId) {
+ return getNodeSettings(nodeId)!=null;
+ }
+
+ @Override
+ public NodeSettings getNodeSettings(String nodeId) {
+ for(NodeSettings nodeSettings:getNodeSettingsList()){
+ if (nodeSettings.getNodeId().equals(nodeId)){
+ return nodeSettings;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public void removeNodeSettings(String nodeId) {
+ if (hasNodeSettings(nodeId)){
+ getNodeSettingsListArray().remove(getNodeSettings(nodeId));
+ }
+
+ }
+
+ @Override
+ public void removeAllNodeSettings() {
+ getNodeSettingsListArray().clear();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/airavata/blob/2654424b/modules/airavata-client/src/main/java/org/apache/airavata/client/stub/interpretor/NameValue.java
----------------------------------------------------------------------
diff --git a/modules/airavata-client/src/main/java/org/apache/airavata/client/stub/interpretor/NameValue.java b/modules/airavata-client/src/main/java/org/apache/airavata/client/stub/interpretor/NameValue.java
new file mode 100644
index 0000000..5faeb10
--- /dev/null
+++ b/modules/airavata-client/src/main/java/org/apache/airavata/client/stub/interpretor/NameValue.java
@@ -0,0 +1,559 @@
+/*
+ *
+ * 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.
+ *
+ */
+package org.apache.airavata.client.stub.interpretor;
+
+
+// http://silktree.cs.indiana.edu:18080/axis2/services/WorkflowInterpretor
+public class NameValue implements org.apache.axis2.databinding.ADBBean {
+ /*
+ * This type was generated from the piece of schema that had name = NameValue Namespace URI =
+ * http://interpretor.xbaya.airavata.apache.org Namespace Prefix = ns1
+ */
+
+ private static String generatePrefix(String namespace) {
+ if (namespace.equals("http://interpretor.xbaya.airavata.apache.org")) {
+ return "ns1";
+ }
+ return org.apache.axis2.databinding.utils.BeanUtil.getUniquePrefix();
+ }
+
+ /**
+ * field for Name
+ */
+
+ protected String localName;
+
+ /*
+ * This tracker boolean wil be used to detect whether the user called the set method for this attribute. It will be
+ * used to determine whether to include this field in the serialized XML
+ */
+ protected boolean localNameTracker = false;
+
+ /**
+ * Auto generated getter method
+ *
+ * @return java.lang.String
+ */
+ public String getName() {
+ return localName;
+ }
+
+ /**
+ * Auto generated setter method
+ *
+ * @param param
+ * Name
+ */
+ public void setName(String param) {
+
+ if (param != null) {
+ // update the setting tracker
+ localNameTracker = true;
+ } else {
+ localNameTracker = true;
+
+ }
+
+ this.localName = param;
+
+ }
+
+ /**
+ * field for Value
+ */
+
+ protected String localValue;
+
+ /*
+ * This tracker boolean wil be used to detect whether the user called the set method for this attribute. It will be
+ * used to determine whether to include this field in the serialized XML
+ */
+ protected boolean localValueTracker = false;
+
+ /**
+ * Auto generated getter method
+ *
+ * @return java.lang.String
+ */
+ public String getValue() {
+ return localValue;
+ }
+
+ /**
+ * Auto generated setter method
+ *
+ * @param param
+ * Value
+ */
+ public void setValue(String param) {
+
+ if (param != null) {
+ // update the setting tracker
+ localValueTracker = true;
+ } else {
+ localValueTracker = true;
+
+ }
+
+ this.localValue = param;
+
+ }
+
+ /**
+ * isReaderMTOMAware
+ *
+ * @return true if the reader supports MTOM
+ */
+ public static boolean isReaderMTOMAware(javax.xml.stream.XMLStreamReader reader) {
+ boolean isReaderMTOMAware = false;
+
+ try {
+ isReaderMTOMAware = Boolean.TRUE.equals(reader
+ .getProperty(org.apache.axiom.om.OMConstants.IS_DATA_HANDLERS_AWARE));
+ } catch (IllegalArgumentException e) {
+ isReaderMTOMAware = false;
+ }
+ return isReaderMTOMAware;
+ }
+
+ /**
+ *
+ * @param parentQName
+ * @param factory
+ * @return org.apache.axiom.om.OMElement
+ */
+ public org.apache.axiom.om.OMElement getOMElement(final javax.xml.namespace.QName parentQName,
+ final org.apache.axiom.om.OMFactory factory) throws org.apache.axis2.databinding.ADBException {
+
+ org.apache.axiom.om.OMDataSource dataSource = new org.apache.axis2.databinding.ADBDataSource(this, parentQName) {
+
+ public void serialize(org.apache.axis2.databinding.utils.writer.MTOMAwareXMLStreamWriter xmlWriter)
+ throws javax.xml.stream.XMLStreamException {
+ NameValue.this.serialize(parentQName, factory, xmlWriter);
+ }
+ };
+ return new org.apache.axiom.om.impl.llom.OMSourcedElementImpl(parentQName, factory, dataSource);
+
+ }
+
+ public void serialize(final javax.xml.namespace.QName parentQName, final org.apache.axiom.om.OMFactory factory,
+ org.apache.axis2.databinding.utils.writer.MTOMAwareXMLStreamWriter xmlWriter)
+ throws javax.xml.stream.XMLStreamException, org.apache.axis2.databinding.ADBException {
+ serialize(parentQName, factory, xmlWriter, false);
+ }
+
+ public void serialize(final javax.xml.namespace.QName parentQName, final org.apache.axiom.om.OMFactory factory,
+ org.apache.axis2.databinding.utils.writer.MTOMAwareXMLStreamWriter xmlWriter, boolean serializeType)
+ throws javax.xml.stream.XMLStreamException, org.apache.axis2.databinding.ADBException {
+
+ String prefix = null;
+ String namespace = null;
+
+ prefix = parentQName.getPrefix();
+ namespace = parentQName.getNamespaceURI();
+
+ if ((namespace != null) && (namespace.trim().length() > 0)) {
+ String writerPrefix = xmlWriter.getPrefix(namespace);
+ if (writerPrefix != null) {
+ xmlWriter.writeStartElement(namespace, parentQName.getLocalPart());
+ } else {
+ if (prefix == null) {
+ prefix = generatePrefix(namespace);
+ }
+
+ xmlWriter.writeStartElement(prefix, parentQName.getLocalPart(), namespace);
+ xmlWriter.writeNamespace(prefix, namespace);
+ xmlWriter.setPrefix(prefix, namespace);
+ }
+ } else {
+ xmlWriter.writeStartElement(parentQName.getLocalPart());
+ }
+
+ if (serializeType) {
+
+ String namespacePrefix = registerPrefix(xmlWriter, "http://interpretor.xbaya.airavata.apache.org");
+ if ((namespacePrefix != null) && (namespacePrefix.trim().length() > 0)) {
+ writeAttribute("xsi", "http://www.w3.org/2001/XMLSchema-instance", "type", namespacePrefix
+ + ":NameValue", xmlWriter);
+ } else {
+ writeAttribute("xsi", "http://www.w3.org/2001/XMLSchema-instance", "type", "NameValue", xmlWriter);
+ }
+
+ }
+ if (localNameTracker) {
+ namespace = "";
+ if (!namespace.equals("")) {
+ prefix = xmlWriter.getPrefix(namespace);
+
+ if (prefix == null) {
+ prefix = generatePrefix(namespace);
+
+ xmlWriter.writeStartElement(prefix, "name", namespace);
+ xmlWriter.writeNamespace(prefix, namespace);
+ xmlWriter.setPrefix(prefix, namespace);
+
+ } else {
+ xmlWriter.writeStartElement(namespace, "name");
+ }
+
+ } else {
+ xmlWriter.writeStartElement("name");
+ }
+
+ if (localName == null) {
+ // write the nil attribute
+
+ writeAttribute("xsi", "http://www.w3.org/2001/XMLSchema-instance", "nil", "1", xmlWriter);
+
+ } else {
+
+ xmlWriter.writeCharacters(localName);
+
+ }
+
+ xmlWriter.writeEndElement();
+ }
+ if (localValueTracker) {
+ namespace = "";
+ if (!namespace.equals("")) {
+ prefix = xmlWriter.getPrefix(namespace);
+
+ if (prefix == null) {
+ prefix = generatePrefix(namespace);
+
+ xmlWriter.writeStartElement(prefix, "value", namespace);
+ xmlWriter.writeNamespace(prefix, namespace);
+ xmlWriter.setPrefix(prefix, namespace);
+
+ } else {
+ xmlWriter.writeStartElement(namespace, "value");
+ }
+
+ } else {
+ xmlWriter.writeStartElement("value");
+ }
+
+ if (localValue == null) {
+ // write the nil attribute
+
+ writeAttribute("xsi", "http://www.w3.org/2001/XMLSchema-instance", "nil", "1", xmlWriter);
+
+ } else {
+
+ xmlWriter.writeCharacters(localValue);
+
+ }
+
+ xmlWriter.writeEndElement();
+ }
+ xmlWriter.writeEndElement();
+
+ }
+
+ /**
+ * Util method to write an attribute with the ns prefix
+ */
+ private void writeAttribute(String prefix, String namespace, String attName, String attValue,
+ javax.xml.stream.XMLStreamWriter xmlWriter) throws javax.xml.stream.XMLStreamException {
+ if (xmlWriter.getPrefix(namespace) == null) {
+ xmlWriter.writeNamespace(prefix, namespace);
+ xmlWriter.setPrefix(prefix, namespace);
+
+ }
+
+ xmlWriter.writeAttribute(namespace, attName, attValue);
+
+ }
+
+ /**
+ * Util method to write an attribute without the ns prefix
+ */
+ private void writeAttribute(String namespace, String attName, String attValue,
+ javax.xml.stream.XMLStreamWriter xmlWriter) throws javax.xml.stream.XMLStreamException {
+ if (namespace.equals("")) {
+ xmlWriter.writeAttribute(attName, attValue);
+ } else {
+ registerPrefix(xmlWriter, namespace);
+ xmlWriter.writeAttribute(namespace, attName, attValue);
+ }
+ }
+
+ /**
+ * Util method to write an attribute without the ns prefix
+ */
+ private void writeQNameAttribute(String namespace, String attName, javax.xml.namespace.QName qname,
+ javax.xml.stream.XMLStreamWriter xmlWriter) throws javax.xml.stream.XMLStreamException {
+
+ String attributeNamespace = qname.getNamespaceURI();
+ String attributePrefix = xmlWriter.getPrefix(attributeNamespace);
+ if (attributePrefix == null) {
+ attributePrefix = registerPrefix(xmlWriter, attributeNamespace);
+ }
+ String attributeValue;
+ if (attributePrefix.trim().length() > 0) {
+ attributeValue = attributePrefix + ":" + qname.getLocalPart();
+ } else {
+ attributeValue = qname.getLocalPart();
+ }
+
+ if (namespace.equals("")) {
+ xmlWriter.writeAttribute(attName, attributeValue);
+ } else {
+ registerPrefix(xmlWriter, namespace);
+ xmlWriter.writeAttribute(namespace, attName, attributeValue);
+ }
+ }
+
+ /**
+ * method to handle Qnames
+ */
+
+ private void writeQName(javax.xml.namespace.QName qname, javax.xml.stream.XMLStreamWriter xmlWriter)
+ throws javax.xml.stream.XMLStreamException {
+ String namespaceURI = qname.getNamespaceURI();
+ if (namespaceURI != null) {
+ String prefix = xmlWriter.getPrefix(namespaceURI);
+ if (prefix == null) {
+ prefix = generatePrefix(namespaceURI);
+ xmlWriter.writeNamespace(prefix, namespaceURI);
+ xmlWriter.setPrefix(prefix, namespaceURI);
+ }
+
+ if (prefix.trim().length() > 0) {
+ xmlWriter.writeCharacters(prefix + ":"
+ + org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qname));
+ } else {
+ // i.e this is the default namespace
+ xmlWriter.writeCharacters(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qname));
+ }
+
+ } else {
+ xmlWriter.writeCharacters(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qname));
+ }
+ }
+
+ private void writeQNames(javax.xml.namespace.QName[] qnames, javax.xml.stream.XMLStreamWriter xmlWriter)
+ throws javax.xml.stream.XMLStreamException {
+
+ if (qnames != null) {
+ // we have to store this data until last moment since it is not
+ // possible to write any
+ // namespace data after writing the charactor data
+ StringBuffer stringToWrite = new StringBuffer();
+ String namespaceURI = null;
+ String prefix = null;
+
+ for (int i = 0; i < qnames.length; i++) {
+ if (i > 0) {
+ stringToWrite.append(" ");
+ }
+ namespaceURI = qnames[i].getNamespaceURI();
+ if (namespaceURI != null) {
+ prefix = xmlWriter.getPrefix(namespaceURI);
+ if ((prefix == null) || (prefix.length() == 0)) {
+ prefix = generatePrefix(namespaceURI);
+ xmlWriter.writeNamespace(prefix, namespaceURI);
+ xmlWriter.setPrefix(prefix, namespaceURI);
+ }
+
+ if (prefix.trim().length() > 0) {
+ stringToWrite.append(prefix).append(":")
+ .append(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qnames[i]));
+ } else {
+ stringToWrite.append(org.apache.axis2.databinding.utils.ConverterUtil
+ .convertToString(qnames[i]));
+ }
+ } else {
+ stringToWrite.append(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(qnames[i]));
+ }
+ }
+ xmlWriter.writeCharacters(stringToWrite.toString());
+ }
+
+ }
+
+ /**
+ * Register a namespace prefix
+ */
+ private String registerPrefix(javax.xml.stream.XMLStreamWriter xmlWriter, String namespace)
+ throws javax.xml.stream.XMLStreamException {
+ String prefix = xmlWriter.getPrefix(namespace);
+
+ if (prefix == null) {
+ prefix = generatePrefix(namespace);
+
+ while (xmlWriter.getNamespaceContext().getNamespaceURI(prefix) != null) {
+ prefix = org.apache.axis2.databinding.utils.BeanUtil.getUniquePrefix();
+ }
+
+ xmlWriter.writeNamespace(prefix, namespace);
+ xmlWriter.setPrefix(prefix, namespace);
+ }
+
+ return prefix;
+ }
+
+ /**
+ * databinding method to get an XML representation of this object
+ *
+ */
+ public javax.xml.stream.XMLStreamReader getPullParser(javax.xml.namespace.QName qName)
+ throws org.apache.axis2.databinding.ADBException {
+
+ java.util.ArrayList elementList = new java.util.ArrayList();
+ java.util.ArrayList attribList = new java.util.ArrayList();
+
+ if (localNameTracker) {
+ elementList.add(new javax.xml.namespace.QName("", "name"));
+
+ elementList.add(localName == null ? null : org.apache.axis2.databinding.utils.ConverterUtil
+ .convertToString(localName));
+ }
+ if (localValueTracker) {
+ elementList.add(new javax.xml.namespace.QName("", "value"));
+
+ elementList.add(localValue == null ? null : org.apache.axis2.databinding.utils.ConverterUtil
+ .convertToString(localValue));
+ }
+
+ return new org.apache.axis2.databinding.utils.reader.ADBXMLStreamReaderImpl(qName, elementList.toArray(),
+ attribList.toArray());
+
+ }
+
+ /**
+ * Factory class that keeps the parse method
+ */
+ public static class Factory {
+
+ /**
+ * static method to create the object Precondition: If this object is an element, the current or next start
+ * element starts this object and any intervening reader events are ignorable If this object is not an element,
+ * it is a complex type and the reader is at the event just after the outer start element Postcondition: If this
+ * object is an element, the reader is positioned at its end element If this object is a complex type, the
+ * reader is positioned at the end element of its outer element
+ */
+ public static NameValue parse(javax.xml.stream.XMLStreamReader reader) throws Exception {
+ NameValue object = new NameValue();
+
+ String nillableValue = null;
+ try {
+
+ while (!reader.isStartElement() && !reader.isEndElement())
+ reader.next();
+
+ if (reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance", "type") != null) {
+ String fullTypeName = reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance", "type");
+ if (fullTypeName != null) {
+ String nsPrefix = null;
+ if (fullTypeName.indexOf(":") > -1) {
+ nsPrefix = fullTypeName.substring(0, fullTypeName.indexOf(":"));
+ }
+ nsPrefix = nsPrefix == null ? "" : nsPrefix;
+
+ String type = fullTypeName.substring(fullTypeName.indexOf(":") + 1);
+
+ if (!"NameValue".equals(type)) {
+ // find namespace for the prefix
+ String nsUri = reader.getNamespaceContext().getNamespaceURI(nsPrefix);
+ return (NameValue) WorkflowInterpretorStub.ExtensionMapper.getTypeObject(nsUri, type,
+ reader);
+ }
+
+ }
+
+ }
+
+ new java.util.Vector();
+
+ reader.next();
+
+ while (!reader.isStartElement() && !reader.isEndElement())
+ reader.next();
+
+ if (reader.isStartElement() && new javax.xml.namespace.QName("", "name").equals(reader.getName())) {
+
+ nillableValue = reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance", "nil");
+ if (!"true".equals(nillableValue) && !"1".equals(nillableValue)) {
+
+ String content = reader.getElementText();
+
+ object.setName(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(content));
+
+ } else {
+
+ reader.getElementText(); // throw away text nodes if
+ // any.
+ }
+
+ reader.next();
+
+ } // End of if for expected property start element
+
+ else {
+
+ }
+
+ while (!reader.isStartElement() && !reader.isEndElement())
+ reader.next();
+
+ if (reader.isStartElement() && new javax.xml.namespace.QName("", "value").equals(reader.getName())) {
+
+ nillableValue = reader.getAttributeValue("http://www.w3.org/2001/XMLSchema-instance", "nil");
+ if (!"true".equals(nillableValue) && !"1".equals(nillableValue)) {
+
+ String content = reader.getElementText();
+
+ object.setValue(org.apache.axis2.databinding.utils.ConverterUtil.convertToString(content));
+
+ } else {
+
+ reader.getElementText(); // throw away text nodes if
+ // any.
+ }
+
+ reader.next();
+
+ } // End of if for expected property start element
+
+ else {
+
+ }
+
+ while (!reader.isStartElement() && !reader.isEndElement())
+ reader.next();
+
+ if (reader.isStartElement())
+ // A start element we are not expecting indicates a
+ // trailing invalid property
+ throw new org.apache.axis2.databinding.ADBException("Unexpected subelement "
+ + reader.getLocalName());
+
+ } catch (javax.xml.stream.XMLStreamException e) {
+ throw new Exception(e);
+ }
+
+ return object;
+ }
+
+ }// end of factory class
+
+}
http://git-wip-us.apache.org/repos/asf/airavata/blob/2654424b/modules/airavata-client/src/main/java/org/apache/airavata/client/stub/interpretor/WorkflowInterpretorCallbackHandler.java
----------------------------------------------------------------------
diff --git a/modules/airavata-client/src/main/java/org/apache/airavata/client/stub/interpretor/WorkflowInterpretorCallbackHandler.java b/modules/airavata-client/src/main/java/org/apache/airavata/client/stub/interpretor/WorkflowInterpretorCallbackHandler.java
new file mode 100644
index 0000000..bf0a4ed
--- /dev/null
+++ b/modules/airavata-client/src/main/java/org/apache/airavata/client/stub/interpretor/WorkflowInterpretorCallbackHandler.java
@@ -0,0 +1,72 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+package org.apache.airavata.client.stub.interpretor;
+
+/**
+ * WorkflowInterpretorCallbackHandler Callback class, Users can extend this class and implement their own receiveResult
+ * and receiveError methods.
+ */
+public abstract class WorkflowInterpretorCallbackHandler {
+
+ protected Object clientData;
+
+ /**
+ * User can pass in any object that needs to be accessed once the NonBlocking Web service call is finished and
+ * appropriate method of this CallBack is called.
+ *
+ * @param clientData
+ * Object mechanism by which the user can pass in user data that will be avilable at the time this
+ * callback is called.
+ */
+ public WorkflowInterpretorCallbackHandler(Object clientData) {
+ this.clientData = clientData;
+ }
+
+ /**
+ * Please use this constructor if you don't want to set any clientData
+ */
+ public WorkflowInterpretorCallbackHandler() {
+ this.clientData = null;
+ }
+
+ /**
+ * Get the client data
+ */
+
+ public Object getClientData() {
+ return clientData;
+ }
+
+ /**
+ * auto generated Axis2 call back method for launchWorkflow method override this method for handling normal response
+ * from launchWorkflow operation
+ */
+ public void receiveResultlaunchWorkflow(java.lang.String result) {
+ }
+
+ /**
+ * auto generated Axis2 Error handler override this method for handling error response from launchWorkflow operation
+ */
+ public void receiveErrorlaunchWorkflow(java.lang.Exception e) {
+ }
+
+}