All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jdplus.toolkit.desktop.plugin.datatransfer.TransferableXmlInformation Maven / Gradle / Ivy

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jdplus.toolkit.desktop.plugin.datatransfer;

import jdplus.toolkit.base.api.information.InformationSet;
import jdplus.toolkit.base.api.information.InformationSetSerializer;
import jdplus.toolkit.base.xml.information.XmlInformationSet;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;

/**
 *
 * @author Jean Palate
 * @param 
 */
public class TransferableXmlInformation implements Transferable {

    private final T obj_;
    private final InformationSetSerializer serializer;
    private final DataFlavor local_;
    private final String type_, version_;
    private static final JAXBContext context;

    static {
        JAXBContext tmp;
        try {
            tmp = JAXBContext.newInstance(XmlInformationSet.class);
        } catch (JAXBException ex) {
            tmp = null;
        }
        context=tmp;
    }

    public static  T read(Transferable dataobj, InformationSetSerializer serializer, Class tclass, String type, String version) {
        try {
            DataFlavor local = newLocalObjectDataFlavor(tclass);
            if (dataobj.isDataFlavorSupported(local)) {
                return (T) dataobj.getTransferData(local);
            }
            DataFlavor xmlflavor = BasicFormatter.DEMETRA;
            if (!dataobj.isDataFlavorSupported(xmlflavor)) {
                return null;
            }
            byte[] bytes=(byte[]) dataobj.getTransferData(BasicFormatter.DEMETRA);
//            String str = new String(bytes); 
//            StringReader reader = new StringReader(str);

//	    byte[] bytearray = (byte[]) dataobj.getTransferData(xmlflavor);
	    ByteArrayInputStream mem = new ByteArrayInputStream(bytes);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            XmlInformationSet x = (XmlInformationSet) unmarshaller.unmarshal(mem);
            if (x == null) {
                return null;
            }
            InformationSet info = x.create();
            if (type != null && !info.isContent(type, version)) {
                return null;
            }
            return serializer.read(info);
        } catch (UnsupportedFlavorException | IOException | JAXBException ex) {
            return null;
        }

    }

    public TransferableXmlInformation(T obj, InformationSetSerializer serializer, String type, String version) {
        obj_ = obj;
        this.serializer=serializer;
        type_ = type;
        version_ = version;
        local_ = newLocalObjectDataFlavor(serializer.getClass());
    }

    @Override
    public DataFlavor[] getTransferDataFlavors() {
        return new DataFlavor[]{BasicFormatter.DEMETRA, local_};
    }

    @Override
    public boolean isDataFlavorSupported(DataFlavor flavor) {
        return flavor.equals(BasicFormatter.DEMETRA) || flavor.equals(local_);
    }

    @Override
    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
        if (obj_ == null) {
            return null;
        }
        if (flavor.equals(local_)) {
            return obj_;
        }
        if (!flavor.equals(BasicFormatter.DEMETRA)) {
            return null;
        }
        StringWriter writer = new StringWriter();
        try {
            InformationSet info = serializer.write(obj_, false);
            if (info == null) {
                return null;
            }
            info.setContent(type_, version_);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            XmlInformationSet xml = new XmlInformationSet();
            xml.copy(info);
            marshaller.marshal(xml, writer);
            writer.flush();
            return writer.toString().getBytes(StandardCharsets.UTF_8);
        } catch (Exception ex) {
            return null;
        }
    }

    static DataFlavor newLocalObjectDataFlavor(Class clazz) {
        try {
            return new DataFlavor(DataFlavor.javaJVMLocalObjectMimeType + ";class=" + clazz.getName());
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException(ex);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy