From 5995b2ed5ca264ecf1cb4e1d58d789f21729cc89 Mon Sep 17 00:00:00 2001 From: Simon Ebner Date: Tue, 22 Apr 2014 08:43:14 +0200 Subject: [PATCH] use of edescriptor also for the server/client setup of FDA --- .../ch/psi/fda/RemoteAcquisitionMain.java | 66 ++++++------------- .../java/ch/psi/fda/aq/XScanDescriptor.java | 13 +++- .../ch/psi/fda/rest/AcquisitionEngine.java | 8 +-- .../java/ch/psi/fda/rest/AcquisitionJob.java | 46 ++++++++----- .../java/ch/psi/fda/rest/ControlClient.java | 23 +++++-- .../EDescriptorJAXBContextProvider.java | 38 +++++++++++ .../ch/psi/fda/rest/services/FDAService.java | 7 +- 7 files changed, 124 insertions(+), 77 deletions(-) create mode 100644 ch.psi.fda/src/main/java/ch/psi/fda/rest/services/EDescriptorJAXBContextProvider.java diff --git a/ch.psi.fda/src/main/java/ch/psi/fda/RemoteAcquisitionMain.java b/ch.psi.fda/src/main/java/ch/psi/fda/RemoteAcquisitionMain.java index 155e025..1ee78f8 100644 --- a/ch.psi.fda/src/main/java/ch/psi/fda/RemoteAcquisitionMain.java +++ b/ch.psi.fda/src/main/java/ch/psi/fda/RemoteAcquisitionMain.java @@ -28,6 +28,7 @@ import java.io.File; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.ServiceLoader; import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; @@ -55,13 +56,12 @@ import com.google.common.eventbus.EventBus; import sun.misc.Signal; import sun.misc.SignalHandler; +import ch.psi.fda.edescriptor.EDescriptor; import ch.psi.fda.gui.ProgressPanel; import ch.psi.fda.gui.ScrollableFlowPanel; -import ch.psi.fda.model.ModelManager; -import ch.psi.fda.model.v1.Configuration; -import ch.psi.fda.model.v1.Data; import ch.psi.fda.rest.ControlClient; import ch.psi.fda.rest.StreamClient; +import ch.psi.fda.vdescriptor.VDescriptor; import ch.psi.fda.visualizer.Visualizer; @SuppressWarnings("restriction") @@ -154,39 +154,20 @@ public class RemoteAcquisitionMain { logger.info("TrackingID of job: " + trackingId); - Configuration c; - try { - c = ModelManager.unmarshall(file); - } catch (Exception e) { - throw new RuntimeException("Unable to deserialize configuration: " + e.getMessage(), e); - } - - // Set data file name - // Determine name used for the data file - String name = file.getName(); - name = name.replaceAll("\\.xml$", ""); - - if (c.getData() != null) { - Data data = c.getData(); - // Only update filename if no name is specified in xml file - if (data.getFileName() == null) { - data.setFileName(name); - } - } else { - Data data = new Data(); - data.setFileName(name); - c.setData(data); - } - - // Override number of executions - if (iterations != null) { - c.setNumberOfExecution(iterations); - } - // Fix configuration if iterations is specified with 0 and no iterations - // option is specified - if (c.getNumberOfExecution() == 0) { - c.setNumberOfExecution(1); - } + EDescriptor edescriptor = null; + VDescriptor vdescriptor = null; + ServiceLoader providers = ServiceLoader.load(DescriptorProvider.class); + for (DescriptorProvider provider : providers) { + try{ + provider.load(file); + edescriptor = provider.getEDescriptor(); + vdescriptor = provider.getVDescriptor(); + break; + } + catch(Exception e){ + logger.log(Level.INFO, provider.getClass().getName()+ " is not able to read provided descriptor files", e); + } + } EventBus b = new AsyncEventBus(Executors.newSingleThreadExecutor()); @@ -194,21 +175,14 @@ public class RemoteAcquisitionMain { - if (!nogui && c.getVisualization().size() > 0) { + if (!nogui && vdescriptor.getPlots().size() > 0) { streamClient = new StreamClient(b); - Visualizer visualizer = new Visualizer(VisualizationMapper.mapVisualizations(c.getVisualization())); + Visualizer visualizer = new Visualizer(vdescriptor); visualizer.configure(); b.register(visualizer); - // If there is a continuous dimension only update plot at the end of a line - if (c.getScan() != null && c.getScan().getCdimension() != null) { - visualizer.setUpdateAtStreamElement(false); - visualizer.setUpdateAtStreamDelimiter(true); - visualizer.setUpdateAtEndOfStream(true); - } - JPanel opanel = new ScrollableFlowPanel(); opanel.setLayout(new FlowLayout()); @@ -311,6 +285,6 @@ public class RemoteAcquisitionMain { }); } - client.acquire(trackingId, c); + client.acquire(trackingId, edescriptor); } } diff --git a/ch.psi.fda/src/main/java/ch/psi/fda/aq/XScanDescriptor.java b/ch.psi.fda/src/main/java/ch/psi/fda/aq/XScanDescriptor.java index aff84e5..2ea139b 100644 --- a/ch.psi.fda/src/main/java/ch/psi/fda/aq/XScanDescriptor.java +++ b/ch.psi.fda/src/main/java/ch/psi/fda/aq/XScanDescriptor.java @@ -1,12 +1,20 @@ package ch.psi.fda.aq; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlType; + import ch.psi.fda.edescriptor.EDescriptor; import ch.psi.fda.model.v1.Configuration; +@XmlRootElement(name="edescriptor") +@XmlType(name="edescriptor") public class XScanDescriptor implements EDescriptor { - private final Configuration configuration; + private Configuration configuration; + public XScanDescriptor(){ + } + public XScanDescriptor(Configuration configuration){ this.configuration = configuration; } @@ -15,4 +23,7 @@ public class XScanDescriptor implements EDescriptor { public Configuration getConfiguration() { return configuration; } + public void setConfiguration(Configuration configuration) { + this.configuration = configuration; + } } diff --git a/ch.psi.fda/src/main/java/ch/psi/fda/rest/AcquisitionEngine.java b/ch.psi.fda/src/main/java/ch/psi/fda/rest/AcquisitionEngine.java index e199f04..5929141 100644 --- a/ch.psi.fda/src/main/java/ch/psi/fda/rest/AcquisitionEngine.java +++ b/ch.psi.fda/src/main/java/ch/psi/fda/rest/AcquisitionEngine.java @@ -31,7 +31,7 @@ import java.util.concurrent.TimeoutException; import javax.inject.Inject; import ch.psi.fda.aq.AcquisitionConfiguration; -import ch.psi.fda.model.v1.Configuration; +import ch.psi.fda.edescriptor.EDescriptor; import ch.psi.jcae.ChannelService; /** @@ -57,16 +57,16 @@ public class AcquisitionEngine { * Submit a scan to be executed. This will generate an execution request which is * enqueued in the execution queue. * - * @param configuration + * @param edescriptor * @return */ - public void submit(String trackingId, Configuration configuration){ + public void submit(String trackingId, EDescriptor edescriptor){ if(erequests.keySet().contains(trackingId) && !erequests.get(trackingId).isDone()){ // Allow finished tracking ids to be reused for new scans throw new IllegalArgumentException("A request with tracking ID "+trackingId+" is already submitted"); } - AcquisitionJob job = new AcquisitionJob(cService, zmqService, config, trackingId, configuration); + AcquisitionJob job = new AcquisitionJob(cService, zmqService, config, trackingId, edescriptor); Future future = eservice.submit(job); erequests.put(trackingId, future); } diff --git a/ch.psi.fda/src/main/java/ch/psi/fda/rest/AcquisitionJob.java b/ch.psi.fda/src/main/java/ch/psi/fda/rest/AcquisitionJob.java index 6be0d43..f06b9d6 100644 --- a/ch.psi.fda/src/main/java/ch/psi/fda/rest/AcquisitionJob.java +++ b/ch.psi.fda/src/main/java/ch/psi/fda/rest/AcquisitionJob.java @@ -18,39 +18,43 @@ */ package ch.psi.fda.rest; +import java.util.ServiceLoader; import java.util.logging.Logger; -import ch.psi.fda.aq.Acquisition; +import ch.psi.fda.EContainer; +import ch.psi.fda.EContainerFactory; +import ch.psi.fda.InjectionModule; import ch.psi.fda.aq.AcquisitionConfiguration; -import ch.psi.fda.model.v1.Configuration; +import ch.psi.fda.edescriptor.EDescriptor; import ch.psi.jcae.ChannelService; import com.google.common.eventbus.EventBus; +import com.google.inject.Guice; +import com.google.inject.Injector; public class AcquisitionJob implements Runnable { private static final Logger logger = Logger.getLogger(AcquisitionJob.class.getName()); - private final AcquisitionConfiguration config; private final ChannelService cService; private final ZMQDataService zmqService; private final String trackingId; - private final Configuration configuration; + private final EDescriptor edescriptor; - public AcquisitionJob(ChannelService cService, ZMQDataService zmqService, AcquisitionConfiguration config, String trackingId, Configuration configuration) { + // TODO remove AcquisitionConfiguration + public AcquisitionJob(ChannelService cService, ZMQDataService zmqService, AcquisitionConfiguration config, String trackingId, EDescriptor edescriptor) { this.zmqService = zmqService; this.cService = cService; - this.config = config; this.trackingId = trackingId; - this.configuration = configuration; + this.edescriptor = edescriptor; } @Override public void run() { - Acquisition acquisition = null; + EContainer econtainer = null; try { logger.info("Execute - " + trackingId); @@ -60,20 +64,30 @@ public class AcquisitionJob implements Runnable { ebus.register(zmqService); // Post visualization configuration - ebus.post(configuration.getVisualization()); +// ebus.post(edescriptor.getVisualization()); - acquisition = new Acquisition(cService, config); - acquisition.initalize(ebus, configuration); - acquisition.execute(); + Injector injector = Guice.createInjector(new InjectionModule(cService)); + + ServiceLoader factories = ServiceLoader.load(EContainerFactory.class); + for (EContainerFactory factory : factories) { + if(factory.supportsEDescriptor(edescriptor)){ + injector.injectMembers(factory); + econtainer = factory.createContainer(edescriptor, ebus); + break; + } + } + + econtainer.initialize(); + econtainer.execute(); + econtainer.destroy(); + logger.info("" + trackingId + " done"); // Cleanup ebus.unregister(zmqService); - } catch (InterruptedException e) { - logger.info("Execution of "+trackingId+ " was interrupted"); } finally { - if(acquisition!=null){ - acquisition.destroy(); + if(econtainer!=null){ + econtainer.destroy(); } } } diff --git a/ch.psi.fda/src/main/java/ch/psi/fda/rest/ControlClient.java b/ch.psi.fda/src/main/java/ch/psi/fda/rest/ControlClient.java index fd26756..71e03ef 100644 --- a/ch.psi.fda/src/main/java/ch/psi/fda/rest/ControlClient.java +++ b/ch.psi.fda/src/main/java/ch/psi/fda/rest/ControlClient.java @@ -23,12 +23,10 @@ import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; -import javax.xml.bind.JAXBElement; -import javax.xml.namespace.QName; import org.glassfish.jersey.jackson.JacksonFeature; -import ch.psi.fda.model.v1.Configuration; +import ch.psi.fda.edescriptor.EDescriptor; public class ControlClient { @@ -37,10 +35,21 @@ public class ControlClient { - public String acquire(String trackingId, Configuration c){ - // Wrap configuration in JAXBElement as there is no @XmlRootElement available within the generated Configuration class - JAXBElement jaxbElement = new JAXBElement<>(new QName("ROOT"), Configuration.class, c); - return target.path(trackingId).request().put(Entity.entity(jaxbElement, MediaType.APPLICATION_XML), String.class); + public String acquire(String trackingId, EDescriptor edescriptor){ + + // For testing purposes +// try { +// JAXBContext context = JAXBContext.newInstance(EDescriptor.class, XScanDescriptor.class); +// Marshaller m = context.createMarshaller(); +// m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); +// m.marshal( edescriptor, System.out ); +// } catch( JAXBException jbe ){ +// // ... +// jbe.printStackTrace(); +// } +// System.out.println("----"); + + return target.path(trackingId).request().put(Entity.entity(edescriptor, MediaType.APPLICATION_XML), String.class); } public void terminate(String trackingId){ diff --git a/ch.psi.fda/src/main/java/ch/psi/fda/rest/services/EDescriptorJAXBContextProvider.java b/ch.psi.fda/src/main/java/ch/psi/fda/rest/services/EDescriptorJAXBContextProvider.java new file mode 100644 index 0000000..20bc21b --- /dev/null +++ b/ch.psi.fda/src/main/java/ch/psi/fda/rest/services/EDescriptorJAXBContextProvider.java @@ -0,0 +1,38 @@ +package ch.psi.fda.rest.services; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.Provider; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; + +import ch.psi.fda.aq.XScanDescriptor; +import ch.psi.fda.edescriptor.EDescriptor; + +/** + * JAXB Context Provider for the EDescriptor class + * This class registers all implementations of the EDescriptor interfaces to the context + */ +@Provider + public class EDescriptorJAXBContextProvider implements ContextResolver { + private static final Logger logger = Logger.getLogger(EDescriptorJAXBContextProvider.class.getName()); + + private JAXBContext context = null; + + public JAXBContext getContext(Class type) { + if(type != EDescriptor.class) + return null; // No support for other classes than EDescriptor + + if(context == null) { + try { + context = JAXBContext.newInstance(EDescriptor.class, XScanDescriptor.class); + } catch (JAXBException e) { + + logger.log(Level.WARNING, "Unable to create JAXB Context", e); + } + } + return context; + } +} diff --git a/ch.psi.fda/src/main/java/ch/psi/fda/rest/services/FDAService.java b/ch.psi.fda/src/main/java/ch/psi/fda/rest/services/FDAService.java index fbefb1f..8e775b7 100644 --- a/ch.psi.fda/src/main/java/ch/psi/fda/rest/services/FDAService.java +++ b/ch.psi.fda/src/main/java/ch/psi/fda/rest/services/FDAService.java @@ -30,7 +30,7 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.MediaType; -import ch.psi.fda.model.v1.Configuration; +import ch.psi.fda.edescriptor.EDescriptor; import ch.psi.fda.rest.AcquisitionEngine; @Path("fda") @@ -42,8 +42,9 @@ public class FDAService { @PUT @Path("{trackingId}") @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - public void execute(@PathParam("trackingId") String trackingId, Configuration configuration) throws InterruptedException{ - aengine.submit(trackingId, configuration); + public void execute(@PathParam("trackingId") String trackingId, EDescriptor edescriptor) throws InterruptedException{ + System.out.println("----- "+ trackingId); + aengine.submit(trackingId, edescriptor); } @DELETE