3 * Copyright (C) 2007 EDIT
4 * European Distributed Institute of Taxonomy
5 * http://www.e-taxonomy.eu
7 * The contents of this file are subject to the Mozilla Public License Version 1.1
8 * See LICENSE.TXT at the top of this package for the full license terms.
11 package eu
.etaxonomy
.taxeditor
.editor
;
13 import java
.io
.ByteArrayInputStream
;
14 import java
.io
.ByteArrayOutputStream
;
15 import java
.io
.DataInputStream
;
16 import java
.io
.DataOutputStream
;
17 import java
.io
.EOFException
;
18 import java
.io
.IOException
;
19 import java
.util
.ArrayList
;
20 import java
.util
.List
;
21 import java
.util
.UUID
;
23 import org
.apache
.log4j
.Logger
;
24 import org
.eclipse
.swt
.dnd
.ByteArrayTransfer
;
25 import org
.eclipse
.swt
.dnd
.TransferData
;
27 import eu
.etaxonomy
.cdm
.api
.service
.ITaxonService
;
28 import eu
.etaxonomy
.cdm
.model
.common
.ICdmBase
;
29 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
30 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
31 import eu
.etaxonomy
.taxeditor
.store
.CdmStore
;
34 * <p>CdmDataTransfer class.</p>
37 * @created Jun 18, 2010
40 public class CdmDataTransfer
extends ByteArrayTransfer
{
41 private static final Logger logger
= Logger
42 .getLogger(CdmDataTransfer
.class);
44 private static int SEPARATOR
= -10;
45 private static int EOF
= -20;
46 private static final String TYPE_NAME
= "cdmdata-transfer-format";
47 private static final int TYPE_ID
= registerType (TYPE_NAME
);
48 private static final CdmDataTransfer instance
= new CdmDataTransfer();
51 * <p>Getter for the field <code>instance</code>.</p>
53 * @return a {@link eu.etaxonomy.taxeditor.editor.CdmDataTransfer} object.
55 public static synchronized CdmDataTransfer
getInstance() {
59 private ICdmBase cdmBase
;
62 * @see org.eclipse.swt.dnd.Transfer#getTypeIds()
66 protected int[] getTypeIds() {
67 return new int[] { TYPE_ID
};
71 * @see org.eclipse.swt.dnd.Transfer#getTypeNames()
75 protected String
[] getTypeNames() {
76 return new String
[]{ TYPE_NAME
};
81 protected void javaToNative(Object object
, TransferData transferData
) {
82 byte[] bytes
= toByteArray((ICdmBase
[]) object
);
84 super.javaToNative(bytes
, transferData
);
91 protected Object
nativeToJava(TransferData transferData
) {
92 byte[] bytes
= (byte[]) super.nativeToJava(transferData
);
93 return fromByteArray(bytes
);
97 private byte[] toByteArray(ICdmBase
[] cdmBaseObjects
) {
99 * Transfer data is an array of gadgets. Serialized version is: (int)
100 * number of gadgets (Gadget) gadget 1 (Gadget) gadget 2 ... repeat for
101 * each subsequent gadget see writeGadget for the (Gadget) format.
103 ByteArrayOutputStream byteOut
= new ByteArrayOutputStream();
104 DataOutputStream out
= new DataOutputStream(byteOut
);
110 for(ICdmBase cdmBaseObject
: cdmBaseObjects
){
111 writeCdmBaseObject(cdmBaseObject
, out
);
114 bytes
= byteOut
.toByteArray();
115 } catch (IOException e
) {
116 // when in doubt send nothing
122 private ICdmBase
[] fromByteArray(byte[] bytes
) {
123 DataInputStream in
= new DataInputStream(new ByteArrayInputStream(bytes
));
126 List
<ICdmBase
> cdmBaseObjects
= new ArrayList
<ICdmBase
>();
130 cdmBaseObjects
.add(readCdmBaseObject(in
));
132 }catch(EOFException e
){
133 return cdmBaseObjects
.toArray(new ICdmBase
[]{});
135 } catch (IOException e
) {
140 private ICdmBase
readCdmBaseObject(DataInputStream in
) throws IOException
{
141 String className
= in
.readUTF();
143 String idString
= in
.readUTF();
146 if(className
.equals(Synonym
.class.getName()) || className
.equals(Taxon
.class.getName())){
147 ICdmBase object
= CdmStore
.getService(ITaxonService
.class).load(UUID
.fromString(idString
));
159 private void writeCdmBaseObject(ICdmBase cdmBase
, DataOutputStream out
) throws IOException
{
161 * CdmBase object serialization:
164 out
.writeUTF(cdmBase
.getClass().getName());
165 out
.writeInt(SEPARATOR
);
166 out
.writeUTF(cdmBase
.getUuid().toString());
169 if(cdmBase
.getId() == 0){
170 // fallback for unsaved instances
171 this.cdmBase
= cdmBase
;