X-Git-Url: https://dev.e-taxonomy.eu/gitweb/taxeditor.git/blobdiff_plain/1c69b0d01165dcae51f1f45667c202e0d15b960d..5790f7319f8486ca9eb62f7b4f42ccace459cfd8:/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeTransfer.java diff --git a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeTransfer.java b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeTransfer.java index fd73c9af5..08853abf3 100644 --- a/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeTransfer.java +++ b/eu.etaxonomy.taxeditor.store/src/main/java/eu/etaxonomy/taxeditor/featuretree/FeatureNodeTransfer.java @@ -1,19 +1,32 @@ /** * Copyright (C) 2007 EDIT - * European Distributed Institute of Taxonomy + * European Distributed Institute of Taxonomy * http://www.e-taxonomy.eu - * + * * The contents of this file are subject to the Mozilla Public License Version 1.1 * See LICENSE.TXT at the top of this package for the full license terms. */ package eu.etaxonomy.taxeditor.featuretree; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.EOFException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; +import org.eclipse.swt.SWTException; +import org.eclipse.swt.dnd.ByteArrayTransfer; +import org.eclipse.swt.dnd.TransferData; + import eu.etaxonomy.cdm.api.service.IFeatureNodeService; -import eu.etaxonomy.cdm.model.description.FeatureNode; -import eu.etaxonomy.taxeditor.model.CdmObjectTransfer; +import eu.etaxonomy.cdm.model.description.Feature; +import eu.etaxonomy.cdm.model.term.TermNode; +import eu.etaxonomy.taxeditor.model.MessagingUtils; import eu.etaxonomy.taxeditor.store.CdmStore; /** @@ -21,9 +34,8 @@ import eu.etaxonomy.taxeditor.store.CdmStore; * * @author n.hoffmann * @created Aug 5, 2010 - * @version 1.0 */ -public class FeatureNodeTransfer extends CdmObjectTransfer { +public class FeatureNodeTransfer extends ByteArrayTransfer { private static FeatureNodeTransfer instance = new FeatureNodeTransfer(); private static final String TYPE_NAME = "featureNode-transfer-format"; @@ -52,12 +64,86 @@ public class FeatureNodeTransfer extends CdmObjectTransfer { protected String[] getTypeNames() { return new String[] { TYPE_NAME }; } - - /* (non-Javadoc) - * @see eu.etaxonomy.taxeditor.model.CdmObjectTransfer#loadElement(java.util.UUID) - */ @Override - public FeatureNode loadElement(UUID uuid) { - return CdmStore.getService(IFeatureNodeService.class).load(uuid); - } + protected void javaToNative(Object object, TransferData transferData) { + if (object != null){ + byte[] bytes = toByteArray((TermNode[]) object); + if (bytes != null) { + super.javaToNative(bytes, transferData); + } + } + } + + @Override + protected Object nativeToJava(TransferData transferData) { + try{ + byte[] bytes = (byte[]) super.nativeToJava(transferData); + if (bytes != null){ + return fromByteArray(bytes); + } + }catch (SWTException e){ + MessagingUtils.warningDialog("The new imported node needs to be saved first", this, "Newly created nodes can not be moved without saving"); + } + + return null; + } + + + protected byte[] toByteArray(TermNode[] elements) { + ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(byteOut); + + byte[] bytes = null; + + try { + for(TermNode element : elements){ + if (element.getUuid() == null){ + // MessagingUtils.warningDialog("The new imported node needs to be saved first", this, "Newly created nodes can not be moved without saving"); + + }else{ + writeElementUuid(element, out); + } + } + out.close(); + bytes = byteOut.toByteArray(); + } catch (IOException e) { + + // when in doubt send nothing + } + return bytes; + } + + protected Object[] fromByteArray(byte[] bytes) { + DataInputStream in = new DataInputStream( + new ByteArrayInputStream(bytes)); + + try { + List elements = new ArrayList(); + + try{ + while(true){ + UUID uuid = readElementUuid(in); + elements.add(loadElement(uuid)); + } + }catch(EOFException e){ + return elements.toArray(); + } + } catch (IOException e) { + return null; + } + } + + public TermNode loadElement(UUID uuid){ + TermNode node = CdmStore.getService(IFeatureNodeService.class).load(uuid); + return node; + } + + public UUID readElementUuid(DataInputStream in) throws IOException{ + return UUID.fromString(in.readUTF()); + } + + private void writeElementUuid(Object element, DataOutputStream out) throws IOException { + out.writeUTF(((TermNode)element).getUuid().toString()); + } + }