MultiTenantTest.java
/***************************************************************************
Copyright 2015 Emily Estes
Licensed 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 net.metanotion.multitenant;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import javax.sql.DataSource;
import net.metanotion.authident.UserToken;
import net.metanotion.contentstore.ContentStore;
import net.metanotion.multitenant.adminapp.AdminAppFactory;
import net.metanotion.multitenant.adminapp.Manager;
import net.metanotion.sql.DbUtil;
import net.metanotion.sql.SchemaPoolSwitcher;
import net.metanotion.sqlauthident.SQLRealm;
import net.metanotion.util.AppUtil;
import net.metanotion.util.MapDictionaryAdapter;
import net.metanotion.util.SecureString;
import net.metanotion.web.AppFactory;
public final class MultiTenantTest {
public static final int ARGS_DB_URL = 0;
public static final int ARGS_DB_NAME = 1;
public static final int ARGS_DB_USER = 2;
public static final int ARGS_DB_PASS = 3;
public static final int ARGS_BACKUP_FOLDER = 4;
public static final int ARGS_LOG_CONFIG = 5;
public static final int ARGS_TENANT_CT = 6;
public static final String ADMIN_USER = "test";
public static final String ADMIN_PASS = "1234";
public static final String ALT_USER = "test2";
public static final String ALT_PASS = "1234";
public static void main(final String[] args) throws Exception {
AppUtil.startLogging(args, ARGS_LOG_CONFIG);
final String url = args[ARGS_DB_URL];
final String dbName = args[ARGS_DB_NAME];
final String user = args[ARGS_DB_USER];
final String pass = args[ARGS_DB_PASS];
final long tenantCount = Long.valueOf(args[ARGS_TENANT_CT]);
try (final Connection conn = DriverManager.getConnection(url, user, pass)) {
DbUtil.createDatabase(conn, dbName, user, true);
}
final DataSource ds = DbUtil.startDBConnectionPool(url + dbName, user, pass);
try (final Connection conn = ds.getConnection()) {
DbUtil.runSchema(conn, MultiTenantTestApp.schemaFactory());
}
final MultiTenant server = new MultiTenant(ds);
final AppFactory appFactory = new MultiTenantTestApp(new File(args[ARGS_BACKUP_FOLDER]));
final DataSource adminDs = new SchemaPoolSwitcher(ds, MultiTenantTestApp.ADMIN_SCHEMA);
final AdminAppFactory admin = new AdminAppFactory(server, adminDs, MultiTenantTestApp.INSTANCE_PREFIX);
final HashMap<String,AppFactory> fixedApps = new HashMap<>();
fixedApps.put(MultiTenantTestApp.ADMIN_PREFIX, admin);
final SimpleMultiTenantAppFactory tenantContainer =
new SimpleMultiTenantAppFactory(new MapDictionaryAdapter<>(fixedApps),
appFactory,
MultiTenantTestApp.INSTANCE_PREFIX,
admin.getDefaultInstanceList());
server.dispatcher();
server.sessionInitializer(tenantContainer);
final SQLRealm realm = new SQLRealm(adminDs);
final UserToken theAdmin = realm.createAuthentication(ADMIN_USER, new SecureString(ADMIN_PASS));
final UserToken altAdmin = realm.createAuthentication(ALT_USER, new SecureString(ALT_PASS));
final Manager manager = new Manager(MultiTenantTestApp.ADMIN_PREFIX,
adminDs,
realm,
null,
server,
tenantContainer,
MultiTenantTestApp.INSTANCE_PREFIX,
AdminAppFactory.LOGGING_ADMIN_MAILER);
for(long i=1; i<=tenantCount; i++) {
manager.createInstance(theAdmin, "inst" + Long.toString(i));
manager.api();
manager.singleApi(i);
manager.adminLogApi(i);
manager.adminsApi(i);
manager.exportsApi(i);
manager.usersApi(i);
manager.updateTitle(theAdmin, i, "inst_" + Long.toString(i));
manager.stopInstance(theAdmin, i);
manager.startInstance(theAdmin, i);
for(int u=1; u < 100; u++) {
manager.addUser(i, theAdmin, "client" + Long.toString(i) + "user" + Long.toString(u));
}
manager.startExport(i);
manager.resetInstance(i, theAdmin, new SecureString(ADMIN_PASS));
manager.reassignOwner(theAdmin, new SecureString(ADMIN_PASS), i, ALT_USER);
if((i % 2L) == 0L) {
manager.removeInstance(altAdmin, new SecureString(ALT_PASS), i);
}
}
MultiTenantTestApp.es.shutdownNow();
}
}