You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/12/12 16:20:34 UTC

[isis] branch master updated (eed91f6 -> 1724a66)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from eed91f6  ISIS-2177: moves fixture state related classes 'runtime' -> 'jdo-applib'
     new 9200522  ISIS-2177: remove home-brew request-scope handling
     new 1724a66  ISIS-2177: remove debugging class

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../ServiceInjectorTestUsingCodegenPlugin.java     | 157 ----------
 .../ServiceInstantiatorTestUsingCodegenPlugin.java | 218 --------------
 .../persistence/PersistenceSession5.java           |  59 ++--
 .../isis/runtime/services/ServiceInstantiator.java | 331 ---------------------
 .../boot/LoggingSpringApplicationRunListener.java  |  55 ----
 .../isis/runtime/scoping/RequestScopedService.java |  79 -----
 6 files changed, 24 insertions(+), 875 deletions(-)
 delete mode 100644 core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java
 delete mode 100644 core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInstantiatorTestUsingCodegenPlugin.java
 delete mode 100644 core/runtime-services/src/main/java/org/apache/isis/runtime/services/ServiceInstantiator.java
 delete mode 100644 core/runtime/src/main/java/org/apache/isis/runtime/boot/LoggingSpringApplicationRunListener.java
 delete mode 100644 core/runtime/src/main/java/org/apache/isis/runtime/scoping/RequestScopedService.java


[isis] 01/02: ISIS-2177: remove home-brew request-scope handling

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 9200522da7445f3542edbac3efac63b3c5328e2d
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 12 17:16:19 2019 +0100

    ISIS-2177: remove home-brew request-scope handling
---
 .../ServiceInjectorTestUsingCodegenPlugin.java     | 157 ----------
 .../ServiceInstantiatorTestUsingCodegenPlugin.java | 218 --------------
 .../persistence/PersistenceSession5.java           |  59 ++--
 .../isis/runtime/services/ServiceInstantiator.java | 331 ---------------------
 .../isis/runtime/scoping/RequestScopedService.java |  79 -----
 5 files changed, 24 insertions(+), 820 deletions(-)

