package com.tesora.dve.sql.template; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import java.util.Set; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang.StringUtils; import com.tesora.dve.common.PEFileUtils; import com.tesora.dve.exceptions.PEException; import com.tesora.dve.sql.schema.PETemplate; import com.tesora.dve.sql.schema.types.Type; import com.tesora.dve.sql.template.jaxb.FkModeType; import com.tesora.dve.sql.template.jaxb.ModelType; import com.tesora.dve.sql.template.jaxb.RequirementType; import com.tesora.dve.sql.template.jaxb.TableTemplateType; import com.tesora.dve.sql.template.jaxb.Template; public class TemplateBuilder { private Template target; public TemplateBuilder(String name) { this(name, null); } public TemplateBuilder(String name, String match) { this(name, match, null); } public TemplateBuilder(String name, String match, String comment) { target = new Template(); target.setName(name); target.setMatch(match); target.setComment(comment); } public TemplateBuilder withFKMode(FkModeType fkmt) { target.setFkmode(fkmt); return this; } public TemplateBuilder withRequirement(String decl) { RequirementType rt = new RequirementType(); rt.setDeclaration(decl); target.getRequirement().add(rt); return this; } public TemplateBuilder withTable(String match, String model) { TableTemplateType ttt = new TableTemplateType(); ttt.setMatch(match); ttt.setModel(ModelType.fromValue(model)); target.getTabletemplate().add(ttt); return this; } public TemplateBuilder withRangeTable(String match, String rangeName, String ...columns) { TableTemplateType ttt = new TableTemplateType(); ttt.setMatch(match); ttt.setModel(ModelType.RANGE); ttt.setRange(rangeName); for(String c : columns) ttt.getColumn().add(c); target.getTabletemplate().add(ttt); return this; } public TemplateBuilder withContainerTable(String match, String container, String ...columns) { TableTemplateType ttt = new TableTemplateType(); ttt.setMatch(match); ttt.setModel(ModelType.CONTAINER); ttt.setContainer(container); for(String c : columns) ttt.getDiscriminator().add(c); target.getTabletemplate().add(ttt); return this; } public String getName() { return this.target.getName(); } public String getMatch() { return this.target.getMatch(); } public String getComment() { return this.target.getComment(); } public String toXml() { return PETemplate.build(target); } public Template toTemplate() { return target; } public String toCreateRangeStatement(final String rangeName, final String groupName, final Set<Type> columnTypes) { final String typeSeparator = ", "; final StringBuilder statement = new StringBuilder(); statement.append("CREATE RANGE IF NOT EXISTS ").append(rangeName).append(" ("); for (final Type type : columnTypes) { statement.append(type.getTypeName()).append(typeSeparator); } final int statementLength = statement.length(); statement.delete(statementLength - typeSeparator.length(), statementLength).append(") PERSISTENT GROUP ").append(groupName); return statement.toString(); } public String toCreateStatement() { StringBuilder buf = new StringBuilder(getCreateStatement(this.getName(), this.toXml())); emitOptionalFields(buf); return buf.toString(); } public String toAlterStatement() { StringBuilder buf = new StringBuilder(getAlterStatement(this.getName(), this.toXml())); emitOptionalFields(buf); return buf.toString(); } public static String getClassPathCreate(String templateName) throws PEException { String body = StringEscapeUtils.escapeSql(PEFileUtils.readToString(TemplateBuilder.class, "/templates/" + templateName + ".template")); StringBuilder buf = new StringBuilder(getCreateStatement(templateName, body)); return buf.toString(); } private static String getCreateStatement(final String name, final String xmlBody) { return "CREATE TEMPLATE IF NOT EXISTS " + name + " XML='" + xmlBody + "'"; } private static String getAlterStatement(final String name, final String xmlBody) { return "ALTER TEMPLATE " + name + " SET XML='" + xmlBody + "'"; } private void emitOptionalFields(final StringBuilder buf) { final String match = this.getMatch(); if (StringUtils.isNotBlank(match)) { buf.append(" MATCH='").append(match).append("'"); } final String comment = this.getComment(); if (StringUtils.isNotBlank(comment)) { buf.append(" COMMENT='").append(comment).append("'"); } } }