blob: 20e90811a5a59bdbcf51ee86ebf68a0af322b17d [file] [log] [blame]
/*
* Copyright (c) 2016, 2020 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// 03/30/2016-2.7 Tomas Kraus
// - 490677: Initial API and implementation.
package org.eclipse.persistence.testing.tests.nosql;
import java.util.Map;
import org.eclipse.persistence.exceptions.DatabaseException;
import org.eclipse.persistence.logging.AbstractSessionLog;
import org.eclipse.persistence.logging.SessionLog;
import org.eclipse.persistence.queries.SQLCall;
import org.eclipse.persistence.sessions.DatabaseLogin;
import org.eclipse.persistence.sessions.DatabaseSession;
import org.eclipse.persistence.sessions.DatasourceLogin;
import org.eclipse.persistence.sessions.Project;
import org.eclipse.persistence.sessions.factories.XMLProjectReader;
import org.eclipse.persistence.sessions.server.Server;
import org.eclipse.persistence.testing.framework.TestProblemException;
/**
* Session initialization helper methods.
* Keeps database configuration properties in static context.
*/
public class SessionHelper {
/** Logger. */
private static final SessionLog LOG = AbstractSessionLog.getLog();
/**
* Creates {@link DatabaseLogin} with relational database connection specifications.
* This method is based on {@link org.eclipse.persistence.testing.framework.TestSystem#loadLoginFromProperties()}
* but uses local properties {@link Map} with NoSQL extensions.
* @return {@link DatabaseLogin} with relational database connection specifications.
*/
public static DatabaseLogin createDatabaseLogin() {
final DatabaseLogin login = new DatabaseLogin();
login.setDriverClassName(NoSQLProperties.getDBDriver());
login.setConnectionString(NoSQLProperties.getDBURL());
login.setUserName(NoSQLProperties.getDBUserName());
// This avoids encrypting the password, as some tests require it non-encrypted.
login.setEncryptedPassword(NoSQLProperties.getDBPassword());
final String platform = NoSQLProperties.getDBPlatform();
if (platform != null) {
login.setPlatformClassName(platform);
}
return login;
}
/**
* Creates EclipseLink configuration {@link Project} without testing model and with provided connection
* specifications.
* @param login Database connection specifications.
* @param loaderClass Class used to retrieve {@link ClassLoader}.
*/
public static Project createProject(final DatasourceLogin login, final Class<?> loaderClass) {
return new Project(login);
}
/**
* Creates EclipseLink configuration {@link Project} with testing model and provided connection specifications.
* @param login Database connection specifications.
* @param loaderClass Class used to retrieve {@link ClassLoader}.
*/
public static Project createModelProject(final DatasourceLogin login, final Class<?> loaderClass) {
final Project project = XMLProjectReader.read(ModelHelper.MODEL_FILE, loaderClass.getClassLoader());
project.setLogin(login);
return project;
}
/**
* Creates {@link DatabaseSession} from project and connect it to database.
* {@link DatabaseSession#logout()} must be called before session instance is disposed.
*/
public static DatabaseSession createDatabaseSession(final Project project) {
DatabaseSession session = project.createDatabaseSession();
session.setSessionLog(LOG);
try {
session.login();
} catch (Exception ex) {
throw new TestProblemException(
"Database needs to be setup for AQ, with the user " + NoSQLProperties.getDBUserName(), ex);
}
return session;
}
/**
* Creates {@link DatabaseSession} from project and connect it to database.
* {@link DatabaseSession#logout()} must be called before session instance is disposed.
*/
public static Server createServerSession(final Project project) {
Server session = project.createServerSession();
session.setSessionLog(LOG);
try {
session.login();
} catch (Exception ex) {
throw new TestProblemException(
"Database needs to be setup for AQ, with the user " + NoSQLProperties.getDBUserName(), ex);
}
return session;
}
/**
* Execute statement in provided database session.
* @param session Database session used to execute statement.
* @param statement Statement to be executed.
*/
public static void executeStatement(final DatabaseSession session, final String statement) {
try {
session.executeNonSelectingCall(new SQLCall(statement));
} catch (DatabaseException de) {
session.getSessionLog().log(SessionLog.INFO, String.format("Error executing: %s", statement));
} catch (Exception ex) {
session.getSessionLog().log(SessionLog.WARNING, String.format("Error executing: %s", statement));
}
}
}