package open.dolphin.stampbox;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import open.dolphin.client.ClientContext;
import open.dolphin.delegater.StampDelegater;
import open.dolphin.infomodel.IInfoModel;
import open.dolphin.infomodel.ModuleInfoBean;
import open.dolphin.infomodel.StampModel;
import open.dolphin.project.Project;
import open.dolphin.util.GUIDGenerator;
import open.dolphin.util.HexBytesTool;
import org.apache.log4j.Logger;
/**
* stampBytesも含めたStampTreeBuilder
*
* based on DefaultStampTreeBuilder.java
* @author masuda, Masuda Naika
*/
public class ExtendedStampTreeBuilder {
/** XML文書で置換が必要な文字 */
//private static final String[] REPLACES = new String[] { "<", ">", "&", "'" ,"\""};
private static final String[] REPLACES = new String[] { "&", "<", ">", "'" ,"\""};
/** 置換文字 */
//private static final String[] MATCHES = new String[] { "<", ">", "&", "'", """ };
private static final String[] MATCHES = new String[] { "&", "<", ">", "'", """ };
/** エディタから発行のスタンプ名 */
// private static final String FROM_EDITOR = "エディタから発行...";
private final String FROM_EDITOR;
/** rootノードの名前 */
private String rootName;
/** エディタから発行があったかどうかのフラグ */
private boolean hasEditor;
/** StampTree のルートノード*/
private StampTreeNode rootNode;
/** StampTree のノード*/
private StampTreeNode node;
/** ノードの UserObject になる StampInfo */
private ModuleInfoBean info;
/** 制御用のリスト */
private LinkedList<StampTreeNode> linkedList;
/** 生成物 */
private List<StampTree> products;
/** Logger */
private Logger logger; // = ClientContext.getLogger("boot");
// Creates new ExtendedStampTreeBuilder
public ExtendedStampTreeBuilder() {
super();
FROM_EDITOR = ClientContext.getMyBundle(ExtendedStampTreeBuilder.class).getString("treeName.fromEditor");
}
public List<StampTree> getProduct() {
return products;
}
//build を開始する。
public void buildStart() {
products = new ArrayList<>();
if (logger != null) {
logger.debug("Build StampTree start");
}
}
/**
* Root を生成する。
* @param name root名
* @param entity
*/
public void buildRoot(String name, String entity) {
if (logger != null) {
logger.debug("Root=" + name);
}
linkedList = new LinkedList<>();
// TreeInfo を 生成し rootNode に保存する
TreeInfo treeInfo = new TreeInfo();
treeInfo.setName(name);
treeInfo.setEntity(entity);
rootNode = new StampTreeNode(treeInfo);
hasEditor = false;
rootName = name;
linkedList.addFirst(rootNode);
}
/**
* ノードを生成する。
* @param name ノード名
*/
public void buildNode(String name) {
if (logger != null) {
logger.debug("Node=" + name);
}
// Node を生成し現在のノードに加える
node = new StampTreeNode(toXmlText(name));
getCurrentNode().add(node);
// このノードを first に加える
linkedList.addFirst(node);
}
/**
* StampInfo を UserObject にするノードを生成する。
* @param name ノード名
* @param role
* @param entity
* @param editable 編集可能かどうかのフラグ
* @param memo メモ
* @param id DB key
* @param stampHexBytes StampModelのstampByetsをHex文字列にしたもの
*/
public void buildStampInfo(String name,
String role,
String entity,
String editable,
String memo,
String id,
String stampHexBytes) { // stampBytesのHex文字列を追加
if (logger != null) {
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(id);
sb.append(",");
sb.append(stampHexBytes); // stampBytesのHex文字列を追加
logger.debug(sb.toString());
}
// StampInfo を生成する
info = new ModuleInfoBean();
info.setStampName(toXmlText(name));
info.setStampRole(role);
info.setEntity(entity);
if (editable != null) {
info.setEditable(Boolean.valueOf(editable));
}
if (memo != null) {
info.setStampMemo(toXmlText(memo));
}
//minagawa^ LSCの運用に合うようにしただけ Backup ではなく新規ユーザーへ初期インストール
// if ( id != null ) {
// StampDelegater del = StampDelegater.getInstance();
// StampModel model = null;
// try {
// model = del.getStamp(id);
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
// // データベースに該当するIDのスタンプが存在する場合
// if (model != null) {
// info.setStampId(id);
// } else {
// // データベースにスタンプが存在しない場合は新たに作成して登録する。
// long userId = Project.getUserModel().getId();
// //String stampId = GUIDGenerator.generate(model);
// model = new StampModel();
// //model.setId(stampId);
// model.setId(id); // id 再利用
// model.setEntity(entity);
// model.setUserId(userId);
// byte[] stampBytes = HexBytesTool.hexToBytes(stampHexBytes);
// model.setStampBytes(stampBytes);
// // 新たに作成したStampModelをデータベースに登録する
// try {
// del.putStamp(model);
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
// // infoのstampIdは新たに生成したものに置き換える
// //info.setStampId(stampId);
// }
// }
if (id!=null && stampHexBytes!=null) {
StampModel model = new StampModel();
String stampId = GUIDGenerator.generate(model);
info.setStampId(stampId);
model.setId(stampId);
model.setEntity(entity);
model.setUserId(Project.getUserModel().getId());
byte[] stampBytes = HexBytesTool.hexToBytes(stampHexBytes);
model.setStampBytes(stampBytes);
// 新たに作成したStampModelをデータベースに登録する
try {
StampDelegater del = StampDelegater.getInstance();
del.putStamp(model);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//minagawa$
// StampInfo から TreeNode を生成し現在のノードへ追加する
node = new StampTreeNode(info);
getCurrentNode().add(node);
// エディタから発行を持っているか
if (info.getStampName().equals(FROM_EDITOR) && (! info.isSerialized()) ) {
hasEditor = true;
info.setEditable(false);
}
}
// Node の生成を終了する。
public void buildNodeEnd() {
if (logger != null) {
logger.debug("End node");
}
linkedList.removeFirst();
}
// Root Node の生成を終了する。
public void buildRootEnd() {
// エディタから発行...を削除された場合に追加する処置
if ( (!hasEditor) && (getEntity(rootName) != null) ) {
if (getEntity(rootName).equals(IInfoModel.ENTITY_TEXT) || getEntity(rootName).equals(IInfoModel.ENTITY_PATH)) {
// テキストスタンプとパススタンプにはエディタから発行...はなし
} else {
ModuleInfoBean si = new ModuleInfoBean();
si.setStampName(FROM_EDITOR);
si.setStampRole(IInfoModel.ROLE_P);
si.setEntity(getEntity(rootName));
si.setEditable(false);
StampTreeNode sn = new StampTreeNode(si);
rootNode.add(sn);
}
}
// StampTree を生成しプロダクトリストへ加える
StampTree tree = new StampTree(new StampTreeModel(rootNode));
products.add(tree);
if (logger != null) {
int pCount = products.size();
logger.debug("End root " + "count=" + pCount);
}
}
// build を終了する。
public void buildEnd() {
if (logger != null) {
logger.debug("Build end");
}
// ORCAセットを加える
boolean hasOrca = false;
for (StampTree st : products) {
String entity = st.getTreeInfo().getEntity();
if (entity.equals(IInfoModel.ENTITY_ORCA)) {
hasOrca = true;
}
}
if (!hasOrca) {
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("open.dolphin.stampbox.StampBoxResource");
TreeInfo treeInfo = new TreeInfo();
treeInfo.setName(bundle.getString("TABNAME_ORCA"));
treeInfo.setEntity(IInfoModel.ENTITY_ORCA);
rootNode = new StampTreeNode(treeInfo);
OrcaTree tree = new OrcaTree(new StampTreeModel(rootNode));
products.add((int)bundle.getObject("TAB_INDEX_ORCA"), tree);
if (logger != null) {
logger.debug("ORCAセットを加えました");
}
}
}
// リストから先頭の StampTreeNode を取り出す。
private StampTreeNode getCurrentNode() {
return linkedList.getFirst();
}
// 特殊文字を変換する。
private String toXmlText(String text) {
for (int i = 0; i < REPLACES.length; i++) {
text = text.replaceAll(MATCHES[i], REPLACES[i]);
}
return text;
}
private String getEntity(String rootName) {
String ret = null;
if (rootName == null) {
return ret;
}
String[] stampNames = (String[])java.util.ResourceBundle.getBundle("open.dolphin.stampbox.StampBoxResource").getObject("STAMP_NAMES");
for (int i = 0; i < IInfoModel.STAMP_ENTITIES.length; i++) {
if (stampNames[i].equals(rootName)) {
ret = IInfoModel.STAMP_ENTITIES[i];
break;
}
}
return ret;
}
}