All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.nuiton.topia.service.sql.batch.SqlRequests Maven / Gradle / Ivy

package org.nuiton.topia.service.sql.batch;

/*
 * #%L
 * ObServe Toolkit :: ToPIA Extension
 * %%
 * Copyright (C) 2008 - 2017 IRD, Ultreia.io
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * 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 General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * .
 * #L%
 */

import com.google.common.collect.ImmutableSet;
import java.io.Writer;
import java.nio.file.Path;
import java.util.Iterator;
import org.nuiton.topia.persistence.TopiaApplicationContext;
import org.nuiton.topia.persistence.metadata.TopiaMetadataModel;
import org.nuiton.topia.service.sql.batch.actions.AbstractSchemaRequest;
import org.nuiton.topia.service.sql.batch.actions.AbstractSqlRequest;
import org.nuiton.topia.service.sql.batch.actions.AbstractTablesRequest;
import org.nuiton.topia.service.sql.batch.actions.CreateSchemaRequest;
import org.nuiton.topia.service.sql.batch.actions.DeleteTablesRequest;
import org.nuiton.topia.service.sql.batch.actions.DropSchemaRequest;
import org.nuiton.topia.service.sql.batch.actions.ReplicateTablesRequest;
import org.nuiton.topia.service.sql.batch.actions.TopiaSqlTableSelectArgument;
import org.nuiton.topia.service.sql.batch.actions.UpdateTablesRequest;
import org.nuiton.topia.service.sql.batch.tables.TopiaSqlTables;

