/******************************************************************************* | |
* Copyright (c) 1998, 2013 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 v1.0 and Eclipse Distribution License v. 1.0 | |
* which accompanies this distribution. | |
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html | |
* and the Eclipse Distribution License is available at | |
* http://www.eclipse.org/org/documents/edl-v10.php. | |
* | |
* Contributors: | |
* Oracle - initial API and implementation from Oracle TopLink | |
******************************************************************************/ | |
package org.eclipse.persistence.testing.tests.isolatedsession; | |
import java.util.*; | |
import org.eclipse.persistence.testing.framework.*; | |
import org.eclipse.persistence.queries.*; | |
import org.eclipse.persistence.sessions.*; | |
import org.eclipse.persistence.sessions.server.*; | |
import org.eclipse.persistence.expressions.*; | |
import org.eclipse.persistence.exceptions.*; | |
import org.eclipse.persistence.internal.sessions.AbstractSession; | |
public class IsolatedQueryTest extends AutoVerifyTestCase { | |
protected DatabaseLogin login; | |
protected ServerSession server; | |
protected VPDIsolatedSessionEventAdaptor eventAdaptor; | |
protected Vector emps; | |
public IsolatedQueryTest() { | |
setDescription("This test will verify that the isolation support will work with VPD"); | |
} | |
public void copyDescriptors(Session session) { | |
Vector descriptors = new Vector(); | |
for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) { | |
descriptors.addElement(iterator.next()); | |
} | |
this.server.addDescriptors(descriptors); | |
// Since the descriptors are already initialized, must also set the session to isolated. | |
this.server.getProject().setHasIsolatedClasses(true); | |
} | |
public void reset() { | |
try { | |
this.server.logout(); | |
getDatabaseSession().logout(); | |
getDatabaseSession().login(); | |
//this cnd following same changes for making tests pass on oc4j server, suggested by James | |
//String schemaName = getSession().getLogin().getUserName(); | |
String schemaName = ((AbstractSession)getSession()).getAccessor().getConnection().getMetaData().getUserName(); | |
getSession().executeNonSelectingCall(new SQLCall("CALL DBMS_RLS.DROP_POLICY ('" + schemaName + "', 'isolated_employee', 'testing_policy')")); | |
getSession().executeNonSelectingCall(new SQLCall("DROP CONTEXT testing_ctx")); | |
} catch (DatabaseException ex) { | |
} catch (java.sql.SQLException se) { | |
se.printStackTrace(); | |
throw new TestErrorException("There is SQLException"); | |
} | |
} | |
public void setup() { | |
try { | |
this.emps = getSession().readAllObjects(IsolatedEmployee.class); | |
//String schemaName = getSession().getLogin().getUserName(); | |
String schemaName = ((AbstractSession)getSession()).getAccessor().getConnection().getMetaData().getUserName(); | |
getSession().executeNonSelectingCall(new SQLCall("CREATE OR REPLACE PACKAGE " + schemaName + ".init AS PROCEDURE set_emp_id(e_id NUMBER, identifier NUMBER); END init;")); | |
getSession().executeNonSelectingCall(new SQLCall("CREATE OR REPLACE PACKAGE BODY " + schemaName + ".init AS PROCEDURE set_emp_id(e_id NUMBER, identifier NUMBER) IS BEGIN DBMS_SESSION.SET_CONTEXT('testing_ctx', 'e_id', e_id, null, identifier); end set_emp_id; end;")); | |
getSession().executeNonSelectingCall(new SQLCall("CREATE OR REPLACE CONTEXT testing_ctx USING " + schemaName + ".init ACCESSED GLOBALLY")); | |
getSession().executeNonSelectingCall(new SQLCall("CREATE OR REPLACE PACKAGE testing_security AS FUNCTION Allowed_ids (ns VARCHAR, na VARCHAR) RETURN VARCHAR2;END;")); | |
getSession().executeNonSelectingCall(new SQLCall("CREATE OR REPLACE PACKAGE BODY testing_security AS FUNCTION Allowed_ids(ns VARCHAR, na VARCHAR) RETURN VARCHAR2 IS D_predicate VARCHAR2(200); BEGIN D_predicate := 'EMP_ID = SYS_CONTEXT(''testing_ctx'', ''e_id'')'; RETURN D_predicate; END Allowed_ids; END testing_security;")); | |
getSession().executeNonSelectingCall(new SQLCall("CALL DBMS_RLS.ADD_POLICY ('" + schemaName + "', 'isolated_employee', 'testing_policy', '" + schemaName + "', 'testing_security.Allowed_ids', 'select')")); | |
getSession().executeNonSelectingCall(new SQLCall("CALL " + schemaName + ".init.set_emp_id (" + ((IsolatedEmployee)emps.get(0)).getId() + ", 1)")); | |
getSession().executeNonSelectingCall(new SQLCall("CALL " + schemaName + ".init.set_emp_id (" + ((IsolatedEmployee)emps.get(1)).getId() + ", 2)")); | |
this.login = (DatabaseLogin)getSession().getLogin().clone(); | |
this.server = new ServerSession(this.login, 2, 5); | |
this.server.getDefaultConnectionPolicy().setExclusiveMode(ConnectionPolicy.ExclusiveMode.Isolated); | |
this.server.setSessionLog(getSession().getSessionLog()); | |
copyDescriptors(getSession()); | |
this.server.login(); | |
this.eventAdaptor = new VPDIsolatedSessionEventAdaptor(); | |
this.server.getEventManager().addListener(this.eventAdaptor); | |
} catch (RuntimeException ex) { | |
getSession().logMessage("This test requires that the connected user has privleges to \"Creat any context\", \"Drop any context\" and \"execute Sys.DBMS_RLS package\" and \"execute Sys.DBMS_SESSION package\"."); | |
throw ex; | |
} catch (java.sql.SQLException se) { | |
se.printStackTrace(); | |
throw new TestErrorException("There is SQLException"); | |
} | |
} | |
public void test() { | |
ReadObjectQuery query = new ReadObjectQuery(IsolatedAddress.class); | |
ExpressionBuilder builder = new ExpressionBuilder(IsolatedEmployee.class); | |
ExpressionBuilder addressBuilder = new ExpressionBuilder(IsolatedAddress.class); | |
Expression exp = addressBuilder.equal(builder.get("address")).and(builder.get("firstName").equal(((IsolatedEmployee)this.emps.get(0)).getFirstName())); | |
query.setSelectionCriteria(exp); | |
Session client1 = this.server.acquireClientSession(); | |
this.eventAdaptor.setSession_Id(1); | |
IsolatedAddress address = (IsolatedAddress)client1.executeQuery(query); | |
if (address != null) { | |
throw new TestErrorException("Query executed down isolated connection"); | |
} | |
query.setShouldUseExclusiveConnection(true); | |
address = (IsolatedAddress)client1.executeQuery(query); | |
if (address == null) { | |
throw new TestErrorException("Query executed down non exclusive connection"); | |
} | |
client1.release(); | |
} | |
public void verify() { | |
} | |
} |