package open.dolphin.stampbox;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import open.dolphin.client.ClientContext;
import open.dolphin.infomodel.ModuleInfoBean;
/**
* DefaultStampTreeBuilder
*
* @author Kazushi Minagawa, Digital Globe, Inc.
*/
public class ASpStampTreeBuilder extends AbstractStampTreeBuilder {
/** Control staffs */
private StampTreeNode rootNode;
private StampTreeNode node;
private ModuleInfoBean info;
private LinkedList<StampTreeNode> linkedList;
private List<StampTree> products;
// Logger
private static final boolean DEBUG=false;
private static final java.util.logging.Logger logger;
static {
logger = java.util.logging.Logger.getLogger(ASpStampTreeBuilder.class.getName());
logger.setLevel(DEBUG ? Level.FINE : Level.INFO);
}
// Goddy conversion
private final boolean goddyConversion = true;
private boolean shidoParsing;
private boolean zaitakuParsing;
private final String convMatchInstraction;
private final String convReplaceInstraction;
private final String convMatchZaitaku;
private final String treeNameFromEditor;
/** Creates new DefaultStampTreeBuilder */
public ASpStampTreeBuilder() {
super();
java.util.ResourceBundle bundle = ClientContext.getMyBundle(ASpStampTreeBuilder.class);
convMatchInstraction = bundle.getString("text.instraction.conversion");
convReplaceInstraction = bundle.getString("text.replaceInstraction.conversion");
convMatchZaitaku = bundle.getString("text.zaitaku.conversion");
treeNameFromEditor = bundle.getString("treeName.fromEditor");
}
/**
* Returns the product of this builder
* @return vector that contains StampTree instances
*/
@Override
public List<StampTree> getProduct() {
return products;
}
@Override
public void buildStart() {
products = new ArrayList<>();
logger.fine("Build StampTree start");
}
@Override
public void buildRoot(String name, String entity) {
// New root
logger.log(Level.FINE, "Root={0}", name);
// Goddy conversion.
if (name.equals(convMatchInstraction) && goddyConversion){
name = convReplaceInstraction;
shidoParsing = true;
}
else if (name.equals(convMatchZaitaku) && goddyConversion) {
zaitakuParsing = true;
return;
}
//--------------------------------------
linkedList = new LinkedList<>();
// TreeInfo を rootNode に保存する
TreeInfo treeInfo = new TreeInfo();
treeInfo.setName(name);
treeInfo.setEntity(entity);
rootNode = new StampTreeNode(treeInfo);
linkedList.addFirst(rootNode);
}
@Override
public void buildNode(String name) {
// New node
logger.log(Level.FINE, "Node={0}", name);
node = new StampTreeNode(name);
getCurrentNode().add(node);
// Add the new node to be current node
linkedList.addFirst(node);
}
@Override
public void buildStampInfo(String name,
String role,
String entity,
String editable,
String memo,
String id) {
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(id);
logger.fine(sb.toString());
}
// ASP Tree なのでエディタから発行を無視する
if (name.equals(treeNameFromEditor) && (id == null) && (role.equals("p")) ) {
return;
}
info = new ModuleInfoBean();
info.setStampName(name);
info.setStampRole(role);
info.setEntity(entity);
if (editable != null) {
info.setEditable(Boolean.valueOf(editable));
}
if (memo != null) {
info.setStampMemo(memo);
}
if ( id != null ) {
info.setStampId(id);
}
// StampInfo から TreeNode を生成し現在のノードへ追加する
node = new StampTreeNode(info);
getCurrentNode().add(node);
}
@Override
public void buildNodeEnd() {
logger.fine("End node");
linkedList.removeFirst();
}
@Override
public void buildRootEnd() {
if (shidoParsing && goddyConversion) {
shidoParsing = false;
return;
}
StampTree tree = new StampTree(new StampTreeModel(rootNode));
products.add(tree);
int pCount = products.size();
logger.log(Level.FINE, "End root count={0}", String.valueOf(pCount));
}
@Override
public void buildEnd() {
if (DEBUG) {
logger.fine("Build end");
}
}
private StampTreeNode getCurrentNode() {
return (StampTreeNode) linkedList.getFirst();
}
}