Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Let, LetMany Variable Support #440

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import com.antheminc.oss.nimbus.context.BeanResolverStrategy;
import com.antheminc.oss.nimbus.context.DefaultBeanResolverStrategy;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.FunctionExecutor;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.ReservedKeywordRegistry;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.process.ParamUpdateEventListener;
import com.antheminc.oss.nimbus.domain.config.builder.AnnotationAttributeHandler;
import com.antheminc.oss.nimbus.domain.config.builder.AnnotationConfigHandler;
Expand All @@ -44,6 +45,7 @@
import com.antheminc.oss.nimbus.domain.config.builder.attributes.DefaultAnnotationAttributeHandler;
import com.antheminc.oss.nimbus.domain.model.config.EntityConfig.Scope;
import com.antheminc.oss.nimbus.domain.model.config.builder.EntityConfigBuilder;
import com.antheminc.oss.nimbus.domain.model.config.builder.internal.LetExecutionConfigProvider;
import com.antheminc.oss.nimbus.domain.model.config.builder.internal.DefaultEntityConfigBuilder;
import com.antheminc.oss.nimbus.domain.model.config.builder.internal.DefaultExecutionConfigProvider;
import com.antheminc.oss.nimbus.domain.model.config.builder.internal.DetourExecutionConfigProvider;
Expand Down Expand Up @@ -125,8 +127,13 @@ public EventHandlerConfigFactory eventHandlerConfigFactory(BeanResolverStrategy
}