diff --git a/core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java b/core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java
deleted file mode 100644
index fa82903..0000000
--- a/core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.apache.isis.runtime.services;
-
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-import javax.enterprise.context.RequestScoped;
-
-import org.apache.isis.runtime.scoping.RequestScopedService;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.metamodel.MetaModelContext_forTesting;
-import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-public class ServiceInjectorTestUsingCodegenPlugin {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
-
-    private ServiceInstantiator serviceInstantiator;
-    private ServiceRegistry serviceRegistry;
-    private ServiceInjector serviceInjector;
-
-    private MetaModelContext_forTesting metaModelContext;
-
-
-    @Before
-    public void setUp() throws Exception {
-
-        serviceInstantiator = new ServiceInstantiator();
-
-        metaModelContext = MetaModelContext_forTesting.builder()
-                .singleton(serviceInstantiator.createInstance(SingletonCalculator.class))
-                .singleton(serviceInstantiator.createInstance(AccumulatingCalculator.class))
-                .build();
-
-        serviceRegistry = metaModelContext.getServiceRegistry();
-        serviceInjector = metaModelContext.getServiceInjector();
-    }
-
-    @Test
-    public void singleton() {
-        SingletonCalculator calculator = serviceRegistry.lookupService(SingletonCalculator.class).get();
-        assertThat(calculator.add(3), is(3));
-        calculator = serviceRegistry.lookupService(SingletonCalculator.class).get();
-        assertThat(calculator.add(4), is(7));
-    }
-
-    @Test
-    public void requestScoped_instantiate() {
-        final AccumulatingCalculator calculator = serviceRegistry.lookupService(AccumulatingCalculator.class).get();
-        assertThat(calculator instanceof RequestScopedService, is(true));
-    }
-
-    @Test
-    public void requestScoped_justOneThread() {
-        final AccumulatingCalculator calculator = serviceRegistry.lookupService(AccumulatingCalculator.class).get();
-
-        try {
-            ((RequestScopedService)calculator).__isis_startRequest(serviceInjector);
-            assertThat(calculator.add(3), is(3));
-            assertThat(calculator.add(4), is(7));
-            assertThat(calculator.getTotal(), is(7));
-        } finally {
-            ((RequestScopedService)calculator).__isis_endRequest();
-        }
-    }
-
-    @Test
-    public void requestScoped_multipleThreads() throws InterruptedException, ExecutionException {
-
-        final AccumulatingCalculator calculator = serviceRegistry.lookupService(AccumulatingCalculator.class).get();
-        final ExecutorService executor = Executors.newFixedThreadPool(10);
-
-        // setup 32 tasks
-        final List<Callable<Integer>> tasks = IntStream.range(0, 1000)
-                .<Callable<Integer>>mapToObj(index->()->{
-
-                    // within each task setup a new calculator instance that adds the numbers from 1 .. 100 = 5050
-                    ((RequestScopedService)calculator).__isis_startRequest(serviceInjector);
-                    for(int i=1; i<=100; i++) {
-                        calculator.add(i);    
-                    }
-                    try {
-                        return calculator.getTotal();
-                    } finally {
-                        ((RequestScopedService)calculator).__isis_endRequest();
-                    }
-                })
-                .collect(Collectors.toList());
-
-
-        final List<Future<Integer>> results = executor.invokeAll(tasks);
-        executor.shutdown();
-        executor.awaitTermination(5, TimeUnit.SECONDS);
-
-        // we expect that each of the 32 calculators have calculated the sum correctly
-        for(Future<Integer> future: results) {
-            assertThat(future.get(), is(5050));
-        }
-    }
-
-    public static class SingletonCalculator {
-        private int total;
-        public int add(int x) {
-            total += x;
-            return getTotal();
-        }
-        public int getTotal() {
-            return total;
-        }
-    }
-
-    @RequestScoped
-    public static class AccumulatingCalculator {
-        private int total;
-        public int add(int x) {
-            total += x;
-            return getTotal();
-        }
-        public int getTotal() {
-            return total;
-        }
-    }
-
-}
diff --git a/core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInstantiatorTestUsingCodegenPlugin.java b/core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInstantiatorTestUsingCodegenPlugin.java
deleted file mode 100644
index 7ec1817..0000000
--- a/core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInstantiatorTestUsingCodegenPlugin.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.apache.isis.runtime.services;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.BrokenBarrierException;
-import java.util.concurrent.CyclicBarrier;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import javax.enterprise.context.RequestScoped;
-
-import org.apache.isis.runtime.scoping.RequestScopedService;
-import org.jmock.auto.Mock;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
-public class ServiceInstantiatorTestUsingCodegenPlugin {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
-
-    private ServiceInstantiator serviceInstantiator;
-
-    @JUnitRuleMockery2.Ignoring
-    @Mock
-    private ServiceInjector mockServiceInjector;
-
-    @Before
-    public void setUp() throws Exception {
-
-        serviceInstantiator = new ServiceInstantiator();
-    }
-
-    @Test
-    public void singleton() {
-        SingletonCalculator calculator = serviceInstantiator.createInstance(SingletonCalculator.class);
-        assertThat(calculator.add(3,4), is(7));
-    }
-
-    @Test
-    public void requestScoped_instantiate() {
-        AccumulatingCalculator calculator = serviceInstantiator.createInstance(AccumulatingCalculator.class);
-        assertThat(calculator instanceof RequestScopedService, is(true));
-    }
-
-    @Test
-    public void requestScoped_justOneThread() {
-        AccumulatingCalculator calculator = serviceInstantiator.createInstance(AccumulatingCalculator.class);
-        try {
-            ((RequestScopedService)calculator).__isis_startRequest(mockServiceInjector);
-            assertThat(calculator.add(3), is(3));
-            assertThat(calculator.add(4), is(7));
-            assertThat(calculator.getTotal(), is(7));
-        } finally {
-            ((RequestScopedService)calculator).__isis_endRequest();
-        }
-    }
-
-    @Test
-    public void requestScoped_multipleThreads() throws InterruptedException, BrokenBarrierException {
-
-        final AccumulatingCalculator calculator = serviceInstantiator.createInstance(AccumulatingCalculator.class);
-
-        // will ask each thread's calculator to increment 10 times
-        final int[] steps = new int[]{10};
-
-        // each thread will post its totals here
-        final int[] totals = new int[]{0,0,0};
-
-        // after each step, all threads wait.  The +1 is for this thread (the co-ordinator)
-        final CyclicBarrier barrier =
-                new CyclicBarrier(totals.length+1, new Runnable() {
-                    @Override
-                    public void run() {
-                        // all threads waiting; decrement number of steps
-                        steps[0]--;
-                    }
-                });
-
-        // start off all threads
-        for(int i=0; i<totals.length; i++) {
-            final int j=i;
-            new Thread() {
-                @Override
-                public void run() {
-                    try {
-                        ((RequestScopedService)calculator).__isis_startRequest(mockServiceInjector);
-                        // keep incrementing, till no more steps
-                        while(steps[0]>0) {
-                            try {
-                                calculator.add((j+1));
-                                totals[j] = calculator.getTotal();
-                                barrier.await();
-                            } catch (InterruptedException | BrokenBarrierException e) {
-                                throw new RuntimeException(e);
-                            }
-                        }
-                    } finally {
-                        ((RequestScopedService)calculator).__isis_endRequest();
-                    }
-                };
-            }.start();
-        }
-
-        // this thread is the co-ordinator; move onto next step when all are waiting
-        while(steps[0]>0) {
-            barrier.await();
-        }
-
-        assertThat(totals[0], is(10));
-        assertThat(totals[1], is(20));
-        assertThat(totals[2], is(30));
-    }
-
-    @Test
-    public void requestScoped_childThreads() throws InterruptedException  {
-
-        final Consumer consumer = serviceInstantiator.createInstance(Consumer.class);
-
-        final List<Integer> allTheNumbers = Collections.synchronizedList(_Lists.<Integer>newArrayList());
-
-        final int n = 100;
-        for (int i = 0; i < n; i++) {
-            allTheNumbers.add(i);
-        }
-
-        final int nThreads = 8;
-        final ExecutorService execService = Executors.newFixedThreadPool(nThreads);
-
-        // initialize the request scoped calculator on current thread ('main')
-        ((RequestScopedService)consumer).__isis_startRequest(mockServiceInjector);
-
-        for (int i = 0; i < n; i++) {
-            final int j=i;
-
-            execService.submit(new Runnable() {
-                @Override public void run() {
-                    try {
-
-                        // access the request scoped calculator on a child thread of 'main'
-                        consumer.consume(allTheNumbers, j);
-
-                    } catch (Exception e) {
-                        System.err.println(e.getMessage());
-                    }
-                }
-            });
-
-        }
-
-        execService.shutdown();
-
-        execService.awaitTermination(10, TimeUnit.SECONDS);
-
-        ((RequestScopedService)consumer).__isis_endRequest();
-
-        assertEquals(0L, _NullSafe.stream(allTheNumbers).filter(_NullSafe::isPresent).count());
-    }
-
-    public static class SingletonCalculator {
-        public int add(int x, int y) {
-            return x+y;
-        }
-    }
-
-    @RequestScoped
-    public static class AccumulatingCalculator {
-        private int total;
-        public int add(int x) {
-            total += x;
-            return getTotal();
-        }
-        public int getTotal() {
-            return total;
-        }
-    }
-
-    @RequestScoped
-    public static class Consumer {
-        public void consume(final List<Integer> queue, final int slot) {
-            synchronized (queue) {
-                final Integer integer = queue.get(slot);
-                if(integer != null) {
-                    queue.set(slot, null);
-                }
-            }
-        }
-    }
-}
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
index a5e3782..7a8b186 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
@@ -49,22 +49,12 @@ import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.persistence.jdo.applib.exceptions.NotPersistableException;
-import org.apache.isis.persistence.jdo.applib.exceptions.UnsupportedFindException;
-import org.apache.isis.persistence.jdo.applib.fixturestate.FixturesInstalledStateHolder;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.commands.DataNucleusCreateObjectCommand;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.commands.DataNucleusDeleteObjectCommand;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryFindAllInstancesProcessor;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryProcessor;
-import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.spi.JdoObjectIdSerializer;
-import org.apache.isis.persistence.jdo.datanucleus5.objectadapter.ObjectAdapterContext;
-import org.apache.isis.metamodel.context.MetaModelContext;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.ObjectNotFoundException;
 import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.adapter.oid.PojoRefreshException;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
