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

    }

}