@Bean
public ExecutionConfigFactory executionConfigFactory(BeanResolverStrategy beanResolver) {
return new ExecutionConfigFactory();
public ReservedKeywordRegistry reservedKeywordRegistry() {
return new ReservedKeywordRegistry();
}

@Bean
public ExecutionConfigFactory executionConfigFactory() {
return new ExecutionConfigFactory(reservedKeywordRegistry());
}

@Bean
Expand All @@ -139,6 +146,11 @@ public DetourExecutionConfigProvider detourExecutionConfigProvider(BeanResolverS
return new DetourExecutionConfigProvider();
}

@Bean
public LetExecutionConfigProvider letExecutionConfigProvider() {
return new LetExecutionConfigProvider();
}

@Bean(name="default.annotationConfigBuilder")
public AnnotationConfigHandler annotationConfigHandler(BeanResolverStrategy beanResolver, PropertyResolver propertyResolver) {
Map<Class<? extends Annotation>, AnnotationAttributeHandler> attributeHandlers = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import com.antheminc.oss.nimbus.domain.cmd.exec.CommandExecutor;
import com.antheminc.oss.nimbus.domain.cmd.exec.CommandPathVariableResolver;
import com.antheminc.oss.nimbus.domain.cmd.exec.CommandTransactionInterceptor;
import com.antheminc.oss.nimbus.domain.cmd.exec.ConfigVariableResolver;
import com.antheminc.oss.nimbus.domain.cmd.exec.DefaultConfigVariableResolver;
import com.antheminc.oss.nimbus.domain.cmd.exec.ExecutionContextLoader;
import com.antheminc.oss.nimbus.domain.cmd.exec.ExecutionContextPathVariableResolver;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.DefaultActionExecutorConfig;
Expand All @@ -41,6 +43,7 @@
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.DefaultExecutionContextLoader;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.DefaultExecutionContextPathVariableResolver;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.HierarchyMatchBasedBeanFinder;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.ReservedKeywordRegistry;
import com.antheminc.oss.nimbus.support.expr.ExpressionEvaluator;
import com.antheminc.oss.nimbus.support.expr.SpelExpressionEvaluator;

Expand Down Expand Up @@ -76,6 +79,11 @@ public ExecutionContextPathVariableResolver defaultExecutionContextPathVariableR
return new DefaultExecutionContextPathVariableResolver(beanResolver);
}

@Bean
public ConfigVariableResolver configVariableResolver(ReservedKeywordRegistry reservedKeywordRegistry) {
return new DefaultConfigVariableResolver(reservedKeywordRegistry);
}

@Bean(name="default.ExecutionContextLoader", destroyMethod="clear")
//@Scope(proxyMode=ScopedProxyMode.TARGET_CLASS, scopeName="session")
public ExecutionContextLoader defaultExecutionContextLoader(BeanResolverStrategy beanResolver) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,14 @@
import com.antheminc.oss.nimbus.domain.bpm.activiti.ActivitiExpressionManager;
import com.antheminc.oss.nimbus.domain.bpm.activiti.CommandExecutorTaskDelegate;
import com.antheminc.oss.nimbus.domain.bpm.activiti.DefaultMongoProcessRepository;
import com.antheminc.oss.nimbus.domain.cmd.exec.CommandExecutorGateway;
import com.antheminc.oss.nimbus.domain.cmd.exec.FunctionHandler;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.DefaultParamFunctionHandler;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.ReservedKeywordRegistry;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.nav.DefaultActionNewInitEntityFunctionHandler;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.nav.PageIdEchoNavHandler;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.process.AddFunctionHandler;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.process.ConfigVariableFunctionHandler;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.process.EvalFunctionHandler;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.process.SetByRuleFunctionalHandler;
import com.antheminc.oss.nimbus.domain.cmd.exec.internal.process.SetFunctionHandler;
Expand Down Expand Up @@ -139,4 +142,8 @@ public EvalFunctionHandler<?,?> evalFunctionHandler(ExpressionManager expression
return new EvalFunctionHandler(expressionManager);
}

@Bean(name="default._process$execute?fn=_setVariable")
public FunctionHandler<?, Object> configVariableFunctionHandler(ReservedKeywordRegistry reservedKeywordRegistry, SpelExpressionEvaluator expressionEvaluator, CommandExecutorGateway commandExecutorGateway) {
return new ConfigVariableFunctionHandler<>(reservedKeywordRegistry, expressionEvaluator, commandExecutorGateway);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/**
* Copyright 2016-2019 the original author or authors.
*
* 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 com.antheminc.oss.nimbus.domain.cmd.exec;

/**
* @author Tony Lopez
* @since 1.3
*
*/
public interface ConfigVariableResolver {

/**
* <p>Resolve any config variables that are present in the the provided
* path and return the resolved result.
* @param context the context object from which to retrieve config
* variables
* @param pathToResolve the path to resolve against
* @return the resolved path
*/
String resolve(ExecutionContext eCtx, String pathToResolve);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/**
* Copyright 2016-2019 the original author or authors.
*
* 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 com.antheminc.oss.nimbus.domain.cmd.exec;

import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;

import com.antheminc.oss.nimbus.domain.cmd.exec.internal.ReservedKeywordRegistry;

import lombok.RequiredArgsConstructor;

/**
* @author Tony Lopez
* @since 1.3
*
*/
@RequiredArgsConstructor
public class DefaultConfigVariableResolver implements ConfigVariableResolver {

private final ReservedKeywordRegistry reservedKeywordRegistry;

@Override
public String resolve(ExecutionContext eCtx, String pathToResolve) {
Map<Integer, String> entries = ParamPathExpressionParser.parse(pathToResolve);

// remove reserved placeholders -- those will be handled by another
// resolver
entries = entries.entrySet().stream().filter(x -> !this.reservedKeywordRegistry.exists(ParamPathExpressionParser.stripPrefixSuffix(x.getValue())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

if (MapUtils.isEmpty(entries)) {
return pathToResolve;
}

String out = pathToResolve;
for (Entry<Integer, String> entry : entries.entrySet()) {
String variableName = ParamPathExpressionParser.stripPrefixSuffix(entry.getValue());
Object variableValue = eCtx.getVariable(variableName);
String sVariableValue = variableValue != null ? variableValue.toString() : null;
out = StringUtils.replace(out, entry.getValue(), sVariableValue, 1);
}

return out;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,13 @@
package com.antheminc.oss.nimbus.domain.cmd.exec;

import java.io.Serializable;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.StringUtils;

import com.antheminc.oss.nimbus.domain.cmd.Command;
import com.antheminc.oss.nimbus.domain.cmd.CommandMessage;
Expand All @@ -40,26 +43,65 @@ public class ExecutionContext implements Serializable {
private static final long serialVersionUID = 1L;

private final CommandMessage commandMessage;

private final Map<String, Object> resolvedVariableMap = new HashMap<>();
private QuadModel<?, ?> quadModel;

public ExecutionContext(Command command) {
this(new CommandMessage(command, null));
}

public ExecutionContext(CommandMessage commandMessage) {
this.commandMessage = commandMessage;
}

public ExecutionContext(CommandMessage commandMessage, QuadModel<?, ?> quadModel) {
this(commandMessage);
setQuadModel(quadModel);
}

/**
* <p>Add a resolved variable value into the resolved variable cache.
* @param name the name to store the variable under
* @param value the value to store
* @return the previous value associated with {@code name}, or
* {@code null} if there was no mapping for {@code name}.
*/
public Object addVariable(String name, Object value) {
return this.resolvedVariableMap.put(name, value);
}

/**
* <p>Add resolved variables into the resolved variable cache.
* @param resolvedVariableMap a map containing entries to add.
* @return the previous value associated with {@code name}, or
* {@code null} if there was no mapping for {@code name}.
*/
public void addVariables(Map<String, Object> resolvedVariableMap) {
this.resolvedVariableMap.putAll(resolvedVariableMap);
}

public String getId() {
return getCommandMessage().getCommand().getRootDomainUri();
}

/**
* <p>Get the map of currently resolved variables.
* @return the map of current resolved variables.
*/
public Map<String, Object> getResolvedVariableMap() {
return Collections.unmodifiableMap(this.resolvedVariableMap);
}

/**
* <p>Get the resolved variable value for a given variable name.
* @param name the name of the variable to retrieve
* @return the previous value associated with {@code name}, or
* {@code null} if there was no mapping for {@code name}.
*/
public Object getVariable(String name) {
return this.resolvedVariableMap.get(name);
}

public boolean equalsId(Command cmd) {
return StringUtils.equals(getId(), cmd.getRootDomainUri());
}
Expand All @@ -76,7 +118,6 @@ public <P> P findStateByPath(String path) {
return getRootModel().findStateByPath(path);
}


@Override
public boolean equals(Object other) {
if(other==null)
Expand All @@ -99,6 +140,10 @@ public int hashCode() {
return builder.hashCode();
}

public void reset() {
this.resolvedVariableMap.clear();
}

@Override
public String toString() {
return getId();
Expand Down
Loading