Skip to content

Commit

Permalink
Merge pull request #36 from CoreMedia/develop
Browse files Browse the repository at this point in the history
Release: updates for 3.1.0
  • Loading branch information
mfaust authored Nov 22, 2018
2 parents 805e7ca + f1a3681 commit 7ff9820
Show file tree
Hide file tree
Showing 17 changed files with 163 additions and 61 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public LinkBuilderSetup(CaasServiceConfig serviceConfig) {


@Override
public boolean preQuery(String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> queryArgs, ServletWebRequest request) {
public boolean preQuery(String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> requestParameters, ServletWebRequest request) {
RequestContext requestContext = rootContext.getRequestContext();
// build prototype URI from either a configured base URI or the current request
String baseUri = clientIdentification.getOption(requestContext.isPreview() ? "mediaBaseUri_preview" : "mediaBaseUri_live", String.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public class JsltPostprocessor extends QueryExecutionInterceptorAdapter {


@Override
public Object postQuery(Object resultData, String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> queryArgs, ServletWebRequest request) {
public Object postQuery(Object resultData, String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> requestParameters, ServletWebRequest request) {
// check for query transformation option
String transformer = queryDefinition.getOption("jslt");
if (transformer != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.coremedia.blueprint.base.settings.SettingsService;
import com.coremedia.caas.server.monitoring.CaasMetrics;
import com.coremedia.caas.server.resolver.SiteResolver;
import com.coremedia.caas.server.resolver.TargetResolver;
import com.coremedia.caas.server.service.request.ClientIdentification;
import com.coremedia.caas.service.repository.RootContext;
Expand All @@ -24,14 +25,11 @@
import java.time.ZonedDateTime;
import java.util.List;
import java.util.function.Supplier;
import java.util.stream.Collectors;

public abstract class ControllerBase {

private static final Logger LOG = LoggerFactory.getLogger(ControllerBase.class);

private static final String TENANT_ID = "tenantId";


private String timerName;

Expand All @@ -45,12 +43,15 @@ public abstract class ControllerBase {
protected RootContextFactory rootContextFactory;

@Autowired
protected SitesService siteService;
protected SitesService sitesService;

@Autowired
@Qualifier("settingsService")
private SettingsService settingsService;

@Autowired
private List<SiteResolver> siteResolvers;

@Autowired
private List<TargetResolver> targetResolvers;

Expand All @@ -60,14 +61,12 @@ public ControllerBase(String timerName) {
}


private List<Site> resolveSites(String tenantId) {
return siteService.getSites().stream().filter(site -> tenantId.equals(settingsService.setting(TENANT_ID, String.class, site.getSiteIndicator()))).collect(Collectors.toList());
}

private Site resolveSite(String tenantId, String siteId) {
Site site = resolveSites(tenantId).stream().filter(item -> siteId.equals(item.getId())).findFirst().orElse(null);
if (site != null && site.getSiteRootDocument() != null) {
return site;
private Site resolveSite(String tenantId, String siteId, String targetId) {
for (SiteResolver resolver : siteResolvers) {
Site site = resolver.resolveSite(tenantId, siteId, targetId);
if (site != null && site.getSiteRootDocument() != null) {
return site;
}
}
return null;
}
Expand All @@ -86,7 +85,7 @@ private Object resolveTarget(Site localizedSite, String targetId) {
}

private boolean validateTarget(Site localizedSite, Object target) {
return !(target instanceof Content) || siteService.isContentInSite(localizedSite, (Content) target);
return !(target instanceof Content) || sitesService.isContentInSite(localizedSite, (Content) target);
}


Expand All @@ -96,7 +95,7 @@ protected ClientIdentification resolveClient(RootContext rootContext, ServletWeb


protected RootContext resolveRootContext(String tenantId, String siteId, ServletWebRequest request) throws AccessControlViolation {
Site site = resolveSite(tenantId, siteId);
Site site = resolveSite(tenantId, siteId, null);
if (site == null) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND);
}
Expand All @@ -105,7 +104,7 @@ protected RootContext resolveRootContext(String tenantId, String siteId, Servlet
}

protected RootContext resolveRootContext(String tenantId, String siteId, String targetId, ServletWebRequest request) throws AccessControlViolation {
Site site = resolveSite(tenantId, siteId);
Site site = resolveSite(tenantId, siteId, targetId);
if (site == null) {
throw new ResponseStatusException(HttpStatus.NOT_FOUND);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import com.coremedia.caas.server.CaasServiceConfig;
import com.coremedia.caas.server.controller.interceptor.QueryExecutionInterceptor;
import com.coremedia.caas.server.service.request.ClientIdentification;
import com.coremedia.caas.server.service.request.GlobalParameters;
import com.coremedia.caas.service.ServiceRegistry;
import com.coremedia.caas.service.expression.RequestParameterAccessor;
import com.coremedia.caas.service.repository.RootContext;
import com.coremedia.caas.service.security.AccessControlViolation;
import com.coremedia.cache.Cache;
Expand All @@ -33,7 +33,6 @@
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.validation.constraints.NotNull;

public abstract class GraphQLControllerBase extends ControllerBase {
Expand Down Expand Up @@ -61,6 +60,10 @@ public abstract class GraphQLControllerBase extends ControllerBase {
@Qualifier("staticProcessingDefinitions")
private Map<String, ProcessingDefinition> staticProcessingDefinitions;

@Autowired
@Qualifier("requestParameterAccessor")
private RequestParameterAccessor requestParameterAccessor;

@Autowired(required = false)
private List<QueryExecutionInterceptor> queryInterceptors;

Expand All @@ -70,18 +73,7 @@ public GraphQLControllerBase(String timerName) {
}


private Map<String, Object> getQueryArgs(ServletWebRequest request) {
return request.getParameterMap().entrySet().stream()
.filter(e -> !GlobalParameters.GLOBAL_BLACKLIST.contains(e.getKey()))
.filter(e -> {
String[] v = e.getValue();
return v != null && v.length > 0 && v[0] != null;
})
.collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()[0]));
}


private Object runQuery(@NotNull String tenantId, @NotNull String siteId, @NotNull RootContext rootContext, @NotNull ClientIdentification clientIdentification, @NotNull String queryName, @NotNull String viewName, Map<String, Object> queryArgs, ServletWebRequest request) {
private Object runQuery(@NotNull String tenantId, @NotNull String siteId, @NotNull RootContext rootContext, @NotNull ClientIdentification clientIdentification, @NotNull String queryName, @NotNull String viewName, Map<String, Object> requestParameters, ServletWebRequest request) {
String definitionName = clientIdentification.getDefinitionName();
// repository defined runtime definition
ProcessingDefinitionCacheKey processingDefinitionCacheKey = new ProcessingDefinitionCacheKey(rootContext.getSite().getSiteIndicator(), settingsService, applicationContext);
Expand All @@ -103,7 +95,7 @@ private Object runQuery(@NotNull String tenantId, @NotNull String siteId, @NotNu
// run pre query interceptors
if (queryInterceptors != null) {
for (QueryExecutionInterceptor executionInterceptor : queryInterceptors) {
if (!executionInterceptor.preQuery(tenantId, siteId, clientIdentification, rootContext, processingDefinition, queryDefinition, queryArgs, request)) {
if (!executionInterceptor.preQuery(tenantId, siteId, clientIdentification, rootContext, processingDefinition, queryDefinition, requestParameters, request)) {
return null;
}
}
Expand All @@ -124,7 +116,7 @@ private Object runQuery(@NotNull String tenantId, @NotNull String siteId, @NotNu
.query(query)
.root(target)
.context(context)
.variables(queryArgs)
.variables(requestParameters)
.build();
ExecutionResult result = GraphQL.newGraphQL(queryDefinition.getQuerySchema(target))
.preparsedDocumentProvider(processingDefinition.getQueryRegistry())
Expand All @@ -139,7 +131,7 @@ private Object runQuery(@NotNull String tenantId, @NotNull String siteId, @NotNu
// run post query interceptors
if (queryInterceptors != null) {
for (QueryExecutionInterceptor executionInterceptor : Lists.reverse(queryInterceptors)) {
Object transformedData = executionInterceptor.postQuery(resultData, tenantId, siteId, clientIdentification, rootContext, processingDefinition, queryDefinition, queryArgs, request);
Object transformedData = executionInterceptor.postQuery(resultData, tenantId, siteId, clientIdentification, rootContext, processingDefinition, queryDefinition, requestParameters, request);
if (transformedData != null) {
resultData = transformedData;
}
Expand Down Expand Up @@ -185,12 +177,10 @@ protected Object execute(String tenantId, String siteId, String queryName, Strin
ClientIdentification clientIdentification = resolveClient(rootContext, request);
String clientId = clientIdentification.getId().toString();
String definitionName = clientIdentification.getDefinitionName();
// determine query arguments
Map<String, Object> queryArgs = getQueryArgs(request);
// initialize expression evaluator
serviceRegistry.getExpressionEvaluator().init(queryArgs);
// get query string parameters from accessor instance
Map<String, Object> requestParameters = requestParameterAccessor.getParamMap();
// run query
return execute(() -> runQuery(tenantId, siteId, rootContext, clientIdentification, queryName, viewName, queryArgs, request), "tenant", tenantId, "site", siteId, "client", clientId, "pd", definitionName, "query", queryName, "view", viewName);
return execute(() -> runQuery(tenantId, siteId, rootContext, clientIdentification, queryName, viewName, requestParameters, request), "tenant", tenantId, "site", siteId, "client", clientId, "pd", definitionName, "query", queryName, "view", viewName);
} catch (AccessControlViolation e) {
return handleError(e, request);
} catch (ResponseStatusException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
public class DefaultContextSetupInterceptor extends QueryExecutionInterceptorAdapter {

@Override
public boolean preQuery(String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> queryArgs, ServletWebRequest request) {
public boolean preQuery(String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> requestParameters, ServletWebRequest request) {
RequestContext requestContext = rootContext.getRequestContext();
// add properties which might be useful during query execution
requestContext.setProperty(ContextProperties.REQUEST_CLIENT_IDENTIFICATON, clientIdentification);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@

public interface QueryExecutionInterceptor {

boolean preQuery(String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> queryArgs, ServletWebRequest request);

Object postQuery(Object resultData, String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> queryArgs, ServletWebRequest request);
boolean preQuery(String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> requestParameters, ServletWebRequest request);

Object postQuery(Object resultData, String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> requestParameters, ServletWebRequest request);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
public class QueryExecutionInterceptorAdapter implements QueryExecutionInterceptor {

@Override
public boolean preQuery(String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> queryArgs, ServletWebRequest request) {
public boolean preQuery(String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> requestParameters, ServletWebRequest request) {
return true;
}

@Override
public Object postQuery(Object resultData, String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> queryArgs, ServletWebRequest request) {
public Object postQuery(Object resultData, String tenantId, String siteId, ClientIdentification clientIdentification, RootContext rootContext, ProcessingDefinition processingDefinition, QueryDefinition queryDefinition, Map<String, Object> requestParameters, ServletWebRequest request) {
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
import org.springframework.stereotype.Component;

@Component
@Order(10)
public class ContentIdResolver implements TargetResolver {
@Order()
public class ContentByIdResolver implements TargetResolver {

@Autowired
private ContentRepository contentRepository;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
import java.util.Map;

@Component
@Order(100)
public class ContentMappingResolver implements TargetResolver {
@Order(10)
public class ContentByMappingResolver implements TargetResolver {

public static final String STATIC_MAPPING_KEY = "caasMappings";

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.coremedia.caas.server.resolver;

import com.coremedia.blueprint.base.settings.SettingsService;
import com.coremedia.cap.multisite.Site;
import com.coremedia.cap.multisite.SitesService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.stream.Collectors;

@Component
@Order()
public class SiteByIdResolver implements SiteResolver {

@Autowired
protected SitesService sitesService;

@Autowired
@Qualifier("settingsService")
private SettingsService settingsService;


@Override
public Site resolveSite(String tenantId, String siteId, String targetId) {
Site site = sitesService.getSites().stream()
.filter(e -> tenantId.equals(settingsService.setting(TENANT_ID, String.class, e.getSiteIndicator())))
.filter(e -> siteId.equals(e.getId()))
.findFirst().orElse(null);
if (site != null && site.getSiteRootDocument() != null) {
return site;
}
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.coremedia.caas.server.resolver;

import com.coremedia.cap.multisite.Site;

public interface SiteResolver {

String TENANT_ID = "tenantId";


Site resolveSite(String tenantId, String siteId, String targetId);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.coremedia.caas.server.service;

import com.coremedia.caas.server.CaasServiceConfig;
import com.coremedia.caas.server.service.expression.RequestParameterAccessorImpl;
import com.coremedia.caas.server.service.expression.spel.SpelExpressionEvaluator;
import com.coremedia.caas.service.ServiceRegistry;
import com.coremedia.caas.service.cache.CacheInstances;
import com.coremedia.caas.service.cache.Weighted;
import com.coremedia.caas.service.expression.ExpressionEvaluator;
import com.coremedia.caas.service.expression.RequestParameterAccessor;
import com.coremedia.caas.service.expression.spel.ReadOnlyMapAccessor;
import com.coremedia.caas.service.repository.content.ContentProxyPropertyAccessor;
import com.coremedia.caas.service.repository.content.StructProxyPropertyAccessor;
Expand Down Expand Up @@ -33,6 +35,7 @@
import org.springframework.expression.spel.support.ReflectivePropertyAccessor;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.request.ServletWebRequest;

import java.util.List;

Expand All @@ -57,9 +60,17 @@ public ModelMapper modelMapper() {
}


@Bean("requestParameterAccessor")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.INTERFACES)
public RequestParameterAccessor requestParameterAccessor(ServletWebRequest request) {
return new RequestParameterAccessorImpl(request);
}

@Bean("spelEvaluator")
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.INTERFACES)
public ExpressionEvaluator createSpelExpressionEvaluator(@Qualifier("queryContentModelMethodResolver") MethodResolver contentMethodResolver) {
public ExpressionEvaluator createSpelExpressionEvaluator(
@Qualifier("queryContentModelMethodResolver") MethodResolver contentMethodResolver,
@Qualifier("requestParameterAccessor") RequestParameterAccessor requestParameterAccessor) {
List<PropertyAccessor> propertyAccessors = ImmutableList.of(
new ContentProxyPropertyAccessor(),
new StructProxyPropertyAccessor(),
Expand All @@ -69,6 +80,8 @@ public ExpressionEvaluator createSpelExpressionEvaluator(@Qualifier("queryConten
StandardEvaluationContext context = new StandardEvaluationContext();
context.setPropertyAccessors(propertyAccessors);
context.addMethodResolver(contentMethodResolver);
// set request services
context.setVariable("requestParameters", requestParameterAccessor);
return new SpelExpressionEvaluator(context);
}

Expand Down
Loading

0 comments on commit 7ff9820

Please sign in to comment.