package org.insightech.er.editor.persistent.impl;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.insightech.er.ResourceString;
import org.insightech.er.db.DBManagerFactory;
import org.insightech.er.db.impl.db2.DB2DBManager;
import org.insightech.er.db.impl.db2.tablespace.DB2TablespaceProperties;
import org.insightech.er.db.impl.mysql.MySQLDBManager;
import org.insightech.er.db.impl.mysql.MySQLTableProperties;
import org.insightech.er.db.impl.mysql.tablespace.MySQLTablespaceProperties;
import org.insightech.er.db.impl.oracle.OracleDBManager;
import org.insightech.er.db.impl.oracle.tablespace.OracleTablespaceProperties;
import org.insightech.er.db.impl.postgres.PostgresDBManager;
import org.insightech.er.db.impl.postgres.PostgresTableProperties;
import org.insightech.er.db.impl.postgres.tablespace.PostgresTablespaceProperties;
import org.insightech.er.db.impl.standard_sql.StandardSQLDBManager;
import org.insightech.er.db.sqltype.SqlType;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.ViewableModel;
import org.insightech.er.editor.model.diagram_contents.DiagramContents;
import org.insightech.er.editor.model.diagram_contents.element.connection.Bendpoint;
import org.insightech.er.editor.model.diagram_contents.element.connection.CommentConnection;
import org.insightech.er.editor.model.diagram_contents.element.connection.ConnectionElement;
import org.insightech.er.editor.model.diagram_contents.element.connection.Relation;
import org.insightech.er.editor.model.diagram_contents.element.node.Location;
import org.insightech.er.editor.model.diagram_contents.element.node.NodeElement;
import org.insightech.er.editor.model.diagram_contents.element.node.NodeSet;
import org.insightech.er.editor.model.diagram_contents.element.node.category.Category;
import org.insightech.er.editor.model.diagram_contents.element.node.ermodel.ERModel;
import org.insightech.er.editor.model.diagram_contents.element.node.ermodel.VGroup;
import org.insightech.er.editor.model.diagram_contents.element.node.image.InsertedImage;
import org.insightech.er.editor.model.diagram_contents.element.node.model_properties.ModelProperties;
import org.insightech.er.editor.model.diagram_contents.element.node.note.Note;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERVirtualTable;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.Column;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.NormalColumn;
import org.insightech.er.editor.model.diagram_contents.element.node.table.index.Index;
import org.insightech.er.editor.model.diagram_contents.element.node.table.properties.TableProperties;
import org.insightech.er.editor.model.diagram_contents.element.node.table.unique_key.ComplexUniqueKey;
import org.insightech.er.editor.model.diagram_contents.element.node.view.View;
import org.insightech.er.editor.model.diagram_contents.element.node.view.properties.ViewProperties;
import org.insightech.er.editor.model.diagram_contents.not_element.dictionary.Dictionary;
import org.insightech.er.editor.model.diagram_contents.not_element.dictionary.TypeData;
import org.insightech.er.editor.model.diagram_contents.not_element.dictionary.UniqueWord;
import org.insightech.er.editor.model.diagram_contents.not_element.dictionary.Word;
import org.insightech.er.editor.model.diagram_contents.not_element.group.ColumnGroup;
import org.insightech.er.editor.model.diagram_contents.not_element.group.GroupSet;
import org.insightech.er.editor.model.diagram_contents.not_element.sequence.Sequence;
import org.insightech.er.editor.model.diagram_contents.not_element.sequence.SequenceSet;
import org.insightech.er.editor.model.diagram_contents.not_element.tablespace.Tablespace;
import org.insightech.er.editor.model.diagram_contents.not_element.tablespace.TablespaceProperties;
import org.insightech.er.editor.model.diagram_contents.not_element.tablespace.TablespaceSet;
import org.insightech.er.editor.model.diagram_contents.not_element.trigger.Trigger;
import org.insightech.er.editor.model.diagram_contents.not_element.trigger.TriggerSet;
import org.insightech.er.editor.model.settings.CategorySetting;
import org.insightech.er.editor.model.settings.DBSetting;
import org.insightech.er.editor.model.settings.Environment;
import org.insightech.er.editor.model.settings.EnvironmentSetting;
import org.insightech.er.editor.model.settings.ExportSetting;
import org.insightech.er.editor.model.settings.PageSetting;
import org.insightech.er.editor.model.settings.Settings;
import org.insightech.er.editor.model.settings.TranslationSetting;
import org.insightech.er.editor.model.settings.export.ExportJavaSetting;
import org.insightech.er.editor.model.settings.export.ExportTestDataSetting;
import org.insightech.er.editor.model.testdata.DirectTestData;
import org.insightech.er.editor.model.testdata.RepeatTestData;
import org.insightech.er.editor.model.testdata.RepeatTestDataDef;
import org.insightech.er.editor.model.testdata.TableTestData;
import org.insightech.er.editor.model.testdata.TestData;
import org.insightech.er.editor.model.tracking.ChangeTracking;
import org.insightech.er.editor.model.tracking.ChangeTrackingList;
import org.insightech.er.util.Format;
import org.insightech.er.util.NameValue;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLLoader {
private ERDiagram diagram;
private String database;
private class LoadContext {
private Map<String, NodeElement> nodeElementMap;
private Map<String, NormalColumn> columnMap;
private Map<String, ComplexUniqueKey> complexUniqueKeyMap;
private Map<NormalColumn, String[]> columnRelationMap;
private Map<NormalColumn, String[]> columnReferencedColumnMap;
private Map<String, ColumnGroup> columnGroupMap;
private Map<String, ERModel> ermodelMap;
private Map<Relation, String> referencedColumnMap;
private Map<Relation, String> referencedComplexUniqueKeyMap;
private Map<ConnectionElement, String> connectionSourceMap;
private Map<ConnectionElement, String> connectionTargetMap;
private Map<String, ConnectionElement> connectionMap;
private Map<String, Word> wordMap;
private Map<String, Tablespace> tablespaceMap;
private Map<String, Environment> environmentMap;
private Map<UniqueWord, Word> uniqueWordMap;
private Dictionary dictionary;
private LoadContext(Dictionary dictionary) {
this.nodeElementMap = new HashMap<String, NodeElement>();
this.columnMap = new HashMap<String, NormalColumn>();
this.complexUniqueKeyMap = new HashMap<String, ComplexUniqueKey>();
this.columnRelationMap = new HashMap<NormalColumn, String[]>();
this.columnReferencedColumnMap = new HashMap<NormalColumn, String[]>();
this.ermodelMap = new HashMap<String, ERModel>();
this.columnGroupMap = new HashMap<String, ColumnGroup>();
this.referencedColumnMap = new HashMap<Relation, String>();
this.referencedComplexUniqueKeyMap = new HashMap<Relation, String>();
this.connectionMap = new HashMap<String, ConnectionElement>();
this.connectionSourceMap = new HashMap<ConnectionElement, String>();
this.connectionTargetMap = new HashMap<ConnectionElement, String>();
this.wordMap = new HashMap<String, Word>();
this.tablespaceMap = new HashMap<String, Tablespace>();
this.environmentMap = new HashMap<String, Environment>();
this.uniqueWordMap = new HashMap<UniqueWord, Word>();
this.dictionary = dictionary;
this.dictionary.clear();
}
private void resolve() {
for (ConnectionElement connection : this.connectionSourceMap
.keySet()) {
String id = this.connectionSourceMap.get(connection);
NodeElement nodeElement = this.nodeElementMap.get(id);
if (nodeElement == null) {
System.out.println("error");
}
connection.setSource(nodeElement);
}
for (ConnectionElement connection : this.connectionTargetMap
.keySet()) {
String id = this.connectionTargetMap.get(connection);
NodeElement nodeElement = this.nodeElementMap.get(id);
if (nodeElement == null) {
System.out.println("error");
}
connection.setTarget(nodeElement);
}
for (Relation relation : this.referencedColumnMap.keySet()) {
String id = this.referencedColumnMap.get(relation);
NormalColumn column = this.columnMap.get(id);
if (column == null) {
System.out.println("error");
}
relation.setReferencedColumn(column);
}
for (Relation relation : this.referencedComplexUniqueKeyMap
.keySet()) {
String id = this.referencedComplexUniqueKeyMap.get(relation);
ComplexUniqueKey complexUniqueKey = this.complexUniqueKeyMap
.get(id);
relation.setReferencedComplexUniqueKey(complexUniqueKey);
}
Set<NormalColumn> foreignKeyColumnSet = this.columnReferencedColumnMap
.keySet();
while (!foreignKeyColumnSet.isEmpty()) {
NormalColumn foreignKeyColumn = foreignKeyColumnSet.iterator()
.next();
reduce(foreignKeyColumnSet, foreignKeyColumn);
}
}
private void reduce(Set<NormalColumn> foreignKeyColumnSet,
NormalColumn foreignKeyColumn) {
String[] referencedColumnIds = this.columnReferencedColumnMap
.get(foreignKeyColumn);
String[] relationIds = this.columnRelationMap.get(foreignKeyColumn);
List<NormalColumn> referencedColumnList = new ArrayList<NormalColumn>();
if (referencedColumnIds != null) {
for (String referencedColumnId : referencedColumnIds) {
try {
Integer.parseInt(referencedColumnId);
NormalColumn referencedColumn = this.columnMap
.get(referencedColumnId);
referencedColumnList.add(referencedColumn);
if (foreignKeyColumnSet.contains(referencedColumn)) {
reduce(foreignKeyColumnSet, referencedColumn);
}
} catch (NumberFormatException e) {
}
}
}
if (relationIds != null) {
for (String relationId : relationIds) {
try {
Integer.parseInt(relationId);
Relation relation = (Relation) this.connectionMap
.get(relationId);
for (NormalColumn referencedColumn : referencedColumnList) {
if (referencedColumn.getColumnHolder() == relation
.getSourceTableView()) {
foreignKeyColumn.addReference(referencedColumn,
relation);
break;
}
}
} catch (NumberFormatException e) {
}
}
}
foreignKeyColumnSet.remove(foreignKeyColumn);
}
}
public ERDiagram load(InputStream in) throws Exception {
DocumentBuilder parser = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
Document document = parser.parse(in);
Node root = document.getFirstChild();
while (root.getNodeType() == Node.COMMENT_NODE) {
document.removeChild(root);
root = document.getFirstChild();
}
load((Element) root);
return this.diagram;
}
private String getStringValue(Element element, String tagname) {
NodeList nodeList = element.getElementsByTagName(tagname);
if (nodeList.getLength() == 0) {
return null;
}
Node node = nodeList.item(0);
if (node.getFirstChild() == null) {
return "";
}
return node.getFirstChild().getNodeValue();
}
private String[] getTagValues(Element element, String tagname) {
NodeList nodeList = element.getElementsByTagName(tagname);
String[] values = new String[nodeList.getLength()];
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getFirstChild() != null) {
values[i] = node.getFirstChild().getNodeValue();
}
}
return values;
}
private boolean getBooleanValue(Element element, String tagname) {
return getBooleanValue(element, tagname, false);
}
private boolean getBooleanValue(Element element, String tagname,
boolean defaultValue) {
NodeList nodeList = element.getElementsByTagName(tagname);
if (nodeList.getLength() == 0) {
return defaultValue;
}
Node node = nodeList.item(0);
String value = node.getFirstChild().getNodeValue();
return Boolean.valueOf(value).booleanValue();
}
private int getIntValue(Element element, String tagname) {
return getIntValue(element, tagname, 0);
}
private int getIntValue(Element element, String tagname, int defaultValue) {
NodeList nodeList = element.getElementsByTagName(tagname);
if (nodeList.getLength() == 0) {
return defaultValue;
}
Node node = nodeList.item(0);
if (node.getFirstChild() == null) {
return defaultValue;
}
String value = node.getFirstChild().getNodeValue();
return Integer.valueOf(value).intValue();
}
private Integer getIntegerValue(Element element, String tagname) {
NodeList nodeList = element.getElementsByTagName(tagname);
if (nodeList.getLength() == 0) {
return null;
}
Node node = nodeList.item(0);
if (node.getFirstChild() == null) {
return null;
}
String value = node.getFirstChild().getNodeValue();
try {
return Integer.valueOf(value);
} catch (NumberFormatException e) {
return null;
}
}
private Long getLongValue(Element element, String tagname) {
NodeList nodeList = element.getElementsByTagName(tagname);
if (nodeList.getLength() == 0) {
return null;
}
Node node = nodeList.item(0);
if (node.getFirstChild() == null) {
return null;
}
String value = node.getFirstChild().getNodeValue();
try {
return Long.valueOf(value);
} catch (NumberFormatException e) {
return null;
}
}
private BigDecimal getBigDecimalValue(Element element, String tagname) {
String value = this.getStringValue(element, tagname);
try {
return new BigDecimal(value);
} catch (Exception e) {
}
return null;
}
private double getDoubleValue(Element element, String tagname) {
NodeList nodeList = element.getElementsByTagName(tagname);
if (nodeList.getLength() == 0) {
return 0;
}
Node node = nodeList.item(0);
if (node.getFirstChild() == null) {
return 0;
}
String value = node.getFirstChild().getNodeValue();
return Double.valueOf(value).doubleValue();
}
private Date getDateValue(Element element, String tagname) {
NodeList nodeList = element.getElementsByTagName(tagname);
if (nodeList.getLength() == 0) {
return null;
}
Node node = nodeList.item(0);
if (node.getFirstChild() == null) {
return null;
}
String value = node.getFirstChild().getNodeValue();
try {
return PersistentXmlImpl.DATE_FORMAT.parse(value);
} catch (ParseException e) {
return null;
}
}
private Element getElement(Element element, String tagname) {
NodeList nodeList = element.getChildNodes();
if (nodeList.getLength() == 0) {
return null;
}
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() == Node.ELEMENT_NODE) {
Element ele = (Element) nodeList.item(i);
if (ele.getTagName().equals(tagname)) {
return ele;
}
}
}
return null;
}
private void load(Element root) {
Element settings = this.getElement(root, "settings");
this.database = this.loadDatabase(settings);
this.diagram = new ERDiagram(this.database);
this.loadDBSetting(this.diagram, root);
this.loadPageSetting(this.diagram, root);
this.loadColor(this.diagram, root);
this.loadDefaultColor(this.diagram, root);
this.loadFont(this.diagram, root);
DiagramContents diagramContents = this.diagram.getDiagramContents();
this.loadDiagramContents(diagramContents, root);
this.diagram.setCurrentCategory(null, this.getIntValue(root, "category_index"));
this.diagram.setCurrentErmodel(null, this.getStringValue(root, "current_ermodel"));
double zoom = this.getDoubleValue(root, "zoom");
this.diagram.setZoom(zoom);
int x = this.getIntValue(root, "x");
int y = this.getIntValue(root, "y");
this.diagram.setLocation(x, y);
this.loadChangeTrackingList(this.diagram.getChangeTrackingList(), root);
this.diagram.getDiagramContents().getSettings().getTranslationSetting()
.load();
}
private String loadDatabase(Element settingsElement) {
String database = this.getStringValue(settingsElement, "database");
if (database == null) {
database = DBManagerFactory.getAllDBList().get(0);
}
return database;
}
private void loadDiagramContents(DiagramContents diagramContents,
Element parent) {
Dictionary dictionary = diagramContents.getDictionary();
LoadContext context = new LoadContext(dictionary);
this.loadDictionary(dictionary, parent, context);
Settings settings = diagramContents.getSettings();
this.loadEnvironmentSetting(settings.getEnvironmentSetting(), parent,
context);
this.loadTablespaceSet(diagramContents.getTablespaceSet(), parent,
context);
GroupSet columnGroups = diagramContents.getGroups();
columnGroups.clear();
this.loadColumnGroups(columnGroups, parent, context);
this.loadContents(diagramContents.getContents(), parent, context);
diagramContents.getModelSet().addModels(this.loadErmodels(parent, context));
this.loadTestDataList(diagramContents.getTestDataList(), parent,
context);
this.loadSequenceSet(diagramContents.getSequenceSet(), parent);
this.loadTriggerSet(diagramContents.getTriggerSet(), parent);
this.loadSettings(settings, parent, context);
context.resolve();
}
private List<ERModel> loadErmodels(Element parent, LoadContext context) {
List<ERModel> results = new ArrayList<ERModel>();
Element element = this.getElement(parent, "ermodels");
if (element != null) {
NodeList nodeList = element.getElementsByTagName("ermodel");
for (int i = 0; i < nodeList.getLength(); i++) {
Element modelElement = (Element) nodeList.item(i);
ERModel model = new ERModel(diagram);
model.setName(getStringValue(modelElement, "name"));
loadColor(model, modelElement);
List<ERVirtualTable> tables = new ArrayList<ERVirtualTable>();
Element vtables = getElement(modelElement, "vtables");
if (vtables != null) {
NodeList tableEls = vtables.getElementsByTagName("vtable");
for (int k = 0; k < tableEls.getLength(); k++) {
Element tableElement = (Element) tableEls.item(k);
tables.add(loadVirtualTable(model, tableElement, context));
}
}
model.setTables(tables);
List<Note> notes = new ArrayList<Note>();
Element elNotes = getElement(modelElement, "notes");
if (elNotes != null) {
NodeList noteEls = elNotes.getElementsByTagName("note");
for (int k = 0; k < noteEls.getLength(); k++) {
Element noteElement = (Element) noteEls.item(k);
Note note = loadNote(model, noteElement, context);
String id = this.getStringValue(noteElement, "id");
context.nodeElementMap.put(id, note);
notes.add(note);
diagram.getDiagramContents().getContents().addNodeElement(note);
}
}
model.setNotes(notes);
List<VGroup> groups = new ArrayList<VGroup>();
Element elGroups = getElement(modelElement, "groups");
if (elGroups != null) {
NodeList groupEls = elGroups.getElementsByTagName("group");
for (int k = 0; k < groupEls.getLength(); k++) {
Element groupElement = (Element) groupEls.item(k);
VGroup group = loadGroup(model, groupElement, context);
String id = this.getStringValue(groupElement, "id");
context.nodeElementMap.put(id, group);
groups.add(group);
}
}
model.setGroups(groups);
String id = this.getStringValue(modelElement, "id");
context.ermodelMap.put(id, model);
results.add(model);
}
}
return results;
}
private ERModel loadErmodel(Element parent, LoadContext context) {
ERModel model = new ERModel(diagram);
model.setName(getStringValue(parent, "name"));
List<ERVirtualTable> tables = new ArrayList<ERVirtualTable>();
Element vtables = getElement(parent, "vtables");
if (vtables != null) {
NodeList tableEls = vtables.getElementsByTagName("vtable");
for (int k = 0; k < tableEls.getLength(); k++) {
Element tableElement = (Element) tableEls.item(k);
tables.add(loadVirtualTable(model, tableElement, context));
}
}
model.setTables(tables);
String id = this.getStringValue(parent, "id");
context.ermodelMap.put(id, model);
return model;
}
private void loadSequenceSet(SequenceSet sequenceSet, Element parent) {
Element element = this.getElement(parent, "sequence_set");
if (element != null) {
NodeList nodeList = element.getElementsByTagName("sequence");
for (int i = 0; i < nodeList.getLength(); i++) {
Element sequenceElemnt = (Element) nodeList.item(i);
Sequence sequence = this.loadSequence(sequenceElemnt);
sequenceSet.addSequence(sequence);
}
}
}
private Sequence loadSequence(Element element) {
Sequence sequence = new Sequence();
sequence.setName(this.getStringValue(element, "name"));
sequence.setSchema(this.getStringValue(element, "schema"));
sequence.setIncrement(this.getIntegerValue(element, "increment"));
sequence.setMinValue(this.getLongValue(element, "min_value"));
sequence.setMaxValue(this.getBigDecimalValue(element, "max_value"));
sequence.setStart(this.getLongValue(element, "start"));
sequence.setCache(this.getIntegerValue(element, "cache"));
sequence.setCycle(this.getBooleanValue(element, "cycle"));
sequence.setOrder(this.getBooleanValue(element, "order"));
sequence.setDescription(this.getStringValue(element, "description"));
sequence.setDataType(this.getStringValue(element, "data_type"));
sequence.setDecimalSize(this.getIntValue(element, "decimal_size"));
return sequence;
}
private void loadTriggerSet(TriggerSet triggerSet, Element parent) {
Element element = this.getElement(parent, "trigger_set");
if (element != null) {
NodeList nodeList = element.getElementsByTagName("trigger");
for (int i = 0; i < nodeList.getLength(); i++) {
Element triggerElemnt = (Element) nodeList.item(i);
Trigger trigger = this.loadTrigger(triggerElemnt);
triggerSet.addTrigger(trigger);
}
}
}
private Trigger loadTrigger(Element element) {
Trigger trigger = new Trigger();
trigger.setName(this.getStringValue(element, "name"));
trigger.setSchema(this.getStringValue(element, "schema"));
trigger.setSql(this.getStringValue(element, "sql"));
trigger.setDescription(this.getStringValue(element, "description"));
return trigger;
}
private void loadTablespaceSet(TablespaceSet tablespaceSet, Element parent,
LoadContext context) {
Element element = this.getElement(parent, "tablespace_set");
if (element != null) {
NodeList nodeList = element.getElementsByTagName("tablespace");
for (int i = 0; i < nodeList.getLength(); i++) {
Element tablespaceElemnt = (Element) nodeList.item(i);
Tablespace tablespace = this.loadTablespace(tablespaceElemnt,
context);
if (tablespace != null) {
tablespaceSet.addTablespace(tablespace);
}
}
}
}
private Tablespace loadTablespace(Element element, LoadContext context) {
String id = this.getStringValue(element, "id");
Tablespace tablespace = new Tablespace();
tablespace.setName(this.getStringValue(element, "name"));
NodeList nodeList = element.getElementsByTagName("properties");
for (int i = 0; i < nodeList.getLength(); i++) {
Element propertiesElemnt = (Element) nodeList.item(i);
String environmentId = this.getStringValue(propertiesElemnt,
"environment_id");
Environment environment = context.environmentMap.get(environmentId);
TablespaceProperties tablespaceProperties = null;
if (DB2DBManager.ID.equals(this.database)) {
tablespaceProperties = this
.loadTablespacePropertiesDB2(propertiesElemnt);
} else if (MySQLDBManager.ID.equals(this.database)) {
tablespaceProperties = this
.loadTablespacePropertiesMySQL(propertiesElemnt);
} else if (OracleDBManager.ID.equals(this.database)) {
tablespaceProperties = this
.loadTablespacePropertiesOracle(propertiesElemnt);
} else if (PostgresDBManager.ID.equals(this.database)) {
tablespaceProperties = this
.loadTablespacePropertiesPostgres(propertiesElemnt);
}
tablespace.putProperties(environment, tablespaceProperties);
}
if (id != null) {
context.tablespaceMap.put(id, tablespace);
}
return tablespace;
}
private TablespaceProperties loadTablespacePropertiesDB2(Element element) {
DB2TablespaceProperties properties = new DB2TablespaceProperties();
properties.setBufferPoolName(this.getStringValue(element,
"buffer_pool_name"));
properties.setContainer(this.getStringValue(element, "container"));
// properties.setContainerDevicePath(this.getStringValue(element,
// "container_device_path"));
// properties.setContainerDirectoryPath(this.getStringValue(element,
// "container_directory_path"));
// properties.setContainerFilePath(this.getStringValue(element,
// "container_file_path"));
// properties.setContainerPageNum(this.getStringValue(element,
// "container_page_num"));
properties.setExtentSize(this.getStringValue(element, "extent_size"));
properties.setManagedBy(this.getStringValue(element, "managed_by"));
properties.setPageSize(this.getStringValue(element, "page_size"));
properties.setPrefetchSize(this
.getStringValue(element, "prefetch_size"));
properties.setType(this.getStringValue(element, "type"));
return properties;
}
private TablespaceProperties loadTablespacePropertiesMySQL(Element element) {
MySQLTablespaceProperties properties = new MySQLTablespaceProperties();
properties.setDataFile(this.getStringValue(element, "data_file"));
properties.setEngine(this.getStringValue(element, "engine"));
properties.setExtentSize(this.getStringValue(element, "extent_size"));
properties.setInitialSize(this.getStringValue(element, "initial_size"));
properties.setLogFileGroup(this.getStringValue(element,
"log_file_group"));
return properties;
}
private TablespaceProperties loadTablespacePropertiesOracle(Element element) {
OracleTablespaceProperties properties = new OracleTablespaceProperties();
properties.setAutoExtend(this.getBooleanValue(element, "auto_extend"));
properties.setAutoExtendMaxSize(this.getStringValue(element,
"auto_extend_max_size"));
properties.setAutoExtendSize(this.getStringValue(element,
"auto_extend_size"));
properties.setAutoSegmentSpaceManagement(this.getBooleanValue(element,
"auto_segment_space_management"));
properties.setDataFile(this.getStringValue(element, "data_file"));
properties.setFileSize(this.getStringValue(element, "file_size"));
properties.setInitial(this.getStringValue(element, "initial"));
properties.setLogging(this.getBooleanValue(element, "logging"));
properties.setMaxExtents(this.getStringValue(element, "max_extents"));
properties.setMinExtents(this.getStringValue(element, "min_extents"));
properties.setMinimumExtentSize(this.getStringValue(element,
"minimum_extent_size"));
properties.setNext(this.getStringValue(element, "next"));
properties.setOffline(this.getBooleanValue(element, "offline"));
properties.setPctIncrease(this.getStringValue(element, "pct_increase"));
properties.setTemporary(this.getBooleanValue(element, "temporary"));
return properties;
}
private TablespaceProperties loadTablespacePropertiesPostgres(
Element element) {
PostgresTablespaceProperties properties = new PostgresTablespaceProperties();
properties.setLocation(this.getStringValue(element, "location"));
properties.setOwner(this.getStringValue(element, "owner"));
return properties;
}
private void loadChangeTrackingList(ChangeTrackingList changeTrackingList,
Element parent) {
Element element = this.getElement(parent, "change_tracking_list");
if (element != null) {
NodeList nodeList = element.getElementsByTagName("change_tracking");
for (int i = 0; i < nodeList.getLength(); i++) {
Element changeTrackingElemnt = (Element) nodeList.item(i);
ChangeTracking changeTracking = this
.loadChangeTracking(changeTrackingElemnt);
changeTrackingList.addChangeTracking(changeTracking);
}
}
}
private ChangeTracking loadChangeTracking(Element element) {
DiagramContents diagramContents = new DiagramContents();
loadDiagramContents(diagramContents, element);
ChangeTracking changeTracking = new ChangeTracking(diagramContents);
changeTracking.setComment(this.getStringValue(element, "comment"));
changeTracking.setUpdatedDate(this
.getDateValue(element, "updated_date"));
return changeTracking;
}
private void loadColumnGroups(GroupSet columnGroups, Element parent,
LoadContext context) {
Element element = this.getElement(parent, "column_groups");
NodeList nodeList = element.getElementsByTagName("column_group");
for (int i = 0; i < nodeList.getLength(); i++) {
Element columnGroupElement = (Element) nodeList.item(i);
ColumnGroup columnGroup = new ColumnGroup();
columnGroup.setGroupName(this.getStringValue(columnGroupElement,
"group_name"));
List<Column> columns = this
.loadColumns(columnGroupElement, context);
for (Column column : columns) {
columnGroup.addColumn((NormalColumn) column);
}
columnGroups.add(columnGroup);
String id = this.getStringValue(columnGroupElement, "id");
context.columnGroupMap.put(id, columnGroup);
}
}
private void loadTestDataList(List<TestData> testDataList, Element parent,
LoadContext context) {
Element element = this.getElement(parent, "test_data_list");
if (element != null) {
NodeList nodeList = element.getElementsByTagName("test_data");
for (int i = 0; i < nodeList.getLength(); i++) {
Element testDataElement = (Element) nodeList.item(i);
TestData testData = new TestData();
this.loadTestData(testData, testDataElement, context);
testDataList.add(testData);
}
}
}
private void loadTestData(TestData testData, Element element,
LoadContext context) {
testData.setName(this.getStringValue(element, "name"));
testData.setExportOrder(this.getIntValue(element, "export_order"));
NodeList nodeList = element.getElementsByTagName("table_test_data");
for (int i = 0; i < nodeList.getLength(); i++) {
Element tableTestDataElement = (Element) nodeList.item(i);
TableTestData tableTestData = new TableTestData();
String tableId = this.getStringValue(tableTestDataElement,
"table_id");
ERTable table = (ERTable) context.nodeElementMap.get(tableId);
if (table != null) {
this.loadDirectTestData(tableTestData.getDirectTestData(),
tableTestDataElement, context);
this.loadRepeatTestData(tableTestData.getRepeatTestData(),
tableTestDataElement, context);
testData.putTableTestData(table, tableTestData);
}
}
}
private void loadDirectTestData(DirectTestData directTestData,
Element parent, LoadContext context) {
Element element = this.getElement(parent, "direct_test_data");
NodeList nodeList = element.getElementsByTagName("data");
List<Map<NormalColumn, String>> dataList = directTestData.getDataList();
for (int i = 0; i < nodeList.getLength(); i++) {
Element dataElement = (Element) nodeList.item(i);
NodeList columnNodeList = dataElement
.getElementsByTagName("column_data");
Map<NormalColumn, String> data = new HashMap<NormalColumn, String>();
for (int j = 0; j < columnNodeList.getLength(); j++) {
Element columnDataElement = (Element) columnNodeList.item(j);
String columnId = this.getStringValue(columnDataElement,
"column_id");
NormalColumn column = context.columnMap.get(columnId);
String value = this.getStringValue(columnDataElement, "value");
data.put(column, value);
}
dataList.add(data);
}
}
private void loadRepeatTestData(RepeatTestData repeatTestData,
Element parent, LoadContext context) {
Element element = this.getElement(parent, "repeat_test_data");
int testDataNum = this.getIntegerValue(element, "test_data_num");
repeatTestData.setTestDataNum(testDataNum);
Element dataDefListElement = this.getElement(element, "data_def_list");
NodeList nodeList = dataDefListElement.getElementsByTagName("data_def");
for (int i = 0; i < nodeList.getLength(); i++) {
Element dataDefElement = (Element) nodeList.item(i);
String columnId = this.getStringValue(dataDefElement, "column_id");
NormalColumn column = context.columnMap.get(columnId);
RepeatTestDataDef dataDef = new RepeatTestDataDef();
dataDef.setType(this.getStringValue(dataDefElement, "type"));
dataDef.setRepeatNum(this.getIntValue(dataDefElement, "repeat_num"));
dataDef.setTemplate(this.getStringValue(dataDefElement, "template"));
dataDef.setFrom(this.getIntValue(dataDefElement, "from"));
dataDef.setTo(this.getIntValue(dataDefElement, "to"));
dataDef.setIncrement(this.getIntValue(dataDefElement, "increment"));
dataDef.setSelects(this.getTagValues(dataDefElement, "select"));
Element modifiedValuesElement = this.getElement(dataDefElement,
"modified_values");
if (modifiedValuesElement != null) {
NodeList modifiedValueNodeList = modifiedValuesElement
.getElementsByTagName("modified_value");
for (int j = 0; j < modifiedValueNodeList.getLength(); j++) {
Element modifiedValueNode = (Element) modifiedValueNodeList
.item(j);
Integer row = this.getIntValue(modifiedValueNode, "row");
String value = this.getStringValue(modifiedValueNode,
"value");
dataDef.setModifiedValue(row, value);
}
}
repeatTestData.setDataDef(column, dataDef);
}
}
private void loadDictionary(Dictionary dictionary, Element parent,
LoadContext context) {
Element element = this.getElement(parent, "dictionary");
if (element != null) {
NodeList nodeList = element.getElementsByTagName("word");
for (int i = 0; i < nodeList.getLength(); i++) {
Element wordElement = (Element) nodeList.item(i);
this.loadWord(wordElement, context);
}
}
}
private Word loadWord(Element element, LoadContext context) {
String id = this.getStringValue(element, "id");
String type = this.getStringValue(element, "type");
TypeData typeData = new TypeData(
this.getIntegerValue(element, "length"), this.getIntegerValue(
element, "decimal"), this.getBooleanValue(element,
"array"), this.getIntegerValue(element,
"array_dimension"), this.getBooleanValue(element,
"unsigned"), this.getStringValue(element, "args"));
Word word = new Word(Format.null2blank(this.getStringValue(element,
"physical_name")), Format.null2blank(this.getStringValue(
element, "logical_name")), SqlType.valueOfId(type), typeData,
Format.null2blank(this.getStringValue(element, "description")),
this.database);
context.wordMap.put(id, word);
return word;
}
private List<Column> loadColumns(Element parent, LoadContext context) {
List<Column> columns = new ArrayList<Column>();
Element element = this.getElement(parent, "columns");
NodeList groupList = element.getChildNodes();
for (int i = 0; i < groupList.getLength(); i++) {
if (groupList.item(i).getNodeType() != Node.ELEMENT_NODE) {
continue;
}
Element columnElement = (Element) groupList.item(i);
if ("column_group".equals(columnElement.getTagName())) {
ColumnGroup column = this.loadColumnGroup(columnElement,
context);
columns.add(column);
} else if ("normal_column".equals(columnElement.getTagName())) {
NormalColumn column = this.loadNormalColumn(columnElement,
context);
columns.add(column);
}
}
return columns;
}
private ColumnGroup loadColumnGroup(Element element, LoadContext context) {
String key = element.getFirstChild().getNodeValue();
return context.columnGroupMap.get(key);
}
private NormalColumn loadNormalColumn(Element element, LoadContext context) {
String id = this.getStringValue(element, "id");
String type = this.getStringValue(element, "type");
String wordId = this.getStringValue(element, "word_id");
Word word = context.wordMap.get(wordId);
NormalColumn normalColumn = null;
if (word == null) {
word = new Word(this.getStringValue(element, "physical_name"),
this.getStringValue(element, "logical_name"),
SqlType.valueOfId(type), new TypeData(null, null, false,
null, false, null), this.getStringValue(element,
"description"), database);
UniqueWord uniqueWord = new UniqueWord(word);
if (context.uniqueWordMap.containsKey(uniqueWord)) {
word = context.uniqueWordMap.get(uniqueWord);
} else {
context.uniqueWordMap.put(uniqueWord, word);
}
}
normalColumn = new NormalColumn(word, this.getBooleanValue(element,
"not_null"), this.getBooleanValue(element, "primary_key"),
this.getBooleanValue(element, "unique_key"),
this.getBooleanValue(element, "auto_increment"),
this.getStringValue(element, "default_value"),
this.getStringValue(element, "constraint"),
this.getStringValue(element, "unique_key_name"),
this.getStringValue(element, "character_set"),
this.getStringValue(element, "collation"));
Element autoIncrementSettingElement = this.getElement(element,
"sequence");
if (autoIncrementSettingElement != null) {
Sequence autoIncrementSetting = this
.loadSequence(autoIncrementSettingElement);
normalColumn.setAutoIncrementSetting(autoIncrementSetting);
}
boolean isForeignKey = false;
String[] relationIds = this.getTagValues(element, "relation");
if (relationIds != null) {
context.columnRelationMap.put(normalColumn, relationIds);
}
String[] referencedColumnIds = this.getTagValues(element,
"referenced_column");
List<String> temp = new ArrayList<String>();
for (String str : referencedColumnIds) {
try {
if (str != null) {
Integer.parseInt(str);
temp.add(str);
}
} catch (NumberFormatException e) {
}
}
referencedColumnIds = temp.toArray(new String[temp.size()]);
if (referencedColumnIds.length != 0) {
context.columnReferencedColumnMap.put(normalColumn,
referencedColumnIds);
isForeignKey = true;
}
if (!isForeignKey) {
context.dictionary.add(normalColumn);
}
context.columnMap.put(id, normalColumn);
return normalColumn;
}
private void loadSettings(Settings settings, Element parent,
LoadContext context) {
Element element = this.getElement(parent, "settings");
if (element != null) {
settings.setDatabase(this.loadDatabase(element));
settings.setCapital(this.getBooleanValue(element, "capital"));
settings.setTableStyle(Format.null2blank(this.getStringValue(
element, "table_style")));
settings.setNotation(this.getStringValue(element, "notation"));
settings.setNotationLevel(this.getIntValue(element,
"notation_level"));
settings.setNotationExpandGroup(this.getBooleanValue(element,
"notation_expand_group"));
settings.setViewMode(this.getIntValue(element, "view_mode"));
settings.setOutlineViewMode(this.getIntValue(element,
"outline_view_mode"));
settings.setViewOrderBy(this.getIntValue(element, "view_order_by"));
settings.setAutoImeChange(this.getBooleanValue(element,
"auto_ime_change"));
settings.setValidatePhysicalName(this.getBooleanValue(element,
"validate_physical_name", true));
settings.setUseBezierCurve(this.getBooleanValue(element,
"use_bezier_curve"));
settings.setSuspendValidator(this.getBooleanValue(element,
"suspend_validator"));
if (this.getStringValue(element, "titleFontEm") != null) {
settings.setTitleFontEm(new BigDecimal(this.getStringValue(element, "titleFontEm")));
}
if (this.getStringValue(element, "masterDataBasePath") != null) {
settings.setMasterDataBasePath(this.getStringValue(element, "masterDataBasePath"));
}
ExportSetting exportSetting = settings.getExportSetting();
this.loadExportSetting(exportSetting, element, context);
CategorySetting categorySetting = settings.getCategorySetting();
this.loadCategorySetting(categorySetting, element, context);
TranslationSetting translationSetting = settings
.getTranslationSetting();
this.loadTranslationSetting(translationSetting, element, context);
ModelProperties modelProperties = settings.getModelProperties();
this.loadModelProperties(modelProperties, element);
this.loadTableProperties(
(TableProperties) settings.getTableViewProperties(),
element, context);
}
}
private void loadExportSetting(ExportSetting exportSetting, Element parent,
LoadContext context) {
Element element = this.getElement(parent, "export_setting");
if (element != null) {
exportSetting.setCategoryNameToExport(this.getStringValue(element,
"category_name_to_export"));
exportSetting.setDdlOutput(this.getStringValue(element,
"ddl_output"));
exportSetting.setExcelOutput(this.getStringValue(element,
"excel_output"));
exportSetting.setExcelTemplate(this.getStringValue(element,
"excel_template"));
exportSetting.setImageOutput(this.getStringValue(element,
"image_output"));
exportSetting.setPutERDiagramOnExcel(this.getBooleanValue(element,
"put_diagram_on_excel"));
exportSetting.setUseLogicalNameAsSheet(this.getBooleanValue(
element, "use_logical_name_as_sheet"));
exportSetting.setOpenAfterSaved(this.getBooleanValue(element,
"open_after_saved"));
exportSetting.getDdlTarget().createComment = this.getBooleanValue(
element, "create_comment");
exportSetting.getDdlTarget().createForeignKey = this
.getBooleanValue(element, "create_foreignKey");
exportSetting.getDdlTarget().createIndex = this.getBooleanValue(
element, "create_index");
exportSetting.getDdlTarget().createSequence = this.getBooleanValue(
element, "create_sequence");
exportSetting.getDdlTarget().createTable = this.getBooleanValue(
element, "create_table");
exportSetting.getDdlTarget().createTablespace = this
.getBooleanValue(element, "create_tablespace");
exportSetting.getDdlTarget().createTrigger = this.getBooleanValue(
element, "create_trigger");
exportSetting.getDdlTarget().createView = this.getBooleanValue(
element, "create_view");
exportSetting.getDdlTarget().dropIndex = this.getBooleanValue(
element, "drop_index");
exportSetting.getDdlTarget().dropSequence = this.getBooleanValue(
element, "drop_sequence");
exportSetting.getDdlTarget().dropTable = this.getBooleanValue(
element, "drop_table");
exportSetting.getDdlTarget().dropTablespace = this.getBooleanValue(
element, "drop_tablespace");
exportSetting.getDdlTarget().dropTrigger = this.getBooleanValue(
element, "drop_trigger");
exportSetting.getDdlTarget().dropView = this.getBooleanValue(
element, "drop_view");
exportSetting.getDdlTarget().inlineColumnComment = this
.getBooleanValue(element, "inline_column_comment");
exportSetting.getDdlTarget().inlineTableComment = this
.getBooleanValue(element, "inline_table_comment");
exportSetting.getDdlTarget().commentValueDescription = this
.getBooleanValue(element, "comment_value_description");
exportSetting.getDdlTarget().commentValueLogicalName = this
.getBooleanValue(element, "comment_value_logical_name");
exportSetting.getDdlTarget().commentValueLogicalNameDescription = this
.getBooleanValue(element,
"comment_value_logical_name_description");
exportSetting.getDdlTarget().commentReplaceLineFeed = this
.getBooleanValue(element, "comment_replace_line_feed");
exportSetting.getDdlTarget().commentReplaceString = this
.getStringValue(element, "comment_replace_string");
this.loadExportJavaSetting(exportSetting.getExportJavaSetting(),
element, context);
this.loadExportTestDataSetting(
exportSetting.getExportTestDataSetting(), element, context);
}
}
private void loadExportJavaSetting(ExportJavaSetting exportJavaSetting,
Element parent, LoadContext context) {
Element element = this.getElement(parent, "export_java_setting");
if (element != null) {
exportJavaSetting.setJavaOutput(this.getStringValue(element,
"java_output"));
exportJavaSetting.setPackageName(Format.null2blank(this
.getStringValue(element, "package_name")));
exportJavaSetting.setClassNameSuffix(Format.null2blank(this
.getStringValue(element, "class_name_suffix")));
exportJavaSetting.setSrcFileEncoding(this.getStringValue(element,
"src_file_encoding"));
exportJavaSetting.setWithHibernate(this.getBooleanValue(element,
"with_hibernate"));
}
}
private void loadExportTestDataSetting(
ExportTestDataSetting exportTestDataSetting, Element parent,
LoadContext context) {
Element element = this.getElement(parent, "export_testdata_setting");
if (element != null) {
exportTestDataSetting.setExportFileEncoding(this.getStringValue(
element, "file_encoding"));
exportTestDataSetting.setExportFilePath(this.getStringValue(
element, "file_path"));
exportTestDataSetting.setExportFormat(this.getIntValue(element,
"format"));
}
}
private void loadCategorySetting(CategorySetting categorySetting,
Element parent, LoadContext context) {
Element element = this.getElement(parent, "category_settings");
categorySetting.setFreeLayout(this.getBooleanValue(element,
"free_layout"));
categorySetting.setShowReferredTables(this.getBooleanValue(element,
"show_referred_tables"));
Element categoriesElement = this.getElement(element, "categories");
NodeList nodeList = categoriesElement.getChildNodes();
List<Category> selectedCategories = new ArrayList<Category>();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() != Node.ELEMENT_NODE) {
continue;
}
Element categoryElement = (Element) nodeList.item(i);
Category category = new Category();
this.loadNodeElement(category, categoryElement, context);
category.setName(this.getStringValue(categoryElement, "name"));
boolean isSelected = this.getBooleanValue(categoryElement,
"selected");
String[] keys = this.getTagValues(categoryElement, "node_element");
List<NodeElement> nodeElementList = new ArrayList<NodeElement>();
for (String key : keys) {
NodeElement nodeElement = context.nodeElementMap.get(key);
if (nodeElement != null) {
nodeElementList.add(nodeElement);
}
}
category.setContents(nodeElementList);
categorySetting.addCategory(category);
if (isSelected) {
selectedCategories.add(category);
}
}
categorySetting.setSelectedCategories(selectedCategories);
}
private VGroup loadGroup(ERModel model, Element node, LoadContext context) {
VGroup group = new VGroup();
this.loadNodeElement(group, node, context);
group.setName(getStringValue(node, "name"));
List<ERVirtualTable> vtables = model.getTables();
String[] keys = this.getTagValues(node, "node_element");
List<NodeElement> nodeElementList = new ArrayList<NodeElement>();
for (String key : keys) {
NodeElement nodeElement = context.nodeElementMap.get(key);
if (nodeElement != null) {
for (ERVirtualTable vtable : vtables) {
if (vtable.getRawTable().equals(nodeElement)) {
nodeElementList.add(vtable);
break;
}
}
}
}
group.setContents(nodeElementList);
return group;
}
private void loadTranslationSetting(TranslationSetting translationSetting,
Element parent, LoadContext context) {
Element element = this.getElement(parent, "translation_settings");
if (element != null) {
translationSetting.setUse(this.getBooleanValue(element, "use"));
Element translationsElement = this.getElement(element,
"translations");
NodeList nodeList = translationsElement.getChildNodes();
List<String> selectedTranslations = new ArrayList<String>();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() != Node.ELEMENT_NODE) {
continue;
}
Element translationElement = (Element) nodeList.item(i);
selectedTranslations.add(this.getStringValue(
translationElement, "name"));
}
translationSetting.setSelectedTranslations(selectedTranslations);
}
}
private void loadEnvironmentSetting(EnvironmentSetting environmentSetting,
Element parent, LoadContext context) {
Element settingElement = this.getElement(parent, "settings");
Element element = this
.getElement(settingElement, "environment_setting");
List<Environment> environmentList = new ArrayList<Environment>();
if (element != null) {
NodeList nodeList = element.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() != Node.ELEMENT_NODE) {
continue;
}
Element environmentElement = (Element) nodeList.item(i);
String id = this.getStringValue(environmentElement, "id");
String name = this.getStringValue(environmentElement, "name");
Environment environment = new Environment(name);
environmentList.add(environment);
context.environmentMap.put(id, environment);
}
}
if (environmentList.isEmpty()) {
Environment environment = new Environment(
ResourceString.getResourceString("label.default"));
environmentList.add(environment);
context.environmentMap.put("", environment);
}
environmentSetting.setEnvironments(environmentList);
}
private void loadModelProperties(ModelProperties modelProperties,
Element parent) {
Element element = this.getElement(parent, "model_properties");
this.loadLocation(modelProperties, element);
this.loadColor(modelProperties, element);
modelProperties.setDisplay(this.getBooleanValue(element, "display"));
modelProperties.setCreationDate(this.getDateValue(element,
"creation_date"));
modelProperties.setUpdatedDate(this.getDateValue(element,
"updated_date"));
NodeList nodeList = element.getElementsByTagName("model_property");
for (int i = 0; i < nodeList.getLength(); i++) {
Element propertyElement = (Element) nodeList.item(i);
NameValue nameValue = new NameValue(this.getStringValue(
propertyElement, "name"), this.getStringValue(
propertyElement, "value"));
modelProperties.addProperty(nameValue);
}
}
private void loadLocation(NodeElement nodeElement, Element element) {
int x = this.getIntValue(element, "x");
int y = this.getIntValue(element, "y");
int width = this.getIntValue(element, "width");
int height = this.getIntValue(element, "height");
nodeElement.setLocation(new Location(x, y, width, height));
}
private void loadFont(ViewableModel viewableModel, Element element) {
if (getElement(element, "font_name") == null) {
return;
}
String fontName = this.getStringValue(element, "font_name");
int fontSize = this.getIntValue(element, "font_size");
viewableModel.setFontName(fontName);
viewableModel.setFontSize(fontSize);
}
private void loadContents(NodeSet contents, Element parent,
LoadContext context) {
Element element = this.getElement(parent, "contents");
NodeList nodeList = element.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() != Node.ELEMENT_NODE) {
continue;
}
Node node = nodeList.item(i);
if ("table".equals(node.getNodeName())) {
ERTable table = this.loadTable((Element) node, context);
contents.addNodeElement(table);
} else if ("view".equals(node.getNodeName())) {
View view = this.loadView((Element) node, context);
contents.addNodeElement(view);
// } else if ("note".equals(node.getNodeName())) {
// Note note = this.loadNote((Element) node, context);
// contents.addNodeElement(note);
} else if ("image".equals(node.getNodeName())) {
InsertedImage insertedImage = this.loadInsertedImage(
(Element) node, context);
contents.addNodeElement(insertedImage);
} else if ("ermodel".equals(node.getNodeName())) {
ERModel ermodel = this.loadErmodel((Element) node, context);
contents.addNodeElement(ermodel);
// } else if ("group".equals(node.getNodeName())) {
// VGroup group = this.loadGroup((Element) node, context);
// contents.addNodeElement(group);
} else {
throw new RuntimeException("not support " + node);
}
}
}
private ERTable loadTable(Element element, LoadContext context) {
ERTable table = new ERTable();
table.setDiagram(this.diagram);
this.loadNodeElement(table, element, context);
table.setPhysicalName(this.getStringValue(element, "physical_name"));
table.setLogicalName(this.getStringValue(element, "logical_name"));
table.setDescription(this.getStringValue(element, "description"));
table.setConstraint(this.getStringValue(element, "constraint"));
table.setPrimaryKeyName(this
.getStringValue(element, "primary_key_name"));
table.setOption(this.getStringValue(element, "option"));
List<Column> columns = this.loadColumns(element, context);
table.setColumns(columns);
List<Index> indexes = this.loadIndexes(element, table, context);
table.setIndexes(indexes);
List<ComplexUniqueKey> complexUniqueKeyList = this
.loadComplexUniqueKeyList(element, table, context);
table.setComplexUniqueKeyList(complexUniqueKeyList);
this.loadTableProperties(
(TableProperties) table.getTableViewProperties(), element,
context);
return table;
}
private ERVirtualTable loadVirtualTable(ERModel model, Element element, LoadContext context) {
String tableId = getStringValue(element, "id");
ERTable rawTable = (ERTable) context.nodeElementMap.get(tableId);
ERVirtualTable vtable = new ERVirtualTable(model, rawTable);
loadLocation(vtable, element);
loadFont(vtable, element);
return vtable;
}
private View loadView(Element element, LoadContext context) {
View view = new View();
view.setDiagram(this.diagram);
this.loadNodeElement(view, element, context);
view.setPhysicalName(this.getStringValue(element, "physical_name"));
view.setLogicalName(this.getStringValue(element, "logical_name"));
view.setDescription(this.getStringValue(element, "description"));
view.setSql(this.getStringValue(element, "sql"));
List<Column> columns = this.loadColumns(element, context);
view.setColumns(columns);
this.loadViewProperties((ViewProperties) view.getTableViewProperties(),
element, context);
return view;
}
private List<Index> loadIndexes(Element parent, ERTable table,
LoadContext context) {
List<Index> indexes = new ArrayList<Index>();
Element element = this.getElement(parent, "indexes");
NodeList nodeList = element.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() != Node.ELEMENT_NODE) {
continue;
}
Element indexElement = (Element) nodeList.item(i);
String type = this.getStringValue(indexElement, "type");
if ("null".equals(type)) {
type = null;
}
Index index = new Index(table, this.getStringValue(indexElement,
"name"), this.getBooleanValue(indexElement, "non_unique"),
type, this.getStringValue(indexElement, "description"));
index.setFullText(this.getBooleanValue(indexElement, "full_text"));
this.loadIndexColumns(index, indexElement, context);
indexes.add(index);
}
return indexes;
}
private void loadIndexColumns(Index index, Element parent,
LoadContext context) {
Element element = this.getElement(parent, "columns");
NodeList nodeList = element.getChildNodes();
List<Boolean> descs = new ArrayList<Boolean>();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() != Node.ELEMENT_NODE) {
continue;
}
Element columnElement = (Element) nodeList.item(i);
String id = this.getStringValue(columnElement, "id");
NormalColumn column = context.columnMap.get(id);
Boolean desc = new Boolean(this.getBooleanValue(columnElement,
"desc"));
index.addColumn(column);
descs.add(desc);
}
index.setDescs(descs);
}
private List<ComplexUniqueKey> loadComplexUniqueKeyList(Element parent,
ERTable table, LoadContext context) {
List<ComplexUniqueKey> complexUniqueKeyList = new ArrayList<ComplexUniqueKey>();
Element element = this.getElement(parent, "complex_unique_key_list");
if (element == null) {
return complexUniqueKeyList;
}
NodeList nodeList = element.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() != Node.ELEMENT_NODE) {
continue;
}
Element complexUniqueKeyElement = (Element) nodeList.item(i);
String id = this.getStringValue(complexUniqueKeyElement, "id");
String name = this.getStringValue(complexUniqueKeyElement, "name");
ComplexUniqueKey complexUniqueKey = new ComplexUniqueKey(name);
this.loadComplexUniqueKeyColumns(complexUniqueKey,
complexUniqueKeyElement, context);
complexUniqueKeyList.add(complexUniqueKey);
context.complexUniqueKeyMap.put(id, complexUniqueKey);
}
return complexUniqueKeyList;
}
private void loadComplexUniqueKeyColumns(ComplexUniqueKey complexUniqueKey,
Element parent, LoadContext context) {
Element element = this.getElement(parent, "columns");
NodeList nodeList = element.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() != Node.ELEMENT_NODE) {
continue;
}
Element columnElement = (Element) nodeList.item(i);
String id = this.getStringValue(columnElement, "id");
NormalColumn column = context.columnMap.get(id);
complexUniqueKey.addColumn(column);
}
}
private void loadTableProperties(TableProperties tableProperties,
Element parent, LoadContext context) {
Element element = this.getElement(parent, "table_properties");
String tablespaceId = this.getStringValue(element, "tablespace_id");
Tablespace tablespace = context.tablespaceMap.get(tablespaceId);
tableProperties.setTableSpace(tablespace);
tableProperties.setSchema(this.getStringValue(element, "schema"));
if (tableProperties instanceof MySQLTableProperties) {
this.loadTablePropertiesMySQL(
(MySQLTableProperties) tableProperties, element);
} else if (tableProperties instanceof PostgresTableProperties) {
this.loadTablePropertiesPostgres(
(PostgresTableProperties) tableProperties, element);
}
}
private void loadTablePropertiesMySQL(MySQLTableProperties tableProperties,
Element element) {
tableProperties.setCharacterSet(this.getStringValue(element,
"character_set"));
tableProperties.setCollation(this.getStringValue(element, "collation"));
tableProperties.setStorageEngine(this.getStringValue(element,
"storage_engine"));
tableProperties.setPrimaryKeyLengthOfText(this.getIntegerValue(element,
"primary_key_length_of_text"));
}
private void loadTablePropertiesPostgres(
PostgresTableProperties tableProperties, Element element) {
tableProperties.setWithoutOIDs(this.getBooleanValue(element,
"without_oids"));
}
private void loadViewProperties(ViewProperties viewProperties,
Element parent, LoadContext context) {
Element element = this.getElement(parent, "view_properties");
if (element != null) {
String tablespaceId = this.getStringValue(element, "tablespace_id");
Tablespace tablespace = context.tablespaceMap.get(tablespaceId);
viewProperties.setTableSpace(tablespace);
viewProperties.setSchema(this.getStringValue(element, "schema"));
}
}
private Note loadNote(ERModel model, Element element, LoadContext context) {
Note note = new Note();
note.setModel(model);
note.setText(this.getStringValue(element, "text"));
this.loadNodeElement(note, element, context);
return note;
}
private InsertedImage loadInsertedImage(Element element, LoadContext context) {
InsertedImage insertedImage = new InsertedImage();
insertedImage
.setBase64EncodedData(this.getStringValue(element, "data"));
insertedImage.setHue(this.getIntValue(element, "hue"));
insertedImage.setSaturation(this.getIntValue(element, "saturation"));
insertedImage.setBrightness(this.getIntValue(element, "brightness"));
insertedImage.setAlpha(this.getIntValue(element, "alpha", 255));
insertedImage.setFixAspectRatio(this.getBooleanValue(element,
"fix_aspect_ratio"));
this.loadNodeElement(insertedImage, element, context);
return insertedImage;
}
private void loadNodeElement(NodeElement nodeElement, Element element,
LoadContext context) {
String id = this.getStringValue(element, "id");
this.loadLocation(nodeElement, element);
this.loadColor(nodeElement, element);
this.loadFont(nodeElement, element);
context.nodeElementMap.put(id, nodeElement);
this.loadConnections(element, context);
}
private void loadConnections(Element parent, LoadContext context) {
Element element = this.getElement(parent, "connections");
if (element != null) {
NodeList nodeList = element.getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
if (nodeList.item(i).getNodeType() != Node.ELEMENT_NODE) {
continue;
}
Element connectionElement = (Element) nodeList.item(i);
if ("relation".equals(connectionElement.getTagName())) {
this.loadRelation(connectionElement, context);
} else if ("comment_connection".equals(connectionElement
.getTagName())) {
this.loadCommentConnection(connectionElement, context);
}
}
}
}
private void loadRelation(Element element, LoadContext context) {
boolean referenceForPK = this.getBooleanValue(element,
"reference_for_pk");
Relation connection = new Relation(referenceForPK, null, null);
this.load(connection, element, context);
connection.setChildCardinality(this.getStringValue(element,
"child_cardinality"));
connection.setParentCardinality(this.getStringValue(element,
"parent_cardinality"));
connection.setName(this.getStringValue(element, "name"));
connection.setOnDeleteAction(this.getStringValue(element,
"on_delete_action"));
connection.setOnUpdateAction(this.getStringValue(element,
"on_update_action"));
connection.setSourceLocationp(this.getIntValue(element, "source_xp"),
this.getIntValue(element, "source_yp"));
connection.setTargetLocationp(this.getIntValue(element, "target_xp"),
this.getIntValue(element, "target_yp"));
String referencedComplexUniqueKeyId = this.getStringValue(element,
"referenced_complex_unique_key");
if (!"null".equals(referencedComplexUniqueKeyId)) {
context.referencedComplexUniqueKeyMap.put(connection,
referencedComplexUniqueKeyId);
}
String referencedColumnId = this.getStringValue(element,
"referenced_column");
if (!"null".equals(referencedColumnId)) {
context.referencedColumnMap.put(connection, referencedColumnId);
}
}
private void loadCommentConnection(Element element, LoadContext context) {
CommentConnection connection = new CommentConnection();
this.load(connection, element, context);
}
private void load(ConnectionElement connection, Element element,
LoadContext context) {
String id = this.getStringValue(element, "id");
context.connectionMap.put(id, connection);
String source = this.getStringValue(element, "source");
String target = this.getStringValue(element, "target");
context.connectionSourceMap.put(connection, source);
context.connectionTargetMap.put(connection, target);
NodeList nodeList = element.getElementsByTagName("bendpoint");
for (int i = 0; i < nodeList.getLength(); i++) {
Element bendPointElement = (Element) nodeList.item(i);
Bendpoint bendpoint = new Bendpoint(this.getIntValue(
bendPointElement, "x"), this.getIntValue(bendPointElement,
"y"));
bendpoint.setRelative(this.getBooleanValue(bendPointElement,
"relative"));
connection.addBendpoint(i, bendpoint);
}
}
private void loadDBSetting(ERDiagram diagram, Element element) {
Element dbSettingElement = this.getElement(element, "dbsetting");
if (dbSettingElement != null) {
String dbsystem = this.getStringValue(element, "dbsystem");
String server = this.getStringValue(element, "server");
int port = this.getIntValue(element, "port");
String database = this.getStringValue(element, "database");
String user = this.getStringValue(element, "user");
String password = this.getStringValue(element, "password");
boolean useDefaultDriver = this.getBooleanValue(element,
"use_default_driver", true);
if (StandardSQLDBManager.ID.equals(dbsystem)) {
useDefaultDriver = false;
}
String url = this.getStringValue(element, "url");
String driverClassName = this.getStringValue(element,
"driver_class_name");
DBSetting dbSetting = new DBSetting(dbsystem, server, port,
database, user, password, useDefaultDriver, url,
driverClassName);
diagram.setDbSetting(dbSetting);
}
}
private void loadPageSetting(ERDiagram diagram, Element element) {
Element dbSettingElement = this.getElement(element, "page_setting");
if (dbSettingElement != null) {
boolean directionHorizontal = this.getBooleanValue(element,
"direction_horizontal");
int scale = this.getIntValue(element, "scale");
String paperSize = this.getStringValue(element, "paper_size");
int topMargin = this.getIntValue(element, "top_margin");
int leftMargin = this.getIntValue(element, "left_margin");
int bottomMargin = this.getIntValue(element, "bottom_margin");
int rightMargin = this.getIntValue(element, "right_margin");
PageSetting pageSetting = new PageSetting(directionHorizontal,
scale, paperSize, topMargin, rightMargin, bottomMargin,
leftMargin);
diagram.setPageSetting(pageSetting);
}
}
private void loadColor(ViewableModel model, Element element) {
int[] rgb = new int[] { 255, 255, 255 };
Element color = this.getElement(element, "color");
if (color != null) {
rgb[0] = this.getIntValue(color, "r");
rgb[1] = this.getIntValue(color, "g");
rgb[2] = this.getIntValue(color, "b");
}
model.setColor(rgb[0], rgb[1], rgb[2]);
}
private void loadDefaultColor(ERDiagram diagram, Element element) {
int[] rgb = new int[] { 255, 255, 255 };
Element color = this.getElement(element, "default_color");
if (color != null) {
rgb[0] = this.getIntValue(color, "r");
rgb[1] = this.getIntValue(color, "g");
rgb[2] = this.getIntValue(color, "b");
}
diagram.setDefaultColor(rgb[0], rgb[1], rgb[2]);
}
}