You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ch...@apache.org on 2014/11/05 19:30:18 UTC
[30/44] git commit: Changing gfac-core to use app catalog
Changing gfac-core to use app catalog
Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/a1e0ec81
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/a1e0ec81
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/a1e0ec81
Branch: refs/heads/gfac_appcatalog_int
Commit: a1e0ec813969000d755e47ee77c2be5fbb401f2b
Parents: 8abe8dc
Author: chathuriw <ka...@gmail.com>
Authored: Thu Oct 30 10:11:19 2014 -0400
Committer: Chathuri Wimalasena <ka...@gmail.com>
Committed: Wed Nov 5 11:16:14 2014 -0500
----------------------------------------------------------------------
.../org/apache/airavata/gfac/Scheduler.java | 35 ++++-----
.../gfac/core/context/JobExecutionContext.java | 21 ++++++
.../airavata/gfac/core/cpi/BetterGfacImpl.java | 47 ++++++++++++
.../core/handler/AppDescriptorCheckHandler.java | 17 -----
.../airavata/gfac/core/monitor/MonitorID.java | 1 +
.../apache/airavata/job/GFacConfigXmlTest.java | 78 ++++++++++++++++----
6 files changed, 148 insertions(+), 51 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/airavata/blob/a1e0ec81/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 9b70fae..8f5847f 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
@@ -21,30 +21,26 @@
package org.apache.airavata.gfac;
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.xpath.XPathExpressionException;
-
-import org.apache.airavata.commons.gfac.type.ApplicationDescription;
import org.apache.airavata.commons.gfac.type.HostDescription;
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.model.appcatalog.computeresource.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPathExpressionException;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.List;
+
/**
* Scheduler decides the execution order of handlers based on application description. In addition
@@ -76,7 +72,6 @@ public class Scheduler {
* @return GFacProvider instance.
*/
private static GFacProvider getProvider(JobExecutionContext jobExecutionContext) throws GFacException {
- ComputeResourceDescription hostDescription = jobExecutionContext.getApplicationContext().getComputeResourceDescription();
String applicationName = jobExecutionContext.getServiceName();
URL resource = Scheduler.class.getClassLoader().getResource(org.apache.airavata.common.utils.Constants.GFAC_CONFIG_XML);
@@ -113,8 +108,8 @@ public class Scheduler {
// We give higher preference to applications specific provider if configured
if (provider == null) {
- jobExecutionContext.getApplicationContext().getComputeResourcePreference().getPreferredJobSubmissionProtocol()
- String hostClass = hostDescription.getType().getClass().getName();
+ List<JobSubmissionInterface> jobSubmissionInterfaces = jobExecutionContext.getApplicationContext().getComputeResourceDescription().getJobSubmissionInterfaces();
+ String hostClass = jobExecutionContext.getPrefferedJobSubmissionProtocal();
providerClassName = GFacConfiguration.getAttributeValue(GFacConfiguration.getHandlerDoc(), Constants.XPATH_EXPR_PROVIDER_ON_HOST + hostClass + "']", Constants.GFAC_CONFIG_CLASS_ATTRIBUTE);
Class<? extends GFacProvider> aClass1 = Class.forName(providerClassName).asSubclass(GFacProvider.class);
provider = aClass1.newInstance();
@@ -144,9 +139,7 @@ public class Scheduler {
return provider;
}
public static ExecutionMode getExecutionMode(JobExecutionContext jobExecutionContext)throws GFacException{
- HostDescription hostDescription = jobExecutionContext.getApplicationContext().getHostDescription();
- String applicationName = jobExecutionContext.getServiceName();
-
+ String applicationName = jobExecutionContext.getApplicationContext().getApplicationInterfaceDescription().getApplicationName();
URL resource = Scheduler.class.getClassLoader().getResource(org.apache.airavata.common.utils.Constants.GFAC_CONFIG_XML);
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = null;
@@ -169,7 +162,7 @@ public class Scheduler {
// This should be have a single element only.
if (executionMode == null || "".equals(executionMode)) {
- String hostClass = hostDescription.getType().getClass().getName();
+ String hostClass = jobExecutionContext.getPrefferedJobSubmissionProtocal();
executionMode = GFacConfiguration.getAttributeValue(GFacConfiguration.getHandlerDoc(), Constants.XPATH_EXPR_PROVIDER_ON_HOST + hostClass + "']", Constants.GFAC_CONFIG_EXECUTION_MODE_ATTRIBUTE);
}
} catch (XPathExpressionException e) {
http://git-wip-us.apache.org/repos/asf/airavata/blob/a1e0ec81/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 da716c5..2b2255f 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
@@ -52,12 +52,14 @@ public class JobExecutionContext extends AbstractContext implements Serializable
private GFacNotifier notifier;
+ //FIXME : not needed for gfac
private Experiment experiment;
private TaskDetails taskData;
private JobDetails jobDetails;
+ // FIXME : not needed for gfac
private WorkflowNodeDetails workflowNodeDetails;
private GFac gfac;
@@ -72,6 +74,9 @@ public class JobExecutionContext extends AbstractContext implements Serializable
private String outputDir;
private String standaredOutput;
private String standaredError;
+ private String prefferedJobSubmissionProtocal;
+ private String prefferedDataMovementProtocal;
+
// private ContextHeaderDocument.ContextHeader contextHeader;
@@ -364,4 +369,20 @@ public class JobExecutionContext extends AbstractContext implements Serializable
public void setStandaredError(String standaredError) {
this.standaredError = standaredError;
}
+
+ public String getPrefferedJobSubmissionProtocal() {
+ return prefferedJobSubmissionProtocal;
+ }
+
+ public void setPrefferedJobSubmissionProtocal(String prefferedJobSubmissionProtocal) {
+ this.prefferedJobSubmissionProtocal = prefferedJobSubmissionProtocal;
+ }
+
+ public String getPrefferedDataMovementProtocal() {
+ return prefferedDataMovementProtocal;
+ }
+
+ public void setPrefferedDataMovementProtocal(String prefferedDataMovementProtocal) {
+ this.prefferedDataMovementProtocal = prefferedDataMovementProtocal;
+ }
}
http://git-wip-us.apache.org/repos/asf/airavata/blob/a1e0ec81/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cpi/BetterGfacImpl.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cpi/BetterGfacImpl.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cpi/BetterGfacImpl.java
index 16c49e6..fd43c65 100644
--- a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cpi/BetterGfacImpl.java
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/cpi/BetterGfacImpl.java
@@ -52,6 +52,7 @@ import org.apache.airavata.messaging.core.PublisherFactory;
import org.apache.airavata.model.appcatalog.appdeployment.ApplicationDeploymentDescription;
import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
+import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference;
import org.apache.airavata.model.messaging.event.*;
import org.apache.airavata.model.workspace.experiment.*;
@@ -298,6 +299,52 @@ public class BetterGfacImpl implements GFac,Watcher {
jobExecutionContext.setGfac(this);
jobExecutionContext.setZk(zk);
jobExecutionContext.setCredentialStoreToken(AiravataZKUtils.getExpTokenId(zk, experimentID, taskID));
+ if (gatewayResourcePreferences != null ) {
+ if (gatewayResourcePreferences.getScratchLocation() == null) {
+ gatewayResourcePreferences.setScratchLocation("/tmp");
+ }
+
+ /**
+ * Working dir
+ */
+ String workingDir = gatewayResourcePreferences.getScratchLocation() + File.separator + jobExecutionContext.getExperimentID();
+ jobExecutionContext.setWorkingDir(workingDir);
+
+ /*
+ * Input and Output Directory
+ */
+ jobExecutionContext.setInputDir(workingDir + File.separator + Constants.INPUT_DATA_DIR_VAR_NAME);
+ jobExecutionContext.setOutputDir(workingDir + File.separator + Constants.OUTPUT_DATA_DIR_VAR_NAME);
+
+ /*
+ * Stdout and Stderr for Shell
+ */
+ jobExecutionContext.setStandaredOutput(workingDir + File.separator + applicationInterface.getApplicationName().replaceAll("\\s+", "") + ".stdout");
+ jobExecutionContext.setStandaredError(workingDir + File.separator + applicationInterface.getApplicationName().replaceAll("\\s+", "") + ".stderr");
+ }
+
+ List<JobSubmissionInterface> jobSubmissionInterfaces = computeResource.getJobSubmissionInterfaces();
+ String preferredJobSubmissionProtocol = gatewayResourcePreferences.getPreferredJobSubmissionProtocol();
+ String hostClass;
+ if (preferredJobSubmissionProtocol != null){
+ hostClass = preferredJobSubmissionProtocol;
+ }else {
+ if (jobSubmissionInterfaces != null && !jobSubmissionInterfaces.isEmpty()){
+ int lowestPriority = jobSubmissionInterfaces.get(0).getPriorityOrder();
+ String selectedHost = null;
+ for (int i = 0; i < jobSubmissionInterfaces.size() - 1; i++){
+ if (jobSubmissionInterfaces.get(i+1).getPriorityOrder() < lowestPriority ){
+ lowestPriority = jobSubmissionInterfaces.get(i+1).getPriorityOrder();
+ selectedHost = jobSubmissionInterfaces.get(i+1).getJobSubmissionProtocol().toString();
+ }
+ }
+ hostClass = selectedHost;
+ }else {
+ throw new GFacException("Compute resource should have atleast one job submission interface defined...");
+ }
+ }
+ jobExecutionContext.setPrefferedJobSubmissionProtocal(hostClass);
+
return jobExecutionContext;
}
http://git-wip-us.apache.org/repos/asf/airavata/blob/a1e0ec81/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/handler/AppDescriptorCheckHandler.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/handler/AppDescriptorCheckHandler.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/handler/AppDescriptorCheckHandler.java
index 676a15a..4627bf5 100644
--- a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/handler/AppDescriptorCheckHandler.java
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/handler/AppDescriptorCheckHandler.java
@@ -20,16 +20,13 @@
*/
package org.apache.airavata.gfac.core.handler;
-import org.apache.airavata.gfac.Constants;
import org.apache.airavata.gfac.core.context.JobExecutionContext;
import org.apache.airavata.gfac.core.states.GfacPluginState;
import org.apache.airavata.gfac.core.utils.GFacUtils;
-import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
import org.apache.airavata.model.appcatalog.gatewayprofile.ComputeResourcePreference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.File;
import java.util.Properties;
public class AppDescriptorCheckHandler implements GFacRecoverableHandler {
@@ -43,33 +40,19 @@ public class AppDescriptorCheckHandler implements GFacRecoverableHandler {
logger.info("Error saving plugin status to ZK");
}
StringBuffer data = new StringBuffer();
- ApplicationInterfaceDescription appInterface = jobExecutionContext.getApplicationContext().getApplicationInterfaceDescription();
ComputeResourcePreference computeResourcePreference = jobExecutionContext.getApplicationContext().getComputeResourcePreference();
- if (computeResourcePreference.getScratchLocation() == null) {
- computeResourcePreference.setScratchLocation("/tmp");
- }
- /*
- * Working dir
- */
-
- String workingDir = computeResourcePreference.getScratchLocation() + File.separator+ jobExecutionContext.getExperimentID();
- jobExecutionContext.setWorkingDir(workingDir);
data.append(computeResourcePreference.getScratchLocation());
data.append(",").append(jobExecutionContext.getWorkingDir());
/*
* Input and Output Directory
*/
- jobExecutionContext.setInputDir(workingDir + File.separator + Constants.INPUT_DATA_DIR_VAR_NAME );
- jobExecutionContext.setOutputDir(workingDir + File.separator + Constants.OUTPUT_DATA_DIR_VAR_NAME);
data.append(",").append(jobExecutionContext.getInputDir()).append(",").append(jobExecutionContext.getOutputDir());
/*
* Stdout and Stderr for Shell
*/
- jobExecutionContext.setStandaredOutput(workingDir + File.separator + appInterface.getApplicationName().replaceAll("\\s+", "") + ".stdout");
- jobExecutionContext.setStandaredError(workingDir + File.separator + appInterface.getApplicationName().replaceAll("\\s+", "") + ".stderr");
data.append(",").append(jobExecutionContext.getStandaredOutput()).append(",").append(jobExecutionContext.getStandaredError());
http://git-wip-us.apache.org/repos/asf/airavata/blob/a1e0ec81/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/monitor/MonitorID.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/monitor/MonitorID.java b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/monitor/MonitorID.java
index fa4ecd2..6ea1839 100644
--- a/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/monitor/MonitorID.java
+++ b/modules/gfac/gfac-core/src/main/java/org/apache/airavata/gfac/core/monitor/MonitorID.java
@@ -24,6 +24,7 @@ import org.apache.airavata.common.logger.AiravataLogger;
import org.apache.airavata.common.logger.AiravataLoggerFactory;
import org.apache.airavata.commons.gfac.type.HostDescription;
import org.apache.airavata.gfac.core.context.JobExecutionContext;
+import org.apache.airavata.model.appcatalog.computeresource.ComputeResourceDescription;
import org.apache.airavata.model.workspace.experiment.JobState;
import java.sql.Timestamp;
http://git-wip-us.apache.org/repos/asf/airavata/blob/a1e0ec81/modules/gfac/gfac-core/src/test/java/org/apache/airavata/job/GFacConfigXmlTest.java
----------------------------------------------------------------------
diff --git a/modules/gfac/gfac-core/src/test/java/org/apache/airavata/job/GFacConfigXmlTest.java b/modules/gfac/gfac-core/src/test/java/org/apache/airavata/job/GFacConfigXmlTest.java
index e32bd9b..7e6bc0d 100644
--- a/modules/gfac/gfac-core/src/test/java/org/apache/airavata/job/GFacConfigXmlTest.java
+++ b/modules/gfac/gfac-core/src/test/java/org/apache/airavata/job/GFacConfigXmlTest.java
@@ -21,6 +21,9 @@
package org.apache.airavata.job;
import junit.framework.Assert;
+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.commons.gfac.type.HostDescription;
import org.apache.airavata.gfac.ExecutionMode;
import org.apache.airavata.gfac.GFacConfiguration;
@@ -29,6 +32,7 @@ import org.apache.airavata.gfac.Scheduler;
import org.apache.airavata.gfac.core.context.ApplicationContext;
import org.apache.airavata.gfac.core.context.JobExecutionContext;
import org.apache.airavata.gfac.core.cpi.BetterGfacImpl;
+import org.apache.airavata.model.appcatalog.computeresource.*;
import org.apache.airavata.schemas.gfac.GsisshHostType;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@@ -53,12 +57,34 @@ public class GFacConfigXmlTest {
try {
JobExecutionContext jec = new JobExecutionContext(GFacConfiguration.create(gfac.getGfacConfigFile(), null), "testService");
ApplicationContext applicationContext = new ApplicationContext();
- HostDescription host = new HostDescription(GsisshHostType.type);
- host.getType().setHostAddress("trestles.sdsc.edu");
- host.getType().setHostName("trestles");
- ((GsisshHostType) host.getType()).setPort(22);
- ((GsisshHostType) host.getType()).setInstalledPath("/opt/torque/bin/");
- applicationContext.setHostDescription(host);
+ ComputeResourceDescription computeResourceDescription = new ComputeResourceDescription();
+ computeResourceDescription.setHostName("trestles.sdsc.xsede.org");
+ computeResourceDescription.setResourceDescription("SDSC Trestles Cluster");
+
+ AppCatalog appCatalog = AppCatalogFactory.getAppCatalog();
+
+ ResourceJobManager resourceJobManager = new ResourceJobManager();
+ resourceJobManager.setResourceJobManagerType(ResourceJobManagerType.PBS);
+ resourceJobManager.setPushMonitoringEndpoint("push");
+ resourceJobManager.setJobManagerBinPath("/opt/torque/bin/");
+
+ SSHJobSubmission sshJobSubmission = new SSHJobSubmission();
+ sshJobSubmission.setResourceJobManager(resourceJobManager);
+ sshJobSubmission.setSecurityProtocol(SecurityProtocol.GSI);
+ sshJobSubmission.setSshPort(22);
+ sshJobSubmission.setResourceJobManager(resourceJobManager);
+
+ String jobSubmissionId = appCatalog.getComputeResource().addSSHJobSubmission(sshJobSubmission);
+
+ JobSubmissionInterface submissionInterface = new JobSubmissionInterface();
+ submissionInterface.setJobSubmissionInterfaceId(jobSubmissionId);
+ submissionInterface.setJobSubmissionProtocol(JobSubmissionProtocol.SSH);
+ submissionInterface.setPriorityOrder(0);
+
+ computeResourceDescription.addToJobSubmissionInterfaces(submissionInterface);
+
+ appCatalog.getComputeResource().addComputeResource(computeResourceDescription);
+ applicationContext.setComputeResourceDescription(computeResourceDescription);
jec.setApplicationContext(applicationContext);
Scheduler.schedule(jec);
Assert.assertEquals(ExecutionMode.ASYNCHRONOUS, jec.getGFacConfiguration().getExecutionMode());
@@ -73,6 +99,8 @@ public class GFacConfigXmlTest {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (GFacException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (AppCatalogException e) {
+ e.printStackTrace();
}
}
@Test
@@ -82,12 +110,34 @@ public class GFacConfigXmlTest {
try {
JobExecutionContext jec = new JobExecutionContext(GFacConfiguration.create(gfac.getGfacConfigFile(), null), "UltraScan");
ApplicationContext applicationContext = new ApplicationContext();
- HostDescription host = new HostDescription(GsisshHostType.type);
- host.getType().setHostAddress("trestles.sdsc.edu");
- host.getType().setHostName("trestles");
- ((GsisshHostType) host.getType()).setPort(22);
- ((GsisshHostType) host.getType()).setInstalledPath("/opt/torque/bin/");
- applicationContext.setHostDescription(host);
+ ComputeResourceDescription computeResourceDescription = new ComputeResourceDescription();
+ computeResourceDescription.setHostName("trestles.sdsc.xsede.org");
+ computeResourceDescription.setResourceDescription("SDSC Trestles Cluster");
+
+ AppCatalog appCatalog = AppCatalogFactory.getAppCatalog();
+
+ ResourceJobManager resourceJobManager = new ResourceJobManager();
+ resourceJobManager.setResourceJobManagerType(ResourceJobManagerType.PBS);
+ resourceJobManager.setPushMonitoringEndpoint("push");
+ resourceJobManager.setJobManagerBinPath("/opt/torque/bin/");
+
+ SSHJobSubmission sshJobSubmission = new SSHJobSubmission();
+ sshJobSubmission.setResourceJobManager(resourceJobManager);
+ sshJobSubmission.setSecurityProtocol(SecurityProtocol.GSI);
+ sshJobSubmission.setSshPort(22);
+ sshJobSubmission.setResourceJobManager(resourceJobManager);
+
+ String jobSubmissionId = appCatalog.getComputeResource().addSSHJobSubmission(sshJobSubmission);
+
+ JobSubmissionInterface submissionInterface = new JobSubmissionInterface();
+ submissionInterface.setJobSubmissionInterfaceId(jobSubmissionId);
+ submissionInterface.setJobSubmissionProtocol(JobSubmissionProtocol.SSH);
+ submissionInterface.setPriorityOrder(0);
+
+ computeResourceDescription.addToJobSubmissionInterfaces(submissionInterface);
+
+ appCatalog.getComputeResource().addComputeResource(computeResourceDescription);
+ applicationContext.setComputeResourceDescription(computeResourceDescription);
jec.setApplicationContext(applicationContext);
Scheduler.schedule(jec);
Assert.assertEquals(3, jec.getGFacConfiguration().getInHandlers().size());
@@ -106,8 +156,10 @@ public class GFacConfigXmlTest {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (GFacException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+ } catch (AppCatalogException e) {
+ e.printStackTrace();
}
- }
+ }
}