package org.insightech.er.editor.persistent.impl; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.List; import java.util.Map; import org.insightech.er.db.impl.db2.tablespace.DB2TablespaceProperties; import org.insightech.er.db.impl.mysql.MySQLTableProperties; import org.insightech.er.db.impl.mysql.tablespace.MySQLTablespaceProperties; import org.insightech.er.db.impl.oracle.tablespace.OracleTablespaceProperties; import org.insightech.er.db.impl.postgres.PostgresTableProperties; import org.insightech.er.db.impl.postgres.tablespace.PostgresTablespaceProperties; import org.insightech.er.db.sqltype.SqlType; import org.insightech.er.editor.model.ERDiagram; import org.insightech.er.editor.model.dbexport.ddl.DDLTarget; 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.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.ERModelSet; 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.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.editor.persistent.Persistent; import org.insightech.er.util.Format; import org.insightech.er.util.NameValue; public class PersistentXmlImpl extends Persistent { public static final DateFormat DATE_FORMAT = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); private class PersistentContext { private Map<ColumnGroup, Integer> columnGroupMap = new HashMap<ColumnGroup, Integer>(); private Map<ConnectionElement, Integer> connectionMap = new HashMap<ConnectionElement, Integer>(); private Map<Column, Integer> columnMap = new HashMap<Column, Integer>(); private Map<ComplexUniqueKey, Integer> complexUniqueKeyMap = new HashMap<ComplexUniqueKey, Integer>(); private Map<NodeElement, Integer> nodeElementMap = new HashMap<NodeElement, Integer>(); private Map<ERModel, Integer> ermodelMap = new HashMap<ERModel, Integer>(); private Map<Word, Integer> wordMap = new HashMap<Word, Integer>(); private Map<Tablespace, Integer> tablespaceMap = new HashMap<Tablespace, Integer>(); private Map<Environment, Integer> environmentMap = new HashMap<Environment, Integer>(); } private PersistentContext getContext(DiagramContents diagramContents) { PersistentContext context = new PersistentContext(); int columnGroupCount = 0; int columnCount = 0; for (ColumnGroup columnGroup : diagramContents.getGroups()) { context.columnGroupMap.put(columnGroup, new Integer( columnGroupCount)); columnGroupCount++; for (NormalColumn normalColumn : columnGroup.getColumns()) { context.columnMap.put(normalColumn, new Integer(columnCount)); columnCount++; } } int nodeElementCount = 0; int connectionCount = 0; int complexUniqueKeyCount = 0; for (NodeElement content : diagramContents.getContents()) { context.nodeElementMap.put(content, new Integer(nodeElementCount)); nodeElementCount++; List<ConnectionElement> connections = content.getIncomings(); for (ConnectionElement connection : connections) { context.connectionMap.put(connection, new Integer( connectionCount)); connectionCount++; } if (content instanceof ERTable) { ERTable table = (ERTable) content; List<Column> columns = table.getColumns(); for (Column column : columns) { if (column instanceof NormalColumn) { context.columnMap.put(column, new Integer(columnCount)); columnCount++; } } for (ComplexUniqueKey complexUniqueKey : table .getComplexUniqueKeyList()) { context.complexUniqueKeyMap.put(complexUniqueKey, new Integer(complexUniqueKeyCount)); complexUniqueKeyCount++; } } } int wordCount = 0; for (Word word : diagramContents.getDictionary().getWordList()) { context.wordMap.put(word, new Integer(wordCount)); wordCount++; } int tablespaceCount = 0; for (Tablespace tablespace : diagramContents.getTablespaceSet()) { context.tablespaceMap.put(tablespace, new Integer(tablespaceCount)); tablespaceCount++; } int environmentCount = 0; for (Environment environment : diagramContents.getSettings() .getEnvironmentSetting().getEnvironments()) { context.environmentMap.put(environment, new Integer( environmentCount)); environmentCount++; } int virtualModelCount = 0; for (ERModel model : diagramContents.getModelSet()) { context.ermodelMap.put(model, new Integer(virtualModelCount)); virtualModelCount++; } return context; } private PersistentContext getCurrentContext(ERDiagram diagram) { return this.getContext(diagram.getDiagramContents()); } private PersistentContext getChangeTrackingContext( ChangeTracking changeTracking) { return this.getContext(changeTracking.getDiagramContents()); } @Override public ERDiagram load(InputStream in) throws Exception { XMLLoader loader = new XMLLoader(); return loader.load(in); } /** * {@inheritDoc} */ @Override public InputStream createInputStream(ERDiagram diagram) throws IOException { InputStream inputStream = null; ByteArrayOutputStream out = new ByteArrayOutputStream(); String xml = this.createXML(diagram); out.write(xml.getBytes("UTF-8")); inputStream = new ByteArrayInputStream(out.toByteArray()); return inputStream; } private static String tab(String str) { str = str.replaceAll("\n\t", "\n\t\t"); str = str.replaceAll("\n<", "\n\t<"); return "\t" + str; } private String createXML(ERDiagram diagram) { StringBuilder xml = new StringBuilder(); xml.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); xml.append("<diagram>\n"); if (diagram.getDbSetting() != null) { xml.append("\t<dbsetting>\n") .append(tab(tab(this.createXML(diagram.getDbSetting())))) .append("\t</dbsetting>\n"); } if (diagram.getPageSetting() != null) { xml.append("\t<page_setting>\n") .append(tab(tab(this.createXML(diagram.getPageSetting())))) .append("\t</page_setting>\n"); } xml.append("\t<category_index>") .append(diagram.getCurrentCategoryIndex()) .append("</category_index>\n"); if (diagram.getCurrentErmodel() != null) { xml.append("\t<current_ermodel>").append(diagram.getCurrentErmodel().getName()).append("</current_ermodel>\n"); } xml.append("\t<zoom>").append(diagram.getZoom()).append("</zoom>\n"); xml.append("\t<x>").append(diagram.getX()).append("</x>\n"); xml.append("\t<y>").append(diagram.getY()).append("</y>\n"); appendColor(xml, "default_color", diagram.getDefaultColor()); xml.append(tab(this.createXMLColor(diagram.getColor()))); xml.append("\t<font_name>").append(escape(diagram.getFontName())) .append("</font_name>\n"); xml.append("\t<font_size>").append(diagram.getFontSize()) .append("</font_size>\n"); PersistentContext context = this.getCurrentContext(diagram); xml.append(tab(this.createXML(diagram.getDiagramContents(), context))); xml.append(tab(this.createXML(diagram.getChangeTrackingList()))); xml.append("</diagram>\n"); return xml.toString(); } private void appendColor(StringBuilder xml, String tagName, int[] defaultColor) { if (defaultColor == null) { return; } xml.append("\t<" + tagName + ">\n"); xml.append("\t\t<r>").append(defaultColor[0]).append("</r>\n"); xml.append("\t\t<g>").append(defaultColor[1]).append("</g>\n"); xml.append("\t\t<b>").append(defaultColor[2]).append("</b>\n"); xml.append("\t</" + tagName + ">\n"); } private String createXML(DBSetting dbSetting) { StringBuilder xml = new StringBuilder(); xml.append("<dbsystem>").append(escape(dbSetting.getDbsystem())) .append("</dbsystem>\n"); xml.append("<server>").append(escape(dbSetting.getServer())) .append("</server>\n"); xml.append("<port>").append(dbSetting.getPort()).append("</port>\n"); xml.append("<database>").append(escape(dbSetting.getDatabase())) .append("</database>\n"); xml.append("<user>").append(escape(dbSetting.getUser())) .append("</user>\n"); xml.append("<password>").append(escape(dbSetting.getPassword())) .append("</password>\n"); xml.append("<use_default_driver>") .append(dbSetting.isUseDefaultDriver()) .append("</use_default_driver>\n"); xml.append("<url>").append(escape(dbSetting.getUrl())) .append("</url>\n"); xml.append("<driver_class_name>") .append(escape(dbSetting.getDriverClassName())) .append("</driver_class_name>\n"); return xml.toString(); } private String createXML(PageSetting pageSetting) { StringBuilder xml = new StringBuilder(); xml.append("<direction_horizontal>") .append(pageSetting.isDirectionHorizontal()) .append("</direction_horizontal>\n"); xml.append("<scale>").append(pageSetting.getScale()) .append("</scale>\n"); xml.append("<paper_size>").append(escape(pageSetting.getPaperSize())) .append("</paper_size>\n"); xml.append("<top_margin>").append(pageSetting.getTopMargin()) .append("</top_margin>\n"); xml.append("<left_margin>").append(pageSetting.getLeftMargin()) .append("</left_margin>\n"); xml.append("<bottom_margin>").append(pageSetting.getBottomMargin()) .append("</bottom_margin>\n"); xml.append("<right_margin>").append(pageSetting.getRightMargin()) .append("</right_margin>\n"); return xml.toString(); } private String createXML(DiagramContents diagramContents, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append(this.createXML(diagramContents.getSettings(), context)); xml.append(this.createXML(diagramContents.getDictionary(), context)); xml.append(this.createXML(diagramContents.getTablespaceSet(), context)); xml.append(this.createXML(diagramContents.getContents(), context)); xml.append(this.createXMLERModel(diagramContents.getModelSet(), context)); xml.append(this.createXML(diagramContents.getGroups(), context)); xml.append(this.createXML(diagramContents.getTestDataList(), context)); xml.append(this.createXML(diagramContents.getSequenceSet())); xml.append(this.createXML(diagramContents.getTriggerSet())); return xml.toString(); } private String createXML(GroupSet columnGroups, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<column_groups>\n"); for (ColumnGroup columnGroup : columnGroups) { xml.append(tab(tab(this.createXML(columnGroup, context)))); } xml.append("</column_groups>\n"); return xml.toString(); } private String createXML(List<TestData> testDataList, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<test_data_list>\n"); for (TestData testData : testDataList) { xml.append(tab(tab(this.createXML(testData, context)))); } xml.append("</test_data_list>\n"); return xml.toString(); } private String createXML(TriggerSet triggerSet) { StringBuilder xml = new StringBuilder(); xml.append("<trigger_set>\n"); for (Trigger trigger : triggerSet) { xml.append(tab(this.createXML(trigger))); } xml.append("</trigger_set>\n"); return xml.toString(); } private String createXML(Trigger trigger) { StringBuilder xml = new StringBuilder(); xml.append("<trigger>\n"); xml.append("\t<name>").append(escape(trigger.getName())) .append("</name>\n"); xml.append("\t<schema>").append(escape(trigger.getSchema())) .append("</schema>\n"); xml.append("\t<sql>").append(escape(trigger.getSql())) .append("</sql>\n"); xml.append("\t<description>").append(escape(trigger.getDescription())) .append("</description>\n"); xml.append("</trigger>\n"); return xml.toString(); } private String createXML(SequenceSet sequenceSet) { StringBuilder xml = new StringBuilder(); xml.append("<sequence_set>\n"); for (Sequence sequence : sequenceSet) { xml.append(tab(this.createXML(sequence))); } xml.append("</sequence_set>\n"); return xml.toString(); } private String createXML(Sequence sequence) { StringBuilder xml = new StringBuilder(); xml.append("<sequence>\n"); xml.append("\t<name>").append(escape(sequence.getName())) .append("</name>\n"); xml.append("\t<schema>").append(escape(sequence.getSchema())) .append("</schema>\n"); xml.append("\t<increment>") .append(Format.toString(sequence.getIncrement())) .append("</increment>\n"); xml.append("\t<min_value>") .append(Format.toString(sequence.getMinValue())) .append("</min_value>\n"); xml.append("\t<max_value>") .append(Format.toString(sequence.getMaxValue())) .append("</max_value>\n"); xml.append("\t<start>").append(Format.toString(sequence.getStart())) .append("</start>\n"); xml.append("\t<cache>").append(Format.toString(sequence.getCache())) .append("</cache>\n"); xml.append("\t<cycle>").append(sequence.isCycle()).append("</cycle>\n"); xml.append("\t<order>").append(sequence.isOrder()).append("</order>\n"); xml.append("\t<description>").append(escape(sequence.getDescription())) .append("</description>\n"); xml.append("\t<data_type>").append(escape(sequence.getDataType())) .append("</data_type>\n"); xml.append("\t<decimal_size>") .append(Format.toString(sequence.getDecimalSize())) .append("</decimal_size>\n"); xml.append("</sequence>\n"); return xml.toString(); } private String createXML(TablespaceSet tablespaceSet, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<tablespace_set>\n"); for (Tablespace tablespace : tablespaceSet) { xml.append(tab(this.createXML(tablespace, context))); } xml.append("</tablespace_set>\n"); return xml.toString(); } private String createXML(Tablespace tablespace, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<tablespace>\n"); if (context != null) { xml.append("\t<id>").append(context.tablespaceMap.get(tablespace)) .append("</id>\n"); } xml.append("\t<name>").append(escape(tablespace.getName())) .append("</name>\n"); for (Map.Entry<Environment, TablespaceProperties> entry : tablespace .getPropertiesMap().entrySet()) { Environment environment = entry.getKey(); TablespaceProperties tablespaceProperties = entry.getValue(); xml.append("\t<properties>\n"); xml.append("\t\t<environment_id>") .append(context.environmentMap.get(environment)) .append("</environment_id>\n"); if (tablespaceProperties instanceof DB2TablespaceProperties) { xml.append(tab(tab(this .createXML((DB2TablespaceProperties) tablespaceProperties)))); } else if (tablespaceProperties instanceof MySQLTablespaceProperties) { xml.append(tab(tab(this .createXML((MySQLTablespaceProperties) tablespaceProperties)))); } else if (tablespaceProperties instanceof OracleTablespaceProperties) { xml.append(tab(tab(this .createXML((OracleTablespaceProperties) tablespaceProperties)))); } else if (tablespaceProperties instanceof PostgresTablespaceProperties) { xml.append(tab(tab(this .createXML((PostgresTablespaceProperties) tablespaceProperties)))); } xml.append("\t</properties>\n"); } xml.append("</tablespace>\n"); return xml.toString(); } private String createXML(DB2TablespaceProperties tablespace) { StringBuilder xml = new StringBuilder(); xml.append("<buffer_pool_name>") .append(escape(tablespace.getBufferPoolName())) .append("</buffer_pool_name>\n"); xml.append("<container>").append(escape(tablespace.getContainer())) .append("</container>\n"); // xml.append("<container_device_path>").append( // escape(tablespace.getContainerDevicePath())).append( // "</container_device_path>\n"); // xml.append("<container_directory_path>").append( // escape(tablespace.getContainerDirectoryPath())).append( // "</container_directory_path>\n"); // xml.append("<container_file_path>").append( // escape(tablespace.getContainerFilePath())).append( // "</container_file_path>\n"); // xml.append("<container_page_num>").append( // escape(tablespace.getContainerPageNum())).append( // "</container_page_num>\n"); xml.append("<extent_size>").append(escape(tablespace.getExtentSize())) .append("</extent_size>\n"); xml.append("<managed_by>").append(escape(tablespace.getManagedBy())) .append("</managed_by>\n"); xml.append("<page_size>").append(escape(tablespace.getPageSize())) .append("</page_size>\n"); xml.append("<prefetch_size>") .append(escape(tablespace.getPrefetchSize())) .append("</prefetch_size>\n"); xml.append("<type>").append(escape(tablespace.getType())) .append("</type>\n"); return xml.toString(); } private String createXML(MySQLTablespaceProperties tablespace) { StringBuilder xml = new StringBuilder(); xml.append("<data_file>").append(escape(tablespace.getDataFile())) .append("</data_file>\n"); xml.append("<engine>").append(escape(tablespace.getEngine())) .append("</engine>\n"); xml.append("<extent_size>").append(escape(tablespace.getExtentSize())) .append("</extent_size>\n"); xml.append("<initial_size>") .append(escape(tablespace.getInitialSize())) .append("</initial_size>\n"); xml.append("<log_file_group>") .append(escape(tablespace.getLogFileGroup())) .append("</log_file_group>\n"); return xml.toString(); } private String createXML(OracleTablespaceProperties tablespace) { StringBuilder xml = new StringBuilder(); xml.append("<auto_extend>").append(tablespace.isAutoExtend()) .append("</auto_extend>\n"); xml.append("<auto_segment_space_management>") .append(tablespace.isAutoSegmentSpaceManagement()) .append("</auto_segment_space_management>\n"); xml.append("<logging>").append(tablespace.isLogging()) .append("</logging>\n"); xml.append("<offline>").append(tablespace.isOffline()) .append("</offline>\n"); xml.append("<temporary>").append(tablespace.isTemporary()) .append("</temporary>\n"); xml.append("<auto_extend_max_size>") .append(escape(tablespace.getAutoExtendMaxSize())) .append("</auto_extend_max_size>\n"); xml.append("<auto_extend_size>") .append(escape(tablespace.getAutoExtendSize())) .append("</auto_extend_size>\n"); xml.append("<data_file>").append(escape(tablespace.getDataFile())) .append("</data_file>\n"); xml.append("<file_size>").append(escape(tablespace.getFileSize())) .append("</file_size>\n"); xml.append("<initial>").append(escape(tablespace.getInitial())) .append("</initial>\n"); xml.append("<max_extents>").append(escape(tablespace.getMaxExtents())) .append("</max_extents>\n"); xml.append("<min_extents>").append(escape(tablespace.getMinExtents())) .append("</min_extents>\n"); xml.append("<minimum_extent_size>") .append(escape(tablespace.getMinimumExtentSize())) .append("</minimum_extent_size>\n"); xml.append("<next>").append(escape(tablespace.getNext())) .append("</next>\n"); xml.append("<pct_increase>") .append(escape(tablespace.getPctIncrease())) .append("</pct_increase>\n"); return xml.toString(); } private String createXML(PostgresTablespaceProperties tablespace) { StringBuilder xml = new StringBuilder(); xml.append("<location>").append(escape(tablespace.getLocation())) .append("</location>\n"); xml.append("<owner>").append(escape(tablespace.getOwner())) .append("</owner>\n"); return xml.toString(); } private String createXML(Settings settings, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<settings>\n"); xml.append("\t<database>").append(escape(settings.getDatabase())) .append("</database>\n"); xml.append("\t<capital>").append(settings.isCapital()) .append("</capital>\n"); xml.append("\t<table_style>").append(escape(settings.getTableStyle())) .append("</table_style>\n"); xml.append("\t<notation>").append(escape(settings.getNotation())) .append("</notation>\n"); xml.append("\t<notation_level>").append(settings.getNotationLevel()) .append("</notation_level>\n"); xml.append("\t<notation_expand_group>") .append(settings.isNotationExpandGroup()) .append("</notation_expand_group>\n"); xml.append("\t<view_mode>").append(settings.getViewMode()) .append("</view_mode>\n"); xml.append("\t<outline_view_mode>") .append(settings.getOutlineViewMode()) .append("</outline_view_mode>\n"); xml.append("\t<view_order_by>").append(settings.getViewOrderBy()) .append("</view_order_by>\n"); xml.append("\t<auto_ime_change>").append(settings.isAutoImeChange()) .append("</auto_ime_change>\n"); xml.append("\t<validate_physical_name>") .append(settings.isValidatePhysicalName()) .append("</validate_physical_name>\n"); xml.append("\t<use_bezier_curve>").append(settings.isUseBezierCurve()) .append("</use_bezier_curve>\n"); xml.append("\t<suspend_validator>") .append(settings.isSuspendValidator()) .append("</suspend_validator>\n"); xml.append("\t<titleFontEm>").append(settings.getTitleFontEm().toString()).append("</titleFontEm>\n"); xml.append("\t<masterDataBasePath>").append(settings.getMasterDataBasePath().toString()).append("</masterDataBasePath>\n"); xml.append(tab(this.createXML(settings.getExportSetting(), context))); xml.append(tab(this.createXML(settings.getCategorySetting(), context))); // xml.append(tab(this.createXML(settings.getGroupSetting(), context))); xml.append(tab(this.createXML(settings.getTranslationSetting(), context))); xml.append(tab(this.createXML(settings.getModelProperties(), context))); xml.append(tab(this.createXML( (TableProperties) settings.getTableViewProperties(), context))); xml.append(tab(this.createXML(settings.getEnvironmentSetting(), context))); xml.append("</settings>\n"); return xml.toString(); } private String createXML(ColumnGroup columnGroup, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<column_group>\n"); xml.append("\t<id>").append(context.columnGroupMap.get(columnGroup)) .append("</id>\n"); xml.append("\t<group_name>").append(escape(columnGroup.getGroupName())) .append("</group_name>\n"); xml.append("\t<columns>\n"); for (NormalColumn normalColumn : columnGroup.getColumns()) { xml.append(tab(tab(this.createXML(normalColumn, context)))); } xml.append("\t</columns>\n"); xml.append("</column_group>\n"); return xml.toString(); } private String createXML(TestData testData, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<test_data>\n"); xml.append("\t<name>").append(escape(testData.getName())) .append("</name>\n"); xml.append("\t<export_order>").append(testData.getExportOrder()) .append("</export_order>\n"); Map<ERTable, TableTestData> tableTestDataMap = testData .getTableTestDataMap(); for (Map.Entry<ERTable, TableTestData> entry : tableTestDataMap .entrySet()) { ERTable table = entry.getKey(); TableTestData tableTestData = entry.getValue(); xml.append(tab(createXML(tableTestData, table, context))); } xml.append("</test_data>\n"); return xml.toString(); } private String createXML(TableTestData tableTestData, ERTable table, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<table_test_data>\n"); xml.append("\t<table_id>").append(context.nodeElementMap.get(table)) .append("</table_id>\n"); DirectTestData directTestData = tableTestData.getDirectTestData(); RepeatTestData repeatTestData = tableTestData.getRepeatTestData(); xml.append(tab(createXML(directTestData, table, context))); xml.append(tab(createXML(repeatTestData, table, context))); xml.append("</table_test_data>\n"); return xml.toString(); } private String createXML(DirectTestData directTestData, ERTable table, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<direct_test_data>\n"); for (Map<NormalColumn, String> data : directTestData.getDataList()) { xml.append("\t<data>\n"); for (NormalColumn normalColumn : table.getExpandedColumns()) { xml.append("\t\t<column_data>\n"); xml.append("\t\t\t<column_id>") .append(context.columnMap.get(normalColumn)) .append("</column_id>\n"); xml.append("\t\t\t<value>") .append(escape(data.get(normalColumn))) .append("</value>\n"); xml.append("\t\t</column_data>\n"); } xml.append("\t</data>\n"); } xml.append("</direct_test_data>\n"); return xml.toString(); } private String createXML(RepeatTestData repeatTestData, ERTable table, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<repeat_test_data>\n"); xml.append("\t<test_data_num>").append(repeatTestData.getTestDataNum()) .append("</test_data_num>\n"); xml.append("\t<data_def_list>\n"); for (NormalColumn normalColumn : table.getExpandedColumns()) { xml.append(tab(tab(this.createXML( repeatTestData.getDataDef(normalColumn), normalColumn, context)))); } xml.append("\t</data_def_list>\n"); xml.append("</repeat_test_data>\n"); return xml.toString(); } private String createXML(RepeatTestDataDef repeatTestDataDef, NormalColumn column, PersistentContext context) { StringBuilder xml = new StringBuilder(); Integer columnId = context.columnMap.get(column); if (columnId != null) { xml.append("<data_def>\n"); xml.append("\t<column_id>").append(columnId) .append("</column_id>\n"); xml.append("\t<type>").append(escape(repeatTestDataDef.getType())) .append("</type>\n"); xml.append("\t<repeat_num>") .append(Format.toString((repeatTestDataDef.getRepeatNum()))) .append("</repeat_num>\n"); xml.append("\t<template>") .append(escape(repeatTestDataDef.getTemplate())) .append("</template>\n"); xml.append("\t<from>") .append(Format.toString((repeatTestDataDef.getFrom()))) .append("</from>\n"); xml.append("\t<to>") .append(Format.toString((repeatTestDataDef.getTo()))) .append("</to>\n"); xml.append("\t<increment>") .append(Format.toString((repeatTestDataDef.getIncrement()))) .append("</increment>\n"); for (String select : repeatTestDataDef.getSelects()) { xml.append("\t<select>").append(escape(select)) .append("</select>\n"); } xml.append("\t<modified_values>\n"); for (Integer modifiedRow : repeatTestDataDef.getModifiedValues() .keySet()) { xml.append("\t\t<modified_value>\n"); xml.append("\t\t\t<row>").append(modifiedRow) .append("</row>\n"); xml.append("\t\t\t<value>") .append(escape(repeatTestDataDef.getModifiedValues() .get(modifiedRow))).append("</value>\n"); xml.append("\t\t</modified_value>\n"); } xml.append("\t</modified_values>\n"); xml.append("</data_def>\n"); } return xml.toString(); } private String createXML(ChangeTrackingList changeTrackingList) { StringBuilder xml = new StringBuilder(); xml.append("<change_tracking_list>\n"); for (ChangeTracking changeTracking : changeTrackingList.getList()) { xml.append(tab(this.createXML(changeTracking))); } xml.append("</change_tracking_list>\n"); return xml.toString(); } private String createXML(ChangeTracking changeTracking) { StringBuilder xml = new StringBuilder(); xml.append("<change_tracking>\n"); xml.append("\t<updated_date>") .append(DATE_FORMAT.format(changeTracking.getUpdatedDate())) .append("</updated_date>\n"); xml.append("\t<comment>").append(escape(changeTracking.getComment())) .append("</comment>\n"); PersistentContext context = this .getChangeTrackingContext(changeTracking); xml.append(tab(this.createXML(changeTracking.getDiagramContents(), context))); xml.append("</change_tracking>\n"); return xml.toString(); } private String createXML(ExportSetting exportSetting, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<export_setting>\n"); xml.append("\t<category_name_to_export>") .append(escape(exportSetting.getCategoryNameToExport())) .append("</category_name_to_export>\n"); xml.append("\t<ddl_output>") .append(escape(exportSetting.getDdlOutput())) .append("</ddl_output>\n"); xml.append("\t<excel_output>") .append(escape(exportSetting.getExcelOutput())) .append("</excel_output>\n"); xml.append("\t<excel_template>") .append(escape(exportSetting.getExcelTemplate())) .append("</excel_template>\n"); xml.append("\t<image_output>") .append(escape(exportSetting.getImageOutput())) .append("</image_output>\n"); xml.append("\t<put_diagram_on_excel>") .append(exportSetting.isPutERDiagramOnExcel()) .append("</put_diagram_on_excel>\n"); xml.append("\t<use_logical_name_as_sheet>") .append(exportSetting.isUseLogicalNameAsSheet()) .append("</use_logical_name_as_sheet>\n"); xml.append("\t<open_after_saved>") .append(exportSetting.isOpenAfterSaved()) .append("</open_after_saved>\n"); DDLTarget ddlTarget = exportSetting.getDdlTarget(); xml.append("\t<create_comment>").append(ddlTarget.createComment) .append("</create_comment>\n"); xml.append("\t<create_foreignKey>").append(ddlTarget.createForeignKey) .append("</create_foreignKey>\n"); xml.append("\t<create_index>").append(ddlTarget.createIndex) .append("</create_index>\n"); xml.append("\t<create_sequence>").append(ddlTarget.createSequence) .append("</create_sequence>\n"); xml.append("\t<create_table>").append(ddlTarget.createTable) .append("</create_table>\n"); xml.append("\t<create_tablespace>").append(ddlTarget.createTablespace) .append("</create_tablespace>\n"); xml.append("\t<create_trigger>").append(ddlTarget.createTrigger) .append("</create_trigger>\n"); xml.append("\t<create_view>").append(ddlTarget.createView) .append("</create_view>\n"); xml.append("\t<drop_index>").append(ddlTarget.dropIndex) .append("</drop_index>\n"); xml.append("\t<drop_sequence>").append(ddlTarget.dropSequence) .append("</drop_sequence>\n"); xml.append("\t<drop_table>").append(ddlTarget.dropTable) .append("</drop_table>\n"); xml.append("\t<drop_tablespace>").append(ddlTarget.dropTablespace) .append("</drop_tablespace>\n"); xml.append("\t<drop_trigger>").append(ddlTarget.dropTrigger) .append("</drop_trigger>\n"); xml.append("\t<drop_view>").append(ddlTarget.dropView) .append("</drop_view>\n"); xml.append("\t<inline_column_comment>") .append(ddlTarget.inlineColumnComment) .append("</inline_column_comment>\n"); xml.append("\t<inline_table_comment>") .append(ddlTarget.inlineTableComment) .append("</inline_table_comment>\n"); xml.append("\t<comment_value_description>") .append(ddlTarget.commentValueDescription) .append("</comment_value_description>\n"); xml.append("\t<comment_value_logical_name>") .append(ddlTarget.commentValueLogicalName) .append("</comment_value_logical_name>\n"); xml.append("\t<comment_value_logical_name_description>") .append(ddlTarget.commentValueLogicalNameDescription) .append("</comment_value_logical_name_description>\n"); xml.append("\t<comment_replace_line_feed>") .append(ddlTarget.commentReplaceLineFeed) .append("</comment_replace_line_feed>\n"); xml.append("\t<comment_replace_string>") .append(Format.null2blank(ddlTarget.commentReplaceString)) .append("</comment_replace_string>\n"); xml.append(tab(this.createXML(exportSetting.getExportJavaSetting(), context))); xml.append(tab(this.createXML(exportSetting.getExportTestDataSetting(), context))); xml.append("</export_setting>\n"); return xml.toString(); } private String createXML(ExportJavaSetting exportJavaSetting, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<export_java_setting>\n"); xml.append("\t<java_output>") .append(escape(exportJavaSetting.getJavaOutput())) .append("</java_output>\n"); xml.append("\t<package_name>") .append(escape(exportJavaSetting.getPackageName())) .append("</package_name>\n"); xml.append("\t<class_name_suffix>") .append(escape(exportJavaSetting.getClassNameSuffix())) .append("</class_name_suffix>\n"); xml.append("\t<src_file_encoding>") .append(escape(exportJavaSetting.getSrcFileEncoding())) .append("</src_file_encoding>\n"); xml.append("\t<with_hibernate>") .append(exportJavaSetting.isWithHibernate()) .append("</with_hibernate>\n"); xml.append("</export_java_setting>\n"); return xml.toString(); } private String createXML(ExportTestDataSetting exportTestDataSetting, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<export_testdata_setting>\n"); xml.append("\t<file_encoding>") .append(escape(exportTestDataSetting.getExportFileEncoding())) .append("</file_encoding>\n"); xml.append("\t<file_path>") .append(escape(exportTestDataSetting.getExportFilePath())) .append("</file_path>\n"); xml.append("\t<format>") .append(exportTestDataSetting.getExportFormat()) .append("</format>\n"); xml.append("</export_testdata_setting>\n"); return xml.toString(); } private String createXML(CategorySetting categorySettings, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<category_settings>\n"); xml.append("\t<free_layout>").append(categorySettings.isFreeLayout()) .append("</free_layout>\n"); xml.append("\t<show_referred_tables>") .append(categorySettings.isShowReferredTables()) .append("</show_referred_tables>\n"); xml.append("\t<categories>\n"); for (Category category : categorySettings.getAllCategories()) { xml.append(tab(tab(this.createXML(category, categorySettings.isSelected(category), context)))); } xml.append("\t</categories>\n"); xml.append("</category_settings>\n"); return xml.toString(); } // private String createXML(VGroupSetting groupSettings, PersistentContext context) { // StringBuilder xml = new StringBuilder(); // // xml.append("<group_settings>\n"); // xml.append("\t<free_layout>").append(groupSettings.isFreeLayout()).append("</free_layout>\n"); // xml.append("\t<show_referred_tables>").append(groupSettings.isShowReferredTables()).append("</show_referred_tables>\n"); // // xml.append("\t<groups>\n"); // for (VGroup group : groupSettings.getAllGroups()) { // xml.append(tab(tab(this.createXML(group, groupSettings.isSelected(group), context)))); // } // xml.append("\t</groups>\n"); // // xml.append("</group_settings>\n"); // // return xml.toString(); // } private String createXML(TranslationSetting translationSettings, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<translation_settings>\n"); xml.append("\t<use>").append(translationSettings.isUse()) .append("</use>\n"); xml.append("\t<translations>\n"); for (String translation : translationSettings.getSelectedTranslations()) { xml.append(tab(tab(this.createTranslationXML(translation, context)))); } xml.append("\t</translations>\n"); xml.append("</translation_settings>\n"); return xml.toString(); } private String createXML(Category category, boolean isSelected, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<category>\n"); xml.append(tab(this.createXMLNodeElement(category, context))); xml.append("\t<name>").append(escape(category.getName())) .append("</name>\n"); xml.append("\t<selected>").append(isSelected).append("</selected>\n"); for (NodeElement nodeElement : category.getContents()) { xml.append("\t<node_element>") .append(context.nodeElementMap.get(nodeElement)) .append("</node_element>\n"); } xml.append("</category>\n"); return xml.toString(); } private String createXML(VGroup group, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<group>\n"); xml.append(tab(this.createXMLNodeElement(group, context))); xml.append("\t<name>").append(escape(group.getName())).append("</name>\n"); // xml.append("\t<selected>").append(isSelected).append("</selected>\n"); for (NodeElement nodeElement : group.getContents()) { xml.append("\t<node_element>") .append(context.nodeElementMap.get(((ERVirtualTable)nodeElement).getRawTable())) .append("</node_element>\n"); } xml.append("</group>\n"); return xml.toString(); } // private String createXML(VGroup group, boolean isSelected, // PersistentContext context) { // StringBuilder xml = new StringBuilder(); // // xml.append("<group>\n"); // // xml.append(tab(this.createXMLNodeElement(group, context))); // // xml.append("\t<name>").append(escape(group.getName())) // .append("</name>\n"); // xml.append("\t<selected>").append(isSelected).append("</selected>\n"); // // for (NodeElement nodeElement : group.getContents()) { // xml.append("\t<node_element>") // .append(context.nodeElementMap.get(nodeElement)) // .append("</node_element>\n"); // } // // xml.append("</group>\n"); // // return xml.toString(); // } private String createTranslationXML(String translation, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<translation>\n"); xml.append("\t<name>").append(escape(translation)).append("</name>\n"); xml.append("</translation>\n"); return xml.toString(); } private String createXML(NodeSet contents, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<contents>\n"); for (NodeElement content : contents) { String subxml = null; if (content instanceof ERTable) { subxml = this.createXML((ERTable) content, context); } else if (content instanceof ERModel) { // do nothing // subxml = this.createXMLERModel((ERModel) content, context); } else if (content instanceof Note) { // subxml = this.createXML((Note) content, context); } else if (content instanceof View) { subxml = this.createXML((View) content, context); } else if (content instanceof InsertedImage) { subxml = this.createXML((InsertedImage) content, context); } else if (content instanceof VGroup) { // do nothing // subxml = this.createXML((VGroup) content, context); } else { throw new RuntimeException("not support " + content); } if (subxml != null) xml.append(tab(subxml)); } xml.append("</contents>\n"); return xml.toString(); } private String createXMLERModel(ERModelSet modelSet, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<ermodels>\n"); for (ERModel erModel : modelSet) { xml.append("\t<ermodel>\n"); xml.append("\t\t<id>").append(context.ermodelMap.get(erModel)).append("</id>\n"); xml.append("\t\t<name>").append(erModel.getName()).append("</name>\n"); appendColor(xml, "color", erModel.getColor()); xml.append("\t\t<vtables>\n"); for (ERVirtualTable table : erModel.getTables()) { xml.append("\t\t\t<vtable>\n"); xml.append("\t\t\t\t<id>").append(context.nodeElementMap.get(table.getRawTable())).append("</id>\n"); xml.append("\t\t\t\t<x>").append(table.getX()).append("</x>\n"); xml.append("\t\t\t\t<y>").append(table.getY()).append("</y>\n"); appendFont(xml, table); xml.append("\t\t\t</vtable>\n"); } xml.append("\t\t</vtables>\n"); xml.append("\t\t<groups>\n"); for (VGroup group : erModel.getGroups()) { xml.append(createXML(group, context)); } xml.append("\t\t</groups>\n"); xml.append("\t\t<notes>\n"); for (Note note : erModel.getNotes()) { xml.append(createXML(note, context)); } xml.append("\t\t</notes>\n"); xml.append("\t</ermodel>\n"); } xml.append("</ermodels>\n"); return xml.toString(); } private void appendFont(StringBuilder xml, NodeElement nodeElement) { xml.append("\t<font_name>").append(escape(nodeElement.getFontName())).append("</font_name>\n"); xml.append("\t<font_size>").append(nodeElement.getFontSize()).append("</font_size>\n"); } // private String createXMLERModel(ERModel erModel, PersistentContext context) { // StringBuilder xml = new StringBuilder(); //// xml.append("<ermodels>\n"); //// //// for (ERModel erModel : ermodels) { // xml.append("\t<ermodel>\n"); // xml.append("\t\t<id>").append(context.nodeElementMap.get(erModel)).append("</id>\n"); // xml.append("\t\t<name>").append(erModel.getName()).append("</name>\n"); // xml.append("\t\t<vtables>\n"); // for (ERVirtualTable table : erModel.getTables()) { // xml.append("\t\t\t<vtable>\n"); // xml.append("\t\t\t\t<id>").append(context.nodeElementMap.get(table.getRawTable())).append("</id>\n"); // xml.append("\t\t\t\t<x>").append(table.getX()).append("</x>\n"); // xml.append("\t\t\t\t<y>").append(table.getY()).append("</y>\n"); // xml.append("\t\t\t</vtable>\n"); // } // xml.append("\t\t</vtables>\n"); // xml.append("\t</ermodel>\n"); //// } //// //// xml.append("</ermodels>\n"); // return xml.toString(); // } private String createXMLNodeElement(NodeElement nodeElement, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<id>") .append(Format.toString(context.nodeElementMap.get(nodeElement))) .append("</id>\n"); xml.append("<height>").append(nodeElement.getHeight()) .append("</height>\n"); xml.append("<width>").append(nodeElement.getWidth()) .append("</width>\n"); xml.append("\t<font_name>").append(escape(nodeElement.getFontName())) .append("</font_name>\n"); xml.append("\t<font_size>").append(nodeElement.getFontSize()) .append("</font_size>\n"); xml.append("<x>").append(nodeElement.getX()).append("</x>\n"); xml.append("<y>").append(nodeElement.getY()).append("</y>\n"); xml.append(this.createXMLColor(nodeElement.getColor())); List<ConnectionElement> incomings = nodeElement.getIncomings(); xml.append(this.createXMLConnections(incomings, context)); return xml.toString(); } private String createXMLColor(int[] colors) { StringBuilder xml = new StringBuilder(); if (colors != null) { xml.append("<color>\n"); xml.append("\t<r>").append(colors[0]).append("</r>\n"); xml.append("\t<g>").append(colors[1]).append("</g>\n"); xml.append("\t<b>").append(colors[2]).append("</b>\n"); xml.append("</color>\n"); } return xml.toString(); } private String createXML(ERTable table, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<table>\n"); xml.append(tab(this.createXMLNodeElement(table, context))); xml.append("\t<physical_name>").append(escape(table.getPhysicalName())) .append("</physical_name>\n"); xml.append("\t<logical_name>").append(escape(table.getLogicalName())) .append("</logical_name>\n"); xml.append("\t<description>").append(escape(table.getDescription())) .append("</description>\n"); xml.append("\t<constraint>").append(escape(table.getConstraint())) .append("</constraint>\n"); xml.append("\t<primary_key_name>") .append(escape(table.getPrimaryKeyName())) .append("</primary_key_name>\n"); xml.append("\t<option>").append(escape(table.getOption())) .append("</option>\n"); List<Column> columns = table.getColumns(); xml.append(tab(this.createXMLColumns(columns, context))); List<Index> indexes = table.getIndexes(); xml.append(tab(this.createXMLIndexes(indexes, context))); List<ComplexUniqueKey> complexUniqueKeyList = table .getComplexUniqueKeyList(); xml.append(tab(this.createXMLComplexUniqueKeyList(complexUniqueKeyList, context))); TableProperties tableProperties = (TableProperties) table .getTableViewProperties(); xml.append(tab(this.createXML(tableProperties, context))); xml.append("</table>\n"); return xml.toString(); } private String createXML(View view, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<view>\n"); xml.append(tab(this.createXMLNodeElement(view, context))); xml.append("\t<physical_name>").append(escape(view.getPhysicalName())) .append("</physical_name>\n"); xml.append("\t<logical_name>").append(escape(view.getLogicalName())) .append("</logical_name>\n"); xml.append("\t<description>").append(escape(view.getDescription())) .append("</description>\n"); xml.append("\t<sql>").append(escape(view.getSql())).append("</sql>\n"); List<Column> columns = view.getColumns(); xml.append(tab(this.createXMLColumns(columns, context))); ViewProperties viewProperties = (ViewProperties) view .getTableViewProperties(); xml.append(tab(this.createXML(viewProperties, context))); xml.append("</view>\n"); return xml.toString(); } private String createXML(ModelProperties modelProperties, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<model_properties>\n"); xml.append(tab(this.createXMLNodeElement(modelProperties, context))); xml.append("\t<display>").append(modelProperties.isDisplay()) .append("</display>\n"); xml.append("\t<creation_date>") .append(DATE_FORMAT.format(modelProperties.getCreationDate())) .append("</creation_date>\n"); xml.append("\t<updated_date>") .append(DATE_FORMAT.format(modelProperties.getUpdatedDate())) .append("</updated_date>\n"); for (NameValue property : modelProperties.getProperties()) { xml.append(tab(this.createXML(property, context))); } xml.append("</model_properties>\n"); return xml.toString(); } private String createXML(NameValue property, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<model_property>\n"); xml.append("\t<name>").append(escape(property.getName())) .append("</name>\n"); xml.append("\t<value>").append(escape(property.getValue())) .append("</value>\n"); xml.append("</model_property>\n"); return xml.toString(); } private String createXML(Note note, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<note>\n"); xml.append(tab(this.createXMLNodeElement(note, context))); xml.append("\t<text>").append(escape(note.getText())) .append("</text>\n"); xml.append("</note>\n"); return xml.toString(); } private String createXML(InsertedImage insertedImage, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<image>\n"); xml.append(tab(this.createXMLNodeElement(insertedImage, context))); xml.append("\t<data>").append(insertedImage.getBase64EncodedData()) .append("</data>\n"); xml.append("\t<hue>").append(insertedImage.getHue()).append("</hue>\n"); xml.append("\t<saturation>").append(insertedImage.getSaturation()) .append("</saturation>\n"); xml.append("\t<brightness>").append(insertedImage.getBrightness()) .append("</brightness>\n"); xml.append("\t<alpha>").append(insertedImage.getAlpha()) .append("</alpha>\n"); xml.append("\t<fix_aspect_ratio>") .append(insertedImage.isFixAspectRatio()) .append("</fix_aspect_ratio>\n"); xml.append("</image>\n"); return xml.toString(); } private String createXMLColumns(List<Column> columns, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<columns>\n"); for (Column column : columns) { if (column instanceof ColumnGroup) { xml.append(tab(this.createXMLId((ColumnGroup) column, context))); } else if (column instanceof NormalColumn) { xml.append(tab(this.createXML((NormalColumn) column, context))); } } xml.append("</columns>\n"); return xml.toString(); } private String createXMLId(ColumnGroup columnGroup, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<column_group>") .append(context.columnGroupMap.get(columnGroup)) .append("</column_group>\n"); return xml.toString(); } private String createXML(NormalColumn normalColumn, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<normal_column>\n"); Integer wordId = null; if (context != null) { wordId = context.wordMap.get(normalColumn.getWord()); if (wordId != null) { xml.append("\t<word_id>").append(wordId).append("</word_id>\n"); } xml.append("\t<id>").append(context.columnMap.get(normalColumn)) .append("</id>\n"); for (NormalColumn referencedColumn : normalColumn .getReferencedColumnList()) { xml.append("\t<referenced_column>") .append(Format.toString(context.columnMap .get(referencedColumn))) .append("</referenced_column>\n"); } for (Relation relation : normalColumn.getRelationList()) { xml.append("\t<relation>") .append(context.connectionMap.get(relation)) .append("</relation>\n"); } } String description = normalColumn.getForeignKeyDescription(); String logicalName = normalColumn.getForeignKeyLogicalName(); String physicalName = normalColumn.getForeignKeyPhysicalName(); SqlType sqlType = normalColumn.getType(); xml.append("\t<description>").append(escape(description)) .append("</description>\n"); xml.append("\t<unique_key_name>") .append(escape(normalColumn.getUniqueKeyName())) .append("</unique_key_name>\n"); xml.append("\t<logical_name>").append(escape(logicalName)) .append("</logical_name>\n"); xml.append("\t<physical_name>").append(escape(physicalName)) .append("</physical_name>\n"); String type = ""; if (sqlType != null) { type = sqlType.getId(); } xml.append("\t<type>").append(type).append("</type>\n"); xml.append("\t<constraint>") .append(escape(normalColumn.getConstraint())) .append("</constraint>\n"); xml.append("\t<default_value>") .append(escape(normalColumn.getDefaultValue())) .append("</default_value>\n"); xml.append("\t<auto_increment>").append(normalColumn.isAutoIncrement()) .append("</auto_increment>\n"); xml.append("\t<foreign_key>").append(normalColumn.isForeignKey()) .append("</foreign_key>\n"); xml.append("\t<not_null>").append(normalColumn.isNotNull()) .append("</not_null>\n"); xml.append("\t<primary_key>").append(normalColumn.isPrimaryKey()) .append("</primary_key>\n"); xml.append("\t<unique_key>").append(normalColumn.isUniqueKey()) .append("</unique_key>\n"); xml.append("\t<character_set>") .append(escape(normalColumn.getCharacterSet())) .append("</character_set>\n"); xml.append("\t<collation>").append(escape(normalColumn.getCollation())) .append("</collation>\n"); xml.append(tab(this.createXML(normalColumn.getAutoIncrementSetting()))); xml.append("</normal_column>\n"); return xml.toString(); } private String createXMLConnections(List<ConnectionElement> incomings, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<connections>\n"); for (ConnectionElement connection : incomings) { if (connection instanceof CommentConnection) { xml.append(tab(this.createXML((CommentConnection) connection, context))); } else if (connection instanceof Relation) { xml.append(tab(this.createXML((Relation) connection, context))); } } xml.append("</connections>\n"); return xml.toString(); } private String createXMLConnectionElement(ConnectionElement connection, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<id>").append(context.connectionMap.get(connection)) .append("</id>\n"); xml.append("<source>") .append(context.nodeElementMap.get(connection.getSource())) .append("</source>\n"); xml.append("<target>") .append(context.nodeElementMap.get(connection.getTarget())) .append("</target>\n"); for (Bendpoint bendpoint : connection.getBendpoints()) { xml.append(tab(this.createXML(bendpoint))); } return xml.toString(); } private String createXML(Bendpoint bendpoint) { StringBuilder xml = new StringBuilder(); xml.append("<bendpoint>\n"); xml.append("\t<relative>").append(bendpoint.isRelative()) .append("</relative>\n"); xml.append("\t<x>").append(bendpoint.getX()).append("</x>\n"); xml.append("\t<y>").append(bendpoint.getY()).append("</y>\n"); xml.append("</bendpoint>\n"); return xml.toString(); } private String createXML(CommentConnection connection, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<comment_connection>\n"); xml.append(tab(this.createXMLConnectionElement(connection, context))); xml.append("</comment_connection>\n"); return xml.toString(); } private String createXML(Relation relation, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<relation>\n"); xml.append(tab(this.createXMLConnectionElement(relation, context))); xml.append("\t<child_cardinality>") .append(escape(relation.getChildCardinality())) .append("</child_cardinality>\n"); xml.append("\t<parent_cardinality>") .append(escape(relation.getParentCardinality())) .append("</parent_cardinality>\n"); xml.append("\t<reference_for_pk>").append(relation.isReferenceForPK()) .append("</reference_for_pk>\n"); xml.append("\t<name>").append(escape(relation.getName())) .append("</name>\n"); xml.append("\t<on_delete_action>") .append(escape(relation.getOnDeleteAction())) .append("</on_delete_action>\n"); xml.append("\t<on_update_action>") .append(escape(relation.getOnUpdateAction())) .append("</on_update_action>\n"); xml.append("\t<source_xp>").append(relation.getSourceXp()) .append("</source_xp>\n"); xml.append("\t<source_yp>").append(relation.getSourceYp()) .append("</source_yp>\n"); xml.append("\t<target_xp>").append(relation.getTargetXp()) .append("</target_xp>\n"); xml.append("\t<target_yp>").append(relation.getTargetYp()) .append("</target_yp>\n"); xml.append("\t<referenced_column>") .append(context.columnMap.get(relation.getReferencedColumn())) .append("</referenced_column>\n"); xml.append("\t<referenced_complex_unique_key>") .append(context.complexUniqueKeyMap.get(relation .getReferencedComplexUniqueKey())) .append("</referenced_complex_unique_key>\n"); xml.append("</relation>\n"); return xml.toString(); } private String createXMLIndexes(List<Index> indexes, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<indexes>\n"); for (Index index : indexes) { xml.append(tab(this.createXML(index, context))); } xml.append("</indexes>\n"); return xml.toString(); } private String createXMLComplexUniqueKeyList( List<ComplexUniqueKey> complexUniqueKeyList, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<complex_unique_key_list>\n"); for (ComplexUniqueKey complexUniqueKey : complexUniqueKeyList) { xml.append(tab(this.createXML(complexUniqueKey, context))); } xml.append("</complex_unique_key_list>\n"); return xml.toString(); } private String createXML(EnvironmentSetting environmentSetting, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<environment_setting>\n"); for (Environment environment : environmentSetting.getEnvironments()) { xml.append("\t<environment>\n"); Integer environmentId = context.environmentMap.get(environment); xml.append("\t\t<id>").append(environmentId).append("</id>\n"); xml.append("\t\t<name>").append(environment.getName()) .append("</name>\n"); xml.append("\t</environment>\n"); } xml.append("</environment_setting>\n"); return xml.toString(); } private String createXML(TableProperties tableProperties, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<table_properties>\n"); Integer tablespaceId = context.tablespaceMap.get(tableProperties .getTableSpace()); if (tablespaceId != null) { xml.append("\t<tablespace_id>").append(tablespaceId) .append("</tablespace_id>\n"); } xml.append("\t<schema>").append(escape(tableProperties.getSchema())) .append("</schema>\n"); if (tableProperties instanceof MySQLTableProperties) { xml.append(tab(this .createXML((MySQLTableProperties) tableProperties))); } else if (tableProperties instanceof PostgresTableProperties) { xml.append(tab(this .createXML((PostgresTableProperties) tableProperties))); } xml.append("</table_properties>\n"); return xml.toString(); } private String createXML(MySQLTableProperties tableProperties) { StringBuilder xml = new StringBuilder(); xml.append("<character_set>") .append(escape(tableProperties.getCharacterSet())) .append("</character_set>\n"); xml.append("<collation>") .append(escape(tableProperties.getCollation())) .append("</collation>\n"); xml.append("<storage_engine>") .append(escape(tableProperties.getStorageEngine())) .append("</storage_engine>\n"); xml.append("<primary_key_length_of_text>") .append(tableProperties.getPrimaryKeyLengthOfText()) .append("</primary_key_length_of_text>\n"); return xml.toString(); } private String createXML(PostgresTableProperties tableProperties) { StringBuilder xml = new StringBuilder(); xml.append("<without_oids>").append(tableProperties.isWithoutOIDs()) .append("</without_oids>\n"); return xml.toString(); } private String createXML(ViewProperties viewProperties, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<view_properties>\n"); Integer tablespaceId = context.tablespaceMap.get(viewProperties .getTableSpace()); if (tablespaceId != null) { xml.append("\t<tablespace_id>").append(tablespaceId) .append("</tablespace_id>\n"); } xml.append("<schema>").append(escape(viewProperties.getSchema())) .append("</schema>\n"); xml.append("</view_properties>\n"); return xml.toString(); } private String createXML(Index index, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<inidex>\n"); xml.append("\t<full_text>").append(index.isFullText()) .append("</full_text>\n"); xml.append("\t<non_unique>").append(index.isNonUnique()) .append("</non_unique>\n"); xml.append("\t<name>").append(escape(index.getName())) .append("</name>\n"); xml.append("\t<type>").append(escape(index.getType())) .append("</type>\n"); xml.append("\t<description>").append(escape(index.getDescription())) .append("</description>\n"); xml.append("\t<columns>\n"); List<Boolean> descs = index.getDescs(); int count = 0; for (Column column : index.getColumns()) { xml.append("\t\t<column>\n"); xml.append("\t\t\t<id>").append(context.columnMap.get(column)) .append("</id>\n"); Boolean desc = Boolean.FALSE; if (descs.size() > count) { desc = descs.get(count); } xml.append("\t\t\t<desc>").append(desc).append("</desc>\n"); xml.append("\t\t</column>\n"); count++; } xml.append("\t</columns>\n"); xml.append("</inidex>\n"); return xml.toString(); } private String createXML(ComplexUniqueKey complexUniqueKey, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<complex_unique_key>\n"); xml.append("\t<id>") .append(context.complexUniqueKeyMap.get(complexUniqueKey)) .append("</id>\n"); xml.append("\t<name>") .append(Format.null2blank(complexUniqueKey.getUniqueKeyName())) .append("</name>\n"); xml.append("\t<columns>\n"); for (NormalColumn column : complexUniqueKey.getColumnList()) { xml.append("\t\t<column>\n"); xml.append("\t\t\t<id>").append(context.columnMap.get(column)) .append("</id>\n"); xml.append("\t\t</column>\n"); } xml.append("\t</columns>\n"); xml.append("</complex_unique_key>\n"); return xml.toString(); } private String createXML(Dictionary dictionary, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<dictionary>\n"); for (Word word : dictionary.getWordList()) { xml.append(tab(this.createXML(word, context))); } xml.append("</dictionary>\n"); return xml.toString(); } private String createXML(Word word, PersistentContext context) { StringBuilder xml = new StringBuilder(); xml.append("<word>\n"); if (context != null) { xml.append("\t<id>").append(context.wordMap.get(word)) .append("</id>\n"); } xml.append("\t<length>").append(word.getTypeData().getLength()) .append("</length>\n"); xml.append("\t<decimal>").append(word.getTypeData().getDecimal()) .append("</decimal>\n"); Integer arrayDimension = word.getTypeData().getArrayDimension(); xml.append("\t<array>").append(word.getTypeData().isArray()) .append("</array>\n"); xml.append("\t<array_dimension>").append(arrayDimension) .append("</array_dimension>\n"); xml.append("\t<unsigned>").append(word.getTypeData().isUnsigned()) .append("</unsigned>\n"); xml.append("\t<args>").append(escape(word.getTypeData().getArgs())) .append("</args>\n"); xml.append("\t<description>").append(escape(word.getDescription())) .append("</description>\n"); xml.append("\t<logical_name>").append(escape(word.getLogicalName())) .append("</logical_name>\n"); xml.append("\t<physical_name>").append(escape(word.getPhysicalName())) .append("</physical_name>\n"); String type = ""; if (word.getType() != null) { type = word.getType().getId(); } xml.append("\t<type>").append(type).append("</type>\n"); xml.append("</word>\n"); return xml.toString(); } public static String escape(String s) { if (s == null) { return ""; } StringBuilder result = new StringBuilder(s.length() + 10); for (int i = 0; i < s.length(); ++i) { appendEscapedChar(result, s.charAt(i)); } return result.toString(); } private static void appendEscapedChar(StringBuilder buffer, char c) { String replacement = getReplacement(c); if (replacement != null) { buffer.append('&'); buffer.append(replacement); buffer.append(';'); } else { buffer.append(c); } } private static String getReplacement(char c) { // Encode special XML characters into the equivalent character // references. // The first five are defined by default for all XML documents. // The next three (#xD, #xA, #x9) are encoded to avoid them // being converted to spaces on deserialization switch (c) { case '<': return "lt"; //$NON-NLS-1$ case '>': return "gt"; //$NON-NLS-1$ case '"': return "quot"; //$NON-NLS-1$ case '\'': return "apos"; //$NON-NLS-1$ case '&': return "amp"; //$NON-NLS-1$ case '\r': return "#x0D"; //$NON-NLS-1$ case '\n': return "#x0A"; //$NON-NLS-1$ case '\u0009': return "#x09"; //$NON-NLS-1$ } return null; } }