Get TransformConfig from a TransformConfigSource List so we can add extra sources like files and remote t-engine config in t-router

This commit is contained in:
alandavis
2022-08-10 16:18:16 +01:00
parent b7d24a745f
commit bb015925a7
10 changed files with 184 additions and 112 deletions

View File

@@ -28,6 +28,10 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>

View File

@@ -36,16 +36,28 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
import org.springframework.retry.annotation.EnableRetry;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class})
@EnableAsync
//@EnableScheduling
//@EnableRetry
public class Application
{
private static final Logger logger = LoggerFactory.getLogger(Application.class);
@Value("${container.name}")
private String containerName;
@Bean
public TaskExecutor taskExecutor()
{
return new SimpleAsyncTaskExecutor();
}
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags()
{

View File

@@ -28,6 +28,7 @@ package org.alfresco.transform.base;
import org.alfresco.transform.base.html.OptionLister;
import org.alfresco.transform.base.logging.LogEntry;
import org.alfresco.transform.base.registry.TransformRegistry;
import org.alfresco.transform.base.transform.TransformHandler;
import org.alfresco.transform.client.model.TransformReply;
import org.alfresco.transform.client.model.TransformRequest;
@@ -62,7 +63,6 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

View File

@@ -1,85 +0,0 @@
/*
* #%L
* Alfresco Transform Core
* %%
* Copyright (C) 2022 - 2022 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* -
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
* -
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* -
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
* -
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
package org.alfresco.transform.base.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer
{
private static final Logger logger = LoggerFactory.getLogger(SpringAsyncConfig.class);
@Value("${async-task-executor.core-pool-size:1}")
int corePoolSize;
@Value("${async-task-executor.max-pool-size:"+Integer.MAX_VALUE+"}")
int maxPoolSize;
@Value("${async-task-executor.keep-alive-seconds:60}")
int keepAliveSeconds;
@Value("${async-task-executor.queue-capacity:"+Integer.MAX_VALUE+"}")
int queueCapacity;
@Value("${async-task-executor.allow-core-thread-time-out:false}")
boolean allowCoreThreadTimeOut;
@Value("${async-task-executor.prestart-all-core-threads:false}")
boolean prestartAllCoreThreads;
@Override
@Bean(name = "taskExecutor")
public Executor getAsyncExecutor()
{
logger.debug("async-task-executor:");
logger.debug(" corePoolSize="+corePoolSize);
logger.debug(" max-pool-size: "+maxPoolSize);
logger.debug(" keep-alive-seconds: "+keepAliveSeconds);
logger.debug(" queue-capacity: "+queueCapacity);
logger.debug(" allow-core-thread-time-out: "+allowCoreThreadTimeOut);
logger.debug(" prestart-all-core-threads: "+prestartAllCoreThreads);
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setKeepAliveSeconds(keepAliveSeconds);
executor.setQueueCapacity(queueCapacity);
executor.setAllowCoreThreadTimeOut(allowCoreThreadTimeOut);
executor.setPrestartAllCoreThreads(prestartAllCoreThreads);
return executor;
}
}

View File

@@ -26,9 +26,10 @@
*/
package org.alfresco.transform.base.config;
import org.alfresco.transform.base.html.TransformInterceptor;
import org.alfresco.transform.base.TransformRegistry;
import org.alfresco.transform.base.clients.AlfrescoSharedFileStoreClient;
import org.alfresco.transform.base.html.TransformInterceptor;
import org.alfresco.transform.base.registry.TransformConfigSource;
import org.alfresco.transform.base.registry.TransformRegistry;
import org.alfresco.transform.common.TransformerDebug;
import org.alfresco.transform.messages.TransformRequestValidator;
import org.alfresco.transform.registry.TransformServiceRegistry;
@@ -41,6 +42,9 @@ import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
import static org.alfresco.transform.common.RequestParamMap.ENDPOINT_TRANSFORM;
import static org.alfresco.transform.config.CoreFunction.standardizeCoreVersion;
@@ -102,4 +106,10 @@ public class WebApplicationConfig implements WebMvcConfigurer
{
return standardizeCoreVersion(coreVersionString);
}
@Bean
public List<TransformConfigSource> transformConfigSources()
{
return new ArrayList<>();
}
}

View File

@@ -0,0 +1,53 @@
/*
* #%L
* Alfresco Transform Core
* %%
* Copyright (C) 2022 - 2022 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* -
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
* -
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* -
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
* -
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
package org.alfresco.transform.base.registry;
import org.springframework.stereotype.Component;
public abstract class AbstractTransformConfigSource implements TransformConfigSource
{
private final String readFrom;
private final String baseUrl;
public AbstractTransformConfigSource(String readFrom, String baseUrl)
{
this.readFrom = readFrom;
this.baseUrl = baseUrl == null ? "---" : baseUrl;
}
@Override
public String getReadFrom()
{
return readFrom;
}
@Override
public String getBaseUrl()
{
return baseUrl;
}
}

View File

@@ -0,0 +1,67 @@
/*
* #%L
* Alfresco Transform Core
* %%
* Copyright (C) 2022 - 2022 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* -
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
* -
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* -
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
* -
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
package org.alfresco.transform.base.registry;
import org.alfresco.transform.base.TransformEngine;
import org.alfresco.transform.config.TransformConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
@Component
public class TransformConfigFromTransformEngines
{
@Autowired(required = false)
private List<TransformEngine> transformEngines;
@Autowired
private List<TransformConfigSource> transformConfigSources;
@PostConstruct
private void fromTransformEngineConfig()
{
if (transformEngines != null)
{
transformEngines.stream()
.forEach(transformEngine -> {
TransformConfig transformConfig = transformEngine.getTransformConfig();
if (transformConfig != null) // if not a wrapping TransformEngine like all-in-one
{
transformConfigSources.add(
new AbstractTransformConfigSource(transformEngine.getTransformEngineName(),null)
{
@Override public TransformConfig getTransformConfig()
{
return transformEngine.getTransformConfig();
}
});
}
});
}
}
}

View File

@@ -0,0 +1,12 @@
package org.alfresco.transform.base.registry;
import org.alfresco.transform.config.TransformConfig;
public interface TransformConfigSource
{
String getReadFrom();
String getBaseUrl();
TransformConfig getTransformConfig();
}

View File

@@ -23,7 +23,7 @@
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
package org.alfresco.transform.base;
package org.alfresco.transform.base.registry;
import org.alfresco.transform.config.TransformConfig;
import org.alfresco.transform.registry.AbstractTransformRegistry;
@@ -32,8 +32,9 @@ import org.alfresco.transform.registry.TransformCache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import javax.annotation.PostConstruct;
import java.util.Comparator;
import java.util.List;
@@ -43,38 +44,36 @@ public class TransformRegistry extends AbstractTransformRegistry
{
private static final Logger log = LoggerFactory.getLogger(TransformRegistry.class);
@Autowired(required = false)
private List<TransformEngine> transformEngines;
@Autowired
private String coreVersion;
@Autowired
private List<TransformConfigSource> transformConfigSources;
private TransformConfig transformConfigBeforeIncompleteTransformsAreRemoved;
@PostConstruct
public void init()
/**
* Load the registry on application startup. This allows Components in projects that extend the t-engine base
* to use @PostConstruct to add to {@code transformConfigSources}, before the registry is loaded.
*/
@EventListener
void init(final ContextRefreshedEvent event)
{
CombinedTransformConfig combinedTransformConfig = new CombinedTransformConfig();
if (transformEngines != null)
{
transformEngines.stream()
.sorted(Comparator.comparing(TransformEngine::getTransformEngineName))
.forEach(transformEngine -> {
TransformConfig transformConfig = transformEngine.getTransformConfig();
if (transformConfig != null) // if not a wrapping TransformEngine like all-in-one
{
setCoreVersionOnSingleStepTransformers(transformConfig, coreVersion);
combinedTransformConfig.addTransformConfig(transformConfig,
transformEngine.getTransformEngineName(), "---", this);
}
});
}
transformConfigSources.stream()
.sorted(Comparator.comparing(TransformConfigSource::getReadFrom))
.forEach(source -> {
TransformConfig transformConfig = source.getTransformConfig();
setCoreVersionOnSingleStepTransformers(transformConfig, coreVersion);
combinedTransformConfig.addTransformConfig(transformConfig, source.getReadFrom(), source.getBaseUrl(),
this);
});
transformConfigBeforeIncompleteTransformsAreRemoved = combinedTransformConfig.buildTransformConfig();
combinedTransformConfig.combineTransformerConfig(this);
combinedTransformConfig.registerCombinedTransformers(this);
}
// Unlike other subclasses this class does not extend Data or replace it at run time.
private TransformCache data = new TransformCache();
public TransformConfig getTransformConfig()

View File