+import org.apache.isis.metamodel.context.MetaModelContext;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.metamodel.facets.object.callbacks.CallbackFacet;
 import org.apache.isis.metamodel.facets.object.callbacks.LoadedCallbackFacet;
@@ -84,12 +74,21 @@ import org.apache.isis.metamodel.spec.EntityState;
 import org.apache.isis.metamodel.spec.FreeStandingList;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
+import org.apache.isis.persistence.jdo.applib.exceptions.NotPersistableException;
+import org.apache.isis.persistence.jdo.applib.exceptions.UnsupportedFindException;
+import org.apache.isis.persistence.jdo.applib.fixturestate.FixturesInstalledStateHolder;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.commands.DataNucleusCreateObjectCommand;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.commands.DataNucleusDeleteObjectCommand;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryFindAllInstancesProcessor;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryFindUsingApplibQueryProcessor;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.queries.PersistenceQueryProcessor;
+import org.apache.isis.persistence.jdo.datanucleus5.datanucleus.persistence.spi.JdoObjectIdSerializer;
+import org.apache.isis.persistence.jdo.datanucleus5.objectadapter.ObjectAdapterContext;
 import org.apache.isis.runtime.persistence.objectstore.transaction.CreateObjectCommand;
 import org.apache.isis.runtime.persistence.objectstore.transaction.DestroyObjectCommand;
 import org.apache.isis.runtime.persistence.objectstore.transaction.PersistenceCommand;
 import org.apache.isis.runtime.persistence.query.PersistenceQueryFindAllInstances;
 import org.apache.isis.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
