package open.stamp.seed;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import open.dolphin.infomodel.StampModel;
import open.dolphin.msg.GUIDGenerator;
/**
* アカウント作成時にシード元のStampTreeをコピーする builder
*
* based on DefaultStampTreeBuilder.java
* @author Kazushi Minagawa.
*/
public class CopyStampTreeBuilder {
private BufferedWriter writer;
private StringWriter stringWriter;
// seed元のStampModel id
private List<String> seedStampList;
// copyして保存すべきStampModel
private List<StampModel> listToPersist;
private boolean DEBUG = false;
// Creates new CopyStampTreeBuilder
public CopyStampTreeBuilder() {
}
public String getStampTreeXML() {
String ret = stringWriter.toString();
debug(ret);
return ret;
}
public List<String> getSeedStampList() {
return seedStampList;
}
public List<StampModel> getStampModelToPersist() {
return listToPersist;
}
//build を開始する。
public void buildStart() throws IOException {
seedStampList = new ArrayList<String>();
listToPersist = new ArrayList<StampModel>();
stringWriter = new StringWriter();
writer = new BufferedWriter(stringWriter);
writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n");
writer.write("<stampBox project=\"open.dolphin\" version=\"1.0\">\n");
}
/**
* Root を生成する。
* @param name root名
* @param Stamptree の Entity
*/
public void buildRoot(String name, String entity) throws IOException {
writer.write("<root name=");
writer.write(addQuote(name));
writer.write(" entity=");
writer.write(addQuote(entity));
writer.write(">");
writer.write("\n");
}
/**
* ノードを生成する。
* @param name ノード名
*/
public void buildNode(String name) throws IOException {
writer.write("<node name=");
writer.write(addQuote(name));
writer.write(">");
writer.write("\n");
}
/**
* StampInfo を UserObject にするノードを生成する。
* @param name ノード名
* @param entity エンティティ
* @param editable 編集可能かどうかのフラグ
* @param memo メモ
* @param seedID DB key
*/
public void buildStampInfo(String name,
String role,
String entity,
String editable,
String memo,
String seedID) throws IOException {
if (DEBUG) {
StringBuilder sb = new StringBuilder();
sb.append(name);
sb.append(",");
sb.append(role);
sb.append(",");
sb.append(entity);
sb.append(",");
sb.append(editable);
sb.append(",");
sb.append(memo);
sb.append(",");
sb.append(seedID);
sb.append(",");
debug(sb.toString());
}
writer.write("<stampInfo name=");
writer.write(addQuote(name));
writer.write(" role=");
writer.write(addQuote(role));
writer.write(" entity=");
writer.write(addQuote(entity));
if (editable!=null) {
writer.write(" editable=");
writer.write(addQuote(editable));
}
if (memo!=null) {
writer.write(" memo=");
writer.write(addQuote(memo));
}
if (seedID!=null) {
// seedになる(保存されている)StampModel id
seedStampList.add(seedID);
// ここで作成したStampModelがpersitされる
// stampBytesはseedIDで検索したものがsetされる
// userIdはpersit側で設定する
StampModel model = new StampModel();
String stampId = GUIDGenerator.generate(model);
model.setId(stampId);
model.setEntity(entity);
//byte[] stampBytes = getStamp(seedID);
//model.setStampBytes(stampBytes);
listToPersist.add(model);
writer.write(" stampId=");
writer.write(addQuote(stampId));
}
writer.write("/>");
writer.write("\n");
}
// Node の生成を終了する。
public void buildNodeEnd() throws IOException {
writer.write("</node>");
writer.write("\n");
}
// Root Node の生成を終了する。
public void buildRootEnd() throws IOException {
writer.write("</root>");
writer.write("\n");
}
// build を終了する。
public void buildEnd() throws IOException {
writer.write("</stampBox>");
writer.write("\n");
writer.flush();
}
private String addQuote(String s) {
StringBuilder buf = new StringBuilder();
buf.append("\"");
buf.append(s);
buf.append("\"");
return buf.toString();
}
private void debug(String str) {
if (DEBUG) {
System.err.print(str);
}
}
}