package com.dgrid.service.impl; import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import com.dgrid.api.JobletTypeHandler; import com.dgrid.errors.TransportException; import com.dgrid.gen.Host; import com.dgrid.gen.InvalidApiKey; import com.dgrid.gen.InvalidHost; import com.dgrid.gen.InvalidJobId; import com.dgrid.gen.InvalidJobletId; import com.dgrid.gen.JOB_CALLBACK_TYPES; import com.dgrid.gen.JOB_STATUS; import com.dgrid.gen.Job; import com.dgrid.gen.Joblet; import com.dgrid.gen.JobletResult; import com.dgrid.gen.NoHostAvailable; import com.dgrid.gen.NoWorkAvailable; import com.dgrid.plugin.PluginManager; import com.dgrid.service.DGridClient; import com.dgrid.service.DGridPluginManager; import com.dgrid.service.DGridTransport; import com.dgrid.util.StackTraceUtil; import com.dgrid.util.io.HostnameDiscovery; public class DGridClientImpl implements DGridClient, ApplicationContextAware { protected Log log = LogFactory.getLog(getClass()); protected DGridPluginManager pluginManager; protected DGridTransport transport; protected ApplicationContext ctx; public DGridClientImpl() { log.trace("DGridClientImpl()"); } public void setPluginManager(PluginManager pluginManager) { this.pluginManager = (DGridPluginManager) pluginManager; } public void setTransport(DGridTransport transport) { this.transport = transport; } public void setApplicationContext(ApplicationContext ctx) throws BeansException { this.ctx = ctx; } public Object getBean(String name) { return ctx.getBean(name); } public void setApiKey(String apiKey) { transport.setApiKey(apiKey); } public void setEndpoint(String endpoint) { transport.setEndpoint(endpoint); } public void setPort(int port) { transport.setPort(port); } public JobletResult executeJoblet(Joblet joblet) { log.trace("executeJoblet()"); try { JobletResult result = execute(joblet); completeJoblet(joblet.getId(), result, ""); return result; } catch (Exception e) { log.error("Exception in executeJoblet()", e); throw new RuntimeException(e); } } public JobletResult execute(Joblet joblet) { log.trace("execute()"); long start = System.currentTimeMillis(); JobletResult result = null; try { String type = joblet.getJobletType(); JobletTypeHandler handler = pluginManager .getJobletTypeHandler(type); if (log.isDebugEnabled()) { log.debug(String.format("Joblet type: %1$s", type)); log.debug(String.format("Handler: %1$s", handler)); log.debug("Executing..."); } result = handler.execute(joblet, this); if (log.isDebugEnabled()) { log .debug(String .format( "Joblet executed with return code (%1$s) and status (%2$d)", result.getReturnCode(), result .getStatus())); } } catch (Throwable e) { log.error("Error executing joblet", e); result = new JobletResult(0, 0l, 1, (System.currentTimeMillis() - start), JOB_STATUS.FAILED, StackTraceUtil.getStackTrace(e), joblet); } if (log.isDebugEnabled()) { log.debug("Joblet completed"); } return result; } public JobletResult gridExecute(Joblet joblet, int retries) throws InvalidApiKey, TransportException, NoHostAvailable { log.trace("gridExecute()"); return transport.gridExecute(joblet, retries); } public void completeJoblet(int jobletId, JobletResult result, String message) throws TransportException, InvalidApiKey, InvalidJobletId { transport.completeJoblet(jobletId, result, message); } public Host getHost() throws TransportException, InvalidApiKey, InvalidHost { return getHostByName(HostnameDiscovery.getHostname()); } public Host getHost(int id) throws TransportException, InvalidApiKey, InvalidHost { return transport.getHost(id); } public Host getHostByName(String hostname) throws TransportException, InvalidApiKey, InvalidHost { return transport.getHostByName(hostname); } public Job getJob(int jobId) throws TransportException, InvalidApiKey, InvalidJobId { return transport.getJob(jobId); } public JobletResult getJobletResult(int jobletId) throws TransportException, InvalidApiKey, InvalidJobletId { return transport.getJobletResult(jobletId); } public List<JobletResult> getResults(int jobId) throws TransportException, InvalidApiKey, InvalidJobId { return transport.getResults(jobId); } public String getHostSetting(int hostid, String name, String defaultValue) throws TransportException, InvalidApiKey, InvalidHost { return transport.getHostSetting(hostid, name, defaultValue); } public String getSetting(String name, String defaultValue) throws TransportException, InvalidApiKey { return transport.getSetting(name, defaultValue); } public Joblet getWork() throws TransportException, InvalidApiKey, InvalidHost, NoWorkAvailable { return transport.getWork(); } public void log(int jobletId, int jobletStatus, String message) throws TransportException, InvalidApiKey, InvalidJobletId { transport.log(jobletId, jobletStatus, message); } public Host registerHost(String hostname) throws TransportException, InvalidApiKey, InvalidHost { return transport.registerHost(hostname); } public void releaseJoblet(int jobletId) throws InvalidApiKey, TransportException, InvalidJobletId { transport.releaseJoblet(jobletId); } public void setHostFacts(int hostid, Map<String, String> facts) throws TransportException, InvalidApiKey, InvalidHost { transport.setHostFacts(hostid, facts); } public Job submitHostJob(String hostname, Job job) throws TransportException, InvalidHost, InvalidApiKey { Host host = getHostByName(hostname); for (Joblet j : job.getJoblets()) { j.setHostId(host.getId()); } return transport.submitJob(job); } public Joblet submitHostJoblet(String hostname, Joblet joblet, int jobId, int callbackType, String callbackAddress, String callbackContent) throws TransportException, InvalidApiKey, InvalidJobId, InvalidHost { Host host = getHostByName(hostname); joblet.setHostId(host.getId()); return transport.submitJoblet(joblet, jobId, callbackType, callbackAddress, callbackContent); } public Joblet submitHostJoblet(String hostname, Joblet joblet, int jobId) throws TransportException, InvalidApiKey, InvalidJobId, InvalidHost { return this.submitHostJoblet(hostname, joblet, jobId, JOB_CALLBACK_TYPES.NONE, "", ""); } public Job submitJob(Job job) throws TransportException, InvalidApiKey { return transport.submitJob(job); } public Joblet submitJoblet(Joblet joblet, int jobId, int callbackType, String callbackAddress, String callbackContent) throws TransportException, InvalidApiKey, InvalidJobId { return transport.submitJoblet(joblet, jobId, callbackType, callbackAddress, callbackContent); } public Joblet submitJoblet(Joblet joblet, int jobId) throws TransportException, InvalidApiKey, InvalidJobId { return this .submitJoblet(joblet, jobId, JOB_CALLBACK_TYPES.NONE, "", ""); } public int getJobletQueueSize() throws TransportException, InvalidApiKey { return transport.getJobletQueueSize(); } public List<Joblet> listActiveJoblets(String submitter, int offset, int limit) throws TransportException, InvalidApiKey { return transport.listActiveJoblets(submitter, offset, limit); } }