package gr.ntua.ivml.athena.mapping;
import gr.ntua.ivml.athena.persistent.DataUpload;
import gr.ntua.ivml.athena.persistent.XpathHolder;
import gr.ntua.ivml.athena.util.TraversableI;
import gr.ntua.ivml.athena.xml.TreeGenerationParser;
import gr.ntua.ivml.athena.xml.Handler.Node;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Schema {
private String id = "";
private String filename = "";
private HashMap<String, MappingElement> map = new HashMap<String, MappingElement>();
private File file = null;
private DataUpload dataUpload = null;
private ArrayList<MappingElement> roots = new ArrayList<MappingElement>();
public Schema() { this.setId(""); this.file = null; this.dataUpload = null;}
public Schema(String id) { this.file = null; this.dataUpload = null; this.setId(id); }
private void addElementsToMap(ArrayList<MappingElement> root) {
String key = null;
for(MappingElement e: root) {
key = "tree_" + this.getId() + "_node_" + map.size();
map.put(key, e);
e.setId(key);
addElementsToMap(e.getAttributes());
addElementsToMap(e.getChildren());
}
}
//added for item tree building
private void addElementsToMap(ArrayList<MappingElement> root, int depth) {
String key = null;
for(MappingElement e: root) {
key = "tree_" + this.getId() + "_node_" + (map.size()+depth);
map.put(key, e);
e.setId(key);
addElementsToMap(e.getAttributes(),depth);
addElementsToMap(e.getChildren(),depth);
}
}
public void initFromFile(String filename) {
this.filename = filename;
System.out.println("schema(" + this.id + ") location: " + this.filename);
try {
this.file = new File(this.filename);
} catch(Exception e) {
System.out.println(e.toString());
this.file = null;
}
TreeGenerationParser parser = new TreeGenerationParser();
ArrayList<Node> nodes = parser.parseElements(this.file);
for(Node n: nodes) {
MappingElement element = new MappingElement(n);
this.roots.add(element);
}
addElementsToMap(roots);
}
public void initFromUpload(DataUpload upload) {
// this.dataUpload = DB.getDataUploadDAO().findById(Long.parseLong(this.uploadid), false);
this.dataUpload = upload;
XpathHolder rootXpath = this.dataUpload.getRootXpath();
if(rootXpath != null) {
List<? extends TraversableI> children = rootXpath.getChildren();
for(TraversableI t: children) {
XpathHolder xp = (XpathHolder) t;
MappingElement element = new MappingElement(xp);
this.roots.add(element);
}
}
addElementsToMap(roots);
}
public void initSubtreeFormUpload(DataUpload upload) {
// this.dataUpload = DB.getDataUploadDAO().findById(Long.parseLong(this.uploadid), false);
this.dataUpload = upload;
this.roots = new ArrayList<MappingElement>();
XpathHolder rootXpath =null;
if(this.dataUpload.getItemXpath()!=null)
rootXpath=this.dataUpload.getItemXpath().getParent();
if(rootXpath==null){
rootXpath=this.dataUpload.getItemXpath();
}
XpathHolder itemXpath = this.dataUpload.getItemXpath();
XpathHolder rXpath=this.dataUpload.getRootXpath();
List xpaths=rXpath.listOfXPaths(false);
int i=0;
//remove duplicate nodes with text()
List finalpaths=new ArrayList<String>();
for(Object t: xpaths) {
if(t.toString().length()==0 || t.toString().indexOf("/text()")>0){
// xpaths.remove(t);
continue;
}
else{
finalpaths.add(t);}
}
//find pos: used to build correct tooltip
int pos=finalpaths.indexOf(itemXpath.getXpathWithPrefix(false));
if(rootXpath != null && itemXpath!=null) {
List<? extends TraversableI> children = rootXpath.getChildren();
for(TraversableI t: children) {
XpathHolder xp = (XpathHolder) t;
if(xp!=itemXpath && xp.getParent()!=itemXpath){
continue;
}
MappingElement element = new MappingElement(xp);
this.roots.add(element);
}
}
addElementsToMap(roots, pos);
}
public void setId(String id) { this.id = id; }
public String getId() { return id; }
public void setFilename(String filename) {
}
public String getFilename() {
return filename;
}
public MappingElement getMappingElement(String name) {
MappingElement e = this.map.get(name);
return e;
}
public String printTree() {
return printTree(false);
}
public String printTree(boolean simple) {
StringBuffer out = new StringBuffer();
out.append("<div id=\"treemenu_" + this.getId() + "\">\n");
out.append("<ul>\n");
for(MappingElement e: roots) {
e.printTree(out, simple);
}
out.append("</ul>\n");
out.append("</div>");
return out.toString();
}
public Map<String, MappingElement> getMap() {
return this.map;
}
}