view service/src/main/java/info/textgrid/middleware/digilib/services/scaler/Scaler.java @ 7:39c4892724ae

new version with maven modules for service and client.
author casties
date Thu, 16 Jun 2011 17:33:06 +0200
parents src/main/java/info/textgrid/middleware/digilib/services/scaler/Scaler.java@913bc132ed96
children fe0a111cc8f5
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 {

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

        // Get TG-crud service.
        String serverUrl = "http://textgrid-ws3.sub.uni-goettingen.de/tgcrud/TGCrudService?wsdl"; // p.getProperty("crud_serverUrl");
        URL location = null;
        try {
            location = new URL(serverUrl);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("TG-crud WSDL location: " + location.getProtocol()
                + "://" + location.getHost() + ":"
                + (location.getPort() == -1 ? "80" : location.getPort())
                + location.getPath());

        // Create TG-crud service stub.
        if (serverUrl != null) {
            // Use MTOM stub.
            TGCrudService_Service service = new TGCrudService_Service(location);
            TGCrudService tgcrud = service.getTGCrudPort();
            BindingProvider bindingProvider = (BindingProvider) tgcrud;
            SOAPBinding binding = (SOAPBinding) bindingProvider.getBinding();
            binding.setMTOMEnabled(true);

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

        } else {
            System.out.println("No TG-crud server WSDL URL given!");
            // assertTrue(false);
        }
    }

}