-import org.apache.isis.runtime.scoping.RequestScopedService;
 import org.apache.isis.runtime.system.persistence.PersistenceQuery;
 import org.apache.isis.security.api.authentication.AuthenticationSession;
 
@@ -161,10 +160,10 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
         // tell the proxy of all request-scoped services to instantiate the underlying
         // services, store onto the thread-local and inject into them...
-        startRequestOnRequestScopedServices();
+        //startRequestOnRequestScopedServices();
 
         // ... and invoke all @PostConstruct
-        postConstructOnRequestScopedServices();
+        //postConstructOnRequestScopedServices();
 
         if(metricsService instanceof InstanceLifecycleListener) {
             val metricsService = (InstanceLifecycleListener) this.metricsService;
@@ -190,16 +189,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         this.state = State.OPEN;
     }
 
-    private void postConstructOnRequestScopedServices() {
-        serviceRegistry.select(RequestScopedService.class)
-        .forEach(RequestScopedService::__isis_postConstruct);
-    }
-
-    private void startRequestOnRequestScopedServices() {
-        serviceRegistry.select(RequestScopedService.class)
-        .forEach(service->service.__isis_startRequest(serviceInjector));
-    }
-
     private Command createCommand() {
         final Command command = commandService.create();
 
@@ -248,10 +237,10 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
         // tell the proxy of all request-scoped services to invoke @PreDestroy
         // (if any) on all underlying services stored on their thread-locals...
-        preDestroyOnRequestScopedServices();
+        //preDestroyOnRequestScopedServices();
 
         // ... and then remove those underlying services from the thread-local
-        endRequestOnRequestScopeServices();
+        //endRequestOnRequestScopeServices();
 
         persistenceManager.removeInstanceLifecycleListener(storeLifecycleListener);
         
@@ -268,15 +257,15 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         this.state = State.CLOSED;
     }
 
