Repository: incubator-ignite Updated Branches: refs/heads/ignite-32 [created] ac306c5e0
# IGNITE-32 WIP: parse db metadata and generating XML configs. Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/ac306c5e Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/ac306c5e Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/ac306c5e Branch: refs/heads/ignite-32 Commit: ac306c5e02dad55ac0284b173ab67588b60e4477 Parents: 3032bee Author: AKuznetsov <akuznet...@gridgain.com> Authored: Fri Dec 19 14:59:48 2014 +0700 Committer: AKuznetsov <akuznet...@gridgain.com> Committed: Fri Dec 19 14:59:48 2014 +0700 ---------------------------------------------------------------------- .../cache/query/GridCacheQueryTypeMetadata.java | 14 +- modules/schema-load/pom.xml | 54 ++++ .../apache/ignite/schema/db/DbConnection.java | 102 +++++++ .../ignite/schema/db/DbMetadataParser.java | 184 ++++++++++++ .../apache/ignite/schema/util/SchemaUtils.java | 67 +++++ .../ignite/schema/xml/XmlTransformer.java | 278 +++++++++++++++++++ pom.xml | 1 + 7 files changed, 695 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/ac306c5e/modules/core/src/main/java/org/gridgain/grid/cache/query/GridCacheQueryTypeMetadata.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/query/GridCacheQueryTypeMetadata.java b/modules/core/src/main/java/org/gridgain/grid/cache/query/GridCacheQueryTypeMetadata.java index 946ad19..b213a18 100644 --- a/modules/core/src/main/java/org/gridgain/grid/cache/query/GridCacheQueryTypeMetadata.java +++ b/modules/core/src/main/java/org/gridgain/grid/cache/query/GridCacheQueryTypeMetadata.java @@ -25,19 +25,19 @@ public class GridCacheQueryTypeMetadata { /** Fields to be queried, in addition to indexed fields. */ @GridToStringInclude - private Map<String, Class<?>> qryFlds = new HashMap<>(); + private Map<String, Class<?>> qryFlds; /** Fields to index in ascending order. */ @GridToStringInclude - private Map<String, Class<?>> ascFlds = new HashMap<>(); + private Map<String, Class<?>> ascFlds; /** Fields to index in descending order. */ @GridToStringInclude - private Map<String, Class<?>> descFlds = new HashMap<>(); + private Map<String, Class<?>> descFlds; /** Fields to index as text. */ @GridToStringInclude - private Collection<String> txtFlds = new LinkedHashSet<>(); + private Collection<String> txtFlds; /** Fields to create group indexes for. */ @GridToStringInclude @@ -47,7 +47,11 @@ public class GridCacheQueryTypeMetadata { * Default constructor. */ public GridCacheQueryTypeMetadata() { - // No-op. + qryFlds = new LinkedHashMap<>(); + ascFlds = new LinkedHashMap<>(); + descFlds = new LinkedHashMap<>(); + txtFlds = new LinkedHashSet<>(); + grps = new LinkedHashMap<>(); } /** http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/ac306c5e/modules/schema-load/pom.xml ---------------------------------------------------------------------- diff --git a/modules/schema-load/pom.xml b/modules/schema-load/pom.xml new file mode 100644 index 0000000..bca95b9 --- /dev/null +++ b/modules/schema-load/pom.xml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + _________ _____ __________________ _____ + __ ____/___________(_)______ /__ ____/______ ____(_)_______ + _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + + Copyright (C) GridGain Systems. All Rights Reserved. +--> +<!-- + POM file. +--> +<project + xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.ignite</groupId> + <artifactId>ignite</artifactId> + <version>${ignite.version}</version> + <relativePath>../..</relativePath> + </parent> + + <artifactId>ignite-schema-load</artifactId> + + <dependencies> + <dependency> + <groupId>org.apache.ignite</groupId> + <artifactId>ignite-core</artifactId> + <version>${ignite.version}</version> + </dependency> + + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + <version>1.3.175</version> + </dependency> + </dependencies> + + <build> + <resources> + <resource> + <directory>src/main/java</directory> + <excludes> + <exclude>**/*.java</exclude> + </excludes> + </resource> + </resources> + </build> +</project> http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/ac306c5e/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbConnection.java ---------------------------------------------------------------------- diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbConnection.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbConnection.java new file mode 100644 index 0000000..d6bce39 --- /dev/null +++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbConnection.java @@ -0,0 +1,102 @@ +/* @java.file.header */ + +/* _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.schema.db; + +import org.apache.ignite.schema.xml.*; +import org.gridgain.grid.cache.query.*; + +import javax.xml.transform.*; +import javax.xml.transform.stream.*; +import java.io.*; +import java.sql.*; +import java.util.*; + +/** + * TODO: Add class description. + */ +public class DbConnection { + /** + * TODO Temporary test. + * + * @param args App args... + */ + public static void main(String[] args) { + try { + Class.forName("org.h2.Driver"); + Connection conn = DriverManager.getConnection("jdbc:h2:mem:test", "sa", ""); + + Statement stmt = conn.createStatement(); + + stmt.executeUpdate("CREATE TABLE Organization (id integer, name varchar(50), city varchar(50))"); + stmt.executeUpdate("CREATE TABLE Person (id integer, org_id integer, name varchar(50))"); + + stmt.executeUpdate("CREATE INDEX Org_Name_IDX On Organization (name)"); + stmt.executeUpdate("CREATE INDEX Org_Name_City_IDX On Organization (name, city)"); + stmt.executeUpdate("CREATE INDEX Person_Name_IDX1 On Person (name)"); + stmt.executeUpdate("CREATE INDEX Person_Name_IDX2 On Person (name desc)"); + + conn.commit(); + + stmt.executeUpdate("INSERT INTO Organization(id, name) VALUES (1, 'GridGain')" ); + stmt.executeUpdate("INSERT INTO Organization(id, name) VALUES (2, 'Apache')" ); + + stmt.executeUpdate("INSERT INTO Person(id, org_id, name) VALUES (1, 1, 'Kuznetsov')"); + stmt.executeUpdate("INSERT INTO Person(id, org_id, name) VALUES (2, 2, 'Boudnik')"); + + DbMetadataParser parser = new DbMetadataParser(conn); + + ResultSet schemas = parser.schemas(); + + Collection<GridCacheQueryTypeMetadata> all = new ArrayList<>(30); + + while(schemas.next()) { + String schema = schemas.getString(1); + + if (!"PUBLIC".equalsIgnoreCase(schema)) + continue; + + String cat = schemas.getString(2); + + System.out.println("Schema:" + schema + " Catalog: " + cat); + + ResultSet tbls = parser.tables(cat, schema); + + while(tbls.next()) { + String tbl = tbls.getString(3); + + System.out.println(" Table:" + tbl); + + GridCacheQueryTypeMetadata meta = parser.parse(cat, schema, tbl); + + all.add(meta); + + XmlTransformer transformer = new XmlTransformer(4); + + Result res = new StreamResult(new File("C:/temp/ignite/" + tbl + ".xml")); + + transformer.transform(meta, res); + } + + XmlTransformer transformer = new XmlTransformer(4); + + Result res = new StreamResult(new File("C:/temp/ignite/all.xml")); + + transformer.transform(all, res); + } + + conn.close(); + + System.out.println("Done!"); + } + catch(Throwable ex) { + ex.printStackTrace(); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/ac306c5e/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbMetadataParser.java ---------------------------------------------------------------------- diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbMetadataParser.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbMetadataParser.java new file mode 100644 index 0000000..e7e2cb9 --- /dev/null +++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/db/DbMetadataParser.java @@ -0,0 +1,184 @@ +/* @java.file.header */ + +/* _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.schema.db; + +import org.apache.ignite.lang.*; +import org.gridgain.grid.cache.query.*; + +import java.math.*; +import java.net.*; +import java.sql.*; +import java.sql.Date; +import java.util.*; + +import static java.sql.Types.*; +import static org.apache.ignite.schema.util.SchemaUtils.*; + +/** + * Database metadata parser. + */ +public class DbMetadataParser { + /** */ + private final DatabaseMetaData meta; + + /** + * @param conn Database connection. + * @throws SQLException If a database access error occurs. + */ + public DbMetadataParser(Connection conn) throws SQLException { + meta = conn.getMetaData(); + } + + /** + * @return Schemas description. + * @throws SQLException If a database access error occurs. + */ + public ResultSet schemas() throws SQLException { + return meta.getSchemas(); + } + + /** + * @return Tables description. + * @throws SQLException If a database access error occurs. + */ + public ResultSet tables(String catalog, String schema) throws SQLException { + return meta.getTables(catalog, schema, "%", null); + } + + /** + * @param type SQL data type. + * @return Java data type. + */ + private Class<?> dataType(int type) { + switch (type) { + case BIT: + case BOOLEAN: + return Boolean.class; + + case TINYINT: + return Byte.class; + + case SMALLINT: + return Short.class; + + case INTEGER: + return Integer.class; + + case BIGINT: + return Long.class; + + case REAL: + return Float.class; + + case FLOAT: + case DOUBLE: + return Double.class; + + case NUMERIC: + case DECIMAL: + return BigDecimal.class; + + case CHAR: + case VARCHAR: + case LONGVARCHAR: + case NCHAR: + case NVARCHAR: + case LONGNVARCHAR: + return String.class; + + case DATE: + return Date.class; + + case TIME: + return Time.class; + + case TIMESTAMP: + return Timestamp.class; + + case BINARY: + case VARBINARY: + case LONGVARBINARY: + case ARRAY: + case BLOB: + case CLOB: + case NCLOB: + return Array.class; + + case NULL: + return Void.class; + + case DATALINK: + return URL.class; + + // OTHER, JAVA_OBJECT, DISTINCT, STRUCT, REF, ROWID, SQLXML + default: + return Object.class; + } + } + + /** + * Parse database metadata. + * + * @param catalog Catalog name. + * @param schema Schema name. + * @param tbl Table name. + * @return New initialized instance of {@code GridCacheQueryTypeMetadata}. + * @throws SQLException If parsing failed. + */ + public GridCacheQueryTypeMetadata parse(String catalog, String schema, String tbl) throws SQLException { + GridCacheQueryTypeMetadata res = new GridCacheQueryTypeMetadata(); + + Map<String, Class<?>> qryFields = res.getQueryFields(); + Map<String, Class<?>> ascFields = res.getAscendingFields(); + Map<String, Class<?>> descFields = res.getDescendingFields(); + Map<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> groups = res.getGroups(); + + res.setType(toJavaClassName(tbl)); + + ResultSet flds = meta.getColumns(catalog, schema, tbl, null); + + while (flds.next()) { + String col = toJavaFieldName(flds.getString(4)); + + qryFields.put(col, dataType(flds.getInt(5))); + } + + ResultSet idxs = meta.getIndexInfo(catalog, schema, tbl, false, true); + + while (idxs.next()) { + String idx = toJavaFieldName(idxs.getString(6)); + String col = toJavaFieldName(idxs.getString(9)); + String askOrDesc = idxs.getString(10); + + LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>> idxCols = groups.get(idx); + + if (idxCols == null) { + idxCols = new LinkedHashMap<>(); + + groups.put(idx, idxCols); + } + + Class<?> dataType = qryFields.get(col); + + Boolean desc = askOrDesc != null ? "D".equals(askOrDesc) : null; + + if (desc != null) { + if (desc) + descFields.put(col, dataType); + else + ascFields.put(col, dataType); + } + + idxCols.put(col, new IgniteBiTuple<Class<?>, Boolean>(dataType, desc)); + } + + return res; + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/ac306c5e/modules/schema-load/src/main/java/org/apache/ignite/schema/util/SchemaUtils.java ---------------------------------------------------------------------- diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/util/SchemaUtils.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/util/SchemaUtils.java new file mode 100644 index 0000000..6e0e9f1 --- /dev/null +++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/util/SchemaUtils.java @@ -0,0 +1,67 @@ +/* @java.file.header */ + +/* _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.schema.util; + +/** + * TODO: Add class description. + */ +public class SchemaUtils { + /** + * @param str Source string. + * @return String with each word first letters capitalized. + */ + public static String capitalize(String str) { + int len = str.length(); + + StringBuilder buf = new StringBuilder(len); + + boolean capitalizeNext = true; + + for (int i = 0; i < len; i++) { + char ch = str.charAt(i); + + if (Character.isWhitespace(ch)) + capitalizeNext = true; + else if (capitalizeNext) { + buf.append(Character.toUpperCase(ch)); + + capitalizeNext = false; + } + else + buf.append(Character.toLowerCase(ch)); + } + + return buf.toString(); + } + + /** + * @param str Source string. + * @return String with first letters in lower case. + */ + public static String uncapitalize(String str) { + return Character.toLowerCase(str.charAt(0)) + str.substring(1); + } + + /** + * @param name Source name. + * @return String converted to java class name notation. + */ + public static String toJavaClassName(String name) { + return capitalize(name.replace("_", " ")).replace(" ", ""); + } + + /** + * @param name Source name. + * @return String converted to java field name notation. + */ + public static String toJavaFieldName(String name) { + return uncapitalize(toJavaClassName(name)); + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/ac306c5e/modules/schema-load/src/main/java/org/apache/ignite/schema/xml/XmlTransformer.java ---------------------------------------------------------------------- diff --git a/modules/schema-load/src/main/java/org/apache/ignite/schema/xml/XmlTransformer.java b/modules/schema-load/src/main/java/org/apache/ignite/schema/xml/XmlTransformer.java new file mode 100644 index 0000000..6a51604 --- /dev/null +++ b/modules/schema-load/src/main/java/org/apache/ignite/schema/xml/XmlTransformer.java @@ -0,0 +1,278 @@ +/* @java.file.header */ + +/* _________ _____ __________________ _____ + * __ ____/___________(_)______ /__ ____/______ ____(_)_______ + * _ / __ __ ___/__ / _ __ / _ / __ _ __ `/__ / __ __ \ + * / /_/ / _ / _ / / /_/ / / /_/ / / /_/ / _ / _ / / / + * \____/ /_/ /_/ \_,__/ \____/ \__,_/ /_/ /_/ /_/ + */ + +package org.apache.ignite.schema.xml; + +import org.apache.ignite.lang.*; +import org.gridgain.grid.cache.query.*; +import org.gridgain.grid.util.typedef.*; +import org.w3c.dom.*; + +import javax.xml.parsers.*; +import javax.xml.transform.*; +import javax.xml.transform.dom.*; +import java.util.*; + +/** + * Transformer that will take cache query metadata and write it to xml. + */ +public class XmlTransformer { + /** */ + private final Document doc; + + /** */ + private final Element beans; + + /** */ + private final Transformer transformer; + + /** + * Create transformer. + * + * @param indent Number of additional whitespace when outputting the result tree. + * @throws IllegalStateException If failed to create instance of {@code CacheQueryTypeMetadataXmlTransformer}. + */ + public XmlTransformer(int indent) throws IllegalStateException { + try { + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + + doc = docBuilder.newDocument(); + doc.setXmlStandalone(true); + + beans = addElement(doc, "beans"); + beans.setAttribute("xmlns", "http://www.springframework.org/schema/beans"); + beans.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); + beans.setAttribute("xmlns:util", "http://www.springframework.org/schema/util"); + beans.setAttribute("xsi:schemaLocation", + "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" + + "http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"); + + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + + transformer = transformerFactory.newTransformer(); + + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", String.valueOf(indent)); + + } + catch(ParserConfigurationException | TransformerConfigurationException e) { + throw new IllegalStateException(e); + } + } + /** + * @param parent Parent XML node. + * @param clazz Bean class. + */ + private Element addBean(Node parent, Class<?> clazz) { + Element elem = doc.createElement("bean"); + + elem.setAttribute("class", clazz.getName()); + + parent.appendChild(elem); + + return elem; + } + + + /** + * @param parent Parent XML node. + * @param tagName XML tag name. + * @param name Value for "name" attribute. + * @param val Value for "value" attribute. + */ + private Element addElement(Node parent, String tagName, String name, String val) { + Element elem = doc.createElement(tagName); + + if (name != null) + elem.setAttribute("name", name); + + if (val != null) + elem.setAttribute("value", val); + + parent.appendChild(elem); + + return elem; + } + + /** + * @param parent Parent XML node. + * @param tagName XML tag name. + */ + private Element addElement(Node parent, String tagName) { + return addElement(parent, tagName, null, null); + } + + /** + * Add to xml document: + * <pre name="code" class="xml"> + * <property name="name" value="value"/> + * </pre> + * + * @param parent Parent element. + * @param name Property name. + * @param val Property value. + */ + private Element addProperty(Node parent, String name, String val) { + return addElement(parent, "property", name, val); + } + + /** + * Add to xml document: + * <pre name="code" class="xml"> + * <property name="name"/> + * </pre> + * + * @param parent Parent XML node. + * @param name Property name. + */ + private Element addProperty(Node parent, String name) { + return addProperty(parent, name, null); + } + + /** + * Add fields to xml document: + * <pre name="code" class="xml"> + * <property name="name"> + * <map> + * <property entry="name" value="value"/> + * </map> + * </property> + * </pre> + * + * @param parent Parent XML node. + * @param name Property name. + * @param fields Map with fields. + */ + private void addFields(Node parent, String name, Map<String, Class<?>> fields) { + if (!fields.isEmpty()) { + Element prop = addProperty(parent, name); + + Element map = addElement(prop, "map"); + + for(Map.Entry<String, Class<?>> item : fields.entrySet()) + addElement(map, "entry", item.getKey(), item.getValue().getName()); + } + } + + /** + * Add text fields to xml document: + * <pre name="code" class="xml"> + * <property name="textFields"> + * <list> + * <value>field</value> + * </list> + * </property> + * </pre> + * + * @param textFields Collection with text fields. + */ + private void addTextFields(Node parent, Collection<String> textFields) { + if (!textFields.isEmpty()) { + Element prop = addProperty(parent, "textFields"); + + Element list = addElement(prop, "list"); + + for(String textField : textFields) + addElement(list, "value").setNodeValue(textField); + } + } + + /** + * Add indexes to xml document. + * + * @param groups Map with indexes. + */ + private void addGroups(Node parent, Map<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> groups) { + if (!F.isEmpty(groups)) { + Element prop = addProperty(parent, "groups"); + + Element map = addElement(prop, "map"); + + for (Map.Entry<String, LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>>> group : groups.entrySet()) { + Element entry1 = addElement(map, "entry", group.getKey(), null); + + Element val1 = addElement(entry1, "map"); + + LinkedHashMap<String, IgniteBiTuple<Class<?>, Boolean>> fields = group.getValue(); + + for(Map.Entry<String, IgniteBiTuple<Class<?>, Boolean>> field : fields.entrySet()) { + Element entry2 = addElement(val1, "entry", field.getKey(), null); + + Element val2 = addBean(entry2, IgniteBiTuple.class); + + Class<?> clazz = field.getValue().get1(); + + assert clazz != null; + + addProperty(val2, "key", field.getValue().get1().getCanonicalName()); + addProperty(val2, "value", String.valueOf(field.getValue().get2())); + } + } + } + } + + /** + * Add element with cache query type metadata to XML document. + * + * @param parent Parent XML node. + * @param meta Meta. + */ + private void addCacheQueryTypeMetadata(Node parent, GridCacheQueryTypeMetadata meta) { + Element bean = addBean(parent, GridCacheQueryTypeMetadata.class); + + addProperty(bean, "type", meta.getType()); + + addFields(bean, "queryFields", meta.getQueryFields()); + + addFields(bean, "ascendingFields", meta.getAscendingFields()); + + addFields(bean, "descendingFields", meta.getDescendingFields()); + + addTextFields(bean, meta.getTextFields()); + + addGroups(bean, meta.getGroups()); + } + + /** + * @param out Output result. + * @throws TransformerException If an unrecoverable error occurs during the course of the transformation. + */ + private void transform(Result out) throws TransformerException { + transformer.transform(new DOMSource(doc), out); + } + + /** + * Transform metadata into xml. + * + * @param meta Metadata to transform. + * @param out Output result. + * @throws TransformerException If an unrecoverable error occurs during the course of the transformation. + */ + public void transform(GridCacheQueryTypeMetadata meta, Result out) throws TransformerException { + addCacheQueryTypeMetadata(beans, meta); + + transform(out); + } + + /** + * Transform metadata into xml. + * + * @param meta Metadata to transform. + * @param out Output result. + * @throws TransformerException If an unrecoverable error occurs during the course of the transformation. + */ + public void transform(Collection<GridCacheQueryTypeMetadata> meta, Result out) throws TransformerException { + for(GridCacheQueryTypeMetadata item : meta) + addCacheQueryTypeMetadata(beans, item); + + transform(out); + } +} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/ac306c5e/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index e35788f..cb7a73d 100644 --- a/pom.xml +++ b/pom.xml @@ -85,6 +85,7 @@ <module>modules/log4j</module> <module>modules/slf4j</module> <module>modules/jcl</module> + <module>modules/schema-load</module> </modules> <dependencyManagement>