package org.exist.client.xacml; 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.InputStream; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import org.exist.util.MimeType; public class NodeTransferable implements Transferable { private static final String FLAVOR_DESCRIPTION = "XACML Element"; private static final Map CLASS_TO_FLAVOR = new HashMap(); public static final DataFlavor CONDITION_FLAVOR = createFlavor(ConditionNode.class); public static final DataFlavor TARGET_FLAVOR = createFlavor(TargetNode.class); public static final DataFlavor RULE_FLAVOR = createFlavor(RuleNode.class); public static final DataFlavor POLICY_FLAVOR = createFlavor(PolicyNode.class); public static final DataFlavor POLICY_SET_FLAVOR = createFlavor(PolicySetNode.class); public static final DataFlavor ABSTRACT_POLICY_FLAVOR = createFlavor(AbstractPolicyNode.class); public static final DataFlavor POLICY_ELEMENT_FLAVOR = createFlavor(PolicyElementNode.class); public static final DataFlavor ROOT_FLAVOR = createFlavor(RootNode.class); public static final DataFlavor ABSTRACT_NODE_FLAVOR = createFlavor(AbstractTreeNode.class); public static final DataFlavor NODE_FLAVOR = createFlavor(XACMLTreeNode.class); public static final DataFlavor TEXT_XML_FLAVOR = new DataFlavor(MimeType.XML_TYPE.getName(), FLAVOR_DESCRIPTION + " (XML)"); public static final DataFlavor APPLICATION_XML_FLAVOR = new DataFlavor("application/xml", FLAVOR_DESCRIPTION + " (XML)"); private static DataFlavor createFlavor(Class c) { DataFlavor ret = new DataFlavor(c, FLAVOR_DESCRIPTION); CLASS_TO_FLAVOR.put(c, ret); return ret; } private Set supportedFlavors; private XACMLTreeNode node; public NodeTransferable(XACMLTreeNode node) { this.node = node; supportedFlavors = new LinkedHashSet(); supportedFlavors.add(TEXT_XML_FLAVOR); supportedFlavors.add(APPLICATION_XML_FLAVOR); supportedFlavors.add(DataFlavor.stringFlavor); for(Class c = node.getClass(); c != null; c = c.getSuperclass()) { DataFlavor flavor = (DataFlavor)CLASS_TO_FLAVOR.get(c); if(flavor != null) supportedFlavors.add(flavor); } } public DataFlavor[] getTransferDataFlavors() { DataFlavor[] ret = new DataFlavor[supportedFlavors.size()]; supportedFlavors.toArray(ret); return ret; } public boolean isDataFlavorSupported(DataFlavor flavor) { return supportedFlavors.contains(flavor); } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if(XACMLTreeNode.class.isAssignableFrom(flavor.getRepresentationClass())) return node; if(DataFlavor.stringFlavor.equals(flavor)) return node.serialize(true); if(TEXT_XML_FLAVOR.equals(flavor)) return serialize(true); if(APPLICATION_XML_FLAVOR.equals(flavor)) return serialize(false); throw new UnsupportedFlavorException(flavor); } private InputStream serialize(boolean indent) { String serializedString = node.serialize(true); return new ByteArrayInputStream(serializedString.getBytes()); } }