-    private void endRequestOnRequestScopeServices() {
-        serviceRegistry.select(RequestScopedService.class)
-        .forEach(RequestScopedService::__isis_endRequest);
-    }
-
-    private void preDestroyOnRequestScopedServices() {
-        serviceRegistry.select(RequestScopedService.class)
-        .forEach(RequestScopedService::__isis_preDestroy);
-    }
+//    private void endRequestOnRequestScopeServices() {
+//        serviceRegistry.select(RequestScopedService.class)
+//        .forEach(RequestScopedService::__isis_endRequest);
+//    }
+//
+//    private void preDestroyOnRequestScopedServices() {
+//        serviceRegistry.select(RequestScopedService.class)
+//        .forEach(RequestScopedService::__isis_preDestroy);
+//    }
 
     private void completeCommandFromInteractionAndClearDomainEvents() {
 
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ServiceInstantiator.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ServiceInstantiator.java
deleted file mode 100644
index 7672c27..0000000
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/ServiceInstantiator.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.apache.isis.runtime.services;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Map;
-import java.util.Set;
-
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import javax.enterprise.context.RequestScoped;
-
-import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.commons.internal.collections._Arrays;
-import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.factory.InstanceCreationClassException;
-import org.apache.isis.commons.internal.factory.InstanceCreationException;
-import org.apache.isis.commons.internal.plugins.codegen.ProxyFactory;
-import org.apache.isis.metamodel.commons.MethodExtensions;
-import org.apache.isis.metamodel.specloader.classsubstitutor.ProxyEnhanced;
-import org.apache.isis.runtime.scoping.RequestScopedService;
-
-import lombok.extern.log4j.Log4j2;
-
-//import javassist.util.proxy.MethodFilter;
-//import javassist.util.proxy.MethodHandler;
-//import javassist.util.proxy.ProxyFactory;
-//import javassist.util.proxy.ProxyObject;
-
-/**
- * Instantiates the service, taking into account whether the service is annotated with
- * {@link RequestScoped} or not.
- *
- * <p>
- * For regular (non-annotated, global, singleton) services, this class simply instantiates
- * the object.  This is then held as a singleton by Isis.
- *
- * <p>
- * For annotated, request-scoped services, this class instantiates a (singleton) proxy object
- * that internally uses a threadlocal to dispatch to the actual service object, one per thread.
- * The proxy additionally implements {@link RequestScopedService} interface, allowing the
- * system to initialize the proxy for the thread with every request, and tear down afterwards.
- *
- * <p>
- * Doing the thread-local stuff within the service proxy means that, for the rest of Isis,
- * services can continue to be considered to be singletons.
- *
- * <p>
- * <b>Note</b>: there is one limitation to using proxies, namely that field-level injection into
- * request-scoped services is not (yet) supported.
- */
-@Log4j2
-public final class ServiceInstantiator {
-
-    public ServiceInstantiator() {
-    }
-
-    // //////////////////////////////////////
-
-    public Object createInstance(String type) {
-        final Class<?> cls = loadClass(type);
-        if(cls == null || cls.isAnonymousClass()) {
-            // eg a test class
-            return null;
-        }
-
-        return createInstance(cls);
-    }
-
-    private Class<?> loadClass(final String className) {
-        try {
-            log.debug("loading class for service: {}", className);
-            return _Context.loadClassAndInitialize(className);
-        } catch (final ClassNotFoundException ex) {
-            throw new InitialisationException(String.format("Cannot find class '%s' for service", className));
-        }
-    }
-
-    // //////////////////////////////////////
-
-    public <T> T createInstance(final Class<T> cls) {
-        if(cls.isAnnotationPresent(RequestScoped.class)) {
-            return instantiateRequestScopedProxy(cls);
-        } else {
-            return instantiateSingleton(cls);
-        }
-    }
-
-    // //////////////////////////////////////
-
-
-    private static <T> T instantiateSingleton(final Class<T> cls) {
-        return instantiate(cls);
-    }
-
-    // //////////////////////////////////////
-
-
-    private <T> T instantiateRequestScopedProxy(final Class<T> cls) {
-
-        final Class<?>[] interfaces = _Arrays.combine(
-                cls.getInterfaces(),
-                new Class<?>[] { RequestScopedService.class, ProxyEnhanced.class });
-
-        final ProxyFactory<T> proxyFactory = ProxyFactory.builder(cls)
-                .interfaces(interfaces)
-                .build();
-
-        final InvocationHandler handler = new InvocationHandler() {
-
-            // Allow serviceByThread to be propagated from the thread that starts the request
-            // to any child-threads, hence InheritableThreadLocal.
-            private InheritableThreadLocal<T> serviceByThread = new InheritableThreadLocal<>();
-
-            @Override
-            public Object invoke(final Object proxied, final Method proxyMethod, final Object[] args)
-                    throws Throwable {
-
-                cacheMethodsIfNecessary(cls);
-
-                if(proxyMethod.getName().equals("__isis_startRequest")) {
-
-                    T service = instantiate(cls);
-                    serviceByThread.set(service);
-
-                    ServiceInjector serviceInjector = (ServiceInjector) args[0];
-                    serviceInjector.injectServicesInto(service);
-
-                    return null;
-
-                } else if(proxyMethod.getName().equals("__isis_postConstruct")) {
-
-                    final T service = serviceByThread.get();
-
-                    callPostConstructIfPresent(service);
-
-                    return null;
-
-                } else if(proxyMethod.getName().equals("__isis_preDestroy")) {
-
-                    final T service = serviceByThread.get();
-
-                    callPreDestroyIfPresent(service);
-
-                    return null;
-
-                } else if(proxyMethod.getName().equals("__isis_endRequest")) {
-
-                    serviceByThread.set(null);
-                    return null;
-
-                } else if(proxyMethod.getName().equals("hashCode") && proxyMethod.getParameterTypes().length == 0) {
-
-                    final T service = serviceByThread.get();
-                    return service != null? service.hashCode(): this.hashCode();
-
-                } else if(proxyMethod.getName().equals("equals") && proxyMethod.getParameterTypes().length == 1 && proxyMethod.getParameterTypes()[0] == Object.class) {
-
-                    final T service = serviceByThread.get();
-                    return service != null? service.equals(args[0]): this.equals(args[0]);
-
-                } else if(proxyMethod.getName().equals("toString") && proxyMethod.getParameterTypes().length == 0) {
-
-                    final T service = serviceByThread.get();
-                    return service != null? service.toString(): this.toString();
-
-                } else {
-                    T service = serviceByThread.get();
-                    if(service == null) {
-                        // shouldn't happen...
-                        throw new IllegalStateException("No service of type " + cls + " is available on this ");
-                    }
-                    final Object proxiedReturn = proxyMethod.invoke(service, args);
-                    return proxiedReturn;
-                }
-            }
-
-        };
-
-        return proxyFactory.createInstance(handler, false);
-    }
-
-    private Set<Class<?>> cached = _Sets.newHashSet();
-    private Map<Class<?>, Method> postConstructMethodsByServiceClass = _Maps.newConcurrentHashMap();
-    private Map<Class<?>, Method> preDestroyMethodsByServiceClass = _Maps.newConcurrentHashMap();
-
-    <T> void callPostConstructIfPresent(T service) {
-
-        final Class<?> serviceClass = service.getClass();
-        final Method postConstructMethod = postConstructMethodsByServiceClass.get(serviceClass);
-        if(postConstructMethod == null) {
-            return;
-        }
-        final int numParams = postConstructMethod.getParameterTypes().length;
-
-        if(log.isDebugEnabled()) {
-            log.debug("... calling @PostConstruct method: {}: {}", serviceClass.getName(), postConstructMethod.getName());
-        }
-        // unlike shutdown, we don't swallow exceptions; would rather fail early
-        if(numParams == 0) {
-            MethodExtensions.invoke(postConstructMethod, service);
-        } else {
-            //TODO[2039] MethodExtensions.invoke(postConstructMethod, service, new Object[]{props});
-            throw new UnsupportedOperationException("post-construct methods must not take any arguments");
-        }
-    }
-
-    <T> void callPreDestroyIfPresent(T service) throws InvocationTargetException, IllegalAccessException {
-
-        final Class<?> serviceClass = service.getClass();
-        final Method preDestroyMethod = preDestroyMethodsByServiceClass.get(serviceClass);
-        if(preDestroyMethod == null) {
-            return;
-        }
-
-        if(log.isDebugEnabled()) {
-            log.debug("... calling @PreDestroy method: {}: {}", serviceClass.getName(), preDestroyMethod.getName());
-        }
-        try {
-            MethodExtensions.invoke(preDestroyMethod, service);
-        } catch(Exception ex) {
-            // do nothing
-            log.warn("... @PreDestroy method threw exception - continuing anyway", ex);
-        }
-    }
-
-
-    private void cacheMethodsIfNecessary(Class<?> serviceClass) {
-        if(cached.contains(serviceClass)) {
-            return;
-        }
-        cacheMethods(serviceClass);
-        cached.add(serviceClass);
-    }
-
-    private void cacheMethods(Class<?> serviceClass) {
-        final Method[] methods = serviceClass.getMethods();
-
-        // @PostConstruct
-        Method postConstructMethod = null;
-        for (final Method method : methods) {
-
-            final PostConstruct postConstructAnnotation = method.getAnnotation(PostConstruct.class);
-            if (postConstructAnnotation == null) {
-                continue;
-            }
-            if (postConstructMethod != null) {
-                throw new RuntimeException("Found more than one @PostConstruct method; service is: " + serviceClass.getName() + ", found " + postConstructMethod.getName() + " and " + method.getName());
-            }
-
-            final Class<?>[] parameterTypes = method.getParameterTypes();
-            switch (parameterTypes.length) {
-            case 0:
-                break;
-            case 1:
-                if (Map.class != parameterTypes[0]) {
-                    throw new RuntimeException("@PostConstruct method must be no-arg or 1-arg accepting java.util.Map; method is: " + serviceClass.getName() + "#" + method.getName());
-                }
-                break;
-            default:
-                throw new RuntimeException("@PostConstruct method must be no-arg or 1-arg accepting java.util.Map; method is: " + serviceClass.getName() + "#" + method.getName());
-            }
-            postConstructMethod = method;
-        }
-
-        // @PreDestroy
-        Method preDestroyMethod = null;
-        for (final Method method : methods) {
-
-            final PreDestroy preDestroyAnnotation = method.getAnnotation(PreDestroy.class);
-            if(preDestroyAnnotation == null) {
-                continue;
-            }
-            if(preDestroyMethod != null) {
-                throw new RuntimeException("Found more than one @PreDestroy method; service is: " + serviceClass.getName() + ", found " + preDestroyMethod.getName() + " and " + method.getName());
-            }
-
-            final Class<?>[] parameterTypes = method.getParameterTypes();
-            switch(parameterTypes.length) {
-            case 0:
-                break;
-            default:
-                throw new RuntimeException("@PreDestroy method must be no-arg; method is: " + serviceClass.getName() + "#" + method.getName());
-            }
-            preDestroyMethod = method;
-        }
-
-        if(postConstructMethod != null) {
-            postConstructMethodsByServiceClass.put(serviceClass, postConstructMethod);
-        }
-        if(preDestroyMethod != null) {
-            preDestroyMethodsByServiceClass.put(serviceClass, preDestroyMethod);
-        }
-    }
-
-    // //////////////////////////////////////
-
-    private static <T> T instantiate(final Class<T> cls) {
-        try {
-            return cls.newInstance();
-        } catch (final NoClassDefFoundError e) {
-            throw new InstanceCreationClassException("Class found '" + cls + "', but is missing a dependent class", e);
-        } catch (final InstantiationException e) {
-            throw new InstanceCreationException("Could not instantiate an object of class '" + cls.getName() + "'; " + e.getMessage(), e);
-        } catch (final IllegalAccessException e) {
-            throw new InstanceCreationException("Could not access the class '" + cls.getName() + "'; " + e.getMessage(), e);
-        }
-    }
-
-
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/scoping/RequestScopedService.java b/core/runtime/src/main/java/org/apache/isis/runtime/scoping/RequestScopedService.java
deleted file mode 100644
index 07081a5..0000000
--- a/core/runtime/src/main/java/org/apache/isis/runtime/scoping/RequestScopedService.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you 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 org.apache.isis.runtime.scoping;
-
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.services.inject.ServiceInjector;
-
-/**
- * Interface in support of request-scoped domain services (is implemented by the Javassist proxy).
- *
- * <p>
- *     Do NOT implement directly (will cause the javassist generation to fail).  Instead the request-scoped service
- *     can provide a (conventional) <code>@PostConstruct</code> and <code>@PreDestroy</code> method.
- * </p>
- */
-public interface RequestScopedService {
-
-    /**
-     * Indicates to the proxy that a new request is starting, so should instantiate a new instance of the underlying
-     * service and bind to the thread, and inject into that service using the provided {@link ServiceInjector}.
-     *
-     * <p>
-     *     This is done before the <code>@PostConstruct</code>, see {@link #__isis_postConstruct()}.
-     * </p>
-     */
-    @Programmatic
-    public void __isis_startRequest(ServiceInjector injector);
-
-    /**
-     * Indicates to the proxy that <code>@PostConstruct</code> should be called on
-     * underlying instance for current thread.
-     *
-     * <p>
-     *     This is done after the request has started, see {@link #__isis_startRequest(ServiceInjector)}.
-     * </p>
-     */
-    @Programmatic
-    public void __isis_postConstruct();
-
-    /**
-     * Indicates to the proxy that <code>@PreDestroy</code> should be called on
-     * underlying instance for current thread.
-     *
-     * <p>
-     *     This is done prior to the request ending, see {@link #__isis_endRequest()}.
-     * </p>
-     */
-    @Programmatic
-    public void __isis_preDestroy();
-
-    /**
-     * Indicates to the proxy that request is ending, so should clean up and remove the
-     * underlying instance for current thread.
-     *
-     * <p>
-     *     This is done after the <code>@PreDestroy</code>, see {@link #__isis_preDestroy()}.
-     * </p>
-     */
-    @Programmatic
-    public void __isis_endRequest();
-
-}


[isis] 02/02: ISIS-2177: remove debugging class

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 1724a6687cca8e583260c35628bed6d0c1778625
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 12 17:20:23 2019 +0100

    ISIS-2177: remove debugging class
---
 .../boot/LoggingSpringApplicationRunListener.java  | 55 ----------------------
 1 file changed, 55 deletions(-)

diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/boot/LoggingSpringApplicationRunListener.java b/core/runtime/src/main/java/org/apache/isis/runtime/boot/LoggingSpringApplicationRunListener.java
deleted file mode 100644
index 6388ecf..0000000
--- a/core/runtime/src/main/java/org/apache/isis/runtime/boot/LoggingSpringApplicationRunListener.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.apache.isis.runtime.boot;
-
-import lombok.extern.log4j.Log4j2;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.SpringApplicationRunListener;
-import org.springframework.context.ConfigurableApplicationContext;
-import org.springframework.core.env.ConfigurableEnvironment;
-
-@Log4j2
-public class LoggingSpringApplicationRunListener implements SpringApplicationRunListener {
-    private SpringApplication app;
-    private String[] args;
-
-    public LoggingSpringApplicationRunListener(SpringApplication app, String[] args){
-        this.app = app;
-        this.args = args;
-    }
-
-    @Override
-    public void starting() {
-        log.debug("starting");
-    }
-
-    @Override
-    public void environmentPrepared(ConfigurableEnvironment environment) {
-        log.debug("environmentPrepared");
-    }
-
-    @Override
-    public void contextPrepared(ConfigurableApplicationContext context) {
-        log.debug("contextPrepared");
-    }
-
-    @Override
-    public void contextLoaded(ConfigurableApplicationContext context) {
-        log.debug("contextLoaded");
-    }
-
-    @Override
-    public void started(ConfigurableApplicationContext context) {
-        log.debug("started");
-    }
-
-    @Override
-    public void running(ConfigurableApplicationContext context) {
-        log.debug("running");
-    }
-
-    @Override
-    public void failed(ConfigurableApplicationContext context, Throwable exception) {
-        log.error("failed", exception);
-    }
-
-}
\ No newline at end of file