/**
 * A {@link SqlRequests} is a container of requests.
 * 

* Created on 04/01/16. * * @author Tony Chemit - [email protected] * @since 3.0.1 */ public class SqlRequests implements Iterable { protected final ImmutableSet requests; protected final boolean showSql; protected SqlRequests(ImmutableSet requests, boolean showSql) { this.requests = requests; this.showSql = showSql; } public static Builder builder() { return new BuilderImpl(); } public static SqlRequests of(R request) { return builder() .from(request.getSourceTopiaApplicationContext()) .to(request.getTargetTopiaApplicationContext()) .to(request.getWriter()) .addRequest(request) .build(); } @Override public Iterator iterator() { return requests.iterator(); } public boolean isShowSql() { return showSql; } public interface Builder extends BuilderAddRequestStep { Builder showSql(); Builder from(TopiaApplicationContext sourceTopiaApplicationContext); Builder to(TopiaApplicationContext targetTopiaApplicationContext); Builder to(Writer writer); } interface BuilderAddRequestStep { CreateSchemaRequestBuilder createSchemaBuilder(); DropSchemaRequestBuilder dropSchemaBuilder(); ReplicateTablesRequestBuilder replicateTablesBuilder(TopiaMetadataModel metadataModel); UpdateTablesRequestBuilder updateTablesBuilder(TopiaMetadataModel metadataModel); DeleteTablesRequestBuilder deleteTablesBuilder(); BuilderAddRequestStep addRequest(R request); Builder flush(); SqlRequests build(); } protected static class BuilderImpl implements Builder { protected final ImmutableSet.Builder requestsBuilder = ImmutableSet.builder(); protected TopiaApplicationContext sourceTopiaApplicationContext; protected TopiaApplicationContext targetTopiaApplicationContext; protected Writer writer; private boolean showSql; @Override public Builder showSql() { showSql = true; return this; } @Override public Builder from(TopiaApplicationContext sourceTopiaApplicationContext) { this.sourceTopiaApplicationContext = sourceTopiaApplicationContext; return this; } @Override public Builder to(TopiaApplicationContext targetTopiaApplicationContext) { this.targetTopiaApplicationContext = targetTopiaApplicationContext; return this; } @Override public Builder to(Writer writer) { this.writer = writer; return this; } @Override public SqlRequests build() { return new SqlRequests(requestsBuilder.build(), showSql); } @Override public Builder addRequest(R request) { requestsBuilder.add(request); return this; } @Override public CreateSchemaRequestBuilder createSchemaBuilder() { return new CreateSchemaRequestBuilder(this, initBuilder(CreateSchemaRequest.builder())); } @Override public DropSchemaRequestBuilder dropSchemaBuilder() { return new DropSchemaRequestBuilder(this, initBuilder(DropSchemaRequest.builder())); } @Override public ReplicateTablesRequestBuilder replicateTablesBuilder(TopiaMetadataModel metadataModel) { ReplicateTablesRequest.Builder builder = new ReplicateTablesRequest.Builder(); builder.setTopiaMetaModel(metadataModel); return new ReplicateTablesRequestBuilder(this, initBuilder(builder)); } @Override public UpdateTablesRequestBuilder updateTablesBuilder(TopiaMetadataModel metadataModel) { UpdateTablesRequest.Builder builder = new UpdateTablesRequest.Builder(); builder.setTopiaMetaModel(metadataModel); return new UpdateTablesRequestBuilder(this, initBuilder(builder)); } @Override public DeleteTablesRequestBuilder deleteTablesBuilder() { return new DeleteTablesRequestBuilder(this, initBuilder(new DeleteTablesRequest.Builder())); } @Override public Builder flush() { return this; } protected > B initBuilder(B builder) { return builder.from(sourceTopiaApplicationContext) .to(targetTopiaApplicationContext) .to(writer); } } public static class CreateSchemaRequestBuilder extends AbstractSchemaRequestBuilder { public CreateSchemaRequestBuilder(BuilderImpl builder, CreateSchemaRequest.Builder delegate) { super(builder, delegate); delegate.setAddSchema(true); } } public static class DropSchemaRequestBuilder extends AbstractSchemaRequestBuilder { public DropSchemaRequestBuilder(BuilderImpl builder, DropSchemaRequest.Builder delegate) { super(builder, delegate); delegate.setDropSchema(true); } } public static class ReplicateTablesRequestBuilder extends AbstractTablesRequestBuilder { public ReplicateTablesRequestBuilder(BuilderImpl builder, ReplicateTablesRequest.Builder delegate) { super(builder, delegate); } } public static class UpdateTablesRequestBuilder extends AbstractTablesRequestBuilder { public UpdateTablesRequestBuilder(BuilderImpl builder, UpdateTablesRequest.Builder delegate) { super(builder, delegate); } } public static class DeleteTablesRequestBuilder extends AbstractTablesRequestBuilder { public DeleteTablesRequestBuilder(BuilderImpl builder, DeleteTablesRequest.Builder delegate) { super(builder, delegate); } } protected static abstract class RequestBuilderImpl implements BuilderAddRequestStep { protected final Builder builder; protected final R delegate; protected RequestBuilderImpl(BuilderImpl builder, R delegate) { this.builder = builder; this.delegate = delegate; } @Override public CreateSchemaRequestBuilder createSchemaBuilder() { return flush().createSchemaBuilder(); } @Override public DropSchemaRequestBuilder dropSchemaBuilder() { return flush().dropSchemaBuilder(); } @Override public ReplicateTablesRequestBuilder replicateTablesBuilder(TopiaMetadataModel metadataModel) { return flush().replicateTablesBuilder(metadataModel); } @Override public UpdateTablesRequestBuilder updateTablesBuilder(TopiaMetadataModel metadataModel) { return flush().updateTablesBuilder(metadataModel); } @Override public DeleteTablesRequestBuilder deleteTablesBuilder() { return flush().deleteTablesBuilder(); } @Override public BuilderAddRequestStep addRequest(RR request) { return builder.addRequest(request); } @Override public SqlRequests build() { return flush().build(); } @Override public Builder flush() { addRequest(delegate.build()); return builder; } protected B returnThis() { return (B) this; } } protected static class AbstractSchemaRequestBuilder extends RequestBuilderImpl { protected AbstractSchemaRequestBuilder(BuilderImpl builder, R delegate) { super(builder, delegate); } public B forH2() { delegate.forH2(); return returnThis(); } public B forPostgres() { delegate.forPostgres(); return returnThis(); } public B setTemporaryPath(Path temporaryPath) { delegate.setTemporaryPath(temporaryPath); return returnThis(); } } protected static class AbstractTablesRequestBuilder extends RequestBuilderImpl { protected AbstractTablesRequestBuilder(BuilderImpl builder, R delegate) { super(builder, delegate); } public B setTables(TopiaSqlTables tables) { delegate.setTables(tables); return returnThis(); } public B setSelectArgument(TopiaSqlTableSelectArgument arg) { delegate.setSelectArgument(arg); return returnThis(); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy