use of edescriptor also for the server/client setup of FDA

This commit is contained in:
2014-04-22 08:43:14 +02:00
parent e20cab4874
commit 5995b2ed5c
7 changed files with 124 additions and 77 deletions

View File

@@ -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<DescriptorProvider> 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);
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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<EContainerFactory> 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();
}
}
}

View File

@@ -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<Configuration> 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){

View File

@@ -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<JAXBContext> {
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;
}
}

View File

@@ -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