/**
* 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.tajo;
import org.apache.tajo.annotation.NotNull;
import org.apache.tajo.annotation.Nullable;
import org.apache.tajo.catalog.CatalogConstants;
import org.apache.tajo.catalog.CatalogUtil;
import org.apache.tajo.catalog.store.*;
import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.conf.TajoConf.ConfVars;
import org.apache.tajo.exception.UnsupportedCatalogStore;
import java.net.URI;
import java.sql.Connection;
import java.sql.DriverManager;
public class CatalogTestingUtil {
public static TajoConf configureCatalog(TajoConf conf, String testDirPath) throws UnsupportedCatalogStore {
String driverClassName = System.getProperty(CatalogConstants.STORE_CLASS);
final boolean useDefaultCatalog = driverClassName == null;
conf = initializeDerbyStore(conf, testDirPath);
// TODO: if useDefaultCatalog is false, use external database as catalog
return conf;
}
/**
* cleanup external catalog store resources
*/
public static void shutdownCatalogStore(TajoConf conf) throws Exception {
String catalogUri = conf.get(CatalogConstants.CATALOG_URI);
URI uri = new URI(catalogUri);
String[] schemeSpecificPart = uri.getSchemeSpecificPart().split(":");
if(DerbyStore.NAME.equals(schemeSpecificPart[0]) && "memory".equals(schemeSpecificPart[1])) {
Connection conn = null;
try {
// Removing an in-memory database.
String removingUri = catalogUri.split(";")[0] + ";drop=true";
Class.forName(DerbyStore.CATALOG_DRIVER).newInstance();
conn = DriverManager.getConnection(removingUri);
} finally {
CatalogUtil.closeQuietly(conn);
}
}
}
static <T extends CatalogStore> boolean requireAuth(Class<T> clazz) {
return clazz.equals(MySQLStore.class) ||
clazz.equals(MariaDBStore.class) ||
clazz.equals(PostgreSQLStore.class) ||
clazz.equals(OracleStore.class);
}
private static TajoConf initializeDerbyStore(TajoConf conf, String testDirPath) throws UnsupportedCatalogStore {
return configureCatalogClassAndUri(conf, DerbyStore.class, getInmemoryDerbyCatalogURI(testDirPath));
}
private static <T extends CatalogStore> TajoConf configureCatalogClassAndUri(TajoConf conf,
Class<T> catalogClass,
String catalogUri) {
conf.set(CatalogConstants.STORE_CLASS, catalogClass.getCanonicalName());
conf.set(CatalogConstants.CATALOG_URI, catalogUri);
conf.setVar(ConfVars.CATALOG_ADDRESS, "localhost:0");
return conf;
}
private static String getInmemoryDerbyCatalogURI(String testDirPath) throws UnsupportedCatalogStore {
return getCatalogURI(DerbyStore.class, "memory", testDirPath);
}
private static <T extends CatalogStore> String getCatalogURI(@NotNull Class<T> clazz,
@Nullable String schemeSpecificPart,
@NotNull String testDirPath)
throws UnsupportedCatalogStore {
String uriScheme = getCatalogURIScheme(clazz);
StringBuilder sb = new StringBuilder("jdbc:").append(uriScheme).append(":");
if (schemeSpecificPart != null) {
sb.append(schemeSpecificPart).append(":");
}
sb.append(testDirPath).append("/db;create=true");
return sb.toString();
}
private static <T extends CatalogStore> String getCatalogURIScheme(Class<T> clazz) throws UnsupportedCatalogStore {
if (clazz.equals(DerbyStore.class)) {
return "derby";
} else if (clazz.equals(MariaDBStore.class)) {
return "mariadb";
} else if (clazz.equals(MySQLStore.class)) {
return "mysql";
} else if (clazz.equals(OracleStore.class)) {
return "oracle";
} else if (clazz.equals(PostgreSQLStore.class)) {
return "postgresql";
} else {
throw new UnsupportedCatalogStore(clazz.getCanonicalName());
}
}
}