blob: 1f43dc032526d0017aee7b94e72a24b53848cd6a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - Initial API and implementation
*******************************************************************************/
package org.eclipse.wst.server.ui.internal.view.servers;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.eclipse.swt.dnd.ByteArrayTransfer;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.TransferData;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.internal.IMemento;
import org.eclipse.wst.server.core.internal.Server;
import org.eclipse.wst.server.core.internal.XMLMemento;
/*
* The element serialization format is:
* (int) number of servers
* Then, the following for each server:
* (String) id
*/
public class ServerTransfer extends ByteArrayTransfer {
private static final ServerTransfer instance = new ServerTransfer();
// Create a unique ID to make sure that different Eclipse
// applications use different "types" of <code>JavaElementTransfer</code>
private static final String TYPE_NAME = "server-transfer-format:" + System.currentTimeMillis() + ":" + instance.hashCode();
private static final int TYPEID = registerType(TYPE_NAME);
private ServerTransfer() {
// do nothing
}
/**
* Returns the singleton instance.
*
* @return the singleton instance
*/
public static ServerTransfer getInstance() {
return instance;
}
/* (non-Javadoc)
* Method declared on Transfer.
*/
protected int[] getTypeIds() {
return new int[] { TYPEID };
}
/* (non-Javadoc)
* Method declared on Transfer.
*/
protected String[] getTypeNames() {
return new String[] { TYPE_NAME };
}
/* (non-Javadoc)
* @see org.eclipse.swt.dnd.Transfer#javaToNative(java.lang.Object, org.eclipse.swt.dnd.TransferData)
*/
protected void javaToNative(Object data, TransferData transferData) {
if (!(data instanceof IServer[]))
return;
IServer[] servers = (IServer[]) data;
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
XMLMemento memento = XMLMemento.createWriteRoot("servers");
// write each element
for (int i = 0; i < servers.length; i++) {
IMemento child = memento.createChild("server");
((Server)servers[i]).serialize(child);
}
memento.save(out);
// cleanup
out.close();
byte[] bytes = out.toByteArray();
super.javaToNative(bytes, transferData);
} catch (IOException e) {
// it's best to send nothing if there were problems
}
}
/* (non-Javadoc)
* @see org.eclipse.swt.dnd.Transfer#nativeToJava(org.eclipse.swt.dnd.TransferData)
*/
protected Object nativeToJava(TransferData transferData) {
byte[] bytes = (byte[]) super.nativeToJava(transferData);
if (bytes == null)
return null;
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
try {
IMemento memento = XMLMemento.loadMemento(in);
IMemento[] children = memento.getChildren("server");
int count = children.length;
IServer[] results = new IServer[count];
for (int i = 0; i < count; i++) {
Server server = new Server(null);
server.deserialize(children[i]);
results[i] = server;
}
return results;
} catch (Exception e) {
DND.error(DND.ERROR_INVALID_DATA);
}
return null;
}
}