移行作業だいたい完了!!

SakuSakuジゴロウ卒業にあわせて、当ブログもJugemからHatenaに引っ越した。はてなに越してきた理由は・・

  • 過去ブログのインポートができるようになっていた。
  • はてなという組織じたいに興味が。

インポートについては前からあったらいいなと思ってたら、いつのまにか実装されてた。やっぱ、キーワードに勝手にリンクが張られたり、とかって楽しいな。似たようなキーワード使ってるページを見れたり(隣のはてな・だっけ)。で、はてなという組織が、すごく若くて自由らしい。アイデアが行動の源!アイデアって重要だな。なんか、はてなって日本版グーグルって感じの会社だ。

今までJugemというブログサービスを使ってきたのだが、Hatenaに移行するにあたって、これまでにホームページやBlogで書いてきた日記を全部Hatenaに移行したいなとおもった。そこでJugemのエクスポート機能を使ってすべての日記をXML出力。で、Hatenaにインポートすんべ!と思ってたら、やっぱりJugemとHatenaじゃXMLの形式が違うと。

というわけで、JugemのエクスポートXMLファイルをHatenaのインポートXMLファイルに変換するJugem2hatenaというJavaクラスを作ってみた。以下がソースなり。うーん、DOMってやっぱめんどくさいけど、便利だわ。DOMといえば入社直後のプロジェクトで使ってたな。。
うん。社員のスキルデータを帳票に直すっていう機能だったな。

package kenmaz.jugem2hatena;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Jugem2Hatena {

	public static void main(String[] args) throws Exception {

		List list = new ArrayList();

		DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = dbFactory.newDocumentBuilder();
		Document doc = builder.parse(new File("jugem.xml"));

		Element root = doc.getDocumentElement();
		NodeList entries = root.getChildNodes().item(4).getChildNodes();

		for (int i = 0; i < entries.getLength(); i++) {
			Node entry = entries.item(i);
			NodeList children = entry.getChildNodes();

			Data data = new Data();

			Node titleItem = children.item(0).getChildNodes().item(0);
			if (titleItem != null) {
				data.title = titleItem.getNodeValue();
			}
			Node categoryItem = children.item(2).getChildNodes().item(0);
			if (categoryItem != null) {
				data.category = categoryItem.getNodeValue();
			}
			Node dateItem = children.item(3).getChildNodes().item(0);
			if (dateItem != null) {
				data.setDate(dateItem.getNodeValue());
			}
			Node descrptionItem = children.item(4).getChildNodes().item(0);
			if (descrptionItem != null) {
				data.description = descrptionItem.getNodeValue();
			}
			list.add(data);
		}

		create(list, builder);
	}

	private static void create(List list, DocumentBuilder builder)
			throws Exception {
		Document doc = builder.newDocument();
		Node dialy = doc.createElement("diary");

		for (Iterator iter = list.iterator(); iter.hasNext();) {
			Data data = (Data) iter.next();

			Node day = doc.createElement("day");
			NamedNodeMap dayAtt = day.getAttributes();
			Attr dateAttr = doc.createAttribute("date");
			dateAttr.setNodeValue(data.date);
			dayAtt.setNamedItem(dateAttr);

			Node body = doc.createElement("body");
			String bodyText = createBodyText(data);
			body.appendChild(doc.createTextNode(bodyText));

			day.appendChild(body);
			dialy.appendChild(day);
		}

		doc.appendChild(dialy);

		TransformerFactory transFactory = TransformerFactory.newInstance();
		Transformer transformer = transFactory.newTransformer();

		DOMSource source = new DOMSource(doc);
		StreamResult result = new StreamResult(new FileOutputStream(new File(
				"out.xml")));
		transformer.transform(source, result);

	}

	private static String createBodyText(Data data) {
		String title = data.title;
		String description = data.description;
		String category = data.category;
		
		StringBuffer sb = new StringBuffer();
		sb.append("*[");
		sb.append(category);
		sb.append("]");
		sb.append(title);
		sb.append("\n");
		sb.append(description);
		
		return sb.toString();
	}

	private static class Data {
		
		public String title;

		public String category;

		public String date;

		public String description;
		
		public void setDate(String newDate){
			int idx = newDate.indexOf(" ");
			newDate=newDate.substring(0,idx);
			date = newDate.replace("/","-");
		}
	}
}