You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by sh...@apache.org on 2015/06/04 22:15:46 UTC

[33/81] [abbrv] airavata git commit: Refactored gfac sub modules, merged gfac-ssh, gfac-gsissh, gfac-local, gfac-monitor and gsissh modules and create gface-impl, removed implementation from gfac-core to gfac-impl

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-client/src/main/java/org/apache/airavata/gfac/cpi/gfac_cpi_serviceConstants.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-client/src/main/java/org/apache/airavata/gfac/cpi/gfac_cpi_serviceConstants.java b/modules/gfac/gfac-client/src/main/java/org/apache/airavata/gfac/cpi/gfac_cpi_serviceConstants.java
new file mode 100644
index 0000000..14fd7fe
--- /dev/null
+++ b/modules/gfac/gfac-client/src/main/java/org/apache/airavata/gfac/cpi/gfac_cpi_serviceConstants.java
@@ -0,0 +1,55 @@
+    /*
+     * 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.
+     */
+/**
+ * Autogenerated by Thrift Compiler (0.9.1)
+ *
+ * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+ *  @generated
+ */
+package org.apache.airavata.gfac.cpi;
+
+import org.apache.thrift.scheme.IScheme;
+import org.apache.thrift.scheme.SchemeFactory;
+import org.apache.thrift.scheme.StandardScheme;
+
+import org.apache.thrift.scheme.TupleScheme;
+import org.apache.thrift.protocol.TTupleProtocol;
+import org.apache.thrift.protocol.TProtocolException;
+import org.apache.thrift.EncodingUtils;
+import org.apache.thrift.TException;
+import org.apache.thrift.async.AsyncMethodCallback;
+import org.apache.thrift.server.AbstractNonblockingServer.*;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.EnumMap;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.EnumSet;
+import java.util.Collections;
+import java.util.BitSet;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@SuppressWarnings("all") public class gfac_cpi_serviceConstants {
+
+  public static final String GFAC_CPI_VERSION = "0.13.0";
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/Scheduler.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/Scheduler.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/Scheduler.java
index 853ffc8..b9c17e7 100644
--- a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/Scheduler.java
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/Scheduler.java
@@ -27,7 +27,7 @@ import org.apache.airavata.gfac.core.context.JobExecutionContext;
 import org.apache.airavata.gfac.core.provider.GFacProvider;
 import org.apache.airavata.gfac.core.provider.GFacProviderConfig;
 import org.apache.airavata.gfac.core.provider.GFacProviderException;
-import org.apache.airavata.gfac.core.utils.GFacUtils;
+import org.apache.airavata.gfac.core.GFacUtils;
 import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
 import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionProtocol;
 import org.apache.airavata.model.appcatalog.computeresource.LOCALSubmission;

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFac.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFac.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFac.java
new file mode 100644
index 0000000..d3e1c70
--- /dev/null
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFac.java
@@ -0,0 +1,77 @@
+/*
+ *
+ * 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.gfac.core;
+
+import org.airavata.appcatalog.cpi.AppCatalog;
+import org.apache.airavata.common.utils.MonitorPublisher;
+import org.apache.airavata.gfac.GFacException;
+import org.apache.airavata.gfac.core.context.JobExecutionContext;
+import org.apache.airavata.registry.cpi.Registry;
+import org.apache.curator.framework.CuratorFramework;
+
+/**
+ * This is the GFac CPI interface which needs to be implemented by an internal class, this simply have a single method to submit a job to
+ * the resource, required data for the job has to be stored in registry prior to invoke this object.
+ */
+public interface GFac {
+
+    /**
+     * Initialized method, this method must call one time before use any other method.
+     * @param registry
+     * @param appCatalog
+     * @param curatorClient
+     * @param publisher
+     * @return
+     */
+    public boolean init(Registry registry, AppCatalog appCatalog, CuratorFramework curatorClient, MonitorPublisher publisher);
+
+    /**
+     * This is the job launching method outsiders of GFac can use, this will invoke the GFac handler chain and providers
+     * And update the registry occordingly, so the users can query the database to retrieve status and output from Registry
+     *
+     * @param experimentID
+     * @return boolean Successful acceptence of the jobExecution returns a true value
+     * @throws org.apache.airavata.gfac.GFacException
+     */
+    public boolean submitJob(String experimentID,String taskID, String gatewayID, String tokenId) throws GFacException;
+
+    /**
+     * This method can be used in a handler to ivvoke outhandler asynchronously
+     * @param jobExecutionContext
+     * @throws GFacException
+     */
+    public void invokeOutFlowHandlers(JobExecutionContext jobExecutionContext) throws GFacException;
+
+    /**
+     * This method can be used to handle re-run case asynchronously
+     * @param jobExecutionContext
+     * @throws GFacException
+     */
+    public void reInvokeOutFlowHandlers(JobExecutionContext jobExecutionContext) throws GFacException;
+
+    /**
+     * This operation can be used to cancel an already running experiment
+     * @return Successful cancellation will return true
+     * @throws GFacException
+     */
+    public boolean cancel(String experimentID, String taskID, String gatewayID, String tokenId)throws GFacException;
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacThreadPoolExecutor.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacThreadPoolExecutor.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacThreadPoolExecutor.java
new file mode 100644
index 0000000..9ae8c99
--- /dev/null
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacThreadPoolExecutor.java
@@ -0,0 +1,57 @@
+/*
+ *
+ * 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.gfac.core;
+
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.logger.AiravataLogger;
+import org.apache.airavata.common.logger.AiravataLoggerFactory;
+import org.apache.airavata.common.utils.ServerSettings;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+public class GFacThreadPoolExecutor {
+    private final static AiravataLogger logger = AiravataLoggerFactory.getLogger(GFacThreadPoolExecutor.class);
+    public static final String GFAC_THREAD_POOL_SIZE = "gfac.thread.pool.size";
+
+    private static ExecutorService threadPool;
+
+    public static ExecutorService getCachedThreadPool() {
+        if(threadPool ==null){
+            threadPool = Executors.newCachedThreadPool();
+        }
+        return threadPool;
+    }
+
+    public static ExecutorService client() throws ApplicationSettingsException {
+        if(threadPool ==null){
+            try {
+                threadPool = Executors.newFixedThreadPool(Integer.parseInt(ServerSettings.getSetting(GFAC_THREAD_POOL_SIZE)));
+            } catch (ApplicationSettingsException e) {
+                logger.error("Error reading " + GFAC_THREAD_POOL_SIZE+ " property");
+                throw e;
+            }
+        }
+        return threadPool;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
new file mode 100644
index 0000000..407db94
--- /dev/null
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/GFacUtils.java
@@ -0,0 +1,708 @@
+/*
+ *
+ * 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.gfac.core;
+
+import org.airavata.appcatalog.cpi.AppCatalog;
+import org.airavata.appcatalog.cpi.AppCatalogException;
+import org.apache.aiaravata.application.catalog.data.impl.AppCatalogFactory;
+import org.apache.airavata.common.exception.ApplicationSettingsException;
+import org.apache.airavata.common.utils.AiravataZKUtils;
+import org.apache.airavata.common.utils.DBUtil;
+import org.apache.airavata.common.utils.MonitorPublisher;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.credential.store.store.CredentialReader;
+import org.apache.airavata.credential.store.store.impl.CredentialReaderImpl;
+import org.apache.airavata.gfac.Constants;
+import org.apache.airavata.gfac.ExecutionMode;
+import org.apache.airavata.gfac.GFacConfiguration;
+import org.apache.airavata.gfac.GFacException;
+import org.apache.airavata.gfac.core.context.JobExecutionContext;
+import org.apache.airavata.gfac.core.handler.GFacHandlerException;
+import org.apache.airavata.gfac.core.states.GfacExperimentState;
+import org.apache.airavata.gfac.core.states.GfacHandlerState;
+import org.apache.airavata.model.appcatalog.appinterface.InputDataObjectType;
+import org.apache.airavata.model.appcatalog.appinterface.OutputDataObjectType;
+import org.apache.airavata.model.appcatalog.computeresource.LOCALSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.SSHJobSubmission;
+import org.apache.airavata.model.appcatalog.computeresource.UnicoreJobSubmission;
+import org.apache.airavata.model.messaging.event.JobIdentifier;
+import org.apache.airavata.model.messaging.event.JobStatusChangeRequestEvent;
+import org.apache.airavata.model.messaging.event.TaskIdentifier;
+import org.apache.airavata.model.messaging.event.TaskStatusChangeRequestEvent;
+import org.apache.airavata.model.workspace.experiment.ActionableGroup;
+import org.apache.airavata.model.workspace.experiment.CorrectiveAction;
+import org.apache.airavata.model.workspace.experiment.ErrorCategory;
+import org.apache.airavata.model.workspace.experiment.ErrorDetails;
+import org.apache.airavata.model.workspace.experiment.Experiment;
+import org.apache.airavata.model.workspace.experiment.ExperimentState;
+import org.apache.airavata.model.workspace.experiment.JobDetails;
+import org.apache.airavata.model.workspace.experiment.JobState;
+import org.apache.airavata.model.workspace.experiment.JobStatus;
+import org.apache.airavata.model.workspace.experiment.TaskState;
+import org.apache.airavata.persistance.registry.jpa.impl.RegistryFactory;
+import org.apache.airavata.registry.cpi.ChildDataType;
+import org.apache.airavata.registry.cpi.CompositeIdentifier;
+import org.apache.airavata.registry.cpi.Registry;
+import org.apache.airavata.registry.cpi.RegistryException;
+import org.apache.airavata.registry.cpi.RegistryModelType;
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.utils.ZKPaths;
+import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.KeeperException;
+import org.apache.zookeeper.ZooDefs;
+import org.apache.zookeeper.data.ACL;
+import org.apache.zookeeper.data.Stat;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetAddress;
+import java.net.URISyntaxException;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+//import org.apache.airavata.commons.gfac.type.ActualParameter;
+
+public class GFacUtils {
+	private final static Logger log = LoggerFactory.getLogger(GFacUtils.class);
+	public static final ArrayList<ACL> OPEN_ACL_UNSAFE = ZooDefs.Ids.OPEN_ACL_UNSAFE;
+
+	private GFacUtils() {
+	}
+
+	/**
+	 * Read data from inputStream and convert it to String.
+	 * 
+	 * @param in
+	 * @return String read from inputStream
+	 * @throws java.io.IOException
+	 */
+	public static String readFromStream(InputStream in) throws IOException {
+		try {
+			StringBuffer wsdlStr = new StringBuffer();
+
+			int read;
+
+			byte[] buf = new byte[1024];
+			while ((read = in.read(buf)) > 0) {
+				wsdlStr.append(new String(buf, 0, read));
+			}
+			return wsdlStr.toString();
+		} finally {
+			if (in != null) {
+				try {
+					in.close();
+				} catch (IOException e) {
+					log.warn("Cannot close InputStream: "
+							+ in.getClass().getName(), e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * this can be used to do framework opertaions specific to different modes
+	 * 
+	 * @param jobExecutionContext
+	 * @return
+	 */
+	public static boolean isSynchronousMode(
+			JobExecutionContext jobExecutionContext) {
+		GFacConfiguration gFacConfiguration = jobExecutionContext
+				.getGFacConfiguration();
+		if (ExecutionMode.ASYNCHRONOUS.equals(gFacConfiguration
+				.getExecutionMode())) {
+			return false;
+		}
+		return true;
+	}
+
+	public static String readFileToString(String file)
+			throws FileNotFoundException, IOException {
+		BufferedReader instream = null;
+		try {
+
+			instream = new BufferedReader(new FileReader(file));
+			StringBuffer buff = new StringBuffer();
+			String temp = null;
+			while ((temp = instream.readLine()) != null) {
+				buff.append(temp);
+				buff.append(Constants.NEWLINE);
+			}
+			return buff.toString();
+		} finally {
+			if (instream != null) {
+				try {
+					instream.close();
+				} catch (IOException e) {
+					log.warn("Cannot close FileinputStream", e);
+				}
+			}
+		}
+	}
+
+	public static boolean isLocalHost(String appHost)
+			throws UnknownHostException {
+		String localHost = InetAddress.getLocalHost().getCanonicalHostName();
+		return (localHost.equals(appHost)
+				|| Constants.LOCALHOST.equals(appHost) || Constants._127_0_0_1
+					.equals(appHost));
+	}
+
+	public static String createUniqueNameWithDate(String name) {
+		String date = new Date().toString();
+		date = date.replaceAll(" ", "_");
+		date = date.replaceAll(":", "_");
+		return name + "_" + date;
+	}
+
+    public static List<Element> getElementList(Document doc, String expression) throws XPathExpressionException {
+        XPathFactory xPathFactory = XPathFactory.newInstance();
+        XPath xPath = xPathFactory.newXPath();
+        XPathExpression expr = xPath.compile(expression);
+        NodeList nodeList = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
+        List<Element> elementList = new ArrayList<Element>();
+        for (int i = 0; i < nodeList.getLength(); i++) {
+            Node item = nodeList.item(i);
+            if (item instanceof Element) {
+                elementList.add((Element) item);
+            }
+        }
+        return elementList;
+    }
+
+	public static String createGsiftpURIAsString(String host, String localPath)
+			throws URISyntaxException {
+		StringBuffer buf = new StringBuffer();
+		if (!host.startsWith("gsiftp://"))
+			buf.append("gsiftp://");
+		buf.append(host);
+		if (!host.endsWith("/"))
+			buf.append("/");
+		buf.append(localPath);
+		return buf.toString();
+	}
+
+	public static void saveJobStatus(JobExecutionContext jobExecutionContext,
+                                     JobDetails details, JobState state) throws GFacException {
+		try {
+            // first we save job details to the registry for sa and then save the job status.
+            Registry registry = jobExecutionContext.getRegistry();
+            JobStatus status = new JobStatus();
+            status.setJobState(state);
+            details.setJobStatus(status);
+            registry.add(ChildDataType.JOB_DETAIL, details,
+                    new CompositeIdentifier(jobExecutionContext.getTaskData()
+                            .getTaskID(), details.getJobID()));
+            JobIdentifier identifier = new JobIdentifier(details.getJobID(), jobExecutionContext.getTaskData().getTaskID(),
+                    jobExecutionContext.getWorkflowNodeDetails().getNodeInstanceId(), jobExecutionContext.getExperimentID(),
+                    jobExecutionContext.getGatewayID());
+            JobStatusChangeRequestEvent jobStatusChangeRequestEvent = new JobStatusChangeRequestEvent(state, identifier);
+            jobExecutionContext.getMonitorPublisher().publish(jobStatusChangeRequestEvent);
+        } catch (Exception e) {
+			throw new GFacException("Error persisting job status"
+					+ e.getLocalizedMessage(), e);
+		}
+	}
+
+	public static void updateJobStatus(JobExecutionContext jobExecutionContext,
+			JobDetails details, JobState state) throws GFacException {
+		try {
+			Registry registry = jobExecutionContext.getRegistry();
+			JobStatus status = new JobStatus();
+			status.setJobState(state);
+			status.setTimeOfStateChange(Calendar.getInstance()
+					.getTimeInMillis());
+			details.setJobStatus(status);
+			registry.update(
+					org.apache.airavata.registry.cpi.RegistryModelType.JOB_DETAIL,
+					details, details.getJobID());
+		} catch (Exception e) {
+			throw new GFacException("Error persisting job status"
+					+ e.getLocalizedMessage(), e);
+		}
+	}
+
+	public static void saveErrorDetails(
+			JobExecutionContext jobExecutionContext, String errorMessage,
+			CorrectiveAction action, ErrorCategory errorCatogory)
+			throws GFacException {
+		try {
+			Registry registry = jobExecutionContext.getRegistry();
+			ErrorDetails details = new ErrorDetails();
+			details.setActualErrorMessage(errorMessage);
+			details.setCorrectiveAction(action);
+			details.setActionableGroup(ActionableGroup.GATEWAYS_ADMINS);
+			details.setCreationTime(Calendar.getInstance().getTimeInMillis());
+			details.setErrorCategory(errorCatogory);
+			registry.add(ChildDataType.ERROR_DETAIL, details,
+					jobExecutionContext.getTaskData().getTaskID());
+		} catch (Exception e) {
+			throw new GFacException("Error persisting job status"
+					+ e.getLocalizedMessage(), e);
+		}
+	}
+
+    public static Map<String, Object> getInputParamMap(List<InputDataObjectType> experimentData) throws GFacException {
+        Map<String, Object> map = new HashMap<String, Object>();
+        for (InputDataObjectType objectType : experimentData) {
+            map.put(objectType.getName(), objectType);
+        }
+        return map;
+    }
+
+    public static Map<String, Object> getOuputParamMap(List<OutputDataObjectType> experimentData) throws GFacException {
+        Map<String, Object> map = new HashMap<String, Object>();
+        for (OutputDataObjectType objectType : experimentData) {
+            map.put(objectType.getName(), objectType);
+        }
+        return map;
+    }
+
+	public static GfacExperimentState getZKExperimentState(CuratorFramework curatorClient,
+			JobExecutionContext jobExecutionContext)
+			throws Exception {
+		String expState = AiravataZKUtils.getExpState(curatorClient, jobExecutionContext
+				.getExperimentID());
+        if (expState == null || expState.isEmpty()) {
+            return GfacExperimentState.UNKNOWN;
+        }
+        return GfacExperimentState.findByValue(Integer.valueOf(expState));
+    }
+
+	public static boolean createHandlerZnode(CuratorFramework curatorClient,
+                                             JobExecutionContext jobExecutionContext, String className)
+			throws Exception {
+		String expState = AiravataZKUtils.getExpZnodeHandlerPath(
+				jobExecutionContext.getExperimentID(), className);
+		Stat exists = curatorClient.checkExists().forPath(expState);
+		if (exists == null) {
+			curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE).forPath(expState, new byte[0]);
+			curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE)
+					.forPath(expState + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE, new byte[0]);
+		} else {
+			exists = curatorClient.checkExists().forPath(expState + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE);
+			if (exists == null) {
+				curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE)
+						.forPath(expState + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE, new byte[0]);
+			}
+		}
+
+		exists = curatorClient.checkExists().forPath(expState + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE);
+		if (exists != null) {
+			curatorClient.setData().withVersion(exists.getVersion())
+					.forPath(expState + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE,
+							String.valueOf(GfacHandlerState.INVOKING.getValue()).getBytes());
+		}
+		return true;
+	}
+
+	public static boolean createHandlerZnode(CuratorFramework curatorClient,
+                                             JobExecutionContext jobExecutionContext, String className,
+                                             GfacHandlerState state) throws Exception {
+		String expState = AiravataZKUtils.getExpZnodeHandlerPath(
+				jobExecutionContext.getExperimentID(), className);
+		Stat exists = curatorClient.checkExists().forPath(expState);
+		if (exists == null) {
+			curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE)
+					.forPath(expState, new byte[0]);
+			curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE)
+					.forPath(expState + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE, new byte[0]);
+		} else {
+			exists = curatorClient.checkExists().forPath(expState + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE);
+			if (exists == null) {
+				curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE)
+						.forPath(expState + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE, new byte[0]);
+			}
+		}
+
+		exists = curatorClient.checkExists().forPath(expState + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE);
+		if (exists != null) {
+			curatorClient.setData().withVersion(exists.getVersion())
+					.forPath(expState + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE,
+							String.valueOf(state.getValue()).getBytes());
+		}
+		return true;
+	}
+
+	public static boolean updateHandlerState(CuratorFramework curatorClient,
+                                             JobExecutionContext jobExecutionContext, String className,
+                                             GfacHandlerState state) throws Exception {
+		String handlerPath = AiravataZKUtils.getExpZnodeHandlerPath(
+				jobExecutionContext.getExperimentID(), className);
+		Stat exists = curatorClient.checkExists().forPath(handlerPath + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE);
+		if (exists != null) {
+			curatorClient.setData().withVersion(exists.getVersion())
+					.forPath(handlerPath + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE, String.valueOf(state.getValue()).getBytes());
+		} else {
+			createHandlerZnode(curatorClient, jobExecutionContext, className, state);
+		}
+		return false;
+	}
+
+	public static GfacHandlerState getHandlerState(CuratorFramework curatorClient,
+                                                  JobExecutionContext jobExecutionContext, String className) {
+		try {
+			String handlerPath = AiravataZKUtils.getExpZnodeHandlerPath( jobExecutionContext.getExperimentID(), className);
+			Stat exists = curatorClient.checkExists().forPath(handlerPath + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE);
+			if (exists != null) {
+				String stateVal = new String(curatorClient.getData().storingStatIn(exists)
+						.forPath(handlerPath + File.separator + AiravataZKUtils.ZK_EXPERIMENT_STATE_NODE));
+				return GfacHandlerState.findByValue(Integer.valueOf(stateVal));
+			}
+			return GfacHandlerState.UNKNOWN; // if the node doesn't exist or any other error we
+							// return false
+		} catch (Exception e) {
+			log.error("Error occured while getting zk node status", e);
+			return null;
+		}
+	}
+
+	// This method is dangerous because of moving the experiment data
+	public static boolean createExperimentEntryForPassive(String experimentID,
+														  String taskID, CuratorFramework curatorClient, String experimentNode,
+														  String pickedChild, String tokenId, long deliveryTag) throws Exception {
+		String experimentPath = experimentNode + File.separator + pickedChild;
+		String newExperimentPath = experimentPath + File.separator + experimentID;
+		Stat exists1 = curatorClient.checkExists().forPath(newExperimentPath);
+		String oldExperimentPath = GFacUtils.findExperimentEntry(experimentID, curatorClient);
+		if (oldExperimentPath == null) {  // this means this is a very new experiment
+			// are going to create a new node
+			log.info("This is a new Job, so creating all the experiment docs from the scratch");
+			curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE).forPath(newExperimentPath, new byte[0]);
+            String stateNodePath = curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE)
+					.forPath(newExperimentPath + File.separator + "state",
+							String .valueOf(GfacExperimentState.LAUNCHED.getValue()) .getBytes());
+
+			if(curatorClient.checkExists().forPath(stateNodePath)!=null) {
+				log.info("Created the node: " + stateNodePath + " successfully !");
+			}else {
+				log.error("Error creating node: " + stateNodePath + " successfully !");
+			}
+			curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE)
+					.forPath(newExperimentPath + AiravataZKUtils.DELIVERY_TAG_POSTFIX, longToBytes(deliveryTag));
+		} else {
+			log.error("ExperimentID: " + experimentID + " taskID: " + taskID + " was running by some Gfac instance,but it failed");
+            removeCancelDeliveryTagNode(oldExperimentPath, curatorClient); // remove previous cancel deliveryTagNode
+            if(newExperimentPath.equals(oldExperimentPath)){
+                log.info("Re-launch experiment came to the same GFac instance");
+            }else {
+				log.info("Re-launch experiment came to a new GFac instance so we are moving data to new gfac node");
+				curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE).forPath(newExperimentPath,
+						curatorClient.getData().storingStatIn(exists1).forPath(oldExperimentPath)); // recursively copy children
+                copyChildren(curatorClient, oldExperimentPath, newExperimentPath, 2); // we need to copy children up to depth 2
+				String oldDeliveryTag = oldExperimentPath + AiravataZKUtils.DELIVERY_TAG_POSTFIX;
+				Stat exists = curatorClient.checkExists().forPath(oldDeliveryTag);
+				if(exists!=null) {
+					curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE)
+							.forPath(newExperimentPath + AiravataZKUtils.DELIVERY_TAG_POSTFIX,
+									curatorClient.getData().storingStatIn(exists).forPath(oldDeliveryTag));
+					ZKPaths.deleteChildren(curatorClient.getZookeeperClient().getZooKeeper(), oldDeliveryTag, true);
+				}
+				// After all the files are successfully transfered we delete the // old experiment,otherwise we do
+				// not delete a single file
+				log.info("After a successful copying of experiment data for an old experiment we delete the old data");
+				log.info("Deleting experiment data: " + oldExperimentPath);
+				ZKPaths.deleteChildren(curatorClient.getZookeeperClient().getZooKeeper(), oldExperimentPath, true);
+			}
+		}
+		return true;
+	}
+
+    private static void removeCancelDeliveryTagNode(String experimentPath, CuratorFramework curatorClient) throws Exception {
+        Stat exists = curatorClient.checkExists().forPath(experimentPath + AiravataZKUtils.CANCEL_DELIVERY_TAG_POSTFIX);
+        if (exists != null) {
+			ZKPaths.deleteChildren(curatorClient.getZookeeperClient().getZooKeeper(), experimentPath + AiravataZKUtils.CANCEL_DELIVERY_TAG_POSTFIX, true);
+		}
+	}
+
+    private static void copyChildren(CuratorFramework curatorClient, String oldPath, String newPath, int depth) throws Exception {
+        for (String childNode : curatorClient.getChildren().forPath(oldPath)) {
+            String oldChildPath = oldPath + File.separator + childNode;
+            Stat stat = curatorClient.checkExists().forPath(oldChildPath); // no need to check exists
+            String newChildPath = newPath + File.separator + childNode;
+            log.info("Creating new znode: " + newChildPath);
+			curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE)
+					.forPath(newChildPath, curatorClient.getData().storingStatIn(stat).forPath(oldChildPath));
+			if (--depth > 0) {
+                copyChildren(curatorClient , oldChildPath, newChildPath, depth );
+            }
+        }
+    }
+
+	/**
+	 * This will return a value if the server is down because we iterate through exisiting experiment nodes, not
+	 * through gfac-server nodes
+	 *
+	 * @param experimentID
+	 * @param curatorClient
+	 * @return
+	 * @throws KeeperException
+	 * @throws InterruptedException
+	 */
+	public static String findExperimentEntry(String experimentID, CuratorFramework curatorClient) throws Exception {
+		String experimentNode = ServerSettings.getSetting(org.apache.airavata.common.utils.Constants.ZOOKEEPER_GFAC_EXPERIMENT_NODE, "/gfac-experiments");
+		List<String> children = curatorClient.getChildren().forPath(experimentNode);
+		for (String pickedChild : children) {
+			String experimentPath = experimentNode + File.separator + pickedChild;
+			String newExpNode = experimentPath + File.separator + experimentID;
+			Stat exists = curatorClient.checkExists().forPath(newExpNode);
+			if (exists == null) {
+				continue;
+			} else {
+				return newExpNode;
+			}
+		}
+		return null;
+	}
+
+    public static boolean setExperimentCancel(String experimentId, CuratorFramework curatorClient, long deliveryTag) throws Exception {
+        String experimentEntry = GFacUtils.findExperimentEntry(experimentId, curatorClient);
+        if (experimentEntry == null) {
+            // This should be handle in validation request. Gfac shouldn't get any invalidate experiment.
+            log.error("Cannot find the experiment Entry, so cancel operation cannot be performed. " +
+                    "This happen when experiment completed and already removed from the zookeeper");
+            return false;
+        } else {
+            // check cancel operation is being processed for the same experiment.
+            Stat cancelState = curatorClient.checkExists().forPath(experimentEntry + AiravataZKUtils.CANCEL_DELIVERY_TAG_POSTFIX);
+            if (cancelState != null) {
+                // another cancel operation is being processed. only one cancel operation can exist for a given experiment.
+                return false;
+            }
+
+			curatorClient.create().withMode(CreateMode.PERSISTENT).withACL(OPEN_ACL_UNSAFE)
+					.forPath(experimentEntry + AiravataZKUtils.CANCEL_DELIVERY_TAG_POSTFIX, longToBytes(deliveryTag)); // save cancel delivery tag to be acknowledge at the end.
+			return true;
+        }
+
+    }
+    public static boolean isCancelled(String experimentID, CuratorFramework curatorClient ) throws Exception {
+		String experimentEntry = GFacUtils.findExperimentEntry(experimentID, curatorClient);
+        if(experimentEntry == null){
+            return false;
+        }else {
+            Stat exists = curatorClient.checkExists().forPath(experimentEntry);
+            if (exists != null) {
+				String operation = new String(curatorClient.getData().storingStatIn(exists).forPath(experimentEntry + File.separator + "operation"));
+				if ("cancel".equals(operation)) {
+					return true;
+				}
+			}
+		}
+        return false;
+    }
+
+    public static void saveHandlerData(JobExecutionContext jobExecutionContext,
+                                       StringBuffer data, String className) throws GFacHandlerException {
+		try {
+			CuratorFramework curatorClient = jobExecutionContext.getCuratorClient();
+			if (curatorClient != null) {
+				String expZnodeHandlerPath = AiravataZKUtils
+						.getExpZnodeHandlerPath(
+								jobExecutionContext.getExperimentID(),
+								className);
+				Stat exists = curatorClient.checkExists().forPath(expZnodeHandlerPath);
+                if (exists != null) {
+					curatorClient.setData().withVersion(exists.getVersion()).forPath(expZnodeHandlerPath, data.toString().getBytes());
+				} else {
+                    log.error("Saving Handler data failed, Stat is null");
+                }
+            }
+		} catch (Exception e) {
+			throw new GFacHandlerException(e);
+		}
+	}
+
+	public static String getHandlerData(JobExecutionContext jobExecutionContext, String className) throws Exception {
+		CuratorFramework curatorClient = jobExecutionContext.getCuratorClient();
+		if (curatorClient != null) {
+			String expZnodeHandlerPath = AiravataZKUtils
+					.getExpZnodeHandlerPath(
+							jobExecutionContext.getExperimentID(),
+							className);
+			Stat exists = curatorClient.checkExists().forPath(expZnodeHandlerPath);
+			return new String(jobExecutionContext.getCuratorClient().getData().storingStatIn(exists).forPath(expZnodeHandlerPath));
+		}
+		return null;
+	}
+
+	public static CredentialReader getCredentialReader()
+			throws ApplicationSettingsException, IllegalAccessException,
+			InstantiationException {
+		try{
+		String jdbcUrl = ServerSettings.getCredentialStoreDBURL();
+		String jdbcUsr = ServerSettings.getCredentialStoreDBUser();
+		String jdbcPass = ServerSettings.getCredentialStoreDBPassword();
+		String driver = ServerSettings.getCredentialStoreDBDriver();
+		return new CredentialReaderImpl(new DBUtil(jdbcUrl, jdbcUsr, jdbcPass,
+				driver));
+		}catch(ClassNotFoundException e){
+			log.error("Not able to find driver: " + e.getLocalizedMessage());
+			return null;	
+		}
+	}
+
+    public static LOCALSubmission getLocalJobSubmission (String submissionId) throws AppCatalogException{
+        try {
+            AppCatalog appCatalog = AppCatalogFactory.getAppCatalog();
+            return appCatalog.getComputeResource().getLocalJobSubmission(submissionId);
+        }catch (Exception e){
+            String errorMsg = "Error while retrieving local job submission with submission id : " + submissionId;
+            log.error(errorMsg, e);
+            throw new AppCatalogException(errorMsg, e);
+        }
+    }
+
+    public static UnicoreJobSubmission getUnicoreJobSubmission (String submissionId) throws AppCatalogException{
+        try {
+            AppCatalog appCatalog = AppCatalogFactory.getAppCatalog();
+            return appCatalog.getComputeResource().getUNICOREJobSubmission(submissionId);
+        }catch (Exception e){
+            String errorMsg = "Error while retrieving UNICORE job submission with submission id : " + submissionId;
+            log.error(errorMsg, e);
+            throw new AppCatalogException(errorMsg, e);
+        }
+    }
+
+    public static SSHJobSubmission getSSHJobSubmission (String submissionId) throws AppCatalogException{
+        try {
+            AppCatalog appCatalog = AppCatalogFactory.getAppCatalog();
+            return appCatalog.getComputeResource().getSSHJobSubmission(submissionId);
+        }catch (Exception e){
+            String errorMsg = "Error while retrieving SSH job submission with submission id : " + submissionId;
+            log.error(errorMsg, e);
+            throw new AppCatalogException(errorMsg, e);
+        }
+    }
+
+    /**
+     * To convert list to separated value
+     * @param listOfStrings
+     * @param separator
+     * @return
+     */
+    public static  String listToCsv(List<String> listOfStrings, char separator) {
+        StringBuilder sb = new StringBuilder();
+
+        // all but last
+        for(int i = 0; i < listOfStrings.size() - 1 ; i++) {
+            sb.append(listOfStrings.get(i));
+            sb.append(separator);
+        }
+
+        // last string, no separator
+        if(listOfStrings.size() > 0){
+            sb.append(listOfStrings.get(listOfStrings.size()-1));
+        }
+
+        return sb.toString();
+    }
+
+	public static byte[] longToBytes(long x) {
+		ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
+		buffer.putLong(x);
+		return buffer.array();
+	}
+
+	public static long bytesToLong(byte[] bytes) {
+		ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
+		buffer.put(bytes);
+		buffer.flip();//need flip
+		return buffer.getLong();
+	}
+
+    public static ExperimentState updateExperimentStatus(String experimentId, ExperimentState state) throws RegistryException {
+        Registry airavataRegistry = RegistryFactory.getDefaultRegistry();
+        Experiment details = (Experiment) airavataRegistry.get(RegistryModelType.EXPERIMENT, experimentId);
+        if (details == null) {
+            details = new Experiment();
+            details.setExperimentID(experimentId);
+        }
+        org.apache.airavata.model.workspace.experiment.ExperimentStatus status = new org.apache.airavata.model.workspace.experiment.ExperimentStatus();
+        status.setExperimentState(state);
+        status.setTimeOfStateChange(Calendar.getInstance().getTimeInMillis());
+        if (!ExperimentState.CANCELED.equals(details.getExperimentStatus().getExperimentState()) &&
+                !ExperimentState.CANCELING.equals(details.getExperimentStatus().getExperimentState())) {
+            status.setExperimentState(state);
+        } else {
+            status.setExperimentState(details.getExperimentStatus().getExperimentState());
+        }
+        details.setExperimentStatus(status);
+        log.info("Updating the experiment status of experiment: " + experimentId + " to " + status.getExperimentState().toString());
+        airavataRegistry.update(RegistryModelType.EXPERIMENT_STATUS, status, experimentId);
+        return details.getExperimentStatus().getExperimentState();
+    }
+
+    public static boolean isFailedJob (JobExecutionContext jec) {
+        JobStatus jobStatus = jec.getJobDetails().getJobStatus();
+        if (jobStatus.getJobState() == JobState.FAILED) {
+            return true;
+        }
+        return false;
+    }
+
+    public static boolean ackCancelRequest(String experimentId, CuratorFramework curatorClient) throws Exception {
+        String experimentEntry = GFacUtils.findExperimentEntry(experimentId, curatorClient);
+        String cancelNodePath = experimentEntry + AiravataZKUtils.CANCEL_DELIVERY_TAG_POSTFIX;
+        if (experimentEntry == null) {
+            // This should be handle in validation request. Gfac shouldn't get any invalidate experiment.
+            log.error("Cannot find the experiment Entry, so cancel operation cannot be performed. " +
+                    "This happen when experiment completed and already removed from the CuratorFramework");
+        } else {
+            // check cancel operation is being processed for the same experiment.
+            Stat cancelState = curatorClient.checkExists().forPath(cancelNodePath);
+            if (cancelState != null) {
+				ZKPaths.deleteChildren(curatorClient.getZookeeperClient().getZooKeeper(), cancelNodePath, true);
+				return true;
+			}
+		}
+        return false;
+    }
+
+    public static void publishTaskStatus (JobExecutionContext jobExecutionContext, MonitorPublisher publisher, TaskState state){
+        TaskIdentifier taskIdentity = new TaskIdentifier(jobExecutionContext.getTaskData().getTaskID(),
+                jobExecutionContext.getWorkflowNodeDetails().getNodeInstanceId(),
+                jobExecutionContext.getExperimentID(),
+                jobExecutionContext.getGatewayID());
+        publisher.publish(new TaskStatusChangeRequestEvent(state, taskIdentity));
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/AuthenticationInfo.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/AuthenticationInfo.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/AuthenticationInfo.java
new file mode 100644
index 0000000..2a01e9d
--- /dev/null
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/AuthenticationInfo.java
@@ -0,0 +1,32 @@
+package org.apache.airavata.gfac.core.authentication;/*
+ *
+ * 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.
+ *
+ */
+
+/**
+ * User: AmilaJ (amilaj@apache.org)
+ * Date: 10/4/13
+ * Time: 11:25 AM
+ */
+
+/**
+ * An empty interface that represents authentication data to the API.
+ */
+public interface AuthenticationInfo {
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/GSIAuthenticationInfo.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/GSIAuthenticationInfo.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/GSIAuthenticationInfo.java
new file mode 100644
index 0000000..91b3d83
--- /dev/null
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/GSIAuthenticationInfo.java
@@ -0,0 +1,43 @@
+package org.apache.airavata.gfac.core.authentication;/*
+ *
+ * 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.
+ *
+ */
+
+import org.ietf.jgss.GSSCredential;
+
+import java.util.Properties;
+
+/**
+ * Authentication data. Could be MyProxy user name, password, could be GSSCredentials
+ * or could be SSH keys.
+ */
+public abstract class GSIAuthenticationInfo implements AuthenticationInfo {
+
+    public Properties properties = new Properties();
+
+    public abstract GSSCredential getCredentials() throws SecurityException;
+
+    public Properties getProperties() {
+        return properties;
+    }
+
+    public void setProperties(Properties properties) {
+        this.properties = properties;
+    }
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHKeyAuthentication.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHKeyAuthentication.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHKeyAuthentication.java
new file mode 100644
index 0000000..41b8c9e
--- /dev/null
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHKeyAuthentication.java
@@ -0,0 +1,46 @@
+package org.apache.airavata.gfac.core.authentication;/*
+ *
+ * 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.
+ *
+ */
+
+/**
+ * User: AmilaJ (amilaj@apache.org)
+ * Date: 10/4/13
+ * Time: 2:39 PM
+ */
+
+/**
+ * Abstracts out common methods for SSH key authentication.
+ */
+public interface SSHKeyAuthentication extends AuthenticationInfo {
+
+    /**
+     * This is needed only if private key and public keys are encrypted.
+     * If they are not encrypted we can just return null.
+     * @return User should return pass phrase if keys are encrypted. If not null.
+     */
+    String getPassPhrase();
+
+    /**
+     * Callback with the banner message. API user can get hold of banner message
+     * by implementing this method.
+     * @param message The banner message.
+     */
+    void bannerMessage(String message);
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPasswordAuthentication.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPasswordAuthentication.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPasswordAuthentication.java
new file mode 100644
index 0000000..e5b867b
--- /dev/null
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPasswordAuthentication.java
@@ -0,0 +1,43 @@
+/*
+ *
+ * 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.gfac.core.authentication;
+
+/**
+ * User: AmilaJ (amilaj@apache.org)
+ * Date: 10/4/13
+ * Time: 11:22 AM
+ */
+
+/**
+ * Password authentication for vanilla SSH.
+ */
+public interface SSHPasswordAuthentication extends AuthenticationInfo {
+
+    /**
+     * Gets the password for given host name and given user name.
+     * @param userName The connecting user name name.
+     * @param hostName The connecting host.
+     * @return Password for the given user.
+     */
+    String getPassword(String userName, String hostName);
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPublicKeyAuthentication.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPublicKeyAuthentication.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPublicKeyAuthentication.java
new file mode 100644
index 0000000..8824f5b
--- /dev/null
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPublicKeyAuthentication.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * 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.gfac.core.authentication;
+
+/**
+ * User: AmilaJ (amilaj@apache.org)
+ * Date: 10/4/13
+ * Time: 9:48 AM
+ */
+
+
+/**
+ * Public key authentication for vanilla SSH.
+ * The public key and private key are returned as byte arrays. Useful when we store private key/public key
+ * in a secure storage such as credential store. API user should implement this.
+ */
+public interface SSHPublicKeyAuthentication extends SSHKeyAuthentication {
+
+    /**
+     * Gets the public key as byte array.
+     * @param userName The user who is trying to SSH
+     * @param hostName The host which user wants to connect to.
+     * @return The public key as a byte array.
+     */
+    byte[] getPrivateKey(String userName, String hostName);
+
+    /**
+     * Gets the private key as byte array.
+     * @param userName The user who is trying to SSH
+     * @param hostName The host which user wants to connect to.
+     * @return The private key as a byte array.
+     */
+    byte[] getPublicKey(String userName, String hostName);
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPublicKeyFileAuthentication.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPublicKeyFileAuthentication.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPublicKeyFileAuthentication.java
new file mode 100644
index 0000000..f98e945
--- /dev/null
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/authentication/SSHPublicKeyFileAuthentication.java
@@ -0,0 +1,52 @@
+package org.apache.airavata.gfac.core.authentication;/*
+ *
+ * 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.
+ *
+ */
+
+
+/**
+ * User: AmilaJ (amilaj@apache.org)
+ * Date: 10/4/13
+ * Time: 9:52 AM
+ */
+
+/**
+ * Public key authentication for vanilla SSH.
+ * The public key and private key stored files are returned. API user should implement this.
+ */
+public interface SSHPublicKeyFileAuthentication extends SSHKeyAuthentication {
+
+    /**
+     * The file which contains the public key.
+     * @param userName The user who is trying to SSH
+     * @param hostName The host which user wants to connect to.
+     * @return The name of the file which contains the public key.
+     */
+    String getPublicKeyFile(String userName, String hostName);
+
+    /**
+     * The file which contains the public key.
+     * @param userName The user who is trying to SSH
+     * @param hostName The host which user wants to connect to.
+     * @return The name of the file which contains the private key.
+     */
+    String getPrivateKeyFile(String userName, String hostName);
+
+
+}

http://git-wip-us.apache.org/repos/asf/airavata/blob/7b809747/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/JobExecutionContext.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/JobExecutionContext.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/JobExecutionContext.java
index 1baf792..67c80cf 100644
--- a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/JobExecutionContext.java
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/context/JobExecutionContext.java
@@ -34,8 +34,7 @@ import org.apache.airavata.common.utils.MonitorPublisher;
 import org.apache.airavata.gfac.GFacConfiguration;
 import org.apache.airavata.gfac.GFacException;
 import org.apache.airavata.gfac.SecurityContext;
-import org.apache.airavata.gfac.core.cpi.GFac;
-import org.apache.airavata.gfac.core.notification.GFacNotifier;
+import org.apache.airavata.gfac.core.GFac;
 import org.apache.airavata.gfac.core.provider.GFacProvider;
 import org.apache.airavata.model.appcatalog.computeresource.*;
 import org.apache.airavata.model.workspace.experiment.Experiment;
@@ -54,7 +53,6 @@ public class JobExecutionContext extends AbstractContext implements Serializable
     private ApplicationContext applicationContext;
     private MessageContext inMessageContext;
     private MessageContext outMessageContext;
-    private GFacNotifier notifier;
     //FIXME : not needed for gfac
     private Experiment experiment;
     private TaskDetails taskData;
@@ -166,7 +164,6 @@ public class JobExecutionContext extends AbstractContext implements Serializable
 
     public JobExecutionContext(GFacConfiguration gFacConfiguration,String applicationName){
         this.gfacConfiguration = gFacConfiguration;
-        notifier = new GFacNotifier();
         setApplicationName(applicationName);
         outputFileList = new ArrayList<String>();
     }
@@ -223,10 +220,6 @@ public class JobExecutionContext extends AbstractContext implements Serializable
         return gfacConfiguration;
     }
 
-    public GFacNotifier getNotificationService(){
-        return notifier;
-    }
-
     public GFacProvider getProvider() {
         return provider;
     }
@@ -259,10 +252,6 @@ public class JobExecutionContext extends AbstractContext implements Serializable
         this.applicationName = applicationName;
     }
 
-    public GFacNotifier getNotifier() {
-        return notifier;
-    }
-
     public boolean isInPath() {
         return inPath;
     }