view src/main/java/info/textgrid/middleware/digilib/services/scaler/Scaler.java @ 4:2a34f8fa0f32

works as a service, takes uri and sid and scales now. no return value yet.
author casties
date Fri, 06 May 2011 17:34:50 +0200
parents ebcc41509c2e
children f723439bd23e
line wrap: on
line source

package info.textgrid.middleware.digilib.services.scaler;

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 info.textgrid.namespaces.metadata.core._2010.MetadataContainerType;
import info.textgrid.namespaces.middleware.digilib.services.digilibservice.DigilibService;
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;

@WebService(targetNamespace = "http://textgrid.info/namespaces/middleware/digilib/services/DigilibService", 
        serviceName="DigilibService", portName="DigilibServiceSOAP",
        endpointInterface="info.textgrid.namespaces.middleware.digilib.services.digilibservice.DigilibService")
public class Scaler implements DigilibService {

    @Override
    public void getScaledImage(String sessionId, String uri,
            String logParameter, Holder<String> mimeType,
            Holder<byte[]> imageData) {
        
        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);

            // Use non MTOM stub.
            /*
             * TGCrudService tgcrud_nonMtom = service.getTGCrudPort();
             * //BindingProvider bindingProvider_nonMtom = (BindingProvider)
             * tgcrud_nonMtom; //SOAPBinding binding_nonMtom = (SOAPBinding)
             * bindingProvider_nonMtom .getBinding();
             * binding_nonMtom.setMTOMEnabled(false);
             */

            // 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();
                    ImageJobDescription job = new ImageJobDescription(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;
                    System.out.println("Identifying...");
                    img.identify(imgStream);
                    job.setDocuImage(img);
                    job.setInput(imgStream);
                    job.setValue("dw", 500);
                    job.setValue("dh", 500);
                    // 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");
                    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);
        }
    }

}