Search in sources :

Example 1 with XMLBuilder

use of org.jkiss.utils.xml.XMLBuilder in project dbeaver by serge-rider.

the class SQLQueryParameterRegistry method save.

public void save() {
    File storeFile = DBeaverActivator.getConfigurationFile(CONFIG_FILE_NAME);
    try (OutputStream os = new FileOutputStream(storeFile)) {
        XMLBuilder xml = new XMLBuilder(os, GeneralUtils.UTF8_ENCODING);
        xml.setButify(true);
        xml.startElement("bindings");
        for (ParameterInfo param : parameterMap.values()) {
            xml.startElement(TAG_PARAMETER);
            xml.addAttribute(RegistryConstants.ATTR_NAME, param.name);
            xml.addAttribute(RegistryConstants.ATTR_VALUE, param.value);
            xml.endElement();
        }
        xml.endElement();
        xml.flush();
    } catch (IOException ex) {
        log.warn("IO error", ex);
    }
}
Also used : XMLBuilder(org.jkiss.utils.xml.XMLBuilder)

Example 2 with XMLBuilder

use of org.jkiss.utils.xml.XMLBuilder in project dbeaver by serge-rider.

the class CompareReportRenderer method renderReport.

public void renderReport(DBRProgressMonitor monitor, CompareReport report, CompareObjectsSettings settings, OutputStream outputStream) throws IOException {
    this.report = report;
    this.settings = settings;
    this.xml = new XMLBuilder(outputStream, GeneralUtils.UTF8_ENCODING, true);
    this.xml.setButify(true);
    xml.addContent("<!DOCTYPE html \n" + "     PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n" + "    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">");
    if (settings.isShowOnlyDifferences()) {
        // Mark differences on tree nodes
        List<CompareReportLine> reportLines = report.getReportLines();
        int reportLinesSize = reportLines.size();
        for (int i = 0; i < reportLinesSize; i++) {
            if (reportLines.get(i).hasDifference) {
                int depth = reportLines.get(i).depth;
                for (int k = i - 1; k >= 0; k--) {
                    CompareReportLine prevNode = reportLines.get(k);
                    if (prevNode.depth < depth) {
                        if (prevNode.hasDifference) {
                            // Already set
                            break;
                        }
                        depth = prevNode.depth;
                        prevNode.hasDifference = true;
                    }
                }
            }
        }
    }
    xml.startElement("html");
    xml.startElement("head");
    xml.startElement("meta");
    xml.addAttribute("http-equiv", "Content-type");
    xml.addAttribute("content", "text/html; charset=utf-8");
    xml.endElement();
    xml.startElement("title");
    xml.addText("Compare report");
    xml.endElement();
    xml.endElement();
    xml.startElement("body");
    renderHeader();
    xml.startElement("table");
    xml.addAttribute("width", "100%");
    //xml.addAttribute("border", "1");
    xml.addAttribute("cellspacing", 0);
    xml.addAttribute("cellpadding", 0);
    renderBody(monitor);
    xml.endElement();
    xml.endElement();
    xml.endElement();
    this.xml.flush();
}
Also used : XMLBuilder(org.jkiss.utils.xml.XMLBuilder)

Example 3 with XMLBuilder

use of org.jkiss.utils.xml.XMLBuilder in project dbeaver by serge-rider.

the class DiagramLoader method save.

public static void save(DBRProgressMonitor monitor, DiagramPart diagramPart, final EntityDiagram diagram, boolean verbose, OutputStream out) throws IOException {
    // Prepare DS objects map
    Map<DBPDataSourceContainer, DataSourceObjects> dsMap = new IdentityHashMap<>();
    if (diagram != null) {
        for (ERDEntity erdEntity : diagram.getEntities()) {
            final DBPDataSourceContainer dsContainer = erdEntity.getObject().getDataSource().getContainer();
            DataSourceObjects desc = dsMap.get(dsContainer);
            if (desc == null) {
                desc = new DataSourceObjects();
                dsMap.put(dsContainer, desc);
            }
            desc.entities.add(erdEntity);
        }
    }
    Map<ERDEntity, TableSaveInfo> infoMap = new IdentityHashMap<>();
    // Save as XML
    XMLBuilder xml = new XMLBuilder(out, GeneralUtils.UTF8_ENCODING);
    xml.setButify(true);
    if (verbose) {
        xml.addContent("\n<!DOCTYPE diagram [\n" + "<!ATTLIST diagram version CDATA #REQUIRED\n" + " name CDATA #IMPLIED\n" + " time CDATA #REQUIRED>\n" + "<!ELEMENT diagram (entities, relations, notes)>\n" + "<!ELEMENT entities (data-source*)>\n" + "<!ELEMENT data-source (entity*)>\n" + "<!ATTLIST data-source id CDATA #REQUIRED>\n" + "<!ELEMENT entity (path*)>\n" + "<!ATTLIST entity id ID #REQUIRED\n" + " name CDATA #REQUIRED\n" + " fq-name CDATA #REQUIRED>\n" + "<!ELEMENT relations (relation*)>\n" + "<!ELEMENT relation (bend*)>\n" + "<!ATTLIST relation name CDATA #REQUIRED\n" + " fq-name CDATA #REQUIRED\n" + " pk-ref IDREF #REQUIRED\n" + " fk-ref IDREF #REQUIRED>\n" + "]>\n");
    }
    xml.startElement(TAG_DIAGRAM);
    xml.addAttribute(ATTR_VERSION, ERD_VERSION_1);
    if (diagram != null) {
        xml.addAttribute(ATTR_NAME, diagram.getName());
    }
    xml.addAttribute(ATTR_TIME, RuntimeUtils.getCurrentTimeStamp());
    if (diagram != null) {
        xml.startElement(TAG_ENTITIES);
        for (DBPDataSourceContainer dsContainer : dsMap.keySet()) {
            xml.startElement(TAG_DATA_SOURCE);
            xml.addAttribute(ATTR_ID, dsContainer.getId());
            final DataSourceObjects desc = dsMap.get(dsContainer);
            int tableCounter = ERD_VERSION_1;
            for (ERDEntity erdEntity : desc.entities) {
                final DBSEntity table = erdEntity.getObject();
                EntityPart tablePart = diagramPart == null ? null : diagramPart.getEntityPart(erdEntity);
                TableSaveInfo info = new TableSaveInfo(erdEntity, tablePart, tableCounter++);
                infoMap.put(erdEntity, info);
                xml.startElement(TAG_ENTITY);
                xml.addAttribute(ATTR_ID, info.objectId);
                xml.addAttribute(ATTR_NAME, table.getName());
                if (table instanceof DBPQualifiedObject) {
                    xml.addAttribute(ATTR_FQ_NAME, ((DBPQualifiedObject) table).getFullyQualifiedName(DBPEvaluationContext.UI));
                }
                Rectangle tableBounds;
                if (tablePart != null) {
                    tableBounds = tablePart.getBounds();
                } else {
                    tableBounds = diagram.getInitBounds(erdEntity);
                }
                if (tableBounds != null) {
                    xml.addAttribute(ATTR_X, tableBounds.x);
                    xml.addAttribute(ATTR_Y, tableBounds.y);
                }
                for (DBSObject parent = table.getParentObject(); parent != null && parent != dsContainer; parent = parent.getParentObject()) {
                    xml.startElement(TAG_PATH);
                    xml.addAttribute(ATTR_NAME, parent.getName());
                    xml.endElement();
                }
                xml.endElement();
            }
            xml.endElement();
        }
        xml.endElement();
        // Relations
        xml.startElement(TAG_RELATIONS);
        for (ERDEntity erdEntity : diagram.getEntities()) {
            for (ERDAssociation rel : erdEntity.getPrimaryKeyRelationships()) {
                xml.startElement(TAG_RELATION);
                DBSEntityAssociation association = rel.getObject();
                xml.addAttribute(ATTR_NAME, association.getName());
                if (association instanceof DBPQualifiedObject) {
                    xml.addAttribute(ATTR_FQ_NAME, ((DBPQualifiedObject) association).getFullyQualifiedName(DBPEvaluationContext.UI));
                }
                xml.addAttribute(ATTR_TYPE, association.getConstraintType().getId());
                TableSaveInfo pkInfo = infoMap.get(rel.getPrimaryKeyEntity());
                if (pkInfo == null) {
                    log.error("Cannot find PK table '" + DBUtils.getObjectFullName(rel.getPrimaryKeyEntity().getObject(), DBPEvaluationContext.UI) + "' in info map");
                    continue;
                }
                TableSaveInfo fkInfo = infoMap.get(rel.getForeignKeyEntity());
                if (fkInfo == null) {
                    log.error("Cannot find FK table '" + DBUtils.getObjectFullName(rel.getForeignKeyEntity().getObject(), DBPEvaluationContext.UI) + "' in info map");
                    continue;
                }
                xml.addAttribute(ATTR_PK_REF, pkInfo.objectId);
                xml.addAttribute(ATTR_FK_REF, fkInfo.objectId);
                if (association instanceof ERDLogicalForeignKey) {
                    // Save columns
                    for (DBSEntityAttributeRef column : ((ERDLogicalForeignKey) association).getAttributeReferences(VoidProgressMonitor.INSTANCE)) {
                        xml.startElement(TAG_COLUMN);
                        xml.addAttribute(ATTR_NAME, column.getAttribute().getName());
                        try {
                            xml.addAttribute(ATTR_REF_NAME, DBUtils.getReferenceAttribute(monitor, association, column.getAttribute()).getName());
                        } catch (DBException e) {
                            log.warn("Error getting reference attribute", e);
                        }
                        xml.endElement();
                    }
                }
                // Save bends
                if (pkInfo.tablePart != null) {
                    AssociationPart associationPart = pkInfo.tablePart.getConnectionPart(rel, false);
                    if (associationPart != null) {
                        final List<Bendpoint> bendpoints = associationPart.getBendpoints();
                        if (!CommonUtils.isEmpty(bendpoints)) {
                            for (Bendpoint bendpoint : bendpoints) {
                                xml.startElement(TAG_BEND);
                                if (bendpoint instanceof AbsoluteBendpoint) {
                                    xml.addAttribute(ATTR_TYPE, BEND_ABSOLUTE);
                                    xml.addAttribute(ATTR_X, bendpoint.getLocation().x);
                                    xml.addAttribute(ATTR_Y, bendpoint.getLocation().y);
                                } else if (bendpoint instanceof RelativeBendpoint) {
                                    xml.addAttribute(ATTR_TYPE, BEND_RELATIVE);
                                    xml.addAttribute(ATTR_X, bendpoint.getLocation().x);
                                    xml.addAttribute(ATTR_Y, bendpoint.getLocation().y);
                                }
                                xml.endElement();
                            }
                        }
                    }
                }
                xml.endElement();
            }
        }
        xml.endElement();
        // Notes
        xml.startElement(TAG_NOTES);
        for (ERDNote note : diagram.getNotes()) {
            NotePart notePart = diagramPart == null ? null : diagramPart.getNotePart(note);
            xml.startElement(TAG_NOTE);
            if (notePart != null) {
                Rectangle noteBounds = notePart.getBounds();
                if (noteBounds != null) {
                    xml.addAttribute(ATTR_X, noteBounds.x);
                    xml.addAttribute(ATTR_Y, noteBounds.y);
                    xml.addAttribute(ATTR_W, noteBounds.width);
                    xml.addAttribute(ATTR_H, noteBounds.height);
                }
            }
            xml.addText(note.getObject());
            xml.endElement();
        }
        xml.endElement();
    }
    xml.endElement();
    xml.flush();
}
Also used : DBException(org.jkiss.dbeaver.DBException) Rectangle(org.eclipse.draw2d.geometry.Rectangle) XMLBuilder(org.jkiss.utils.xml.XMLBuilder) AbsoluteBendpoint(org.eclipse.draw2d.AbsoluteBendpoint) AbsoluteBendpoint(org.eclipse.draw2d.AbsoluteBendpoint) Point(org.eclipse.draw2d.geometry.Point) RelativeBendpoint(org.eclipse.draw2d.RelativeBendpoint) Bendpoint(org.eclipse.draw2d.Bendpoint) RelativeBendpoint(org.eclipse.draw2d.RelativeBendpoint) NotePart(org.jkiss.dbeaver.ext.erd.part.NotePart) AssociationPart(org.jkiss.dbeaver.ext.erd.part.AssociationPart) EntityPart(org.jkiss.dbeaver.ext.erd.part.EntityPart) AbsoluteBendpoint(org.eclipse.draw2d.AbsoluteBendpoint) RelativeBendpoint(org.eclipse.draw2d.RelativeBendpoint) Bendpoint(org.eclipse.draw2d.Bendpoint)

Example 4 with XMLBuilder

use of org.jkiss.utils.xml.XMLBuilder in project dbeaver by serge-rider.

the class ERDExportGraphML method exportDiagramToGraphML.

void exportDiagramToGraphML(String filePath) {
    try {
        try (FileOutputStream fos = new FileOutputStream(filePath)) {
            XMLBuilder xml = new XMLBuilder(fos, GeneralUtils.UTF8_ENCODING);
            xml.setButify(true);
            xml.startElement("graphml");
            xml.addAttribute("xmlns", "http://graphml.graphdrawing.org/xmlns");
            xml.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
            xml.addAttribute("xsi:schemaLocation", "http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd");
            xml.addAttribute("xmlns:y", "http://www.yworks.com/xml/graphml");
            xml.startElement("key");
            xml.addAttribute("for", "node");
            xml.addAttribute("id", "nodegraph");
            xml.addAttribute("yfiles.type", "nodegraphics");
            xml.endElement();
            xml.startElement("key");
            xml.addAttribute("for", "edge");
            xml.addAttribute("id", "edgegraph");
            xml.addAttribute("yfiles.type", "edgegraphics");
            xml.endElement();
            xml.startElement("graph");
            xml.addAttribute("edgedefault", "directed");
            xml.addAttribute("id", "G");
            Map<ERDEntity, String> entityMap = new HashMap<>();
            int nodeNum = 0;
            for (ERDEntity entity : diagram.getEntities()) {
                nodeNum++;
                String nodeId = "n" + nodeNum;
                entityMap.put(entity, nodeId);
                // node
                xml.startElement("node");
                xml.addAttribute("id", nodeId);
                {
                    // Graph data
                    xml.startElement("data");
                    xml.addAttribute("key", "nodegraph");
                    {
                        // Generic node
                        EntityPart entityPart = diagramPart.getEntityPart(entity);
                        EntityFigure entityFigure = (EntityFigure) entityPart.getFigure();
                        Rectangle partBounds = entityPart.getBounds();
                        xml.startElement("y:GenericNode");
                        xml.addAttribute("configuration", "com.yworks.entityRelationship.big_entity");
                        // Geometry
                        xml.startElement("y:Geometry");
                        xml.addAttribute("height", partBounds.height());
                        xml.addAttribute("width", partBounds.width);
                        xml.addAttribute("x", partBounds.x());
                        xml.addAttribute("y", partBounds.y());
                        xml.endElement();
                        // Fill
                        xml.startElement("y:Fill");
                        xml.addAttribute("color", getHtmlColor(entityFigure.getBackgroundColor()));
                        //xml.addAttribute("color2", partBounds.width);
                        xml.addAttribute("transparent", "false");
                        xml.endElement();
                        // Border
                        xml.startElement("y:BorderStyle");
                        xml.addAttribute("color", getHtmlColor(entityFigure.getForegroundColor()));
                        xml.addAttribute("type", "line");
                        xml.addAttribute("width", "1.0");
                        xml.endElement();
                        {
                            // Entity Name
                            Rectangle nameBounds = entityFigure.getNameLabel().getBounds();
                            xml.startElement("y:NodeLabel");
                            xml.addAttribute("alignment", "center");
                            xml.addAttribute("autoSizePolicy", "content");
                            xml.addAttribute("configuration", "com.yworks.entityRelationship.label.name");
                            xml.addAttribute("fontFamily", "Courier");
                            xml.addAttribute("fontSize", "12");
                            xml.addAttribute("fontStyle", "plain");
                            xml.addAttribute("hasLineColor", "false");
                            xml.addAttribute("modelName", "internal");
                            xml.addAttribute("modelPosition", "t");
                            xml.addAttribute("backgroundColor", getHtmlColor(entityFigure.getNameLabel().getBackgroundColor()));
                            xml.addAttribute("textColor", getHtmlColor(entityFigure.getNameLabel().getForegroundColor()));
                            xml.addAttribute("visible", "true");
                            xml.addAttribute("height", nameBounds.height());
                            xml.addAttribute("width", nameBounds.width);
                            xml.addAttribute("x", nameBounds.x());
                            xml.addAttribute("y", nameBounds.y());
                            xml.addText(entity.getName());
                            xml.endElement();
                        }
                        {
                            // Attributes
                            AttributeListFigure columnsFigure = entityFigure.getColumnsFigure();
                            Rectangle attrsBounds = columnsFigure.getBounds();
                            xml.startElement("y:NodeLabel");
                            xml.addAttribute("alignment", "left");
                            xml.addAttribute("autoSizePolicy", "content");
                            xml.addAttribute("configuration", "com.yworks.entityRelationship.label.attributes");
                            xml.addAttribute("fontFamily", "Courier");
                            xml.addAttribute("fontSize", "12");
                            xml.addAttribute("fontStyle", "plain");
                            xml.addAttribute("hasLineColor", "false");
                            xml.addAttribute("modelName", "custom");
                            xml.addAttribute("modelPosition", "t");
                            xml.addAttribute("backgroundColor", getHtmlColor(columnsFigure.getBackgroundColor()));
                            xml.addAttribute("textColor", getHtmlColor(columnsFigure.getForegroundColor()));
                            xml.addAttribute("visible", "true");
                            xml.addAttribute("height", attrsBounds.height());
                            xml.addAttribute("width", attrsBounds.width);
                            xml.addAttribute("x", attrsBounds.x());
                            xml.addAttribute("y", attrsBounds.y());
                            StringBuilder attrsString = new StringBuilder();
                            for (ERDEntityAttribute attr : entity.getColumns()) {
                                if (attrsString.length() > 0) {
                                    attrsString.append("\n");
                                }
                                attrsString.append(attr.getName());
                            }
                            xml.addText(attrsString.toString());
                            xml.startElement("y:LabelModel");
                            xml.startElement("y:ErdAttributesNodeLabelModel");
                            xml.endElement();
                            xml.endElement();
                            xml.startElement("y:ModelParameter");
                            xml.startElement("y:ErdAttributesNodeLabelModelParameter");
                            xml.endElement();
                            xml.endElement();
                            xml.endElement();
                        }
                        xml.endElement();
                    }
                    xml.endElement();
                }
                xml.endElement();
            }
            int edgeNum = 0;
            for (ERDEntity entity : diagram.getEntities()) {
                EntityPart entityPart = diagramPart.getEntityPart(entity);
                for (ERDAssociation association : entity.getForeignKeyRelationships()) {
                    AssociationPart associationPart = entityPart.getConnectionPart(association, true);
                    if (associationPart == null) {
                        log.debug("Association part not found");
                        continue;
                    }
                    edgeNum++;
                    String edgeId = "e" + edgeNum;
                    xml.startElement("edge");
                    xml.addAttribute("id", edgeId);
                    xml.addAttribute("source", entityMap.get(entity));
                    xml.addAttribute("target", entityMap.get(association.getPrimaryKeyEntity()));
                    xml.startElement("data");
                    xml.addAttribute("key", "edgegraph");
                    xml.startElement("y:PolyLineEdge");
                    // sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
                    xml.startElement("y:Path");
                    for (Bendpoint bp : associationPart.getBendpoints()) {
                        xml.startElement("y:Point");
                        xml.addAttribute("x", bp.getLocation().x);
                        xml.addAttribute("y", bp.getLocation().x);
                        xml.endElement();
                    }
                    xml.endElement();
                    xml.startElement("y:LineStyle");
                    xml.addAttribute("color", "#000000");
                    xml.addAttribute("type", !association.isIdentifying() || association.isLogical() ? "dashed" : "line");
                    xml.addAttribute("width", "1.0");
                    xml.endElement();
                    xml.startElement("y:Arrows");
                    String sourceStyle = !association.isIdentifying() ? "white_diamond" : "none";
                    xml.addAttribute("source", sourceStyle);
                    xml.addAttribute("target", "circle");
                    xml.endElement();
                    xml.startElement("y:BendStyle");
                    xml.addAttribute("smoothed", "false");
                    xml.endElement();
                    xml.endElement();
                    xml.endElement();
                    xml.endElement();
                }
            }
            xml.endElement();
            xml.endElement();
            xml.flush();
            fos.flush();
        }
        UIUtils.launchProgram(filePath);
    } catch (Exception e) {
        UIUtils.showErrorDialog(null, "Save ERD as GraphML", null, e);
    }
}
Also used : EntityFigure(org.jkiss.dbeaver.ext.erd.figures.EntityFigure) HashMap(java.util.HashMap) ERDEntity(org.jkiss.dbeaver.ext.erd.model.ERDEntity) Rectangle(org.eclipse.draw2d.geometry.Rectangle) ERDAssociation(org.jkiss.dbeaver.ext.erd.model.ERDAssociation) XMLBuilder(org.jkiss.utils.xml.XMLBuilder) Bendpoint(org.eclipse.draw2d.Bendpoint) AttributeListFigure(org.jkiss.dbeaver.ext.erd.figures.AttributeListFigure) ERDEntityAttribute(org.jkiss.dbeaver.ext.erd.model.ERDEntityAttribute) FileOutputStream(java.io.FileOutputStream) AssociationPart(org.jkiss.dbeaver.ext.erd.part.AssociationPart) EntityPart(org.jkiss.dbeaver.ext.erd.part.EntityPart) Bendpoint(org.eclipse.draw2d.Bendpoint)

Example 5 with XMLBuilder

use of org.jkiss.utils.xml.XMLBuilder in project dbeaver by dbeaver.

the class DiagramLoader method save.

public static void save(DBRProgressMonitor monitor, @Nullable DiagramPart diagramPart, final EntityDiagram diagram, boolean verbose, OutputStream out) throws IOException {
    List allNodeFigures = diagramPart == null ? new ArrayList() : diagramPart.getFigure().getChildren();
    // Prepare DS objects map
    Map<DBPDataSourceContainer, DataSourceObjects> dsMap = new IdentityHashMap<>();
    if (diagram != null) {
        for (ERDEntity erdEntity : diagram.getEntities()) {
            final DBPDataSourceContainer dsContainer = erdEntity.getObject().getDataSource().getContainer();
            DataSourceObjects desc = dsMap.get(dsContainer);
            if (desc == null) {
                desc = new DataSourceObjects();
                dsMap.put(dsContainer, desc);
            }
            desc.entities.add(erdEntity);
        }
    }
    Map<ERDEntity, TableSaveInfo> infoMap = new IdentityHashMap<>();
    // Save as XML
    XMLBuilder xml = new XMLBuilder(out, GeneralUtils.UTF8_ENCODING);
    xml.setButify(true);
    if (verbose) {
        xml.addContent("\n<!DOCTYPE diagram [\n" + "<!ATTLIST diagram version CDATA #REQUIRED\n" + " name CDATA #IMPLIED\n" + " time CDATA #REQUIRED>\n" + "<!ELEMENT diagram (entities, relations, notes)>\n" + "<!ELEMENT entities (data-source*)>\n" + "<!ELEMENT data-source (entity*)>\n" + "<!ATTLIST data-source id CDATA #REQUIRED>\n" + "<!ELEMENT entity (path*)>\n" + "<!ATTLIST entity id ID #REQUIRED\n" + " name CDATA #REQUIRED\n" + " fq-name CDATA #REQUIRED>\n" + "<!ELEMENT relations (relation*)>\n" + "<!ELEMENT relation (bend*)>\n" + "<!ATTLIST relation name CDATA #REQUIRED\n" + " fq-name CDATA #REQUIRED\n" + " pk-ref IDREF #REQUIRED\n" + " fk-ref IDREF #REQUIRED>\n" + "]>\n");
    }
    xml.startElement(TAG_DIAGRAM);
    xml.addAttribute(ATTR_VERSION, ERD_VERSION_1);
    if (diagram != null) {
        xml.addAttribute(ATTR_NAME, diagram.getName());
    }
    xml.addAttribute(ATTR_TIME, RuntimeUtils.getCurrentTimeStamp());
    if (diagram != null) {
        xml.startElement(TAG_ENTITIES);
        for (DBPDataSourceContainer dsContainer : dsMap.keySet()) {
            xml.startElement(TAG_DATA_SOURCE);
            xml.addAttribute(ATTR_ID, dsContainer.getId());
            final DataSourceObjects desc = dsMap.get(dsContainer);
            int tableCounter = ERD_VERSION_1;
            for (ERDEntity erdEntity : desc.entities) {
                final DBSEntity table = erdEntity.getObject();
                EntityPart tablePart = diagramPart == null ? null : diagramPart.getEntityPart(erdEntity);
                TableSaveInfo info = new TableSaveInfo(erdEntity, tablePart, tableCounter++);
                infoMap.put(erdEntity, info);
                xml.startElement(TAG_ENTITY);
                xml.addAttribute(ATTR_ID, info.objectId);
                xml.addAttribute(ATTR_NAME, table.getName());
                if (table instanceof DBPQualifiedObject) {
                    xml.addAttribute(ATTR_FQ_NAME, ((DBPQualifiedObject) table).getFullyQualifiedName(DBPEvaluationContext.UI));
                }
                EntityDiagram.NodeVisualInfo visualInfo;
                if (tablePart != null) {
                    visualInfo = new EntityDiagram.NodeVisualInfo();
                    visualInfo.initBounds = tablePart.getBounds();
                    visualInfo.bgColor = tablePart.getCustomBackgroundColor();
                    saveColorAndOrder(allNodeFigures, xml, tablePart);
                } else {
                    visualInfo = diagram.getVisualInfo(erdEntity);
                }
                if (visualInfo != null && visualInfo.initBounds != null) {
                    xml.addAttribute(ATTR_X, visualInfo.initBounds.x);
                    xml.addAttribute(ATTR_Y, visualInfo.initBounds.y);
                }
                for (DBSObject parent = table.getParentObject(); parent != null && parent != dsContainer; parent = parent.getParentObject()) {
                    xml.startElement(TAG_PATH);
                    xml.addAttribute(ATTR_NAME, parent.getName());
                    xml.endElement();
                }
                xml.endElement();
            }
            xml.endElement();
        }
        xml.endElement();
        // Relations
        xml.startElement(TAG_RELATIONS);
        for (ERDEntity erdEntity : diagram.getEntities()) {
            for (ERDAssociation rel : erdEntity.getPrimaryKeyRelationships()) {
                xml.startElement(TAG_RELATION);
                DBSEntityAssociation association = rel.getObject();
                xml.addAttribute(ATTR_NAME, association.getName());
                if (association instanceof DBPQualifiedObject) {
                    xml.addAttribute(ATTR_FQ_NAME, ((DBPQualifiedObject) association).getFullyQualifiedName(DBPEvaluationContext.UI));
                }
                xml.addAttribute(ATTR_TYPE, association.getConstraintType().getId());
                TableSaveInfo pkInfo = infoMap.get(rel.getPrimaryKeyEntity());
                if (pkInfo == null) {
                    log.error("Cannot find PK table '" + DBUtils.getObjectFullName(rel.getPrimaryKeyEntity().getObject(), DBPEvaluationContext.UI) + "' in info map");
                    continue;
                }
                TableSaveInfo fkInfo = infoMap.get(rel.getForeignKeyEntity());
                if (fkInfo == null) {
                    log.error("Cannot find FK table '" + DBUtils.getObjectFullName(rel.getForeignKeyEntity().getObject(), DBPEvaluationContext.UI) + "' in info map");
                    continue;
                }
                xml.addAttribute(ATTR_PK_REF, pkInfo.objectId);
                xml.addAttribute(ATTR_FK_REF, fkInfo.objectId);
                if (association instanceof ERDLogicalForeignKey) {
                    // Save columns
                    for (DBSEntityAttributeRef column : ((ERDLogicalForeignKey) association).getAttributeReferences(new VoidProgressMonitor())) {
                        xml.startElement(TAG_COLUMN);
                        xml.addAttribute(ATTR_NAME, column.getAttribute().getName());
                        try {
                            DBSEntityAttribute referenceAttribute = DBUtils.getReferenceAttribute(monitor, association, column.getAttribute(), false);
                            if (referenceAttribute != null) {
                                xml.addAttribute(ATTR_REF_NAME, referenceAttribute.getName());
                            }
                        } catch (DBException e) {
                            log.warn("Error getting reference attribute", e);
                        }
                        xml.endElement();
                    }
                }
                // Save bends
                if (pkInfo.tablePart != null) {
                    AssociationPart associationPart = pkInfo.tablePart.getConnectionPart(rel, false);
                    if (associationPart != null) {
                        final List<Bendpoint> bendpoints = associationPart.getBendpoints();
                        if (!CommonUtils.isEmpty(bendpoints)) {
                            for (Bendpoint bendpoint : bendpoints) {
                                xml.startElement(TAG_BEND);
                                if (bendpoint instanceof AbsoluteBendpoint) {
                                    xml.addAttribute(ATTR_TYPE, BEND_ABSOLUTE);
                                    xml.addAttribute(ATTR_X, bendpoint.getLocation().x);
                                    xml.addAttribute(ATTR_Y, bendpoint.getLocation().y);
                                } else if (bendpoint instanceof RelativeBendpoint) {
                                    xml.addAttribute(ATTR_TYPE, BEND_RELATIVE);
                                    xml.addAttribute(ATTR_X, bendpoint.getLocation().x);
                                    xml.addAttribute(ATTR_Y, bendpoint.getLocation().y);
                                }
                                xml.endElement();
                            }
                        }
                    }
                }
                xml.endElement();
            }
        }
        xml.endElement();
        // Notes
        xml.startElement(TAG_NOTES);
        for (ERDNote note : diagram.getNotes()) {
            NotePart notePart = diagramPart == null ? null : diagramPart.getNotePart(note);
            xml.startElement(TAG_NOTE);
            if (notePart != null) {
                saveColorAndOrder(allNodeFigures, xml, notePart);
                Rectangle noteBounds = notePart.getBounds();
                if (noteBounds != null) {
                    xml.addAttribute(ATTR_X, noteBounds.x);
                    xml.addAttribute(ATTR_Y, noteBounds.y);
                    xml.addAttribute(ATTR_W, noteBounds.width);
                    xml.addAttribute(ATTR_H, noteBounds.height);
                }
            }
            xml.addText(note.getObject());
            xml.endElement();
        }
        xml.endElement();
    }
    xml.endElement();
    xml.flush();
}
Also used : DBException(org.jkiss.dbeaver.DBException) Rectangle(org.eclipse.draw2d.geometry.Rectangle) XMLBuilder(org.jkiss.utils.xml.XMLBuilder) AbsoluteBendpoint(org.eclipse.draw2d.AbsoluteBendpoint) AbsoluteBendpoint(org.eclipse.draw2d.AbsoluteBendpoint) Point(org.eclipse.draw2d.geometry.Point) RelativeBendpoint(org.eclipse.draw2d.RelativeBendpoint) Bendpoint(org.eclipse.draw2d.Bendpoint) RelativeBendpoint(org.eclipse.draw2d.RelativeBendpoint) VoidProgressMonitor(org.jkiss.dbeaver.model.runtime.VoidProgressMonitor) AbsoluteBendpoint(org.eclipse.draw2d.AbsoluteBendpoint) RelativeBendpoint(org.eclipse.draw2d.RelativeBendpoint) Bendpoint(org.eclipse.draw2d.Bendpoint)

Aggregations

XMLBuilder (org.jkiss.utils.xml.XMLBuilder)40 FileOutputStream (java.io.FileOutputStream)10 HashMap (java.util.HashMap)8 Map (java.util.Map)8 Bendpoint (org.eclipse.draw2d.Bendpoint)8 Rectangle (org.eclipse.draw2d.geometry.Rectangle)8 DBException (org.jkiss.dbeaver.DBException)7 OutputStream (java.io.OutputStream)6 XMLException (org.jkiss.utils.xml.XMLException)6 AbsoluteBendpoint (org.eclipse.draw2d.AbsoluteBendpoint)4 RelativeBendpoint (org.eclipse.draw2d.RelativeBendpoint)4 DBPDriverLibrary (org.jkiss.dbeaver.model.connection.DBPDriverLibrary)4 AssociationPart (org.jkiss.dbeaver.ext.erd.part.AssociationPart)3 EntityPart (org.jkiss.dbeaver.ext.erd.part.EntityPart)3 VoidProgressMonitor (org.jkiss.dbeaver.model.runtime.VoidProgressMonitor)3 ByteArrayInputStream (java.io.ByteArrayInputStream)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)2 File (java.io.File)2 IOException (java.io.IOException)2 StringWriter (java.io.StringWriter)2