You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ab...@apache.org on 2019/06/07 13:22:12 UTC

[cayenne] 01/02: CAY-2519 Use NoopEventManager if SERVER_CONTEXTS_SYNC_PROPERTY is false

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

abulatski pushed a commit to branch STABLE-4.0
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit bc5cf828a853ba83468e9a6fcaf9d60433be9f11
Author: Arseni Bulatski <an...@gmail.com>
AuthorDate: Thu Feb 7 14:58:05 2019 +0300

    CAY-2519 Use NoopEventManager if SERVER_CONTEXTS_SYNC_PROPERTY is false
---
 RELEASE-NOTES.txt                                  | 12 +++-
 .../configuration/rop/client/ClientModule.java     |  8 ++-
 .../org/apache/cayenne/access/DataContext.java     | 10 ++-
 .../cayenne/configuration/server/ServerModule.java | 16 ++---
 .../apache/cayenne/event/EventManagerProvider.java | 44 ++++++++++++
 .../org/apache/cayenne/event/NoopEventManager.java | 81 ++++++++++++++++++++++
 6 files changed, 157 insertions(+), 14 deletions(-)

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index a27c383..f462915 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -8,6 +8,17 @@ To browse individual bug reports check out project issue tracker:
 https://issues.apache.org/jira/browse/CAY
 
 ----------------------------------
+Release: 4.0.2
+Date:
+----------------------------------
+
+=======
+Changes/New Features:
+
+CAY-2517 EventManager: optimization of adding listeners
+CAY-2519 Use NoopEventManager if SERVER_CONTEXTS_SYNC_PROPERTY is false
+
+----------------------------------
 Release: 4.0.1
 Date: December 20, 2018
 ----------------------------------
@@ -20,7 +31,6 @@ CAY-2474 Modeler: swap buttons in dialog toolbar
 CAY-2475 Modeler: move inheritance icon to name column in objAttr table and objRel table
 CAY-2476 Modeler: Fixed wrong behaviour of code generation dialog
 CAY-2479 Modeler: update cgen dialog
-CAY-2517 EventManager: optimization of adding listeners
 
 Bug Fixes:
 
diff --git a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java
index 690ed2c..0a0553e 100644
--- a/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java
+++ b/cayenne-client/src/main/java/org/apache/cayenne/configuration/rop/client/ClientModule.java
@@ -30,11 +30,13 @@ import org.apache.cayenne.configuration.server.ServerModule;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.MapBuilder;
 import org.apache.cayenne.di.Module;
-import org.apache.cayenne.event.DefaultEventManager;
 import org.apache.cayenne.event.EventManager;
+import org.apache.cayenne.event.EventManagerProvider;
 import org.apache.cayenne.remote.ClientConnection;
 import org.apache.cayenne.remote.RemoteService;
-import org.apache.cayenne.rop.*;
+import org.apache.cayenne.rop.HttpClientConnectionProvider;
+import org.apache.cayenne.rop.ProxyRemoteService;
+import org.apache.cayenne.rop.ROPSerializationService;
 import org.apache.cayenne.rop.http.ClientHessianSerializationServiceProvider;
 
 /**
@@ -87,7 +89,7 @@ public class ClientModule implements Module {
         binder.bind(ROPSerializationService.class).toProvider(ClientHessianSerializationServiceProvider.class);
         binder.bind(RemoteService.class).to(ProxyRemoteService.class);
         binder.bind(ClientConnection.class).toProvider(HttpClientConnectionProvider.class);
-        binder.bind(EventManager.class).to(DefaultEventManager.class);
+        binder.bind(EventManager.class).toProvider(EventManagerProvider.class);
         binder.bind(RuntimeProperties.class).to(DefaultRuntimeProperties.class);
         binder.bind(DataChannel.class).toProvider(ClientChannelProvider.class);
         binder.bind(QueryCache.class).toProvider(MapQueryCacheProvider.class);
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
index bc80736..d430914 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataContext.java
@@ -44,6 +44,7 @@ import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.access.util.IteratedSelectObserver;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.event.EventManager;
+import org.apache.cayenne.event.NoopEventManager;
 import org.apache.cayenne.graph.ChildDiffLoader;
 import org.apache.cayenne.graph.CompoundDiff;
 import org.apache.cayenne.graph.GraphDiff;
@@ -53,7 +54,12 @@ import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.query.*;
+import org.apache.cayenne.query.EntityResultSegment;
+import org.apache.cayenne.query.MappedExec;
+import org.apache.cayenne.query.MappedSelect;
+import org.apache.cayenne.query.Query;
+import org.apache.cayenne.query.QueryMetadata;
+import org.apache.cayenne.query.Select;
 import org.apache.cayenne.reflect.AttributeProperty;
 import org.apache.cayenne.reflect.ClassDescriptor;
 import org.apache.cayenne.reflect.PropertyVisitor;
@@ -140,7 +146,7 @@ public class DataContext extends BaseContext {
 
         EventManager eventManager = channel.getEventManager();
 
-        if (eventManager != null) {
+        if (eventManager != null && !(eventManager instanceof NoopEventManager)) {
             mergeHandler = new DataContextMergeHandler(this);
 
             // listen to our channel events...
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java
index 44b926a..ccc20ee 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerModule.java
@@ -18,6 +18,9 @@
  ****************************************************************/
 package org.apache.cayenne.configuration.server;
 
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
 import org.apache.cayenne.DataChannel;
 import org.apache.cayenne.DataChannelFilter;
 import org.apache.cayenne.access.DataDomain;
