Javaでクリップボードに複数の形式でコピー

クリップボードは複数のデータ形式を保持することができますが、JavaAPIには、
文字列用のクラス(StringSelection)しかありません。
なので、複数の任意のデータ形式を扱えるクラスを作ってみました。

/*
 * 作成日: 2009/10/18
 */
package util;

import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;


/**
 * クリップボードの内容を保持します。
 * 複数の様々なデータ形式をサポートします。
 * 独自のデータ形式を扱うことも可能です。
 */
public class ClipboardContents implements Transferable, ClipboardOwner {
	private Map map = new HashMap();
	public ClipboardContents() {}
	/**
	 * クリップボードにデータを登録します。
	 */
	public void put(DataFlavor flavor, Object data) {
		map.put(flavor, data);
	}
	
	/** 転送されるデータを表すオブジェクトを返します。*/
	public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
		Object result = map.get(flavor);
		if (result != null) return result;
		throw new UnsupportedFlavorException(flavor);
	}
	/** データを提供することができるフレーバを示す DataFlavor オブジェクトの配列を返します。 */
	public DataFlavor[] getTransferDataFlavors() {
		Set set = map.keySet();
		DataFlavor[] result = new DataFlavor[set.size()];
		Iterator ite=set.iterator();
		for (int i=0; i<result.length; i++) {
			result[i] = (DataFlavor) ite.next();
		}
		return result;
	}
	/** 指定されたデータフレーバが、このオブジェクトに対してサポートされているかどうかを返します。 */
	public boolean isDataFlavorSupported(DataFlavor flavor) {
		return map.keySet().contains(flavor);
	}
	/** クリップボードの内容のオーナではなくなったことを、このオブジェクトに通知します。*/
	public void lostOwnership(Clipboard clipboard, Transferable contents) {
		map.clear();
	}
}

使い方はこうです。文字列とファイルリストの2種類をコピーしています。

		String strdata = ...
		List filelist = ...   // 要素はFile
		// クリップボードにコピー
		Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
		ClipboardContents cc = new ClipboardContents();
		cc.put(DataFlavor.stringFlavor, strdata);
		cc.put(DataFlavor.javaFileListFlavor, filelist);
		clipboard.setContents(cc, cc);