| /* | |
| * Copyright (c) 2017, 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. | |
| * | |
| * This Source Code may also be made available under the following Secondary | |
| * Licenses when the conditions for such availability set forth in the | |
| * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, | |
| * version 2 with the GNU Classpath Exception, which is available at | |
| * https://www.gnu.org/software/classpath/license.html. | |
| * | |
| * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 | |
| */ | |
| package com.sun.s1asdev.ejb.timer.timertests.client; | |
| import java.io.Serializable; | |
| import java.util.Date; | |
| import jakarta.ejb.*; | |
| import javax.naming.*; | |
| import javax.rmi.PortableRemoteObject; | |
| import com.sun.s1asdev.ejb.timer.timertests.Bar; | |
| import com.sun.s1asdev.ejb.timer.timertests.BarHome; | |
| import com.sun.s1asdev.ejb.timer.timertests.BarPrimaryKey; | |
| import com.sun.s1asdev.ejb.timer.timertests.FooHome; | |
| import com.sun.s1asdev.ejb.timer.timertests.Foo; | |
| import com.sun.s1asdev.ejb.timer.timertests.TimerStuff; | |
| import com.sun.s1asdev.ejb.timer.timertests.StatefulHome; | |
| import com.sun.ejte.ccl.reporter.SimpleReporterAdapter; | |
| public class Client { | |
| private InitialContext context; | |
| /** | |
| private TopicConnection topicCon; | |
| private TopicSession topicSession; | |
| private TopicPublisher topicPublisher; | |
| private TopicSubscriber topicSubscriber; | |
| private QueueConnection queueCon; | |
| private QueueSession queueSession; | |
| private QueueSender queueSender; | |
| */ | |
| private static SimpleReporterAdapter stat = | |
| new SimpleReporterAdapter("appserv-tests"); | |
| public static void main(String args[]) { | |
| boolean doJms = false; // TODO (args.length == 1) && (args[0].equalsIgnoreCase("jms")); | |
| stat.addDescription("ejb-timer-timertests"); | |
| new Client().doFooTest("ejbs/Foo_CMT", doJms); | |
| new Client().doFooTest("ejbs/Foo_UNSPECIFIED_TX", doJms); | |
| TimerStuff foo = new Client().doFooTest("ejbs/Foo_BMT", doJms); | |
| /** TODO | |
| new Client().doMessageDrivenTest("jms/TimerMDBQueue_CMT", foo, doJms); | |
| new Client().doMessageDrivenTest("jms/TimerMDBQueue_BMT", foo, doJms); | |
| **/ | |
| new Client().doStatefulTest("ejbs/Stateful_CMT", foo,doJms); | |
| new Client().doStatefulTest("ejbs/Stateful_BMT", foo, doJms); | |
| new Client().doBarTest("ejbtimer/Bar_CMT", doJms); | |
| try { | |
| ((Foo) foo).remove(); | |
| } catch(Exception e) { | |
| e.printStackTrace(); | |
| } | |
| stat.printSummary("ejb-timer-timertests"); | |
| } | |
| // when running this class through the appclient infrastructure | |
| public Client() { | |
| try { | |
| context = new InitialContext(); | |
| } catch(Exception e) { | |
| System.out.println("Client : new InitialContext() failed"); | |
| e.printStackTrace(); | |
| stat.addStatus("Client() ", stat.FAIL); | |
| } | |
| } | |
| public void doMessageDrivenTest(String jndiName, TimerStuff foo, | |
| boolean jms) { | |
| /** | |
| if( jms ) { return; } | |
| try { | |
| System.out.println("********PG-> in doMessageDrivenTest() for jndiName = " + jndiName ); | |
| setup(); | |
| System.out.println("********PG-> in doMessageDrivenTest() after setup"); | |
| Context ic = new InitialContext(); | |
| Queue messageDrivenDest = (Queue) ic.lookup("java:comp/env/" + jndiName); | |
| System.out.println("Doing message driven tests for" + jndiName); | |
| String testName; | |
| int numTests = 6; | |
| TimerHandle ths[] = new TimerHandle[numTests]; | |
| for(int i = 1; i < numTests; i++) { | |
| testName = "test" + i; | |
| System.out.println("Doing " + testName); | |
| ths[i] = foo.createTimer(1000000, testName); | |
| ObjectMessage objMsg = queueSession.createObjectMessage(ths[i]); | |
| sendMsgs(messageDrivenDest, objMsg, 1); | |
| } | |
| long sleepTime = 30000; | |
| System.out.println("Sleeping for " + sleepTime / 1000 + " seconds"); | |
| Thread.sleep(sleepTime); | |
| // at this point, all foo timers should have been cancelled | |
| // by the message bean. | |
| foo.assertNoTimers(); | |
| System.out.println("Message-driven test " + jndiName + " passed!!"); | |
| stat.addStatus("Message-driven test: " + jndiName, stat.PASS); | |
| } catch(Exception e) { | |
| System.out.println("Message-driven test " + jndiName + " failed!!"); | |
| e.printStackTrace(); | |
| stat.addStatus("Message-driven test: " + jndiName, stat.FAIL); | |
| } finally { | |
| cleanup(); | |
| } | |
| **/ | |
| } | |
| public void doBarTest(String jndiName, boolean jms) { | |
| try { | |
| Object barObjref = context.lookup(jndiName); | |
| System.out.println("doBarTest(): Doing bar timer test for " + jndiName); | |
| BarHome barHome = (BarHome)PortableRemoteObject.narrow | |
| (barObjref, BarHome.class); | |
| System.out.println("doBarTest(): Bar lookup succeeded: " + jndiName ); | |
| Long id = new Long(1); | |
| String value2 = id.toString(); | |
| TimerStuff bar; | |
| try { | |
| try { | |
| System.out.println("Calling findbyprimarykey"); | |
| barHome.findByPrimaryKey(new BarPrimaryKey(id, value2)); | |
| } catch(FinderException fe) { | |
| System.out.println("caught expected finder ex for " + id + | |
| " " + fe); | |
| } | |
| bar = barHome.create(id, value2); | |
| System.out.println("doBarTest(): Bar after create " ); | |
| } catch(CreateException ce) { | |
| bar = barHome.findByPrimaryKey(new BarPrimaryKey(id, value2)); | |
| System.out.println("doBarTest(): Bar after find " ); | |
| } | |
| if (jms) { | |
| doJmsTest(bar); | |
| } else { | |
| doTest(bar); | |
| ((EJBObject)bar).remove(); | |
| doEntityTests(barHome); | |
| } | |
| System.out.println("doBarTest(): Bar : " + jndiName + " test passed!!"); | |
| stat.addStatus("Bar: " + jndiName, stat.PASS); | |
| } catch(Exception e) { | |
| System.out.println("Bar : " + jndiName + " test failed"); | |
| e.printStackTrace(); | |
| stat.addStatus("Bar: " + jndiName, stat.FAIL); | |
| } | |
| } | |
| public void setup() throws Exception { | |
| /** | |
| //PG-> context = new InitialContext(); | |
| TopicConnectionFactory topicConFactory = | |
| (TopicConnectionFactory) context.lookup | |
| ("java:comp/env/jms/MyTopicConnectionFactory"); | |
| System.out.println("********PG-> setup(): after lookup"); | |
| topicCon = topicConFactory.createTopicConnection(); | |
| System.out.println("********PG-> setup(): after createTopicConnection"); | |
| topicSession = | |
| topicCon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); | |
| System.out.println("********PG-> setup(): after createTopicSession"); | |
| // Producer will be specified when actual msg is published. | |
| topicPublisher = topicSession.createPublisher(null); | |
| System.out.println("********PG-> setup(): after createPublisher"); | |
| topicCon.start(); | |
| System.out.println("********PG-> setup(): after start"); | |
| QueueConnectionFactory queueConFactory = | |
| (QueueConnectionFactory) context.lookup | |
| ("java:comp/env/jms/MyQueueConnectionFactory"); | |
| queueCon = queueConFactory.createQueueConnection(); | |
| queueSession = queueCon.createQueueSession | |
| (false, Session.AUTO_ACKNOWLEDGE); | |
| // Producer will be specified when actual msg is sent. | |
| queueSender = queueSession.createSender(null); | |
| queueCon.start(); | |
| **/ | |
| } | |
| public void cleanup() { | |
| /** | |
| try { | |
| if( topicCon != null ) { | |
| topicCon.close(); | |
| } | |
| if( queueCon != null ) { | |
| queueCon.close(); | |
| } | |
| } catch(Throwable t) { | |
| t.printStackTrace(); | |
| } | |
| **/ | |
| } | |
| /** | |
| public void publishMsgs(Topic topic, Message msg, int num) | |
| throws JMSException { | |
| for(int i = 0; i < num; i++) { | |
| System.out.println("Publishing message " + i + " to " + topic); | |
| topicPublisher.publish(topic, msg); | |
| } | |
| } | |
| public void sendMsgs(Queue queue, Message msg, int num) | |
| throws JMSException { | |
| for(int i = 0; i < num; i++) { | |
| System.out.println("Publishing message " + i + " to " + queue); | |
| queueSender.send(queue, msg); | |
| } | |
| } | |
| */ | |
| public void doStatefulTest(String jndiName, TimerStuff foo, boolean jms) { | |
| if( jms ) return; | |
| try { | |
| Context ic = new InitialContext(); | |
| Object sfObjref = ic.lookup("java:comp/env/" + jndiName); | |
| System.out.println("Doing stateful timer test for " + jndiName); | |
| StatefulHome sfHome = (StatefulHome)PortableRemoteObject.narrow | |
| (sfObjref, StatefulHome.class); | |
| TimerHandle th = foo.createTimer(10000000, "test1"); | |
| TimerStuff sf = sfHome.create(th); | |
| Serializable info = sf.getInfo(th); | |
| sf.getNextTimeoutTest2(5, th); | |
| sf.getTimeRemainingTest2(5, th); | |
| sf.cancelTimerAndRollback(th); | |
| sf.cancelTimer(th); | |
| ((EJBObject)sf).remove(); | |
| System.out.println("Stateful : " + jndiName + " test passed!!"); | |
| stat.addStatus("Stateful: " + jndiName, stat.PASS); | |
| } catch(Exception e) { | |
| System.out.println("Stateful : " + jndiName + " test failed"); | |
| e.printStackTrace(); | |
| stat.addStatus("Stateful: " + jndiName, stat.FAIL); | |
| } | |
| } | |
| public TimerStuff doFooTest(String jndiName, boolean jms) { | |
| TimerStuff foo = null; | |
| try { | |
| Context ic = new InitialContext(); | |
| Object fooObjref = ic.lookup("java:comp/env/" + jndiName); | |
| System.out.println("Doing foo timer test for " + jndiName); | |
| FooHome fooHome = (FooHome)PortableRemoteObject.narrow | |
| (fooObjref, FooHome.class); | |
| foo = fooHome.create(); | |
| if( jms ) { | |
| doJmsTest(foo); | |
| } else { | |
| doTest(foo); | |
| } | |
| System.out.println("Foo : " + jndiName + " test passed!!"); | |
| stat.addStatus("Foo: " + jndiName, stat.PASS); | |
| } catch(Exception e) { | |
| System.out.println("Foo : " + jndiName + " test failed"); | |
| e.printStackTrace(); | |
| stat.addStatus("Foo: " + jndiName, stat.FAIL); | |
| } | |
| return foo; | |
| } | |
| private void doJmsTest(TimerStuff timerStuff) throws Exception { | |
| timerStuff.sendMessageAndCreateTimer(); | |
| timerStuff.recvMessageAndCreateTimer(true); | |
| timerStuff.sendMessageAndCreateTimerAndRollback(); | |
| timerStuff.recvMessageAndCreateTimerAndRollback(false); | |
| } | |
| public void doTest(TimerStuff timerStuff) throws Exception { | |
| System.out.println("doTest(): creating the runtimeExTimer handle"); | |
| TimerHandle runtimeExTimer = | |
| timerStuff.createTimer(1, "RuntimeException"); | |
| System.out.println("doTest(): creating the timerhandle"); | |
| TimerHandle timerHandle = timerStuff.createTimer(1, 1); | |
| // | |
| System.out.println("doTest(): creating the timerhandle2"); | |
| TimerHandle timerHandle2 = timerStuff.createTimer(10000, 10000); | |
| // | |
| System.out.println("doTest(): creating the timerhandle3"); | |
| TimerHandle timerHandle3 = timerStuff.createTimer(new Date()); | |
| // | |
| System.out.println("doTest(): creating the timerhandle4"); | |
| TimerHandle timerHandle4 = timerStuff.createTimer(new Date(new Date().getTime() + 2000)); | |
| // | |
| System.out.println("doTest(): creating the timerhandle5"); | |
| TimerHandle timerHandle5 = timerStuff.createTimer(new Date(new Date().getTime() + 20000), 10000); | |
| System.out.println("doTest(): creating the createTimerAndRollback"); | |
| timerStuff.createTimerAndRollback(20000); | |
| // | |
| System.out.println("doTest(): creating the createTimerAndCancel"); | |
| timerStuff.createTimerAndCancel(20000); | |
| // @@@ reevaluate double cancel logic | |
| //timerStuff.createTimerAndCancelAndCancel(20000); | |
| // | |
| System.out.println("doTest(): creating the createTimerAndCancelAndRollback"); | |
| timerStuff.createTimerAndCancelAndRollback(20000); | |
| // | |
| System.out.println("doTest(): creating the cancelTimer(timerhandle2)"); | |
| timerStuff.cancelTimer(timerHandle2); | |
| System.out.println("doTest(): assertTimerNotactive(timerhandle2)"); | |
| timerStuff.assertTimerNotActive(timerHandle2); | |
| // | |
| timerStuff.cancelTimerAndRollback(timerHandle5); | |
| // @@@ reevaluate double cancel logic | |
| //timerStuff.cancelTimerAndCancelAndRollback(timerHandle6); | |
| TimerHandle timerHandle7 = | |
| timerStuff.createTimer(1, 1, "cancelTimer"); | |
| TimerHandle timerHandle8 = | |
| timerStuff.createTimer(1, 1, "cancelTimerAndRollback"); | |
| TimerHandle timerHandle9 = | |
| timerStuff.createTimer(1, "cancelTimerAndRollback"); | |
| TimerHandle timerHandle11 = timerStuff.getTimeRemainingTest1(20); | |
| timerStuff.getTimeRemainingTest2(20, timerHandle11); | |
| timerStuff.getTimeRemainingTest2(20, timerHandle); | |
| TimerHandle timerHandle12 = timerStuff.getNextTimeoutTest1(20); | |
| timerStuff.getNextTimeoutTest2(20, timerHandle12); | |
| timerStuff.getNextTimeoutTest2(20, timerHandle); | |
| System.out.println("cancelling timerHandle"); | |
| timerStuff.cancelTimer(timerHandle); | |
| System.out.println("cancelling timerHandle5"); | |
| timerStuff.cancelTimer(timerHandle5); | |
| System.out.println("cancelling timerHandle11"); | |
| timerStuff.cancelTimer(timerHandle11); | |
| System.out.println("cancelling timerHandle12"); | |
| timerStuff.cancelTimer(timerHandle12); | |
| // It's possible that the following timers haven't expired yet | |
| try { | |
| timerStuff.cancelTimerNoError(timerHandle8); | |
| } catch(Exception e) { | |
| e.printStackTrace(); | |
| } | |
| try { | |
| timerStuff.cancelTimerNoError(timerHandle3); | |
| } catch(Exception e) { | |
| e.printStackTrace(); | |
| } | |
| try { | |
| timerStuff.cancelTimerNoError(timerHandle4); | |
| } catch(Exception e) { | |
| e.printStackTrace(); | |
| } | |
| try { | |
| timerStuff.cancelTimerNoError(timerHandle7); | |
| } catch(Exception e) { | |
| e.printStackTrace(); | |
| } | |
| try { | |
| timerStuff.cancelTimerNoError(runtimeExTimer); | |
| } catch(Exception e) { | |
| e.printStackTrace(); | |
| } | |
| timerStuff.assertNoTimers(); | |
| } | |
| public void doEntityTests(BarHome barHome) | |
| throws Exception { | |
| TimerStuff bar1 = barHome.create(new Long(1), "1"); | |
| TimerHandle timerHandle1 = bar1.createTimer(100000000); | |
| ((EJBObject)bar1).remove(); | |
| barHome.newTimerAndRemoveBean(new Long(2), "2"); | |
| barHome.newTimerAndRemoveBeanAndRollback(new Long(3), "3"); | |
| Bar bar4 = barHome.create(new Long(4), "4"); | |
| TimerHandle timerHandle4 = bar4.createTimer(1, 1); | |
| barHome.nixBeanAndRollback(bar4); | |
| // Since bean and timer still exist after rollback, getInfo | |
| // should work. | |
| Serializable info = bar4.getInfo(timerHandle4); | |
| System.out.println("after rollback, bar4 info = " + info); | |
| Long bar5Id = new Long(5); | |
| TimerStuff bar5 = barHome.create(bar5Id, "5"); | |
| TimerHandle timerHandle5 = bar5.createTimer(10000000); | |
| info = bar5.getInfo(timerHandle5); | |
| System.out.println("Info = " + info); | |
| barHome.remove(((EJBObject)bar5).getPrimaryKey()); | |
| // At this point timer should not exist since we removed its | |
| // timed object | |
| try { | |
| info = bar5.getInfoNoError(timerHandle5); | |
| } catch(Exception e) { | |
| System.out.println("Caught expected exception for bar5"); | |
| } | |
| // Create entity with same pkey as before. | |
| bar5 = barHome.create(bar5Id, "5"); | |
| // Timer should still *not* be accessible. | |
| try { | |
| info = bar5.getInfoNoError(timerHandle5); | |
| } catch(Exception e) { | |
| } | |
| barHome.remove(new BarPrimaryKey(bar5Id, "5")); | |
| bar4.cancelTimer(timerHandle4); | |
| bar4.assertNoTimers(); | |
| ((EJBObject) bar4).remove(); | |
| } | |
| } |