org.apache.jackrabbit.core.util.db.CheckSchemaOperation Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.core.util.db;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.IOUtils;
import org.apache.jackrabbit.util.Text;
/**
* An operation which synchronously checks the DB schema in the {@link #run()} method. The
* {@link #addVariableReplacement(String, String)} method return the instance to enable method chaining.
*/
public class CheckSchemaOperation {
public static final String SCHEMA_OBJECT_PREFIX_VARIABLE = "${schemaObjectPrefix}";
public static final String TABLE_SPACE_VARIABLE = "${tableSpace}";
private final ConnectionHelper conHelper;
private final InputStream ddl;
private final String table;
private final Map varReplacement = new HashMap();
/**
* @param connectionhelper the connection helper
* @param ddlStream the stream of the DDL to use to create the schema if necessary (closed by the
* {@link #run()} method)
* @param tableName the name of the table to use for the schema-existence-check
*/
public CheckSchemaOperation(ConnectionHelper connectionhelper, InputStream ddlStream, String tableName) {
conHelper = connectionhelper;
ddl = ddlStream;
table = tableName;
}
/**
* Adds a variable replacement mapping.
*
* @param var the variable
* @param replacement the replacement value
* @return this
*/
public CheckSchemaOperation addVariableReplacement(String var, String replacement) {
varReplacement.put(var, replacement);
return this;
}
/**
* Checks if the required schema objects exist and creates them if they don't exist yet.
*
* @throws SQLException if an error occurs
* @throws IOException if an error occurs
*/
public void run() throws SQLException, IOException {
try {
if (!conHelper.tableExists(table)) {
BufferedReader reader = new BufferedReader(new InputStreamReader(ddl));
String sql = reader.readLine();
while (sql != null) {
// Skip comments and empty lines
if (!sql.startsWith("#") && sql.length() > 0) {
// replace prefix variable
sql = replace(sql);
// execute sql stmt
conHelper.exec(sql);
}
// read next sql stmt
sql = reader.readLine();
}
}
} finally {
IOUtils.closeQuietly(ddl);
}
}
/**
* Applies the variable replacement to the given string.
*
* @param sql the string in which to replace variables
* @return the new string
*/
private String replace(String sql) {
String result = sql;
for (Map.Entry entry : varReplacement.entrySet()) {
result = Text.replace(result, entry.getKey(), entry.getValue()).trim();
}
return result;
}
}