@@ -55,6 +58,7 @@ import org.apache.cayenne.access.types.TimeType;
 import org.apache.cayenne.access.types.TimestampType;
 import org.apache.cayenne.access.types.UUIDValueType;
 import org.apache.cayenne.access.types.UtilDateType;
+import org.apache.cayenne.access.types.ValueObjectType;
 import org.apache.cayenne.access.types.ValueObjectTypeRegistry;
 import org.apache.cayenne.access.types.VoidType;
 import org.apache.cayenne.ashwood.AshwoodEntitySorter;
@@ -97,14 +101,13 @@ import org.apache.cayenne.di.MapBuilder;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
 import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
-import org.apache.cayenne.event.DefaultEventManager;
-import org.apache.cayenne.event.NoopEventBridgeProvider;
 import org.apache.cayenne.event.EventBridge;
 import org.apache.cayenne.event.EventManager;
-import org.apache.cayenne.log.Slf4jJdbcEventLogger;
+import org.apache.cayenne.event.EventManagerProvider;
+import org.apache.cayenne.event.NoopEventBridgeProvider;
 import org.apache.cayenne.log.JdbcEventLogger;
+import org.apache.cayenne.log.Slf4jJdbcEventLogger;
 import org.apache.cayenne.map.EntitySorter;
-import org.apache.cayenne.access.types.ValueObjectType;
 import org.apache.cayenne.resource.ClassLoaderResourceLocator;
 import org.apache.cayenne.resource.ResourceLocator;
 import org.apache.cayenne.tx.DefaultTransactionFactory;
@@ -114,9 +117,6 @@ import org.apache.cayenne.tx.TransactionFilter;
 import org.apache.cayenne.tx.TransactionManager;
 import org.apache.cayenne.velocity.VelocitySQLTemplateProcessor;
 
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-
 /**
  * A DI module containing all Cayenne server runtime configuration.
  *
@@ -341,7 +341,7 @@ public class ServerModule implements Module {
 
         binder.bind(ConfigurationNameMapper.class).to(DefaultConfigurationNameMapper.class);
 
-        binder.bind(EventManager.class).to(DefaultEventManager.class);
+        binder.bind(EventManager.class).toProvider(EventManagerProvider.class);
 
         binder.bind(QueryCache.class).toProvider(MapQueryCacheProvider.class);
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/event/EventManagerProvider.java b/cayenne-server/src/main/java/org/apache/cayenne/event/EventManagerProvider.java
new file mode 100644
index 0000000..ddf4360
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/event/EventManagerProvider.java
@@ -0,0 +1,44 @@
+/*****************************************************************
+ *   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.cayenne.event;
+
+import org.apache.cayenne.configuration.Constants;
+import org.apache.cayenne.configuration.RuntimeProperties;
+import org.apache.cayenne.di.DIRuntimeException;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.Provider;
+
+/**
+ * @since 4.0.2
+ */
+public class EventManagerProvider implements Provider<EventManager> {
+
+    protected RuntimeProperties properties;
+
+    public EventManagerProvider(@Inject RuntimeProperties properties) {
+        this.properties = properties;
+    }
+
+    @Override
+    public EventManager get() throws DIRuntimeException {
+        boolean sync = properties.getBoolean(Constants.SERVER_CONTEXTS_SYNC_PROPERTY, true);
+
+        return sync ? new DefaultEventManager() : new NoopEventManager();
+    }
+}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventManager.java b/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventManager.java
new file mode 100644
index 0000000..db00c36
--- /dev/null
+++ b/cayenne-server/src/main/java/org/apache/cayenne/event/NoopEventManager.java
@@ -0,0 +1,81 @@
+/*****************************************************************
+ *   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.cayenne.event;
+
+import java.util.EventObject;
+
+/**
+ * @since 4.0.2
+ */
+public class NoopEventManager implements EventManager{
+    @Override
+    public boolean isSingleThreaded() {
+        return false;
+    }
+
+    @Override
+    public void addListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject) {
+
+    }
+
+    @Override
+    public void addNonBlockingListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject) {
+
+    }
+
+    @Override
+    public void addListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject, Object sender) {
+
+    }
+
+    @Override
+    public void addNonBlockingListener(Object listener, String methodName, Class<?> eventParameterClass, EventSubject subject, Object sender) {
+
+    }
+
+    @Override
+    public boolean removeListener(Object listener) {
+        return false;
+    }
+
+    @Override
+    public boolean removeAllListeners(EventSubject subject) {
+        return false;
+    }
+
+    @Override
+    public boolean removeListener(Object listener, EventSubject subject) {
+        return false;
+    }
+
+    @Override
+    public boolean removeListener(Object listener, EventSubject subject, Object sender) {
+        return false;
+    }
+
+    @Override
+    public void postEvent(EventObject event, EventSubject subject) {
+
+    }
+
+    @Override
+    public void postNonBlockingEvent(EventObject event, EventSubject subject) {
+
+    }
+}