From bafc7445d9ddfbaa1af608c63c89322bac81b6a7 Mon Sep 17 00:00:00 2001 From: Mario Fusco Date: Tue, 16 Nov 2021 09:17:11 +0100 Subject: [PATCH] [DROOLS-6683] improve ContextImpl constructor performance (#4012) (#4014) (cherry picked from commit bf519547ee47595650f8f4101a21e1c01e288828) --- .../command/ConversationContextManager.java | 14 +-- .../drools/core/command/GetDefaultValue.java | 20 ----- .../command/LeaveConversationCommand.java | 19 ----- .../SetVariableCommandFromLastReturn.java | 85 ------------------- .../drools/core/command/impl/ContextImpl.java | 8 +- .../core/fluent/impl/BaseBatchFluent.java | 7 -- .../impl/StatelessKnowledgeSessionImpl.java | 4 +- .../core/world/impl/ContextManagerImpl.java | 31 ++----- 8 files changed, 16 insertions(+), 172 deletions(-) delete mode 100644 drools-core/src/main/java/org/drools/core/command/GetDefaultValue.java delete mode 100644 drools-core/src/main/java/org/drools/core/command/LeaveConversationCommand.java delete mode 100644 drools-core/src/main/java/org/drools/core/command/SetVariableCommandFromLastReturn.java diff --git a/drools-core/src/main/java/org/drools/core/command/ConversationContextManager.java b/drools-core/src/main/java/org/drools/core/command/ConversationContextManager.java index 2672441beb7..cdc77d7ee42 100644 --- a/drools-core/src/main/java/org/drools/core/command/ConversationContextManager.java +++ b/drools-core/src/main/java/org/drools/core/command/ConversationContextManager.java @@ -1,21 +1,19 @@ package org.drools.core.command; -import org.drools.core.command.impl.ContextImpl; -import org.kie.api.runtime.Context; - import java.util.HashMap; import java.util.Map; import java.util.UUID; +import org.drools.core.command.impl.ContextImpl; +import org.kie.api.runtime.Context; + public class ConversationContextManager { private Map conversationContexts; - private long counter; - public ConversationContextManager() { - conversationContexts = new HashMap(); + conversationContexts = new HashMap<>(); } public void startConversation(RequestContextImpl requestContext) { @@ -33,10 +31,6 @@ public void joinConversation(RequestContextImpl requestContext, String conversat requestContext.setConversationContext(ctx); } - public void leaveConversation(RequestContextImpl requestContext, String conversationId) { - throw new UnsupportedOperationException("Need to implement"); - } - public void endConversation(RequestContextImpl requestContext, String conversationId) { conversationContexts.remove(conversationId); requestContext.setConversationContext(null); diff --git a/drools-core/src/main/java/org/drools/core/command/GetDefaultValue.java b/drools-core/src/main/java/org/drools/core/command/GetDefaultValue.java deleted file mode 100644 index 5fc7619a917..00000000000 --- a/drools-core/src/main/java/org/drools/core/command/GetDefaultValue.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2015 Red Hat, Inc. and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * - * 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.drools.core.command; - -public interface GetDefaultValue { - public Object getObject(); -} diff --git a/drools-core/src/main/java/org/drools/core/command/LeaveConversationCommand.java b/drools-core/src/main/java/org/drools/core/command/LeaveConversationCommand.java deleted file mode 100644 index b424893923b..00000000000 --- a/drools-core/src/main/java/org/drools/core/command/LeaveConversationCommand.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.drools.core.command; - -import org.kie.api.command.ExecutableCommand; -import org.kie.api.runtime.Context; - - -public class LeaveConversationCommand implements ExecutableCommand { - public LeaveConversationCommand() { - } - - @Override - public Void execute(Context context) { - RequestContextImpl reqContext = (RequestContextImpl)context; - ConversationContextManager cvnManager = reqContext.getConversationManager(); - cvnManager.leaveConversation(reqContext, reqContext.getConversationContext().getName()); - - return (Void) null; - } -} diff --git a/drools-core/src/main/java/org/drools/core/command/SetVariableCommandFromLastReturn.java b/drools-core/src/main/java/org/drools/core/command/SetVariableCommandFromLastReturn.java deleted file mode 100644 index f378240a702..00000000000 --- a/drools-core/src/main/java/org/drools/core/command/SetVariableCommandFromLastReturn.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2010 Red Hat, Inc. and/or its affiliates. - * - * Licensed 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.drools.core.command; - -import java.util.HashMap; -import java.util.Map; - -import org.drools.core.common.InternalFactHandle; -import org.kie.api.command.ExecutableCommand; -import org.kie.api.runtime.Context; -import org.kie.api.runtime.rule.FactHandle; -import org.kie.internal.builder.fluent.Scope; -import org.kie.internal.command.RegistryContext; - -public class SetVariableCommandFromLastReturn - implements - ExecutableCommand { - - private String identifier; - private String contextName; - private Scope scope = Scope.REQUEST; - - public SetVariableCommandFromLastReturn(String identifier) { - this.identifier = identifier; - } - - public SetVariableCommandFromLastReturn(String contextName, - String identifier) { - this.identifier = identifier; - this.contextName = contextName; - } - - public SetVariableCommandFromLastReturn(String contextName, - String identifier, - Scope scope) { - this.identifier = identifier; - this.contextName = contextName; - this.scope = scope; - } - - public Object execute(Context context) { - Context targetCtx; - if (this.contextName == null) { - targetCtx = context; - } else { - targetCtx = ((RegistryContext) context).getContextManager().getContext(this.contextName); - } - - GetDefaultValue sim = (GetDefaultValue) context.get("simulator"); - - Object o = sim.getObject(); - // for FactHandle's we store the handle on a map and the actual object as - if (o instanceof FactHandle) { - Map handles = (Map) targetCtx.get("h"); - if (handles == null) { - handles = new HashMap(); - targetCtx.set("h", - handles); - } - handles.put(identifier, - (FactHandle) o); - - o = ((InternalFactHandle) o).getObject(); - } - - targetCtx.set(identifier, - o); - - return o; - } -} diff --git a/drools-core/src/main/java/org/drools/core/command/impl/ContextImpl.java b/drools-core/src/main/java/org/drools/core/command/impl/ContextImpl.java index 9c6969ff221..d4348405b65 100644 --- a/drools-core/src/main/java/org/drools/core/command/impl/ContextImpl.java +++ b/drools-core/src/main/java/org/drools/core/command/impl/ContextImpl.java @@ -18,8 +18,8 @@ import java.util.HashMap; import java.util.Map; -import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import org.drools.core.world.impl.ContextManagerImpl; import org.kie.api.runtime.Context; @@ -28,9 +28,11 @@ public class ContextImpl implements RegistryContext { + public static final AtomicInteger ID_GENERATOR = new AtomicInteger(0); + public static final String REGISTRY = "__REGISTRY__"; - private final Map map = new ConcurrentHashMap(); + private final Map map = new ConcurrentHashMap<>(); private final ContextManager manager; @@ -39,7 +41,7 @@ public class ContextImpl implements RegistryContext { private final Context delegate; public ContextImpl() { - this( UUID.randomUUID().toString(), new ContextManagerImpl() ); + this( "Context_" + ID_GENERATOR.incrementAndGet(), new ContextManagerImpl() ); } public ContextImpl(String name, diff --git a/drools-core/src/main/java/org/drools/core/fluent/impl/BaseBatchFluent.java b/drools-core/src/main/java/org/drools/core/fluent/impl/BaseBatchFluent.java index e9d6beee865..2f3e130a33d 100644 --- a/drools-core/src/main/java/org/drools/core/fluent/impl/BaseBatchFluent.java +++ b/drools-core/src/main/java/org/drools/core/fluent/impl/BaseBatchFluent.java @@ -18,7 +18,6 @@ import org.drools.core.command.EndConversationCommand; import org.drools.core.command.JoinConversationCommand; -import org.drools.core.command.LeaveConversationCommand; import org.drools.core.command.OutCommand; import org.drools.core.command.StartConversationCommand; import org.kie.api.command.ExecutableCommand; @@ -130,12 +129,6 @@ public T joinConversation(String uuid) { return (T) this; } - @Override - public T leaveConversation() { - fluentCtx.addCommand(new LeaveConversationCommand()); - return (T) this; - } - @Override public T endConversation(String uuid) { fluentCtx.addCommand(new EndConversationCommand(uuid)); diff --git a/drools-core/src/main/java/org/drools/core/impl/StatelessKnowledgeSessionImpl.java b/drools-core/src/main/java/org/drools/core/impl/StatelessKnowledgeSessionImpl.java index a680b9c1e80..e483ebfafcd 100644 --- a/drools-core/src/main/java/org/drools/core/impl/StatelessKnowledgeSessionImpl.java +++ b/drools-core/src/main/java/org/drools/core/impl/StatelessKnowledgeSessionImpl.java @@ -243,7 +243,7 @@ public T execute(Command command) { try { if ( command instanceof BatchExecutionCommand ) { - ((RegistryContext) context).register( ExecutionResultImpl.class, new ExecutionResultImpl() ); + context.register( ExecutionResultImpl.class, new ExecutionResultImpl() ); } ((StatefulKnowledgeSessionImpl) ksession).startBatchExecution(); @@ -265,7 +265,7 @@ public T execute(Command command) { ksession.fireAllRules(); } if ( command instanceof BatchExecutionCommand ) { - return (T) ((RegistryContext) context).lookup( ExecutionResultImpl.class ); + return (T) context.lookup( ExecutionResultImpl.class ); } else { return (T) o; } diff --git a/drools-core/src/main/java/org/drools/core/world/impl/ContextManagerImpl.java b/drools-core/src/main/java/org/drools/core/world/impl/ContextManagerImpl.java index ab7356ebacf..46b5d02280d 100644 --- a/drools-core/src/main/java/org/drools/core/world/impl/ContextManagerImpl.java +++ b/drools-core/src/main/java/org/drools/core/world/impl/ContextManagerImpl.java @@ -19,7 +19,6 @@ import java.util.HashMap; import java.util.Map; -import org.drools.core.command.GetDefaultValue; import org.drools.core.command.impl.ContextImpl; import org.kie.api.command.Command; import org.kie.api.command.ExecutableCommand; @@ -27,21 +26,17 @@ import org.kie.api.runtime.Context; import org.kie.internal.command.ContextManager; -public class ContextManagerImpl - implements ContextManager, GetDefaultValue, CommandExecutor { - +public class ContextManagerImpl implements ContextManager, CommandExecutor { private Context root; - private Map contexts; + private final Map contexts; public static String ROOT = "ROOT"; private CommandExecutionHandler executionHandler = new DefaultCommandExecutionHandler(); - private Object lastReturnValue; - public ContextManagerImpl() { - this( new HashMap() ); + this( new HashMap<>() ); } public ContextManagerImpl( Map contexts ) { @@ -82,12 +77,8 @@ public Context getRootContext() { return this.root; } - public Object getLastReturnValue() { - return this.lastReturnValue; - } - - public static interface CommandExecutionHandler { - public Object execute( ExecutableCommand command, + public interface CommandExecutionHandler { + Object execute( ExecutableCommand command, Context context ); } @@ -100,18 +91,6 @@ public Object execute( ExecutableCommand command, } } - public Object getObject() { - return lastReturnValue; - } - - public ContextManager getContextManager() { - return this; - } - - public String getName() { - return root.getName(); - } - public Object get( String identifier ) { return root.get( identifier ); }