/******************************************************************************* | |
* 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.SQLCall; | |
import org.eclipse.persistence.sessions.*; | |
import org.eclipse.persistence.sessions.server.*; | |
import org.eclipse.persistence.exceptions.*; | |
import org.eclipse.persistence.internal.sessions.AbstractSession; | |
public class NoRowsUpdatedTest extends AutoVerifyTestCase { | |
protected DatabaseLogin login; | |
protected ServerSession server; | |
protected VPDIsolatedSessionEventAdaptor eventAdaptor; | |
protected Session nonVPDSession; | |
protected IsolatedEmployee original; | |
public NoRowsUpdatedTest() { | |
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 change for making tests pass on oc4j server, suggested by James | |
//String schemaName = getSession().getLogin().getUserName(); | |
String schemaName = ((AbstractSession)getSession()).getAccessor().getConnection().getMetaData().getUserName(); | |
try { | |
getSession().executeNonSelectingCall(new SQLCall("CALL DBMS_RLS.DROP_POLICY ('" + schemaName + "', 'isolated_employee', 'testing_policy')")); | |
getSession().executeNonSelectingCall(new SQLCall("DROP CONTEXT testing_ctx")); | |
} catch (Exception ex) { | |
//ignore this is called twice in the case of an exception in the test. | |
} | |
UnitOfWork uow = getSession().acquireUnitOfWork(); | |
IsolatedEmployee emp = (IsolatedEmployee)uow.readObject(this.original); | |
emp.setFirstName(this.original.getFirstName()); | |
} catch (DatabaseException ex) { | |
} catch (java.sql.SQLException se) { | |
se.printStackTrace(); | |
throw new TestErrorException("There is SQLException"); | |
} | |
} | |
public void setup() { | |
try { | |
Vector emps = getSession().readAllObjects(IsolatedEmployee.class); | |
//String schemaName = getSession().getLogin().getUserName(); | |
String schemaName = ((AbstractSession)getSession()).getAccessor().getConnection().getMetaData().getUserName(); | |
this.original = (IsolatedEmployee)emps.get(0); | |
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')")); | |
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\"."); | |
throw ex; | |
} catch (java.sql.SQLException se) { | |
se.printStackTrace(); | |
throw new TestErrorException("There is SQLException"); | |
} | |
} | |
public void test() { | |
Session client1 = this.server.acquireClientSession(); | |
this.eventAdaptor.setSession_Id(1); | |
UnitOfWork uow = client1.acquireUnitOfWork(); | |
IsolatedEmployee emp = (IsolatedEmployee)uow.readObject(this.original); | |
emp.setFirstName("ChangedName"); | |
client1.executeNonSelectingCall(new SQLCall("CALL DBMS_SESSION.CLEAR_IDENTIFIER()")); | |
try { | |
uow.commit(); | |
} catch (OptimisticLockException ex) { | |
//ignore as this exception is expected but not part of the test. | |
} | |
} | |
public void verify() { | |
if (!this.eventAdaptor.noRowsModified) { | |
throw new TestErrorException("Failed to throw the no rows updated event"); | |
} | |
} | |
} |