use of edescriptor also for the server/client setup of FDA
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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){
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user