Mercurial > hg > digilibservice
view service/src/main/java/info/textgrid/middleware/digilib/services/scaler/Scaler.java @ 10:fe0a111cc8f5
server creates tgcrud port in constructor. client takes external server url.
author | casties |
---|---|
date | Fri, 17 Jun 2011 17:07:42 +0200 |
parents | 39c4892724ae |
children |
line wrap: on
line source
package info.textgrid.middleware.digilib.services.scaler; import info.textgrid.namespaces.metadata.core._2010.MetadataContainerType; import info.textgrid.namespaces.middleware.digilib.services.digilibservice.DigilibServicePortType; import info.textgrid.namespaces.middleware.tgcrud.services.tgcrudservice.AuthFault; import info.textgrid.namespaces.middleware.tgcrud.services.tgcrudservice.IoFault; import info.textgrid.namespaces.middleware.tgcrud.services.tgcrudservice.MetadataParseFault; import info.textgrid.namespaces.middleware.tgcrud.services.tgcrudservice.ObjectNotFoundFault; import info.textgrid.namespaces.middleware.tgcrud.services.tgcrudservice.ProtocolNotImplementedFault; import info.textgrid.namespaces.middleware.tgcrud.services.tgcrudservice.TGCrudService; import info.textgrid.namespaces.middleware.tgcrud.services.tgcrudservice.TGCrudService_Service; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import javax.activation.DataHandler; import javax.jws.WebService; import javax.xml.ws.BindingProvider; import javax.xml.ws.Holder; import javax.xml.ws.soap.SOAPBinding; import digilib.image.ImageJobDescription; import digilib.image.ImageLoaderDocuImage; import digilib.image.ImageOpException; import digilib.image.ImageWorker; import digilib.io.ImageCacheStream; import digilib.servlet.DigilibConfiguration; import digilib.servlet.DigilibRequest; @WebService(targetNamespace = "http://textgrid.info/namespaces/middleware/digilib/services/DigilibService", serviceName = "DigilibService", portName = "DigilibServicePort", endpointInterface = "info.textgrid.namespaces.middleware.digilib.services.digilibservice.DigilibServicePortType") public class Scaler implements DigilibServicePortType { private TGCrudService_Service tgcrudService; private TGCrudService tgcrud; private String tgcrudServerUrl = "http://textgrid-ws3.sub.uni-goettingen.de/tgcrud/TGCrudService?wsdl"; /** * CXF calls this constructor just once at service start time... (says * Stefan Funk) */ public Scaler() { System.out.println("digilibservice Scaler starting..."); // Get TG-crud service. tgcrudServerUrl = "http://textgrid-ws3.sub.uni-goettingen.de/tgcrud/TGCrudService?wsdl"; createTgCrudService(); } /** * */ protected void createTgCrudService() { URL location = null; try { location = new URL(tgcrudServerUrl); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("TG-crud WSDL location: " + location); tgcrudService = new TGCrudService_Service(location); tgcrud = tgcrudService.getTGCrudPort(); // use MTOM BindingProvider bindingProvider = (BindingProvider) tgcrud; SOAPBinding binding = (SOAPBinding) bindingProvider.getBinding(); binding.setMTOMEnabled(true); } @Override public void getScaledImage(String sessionId, String uri, String query, String logParameter, Holder<String> mimeType, Holder<byte[]> imageData, Holder<Integer> width, Holder<Integer> height) { System.out.println("getScaledImage! sid=" + sessionId + " uri=" + uri + " log=" + logParameter); if (tgcrud == null) { // Create TG-crud service stub. createTgCrudService(); } // Create holders. Holder<MetadataContainerType> metadataHolder = new Holder<MetadataContainerType>(); Holder<DataHandler> dataHolder = new Holder<DataHandler>(); // Start #READ operation. try { String theSessionId = sessionId; String theLogParameter = logParameter; String theUri = uri; String mode = "digilib"; long startTime = System.currentTimeMillis(); tgcrud.read(theSessionId, theLogParameter, theUri, metadataHolder, dataHolder); System.out.println(Long.toString(System.currentTimeMillis() - startTime) + " ms"); System.out.println("READ: Title=" + metadataHolder.value.getObject().getGeneric() .getProvided().getTitle().get(0)); InputStream istream = dataHolder.value.getInputStream(); String mt = metadataHolder.value.getObject().getGeneric() .getProvided().getFormat(); System.out.println("Stream=" + istream.toString() + " type=" + mt); if (mode.equalsIgnoreCase("digilib")) { // try scaling DigilibConfiguration dlConfig = new DigilibConfiguration(); DigilibRequest dlReq = new DigilibRequest(); dlReq.setWithParamString(query, "&"); ImageJobDescription job = ImageJobDescription.getInstance( dlReq, dlConfig); ImageCacheStream imgStream = new ImageCacheStream(istream, mt); System.out.println("iis=" + imgStream.getImageInputStream()); ImageLoaderDocuImage img = new ImageLoaderDocuImage(); // reuse reader for stream input img.reuseReader = true; // identify image size System.out.println("Identifying..."); img.identify(imgStream); job.setDocuImage(img); job.setInput(imgStream); // use image worker ImageWorker digilib = new ImageWorker(dlConfig, job); System.out.println("Scaling with " + digilib); digilib.call(); System.out.println(Long.toString(System.currentTimeMillis() - startTime) + " ms"); // save image to buffer ByteArrayOutputStream ostream = new ByteArrayOutputStream(); img.writeImage("image/jpeg", ostream); System.out.println("written in " + (System.currentTimeMillis() - startTime) + " ms"); // set buffer in Holder imageData.value = ostream.toByteArray(); mimeType.value = "image/jpeg"; width.value = img.getWidth(); height.value = img.getHeight(); System.out.println("output set."); /* * save to file File f = new File("/tmp/tgimg.jpg"); * OutputStream ostream = new FileOutputStream(f); * img.writeImage("image/jpeg", ostream); * System.out.println(Long.toString(System.currentTimeMillis() - * startTime) + " ms"); */ } else { // try to copy to file File f = new File("/tmp/tgimg.img"); OutputStream ostream = new FileOutputStream(f); byte[] data = new byte[1024]; int l = istream.read(data); while (l > -1) { ostream.write(data, 0, l); l = istream.read(data); } ostream.close(); System.out.println(Long.toString(System.currentTimeMillis() - startTime) + " ms"); System.out.println("Done writing " + f); } } catch (ObjectNotFoundFault e) { // System.out.println(TestServiceUtils.faultDetails(e.getFaultInfo(), // e.getClass().getSimpleName())); e.printStackTrace(); } catch (MetadataParseFault e) { // System.out.println(TestServiceUtils.faultDetails(e.getFaultInfo(), // e.getClass().getSimpleName())); e.printStackTrace(); } catch (IoFault e) { // System.out.println(TestServiceUtils.faultDetails(e.getFaultInfo(), // e.getClass().getSimpleName())); e.printStackTrace(); } catch (ProtocolNotImplementedFault e) { // System.out.println(TestServiceUtils.faultDetails(e.getFaultInfo(), // e.getClass().getSimpleName())); e.printStackTrace(); } catch (AuthFault e) { // System.out.println(TestServiceUtils.faultDetails(e.getFaultInfo(), // e.getClass().getSimpleName())); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ImageOpException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }