mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
ACS-1778 Common transform routing code for Repo and t-router (#648)
Main change is the removal of code from CombinedConfig into alfresco-transform-model as CombinedTransformConfig.The Code within LocalCombinedConfig has now moved to CombinedConfig as there is only one type of config now. * Bump alfresco-transform-model from 1.3.1.1 to 1.4.0 * Add logWarn method
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -51,7 +51,7 @@
|
|||||||
<dependency.alfresco-log-sanitizer.version>0.2</dependency.alfresco-log-sanitizer.version>
|
<dependency.alfresco-log-sanitizer.version>0.2</dependency.alfresco-log-sanitizer.version>
|
||||||
<dependency.activiti-engine.version>5.23.0</dependency.activiti-engine.version>
|
<dependency.activiti-engine.version>5.23.0</dependency.activiti-engine.version>
|
||||||
<dependency.activiti.version>5.23.0</dependency.activiti.version>
|
<dependency.activiti.version>5.23.0</dependency.activiti.version>
|
||||||
<dependency.transform.model.version>1.3.1</dependency.transform.model.version>
|
<dependency.alfresco-transform-model.version>1.4.0</dependency.alfresco-transform-model.version>
|
||||||
<dependency.alfresco-greenmail.version>6.2</dependency.alfresco-greenmail.version>
|
<dependency.alfresco-greenmail.version>6.2</dependency.alfresco-greenmail.version>
|
||||||
<dependency.acs-event-model.version>0.0.12</dependency.acs-event-model.version>
|
<dependency.acs-event-model.version>0.0.12</dependency.acs-event-model.version>
|
||||||
|
|
||||||
|
@@ -718,7 +718,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-transform-model</artifactId>
|
<artifactId>alfresco-transform-model</artifactId>
|
||||||
<version>${dependency.transform.model.version}</version>
|
<version>${dependency.alfresco-transform-model.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- Test dependencies -->
|
<!-- Test dependencies -->
|
||||||
@@ -740,7 +740,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.alfresco</groupId>
|
<groupId>org.alfresco</groupId>
|
||||||
<artifactId>alfresco-transform-model</artifactId>
|
<artifactId>alfresco-transform-model</artifactId>
|
||||||
<version>${dependency.transform.model.version}</version>
|
<version>${dependency.alfresco-transform-model.version}</version>
|
||||||
<classifier>tests</classifier>
|
<classifier>tests</classifier>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
@@ -1,143 +0,0 @@
|
|||||||
/*
|
|
||||||
* #%L
|
|
||||||
* Alfresco Repository
|
|
||||||
* %%
|
|
||||||
* Copyright (C) 2019 - 2021 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.repo.content.transform;
|
|
||||||
|
|
||||||
import org.alfresco.transform.client.model.config.Transformer;
|
|
||||||
import org.alfresco.transform.client.registry.CombinedConfig;
|
|
||||||
import org.alfresco.transform.client.registry.TransformServiceRegistryImpl;
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.alfresco.repo.content.transform.LocalTransformServiceRegistry.LOCAL_TRANSFORMER;
|
|
||||||
import static org.alfresco.repo.content.transform.LocalTransformServiceRegistry.URL;
|
|
||||||
import static org.alfresco.util.EqualsHelper.nullSafeEquals;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extends the standard CombinedConfig to add in removal of overridden or invalid transforms.
|
|
||||||
*
|
|
||||||
* @author adavis
|
|
||||||
*/
|
|
||||||
public class LocalCombinedConfig extends CombinedConfig
|
|
||||||
{
|
|
||||||
public LocalCombinedConfig(Log log)
|
|
||||||
{
|
|
||||||
super(log);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Discards a transformer that is invalid (e.g. T-Engines with the same name, baseUrl has not been specified on a
|
|
||||||
* T-Engine transform) or overridden an earlier transform with the same name). If the overridden transform is from
|
|
||||||
* a T-Engine and the overriding transform is not a pipeline or a failover, we also copy the {@code baseUrl} from
|
|
||||||
* the overridden transform so that the original T-Engine will still be called.
|
|
||||||
*
|
|
||||||
* @param i the current transform's index into combinedTransformers.
|
|
||||||
* @param combinedTransformers the full list of transformers in the order they were read.
|
|
||||||
* @param registry that wil hold the transforms.
|
|
||||||
* @param transformAndItsOrigin the current combinedTransformers element.
|
|
||||||
* @param transformer the current transformer.
|
|
||||||
* @param name the current transformer's name.
|
|
||||||
* @param readFrom where the current transformer was read from.
|
|
||||||
* @param isPipeline if the current transform is a pipeline.
|
|
||||||
* @param isFailover if the current transform is a failover.
|
|
||||||
*
|
|
||||||
* @returns the index of a transform to be removed. {@code -1} is returned if there should not be a remove.
|
|
||||||
* @throws IllegalArgumentException if the current transform has a problem and should be removed.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected int removeInvalidTransformer(int i, List<TransformAndItsOrigin> combinedTransformers,
|
|
||||||
TransformServiceRegistryImpl registry,
|
|
||||||
TransformAndItsOrigin transformAndItsOrigin, Transformer transformer,
|
|
||||||
String name, String readFrom, boolean isPipeline, boolean isFailover)
|
|
||||||
{
|
|
||||||
int indexToRemove = -1;
|
|
||||||
|
|
||||||
if (name == null || "".equals(name.trim()))
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("Local transformer names may not be null. Read from " + readFrom);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the baseUrl - test code might change it
|
|
||||||
String baseUrl = transformAndItsOrigin.getBaseUrl();
|
|
||||||
String testBaseUrl = ((LocalTransformServiceRegistry)registry).getBaseUrlIfTesting(name, baseUrl);
|
|
||||||
if (!nullSafeEquals(baseUrl, testBaseUrl))
|
|
||||||
{
|
|
||||||
baseUrl = testBaseUrl;
|
|
||||||
transformAndItsOrigin = new TransformAndItsOrigin(transformer, baseUrl, readFrom);
|
|
||||||
combinedTransformers.set(i, transformAndItsOrigin);
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isOneStepTransform = !isPipeline && !isFailover && !name.equals(LocalPassThroughTransform.NAME);
|
|
||||||
|
|
||||||
// Check to see if the name has been used before.
|
|
||||||
int j = lastIndexOf(name, combinedTransformers, i);
|
|
||||||
if (j >= 0)
|
|
||||||
{
|
|
||||||
if (baseUrl != null) // If a T-Engine, else it is an override
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("Local T-Engine transformer " + transformerName(name) +
|
|
||||||
" must be a unique name. Read from " + readFrom);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isOneStepTransform)
|
|
||||||
{
|
|
||||||
// We need to set the baseUrl of the original transform in the one overriding,
|
|
||||||
// so we can talk to its T-Engine
|
|
||||||
TransformAndItsOrigin overriddenTransform = combinedTransformers.get(j);
|
|
||||||
String overriddenBaseUrl = overriddenTransform.getBaseUrl();
|
|
||||||
Transformer overriddenTransformTransform = transformAndItsOrigin.getTransformer();
|
|
||||||
TransformAndItsOrigin overridingTransform = new TransformAndItsOrigin(
|
|
||||||
overriddenTransformTransform, overriddenBaseUrl, readFrom);
|
|
||||||
combinedTransformers.set(i, overridingTransform);
|
|
||||||
}
|
|
||||||
indexToRemove = j;
|
|
||||||
}
|
|
||||||
else if (isOneStepTransform && baseUrl == null)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("Local T-Engine transformer " + transformerName(name) +
|
|
||||||
" must have its baseUrl set in " + LOCAL_TRANSFORMER + name + URL + " Read from " +
|
|
||||||
readFrom);
|
|
||||||
}
|
|
||||||
return indexToRemove;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int lastIndexOf(String name, List<TransformAndItsOrigin> combinedTransformers, int toIndex)
|
|
||||||
{
|
|
||||||
// Lists are short (< 100) entries and this is not a frequent or time critical step, so walking the list
|
|
||||||
// should be okay.
|
|
||||||
for (int j = toIndex-1; j >=0; j--)
|
|
||||||
{
|
|
||||||
TransformAndItsOrigin transformAndItsOrigin = combinedTransformers.get(j);
|
|
||||||
Transformer transformer = transformAndItsOrigin.getTransformer();
|
|
||||||
String transformerName = transformer.getTransformerName();
|
|
||||||
if (name.equals(transformerName))
|
|
||||||
{
|
|
||||||
return j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -133,7 +133,7 @@ public class LocalTransformServiceRegistry extends TransformServiceRegistryImpl
|
|||||||
@Override
|
@Override
|
||||||
public boolean readConfig() throws IOException
|
public boolean readConfig() throws IOException
|
||||||
{
|
{
|
||||||
CombinedConfig combinedConfig = new LocalCombinedConfig(getLog());
|
CombinedConfig combinedConfig = new CombinedConfig(getLog());
|
||||||
List<String> urls = getTEngineUrls();
|
List<String> urls = getTEngineUrls();
|
||||||
boolean successReadingConfig = combinedConfig.addRemoteConfig(urls, "T-Engine");
|
boolean successReadingConfig = combinedConfig.addRemoteConfig(urls, "T-Engine");
|
||||||
successReadingConfig &= combinedConfig.addLocalConfig("alfresco/transforms");
|
successReadingConfig &= combinedConfig.addLocalConfig("alfresco/transforms");
|
||||||
@@ -315,12 +315,6 @@ public class LocalTransformServiceRegistry extends TransformServiceRegistryImpl
|
|||||||
options;
|
options;
|
||||||
}
|
}
|
||||||
|
|
||||||
// When testing, we need to be able to set the baseUrl when reading from a file.
|
|
||||||
public String getBaseUrlIfTesting(String name, String baseUrl)
|
|
||||||
{
|
|
||||||
return baseUrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Log getLog()
|
protected Log getLog()
|
||||||
{
|
{
|
||||||
|
@@ -30,10 +30,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import org.alfresco.error.AlfrescoRuntimeException;
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
import org.alfresco.repo.content.transform.LocalPassThroughTransform;
|
import org.alfresco.repo.content.transform.LocalPassThroughTransform;
|
||||||
import org.alfresco.service.cmr.repository.MimetypeService;
|
import org.alfresco.service.cmr.repository.MimetypeService;
|
||||||
import org.alfresco.transform.client.model.config.SupportedSourceAndTarget;
|
|
||||||
import org.alfresco.transform.client.model.config.TransformConfig;
|
import org.alfresco.transform.client.model.config.TransformConfig;
|
||||||
import org.alfresco.transform.client.model.config.TransformOption;
|
|
||||||
import org.alfresco.transform.client.model.config.TransformStep;
|
|
||||||
import org.alfresco.transform.client.model.config.Transformer;
|
import org.alfresco.transform.client.model.config.Transformer;
|
||||||
import org.alfresco.util.ConfigFileFinder;
|
import org.alfresco.util.ConfigFileFinder;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
@@ -47,58 +44,22 @@ import org.apache.http.util.EntityUtils;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
import static org.alfresco.repo.content.metadata.AsynchronousExtractor.isMetadataEmbedMimetype;
|
|
||||||
import static org.alfresco.repo.content.metadata.AsynchronousExtractor.isMetadataExtractMimetype;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class reads multiple T-Engine config and local files and registers them all with a registry as if they were all
|
* This class reads multiple T-Engine config and local files and registers as if they were all
|
||||||
* in one file. Transform options are shared between all sources.<p>
|
* in one file. Transform options are shared between all sources.<p>
|
||||||
*
|
*
|
||||||
* The caller should make calls to {@link #addRemoteConfig(List, String)} and {@link #addLocalConfig(String)} followed
|
* The caller should make calls to {@link #addRemoteConfig(List, String)}, {@link #addLocalConfig(String)} or
|
||||||
* by a call to {@link #register(TransformServiceRegistryImpl)}.
|
* {@link #addTransformConfig(TransformConfig, String, String)} followed by a call to
|
||||||
|
* {@link #register(TransformServiceRegistryImpl)}.
|
||||||
*
|
*
|
||||||
* @author adavis
|
* @author adavis
|
||||||
*/
|
*/
|
||||||
public class CombinedConfig
|
public class CombinedConfig extends CombinedTransformConfig
|
||||||
{
|
{
|
||||||
private final Log log;
|
private final Log log;
|
||||||
|
|
||||||
public static class TransformAndItsOrigin
|
|
||||||
{
|
|
||||||
final Transformer transformer;
|
|
||||||
final String baseUrl;
|
|
||||||
final String readFrom;
|
|
||||||
|
|
||||||
public TransformAndItsOrigin(Transformer transformer, String baseUrl, String readFrom)
|
|
||||||
{
|
|
||||||
this.transformer = transformer;
|
|
||||||
this.baseUrl = baseUrl;
|
|
||||||
this.readFrom = readFrom;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Transformer getTransformer()
|
|
||||||
{
|
|
||||||
return transformer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getBaseUrl()
|
|
||||||
{
|
|
||||||
return baseUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Map<String, Set<TransformOption>> combinedTransformOptions = new HashMap<>();
|
|
||||||
List<TransformAndItsOrigin> combinedTransformers = new ArrayList<>();
|
|
||||||
|
|
||||||
private ObjectMapper jsonObjectMapper = new ObjectMapper();
|
private ObjectMapper jsonObjectMapper = new ObjectMapper();
|
||||||
private ConfigFileFinder configFileFinder;
|
private ConfigFileFinder configFileFinder;
|
||||||
private int tEngineCount;
|
private int tEngineCount;
|
||||||
@@ -113,9 +74,7 @@ public class CombinedConfig
|
|||||||
protected void readJson(JsonNode jsonNode, String readFrom, String baseUrl)
|
protected void readJson(JsonNode jsonNode, String readFrom, String baseUrl)
|
||||||
{
|
{
|
||||||
TransformConfig transformConfig = jsonObjectMapper.convertValue(jsonNode, TransformConfig.class);
|
TransformConfig transformConfig = jsonObjectMapper.convertValue(jsonNode, TransformConfig.class);
|
||||||
transformConfig.getTransformOptions().forEach((key, map) -> combinedTransformOptions.put(key, map));
|
addTransformConfig(transformConfig, readFrom, baseUrl);
|
||||||
transformConfig.getTransformers().forEach(transformer -> combinedTransformers.add(
|
|
||||||
new TransformAndItsOrigin(transformer, baseUrl, readFrom)));
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -255,6 +214,12 @@ public class CombinedConfig
|
|||||||
return message;
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean isPassThroughTransformName(String name)
|
||||||
|
{
|
||||||
|
return name.equals(LocalPassThroughTransform.NAME);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a PassThrough transform where the source and target mimetypes are identical, or transforms to "text/plain"
|
* Adds a PassThrough transform where the source and target mimetypes are identical, or transforms to "text/plain"
|
||||||
* from selected text based types.
|
* from selected text based types.
|
||||||
@@ -273,277 +238,7 @@ public class CombinedConfig
|
|||||||
data.setTEngineCount(tEngineCount);
|
data.setTEngineCount(tEngineCount);
|
||||||
data.setFileCount(configFileFinder.getFileCount());
|
data.setFileCount(configFileFinder.getFileCount());
|
||||||
|
|
||||||
combinedTransformers = removeInvalidTransformers(combinedTransformers, registry);
|
combineTransformerConfig(registry);
|
||||||
combinedTransformers = sortTransformers(combinedTransformers, registry);
|
registerCombinedTransformers(registry);
|
||||||
addWildcardSupportedSourceAndTarget(combinedTransformers);
|
|
||||||
|
|
||||||
combinedTransformers.forEach(transformer ->
|
|
||||||
registry.register(transformer.transformer, combinedTransformOptions,
|
|
||||||
transformer.baseUrl, transformer.readFrom));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Discards transformers that are invalid (e.g. transformers that have both pipeline and failover sections). Calls
|
|
||||||
* {@link #removeInvalidTransformer(int, List, TransformServiceRegistryImpl, TransformAndItsOrigin, Transformer,
|
|
||||||
* String, String, boolean, boolean)} for each transform, so that subclasses (LocalCombinedConfig), may also
|
|
||||||
* discard invalid transforms or overridden transforms.
|
|
||||||
*
|
|
||||||
* @param combinedTransformers the full list of transformers in the order they were read.
|
|
||||||
* @param registry that wil hold the transforms.
|
|
||||||
*/
|
|
||||||
private List<TransformAndItsOrigin> removeInvalidTransformers(List<TransformAndItsOrigin> combinedTransformers,
|
|
||||||
TransformServiceRegistryImpl registry)
|
|
||||||
{
|
|
||||||
for (int i=0; i<combinedTransformers.size(); i++)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
TransformAndItsOrigin transformAndItsOrigin = combinedTransformers.get(i);
|
|
||||||
Transformer transformer = transformAndItsOrigin.transformer;
|
|
||||||
String readFrom = transformAndItsOrigin.readFrom;
|
|
||||||
String name = transformer.getTransformerName();
|
|
||||||
List<TransformStep> pipeline = transformer.getTransformerPipeline();
|
|
||||||
List<String> failover = transformer.getTransformerFailover();
|
|
||||||
boolean isPipeline = pipeline != null && !pipeline.isEmpty();
|
|
||||||
boolean isFailover = failover != null && !failover.isEmpty();
|
|
||||||
|
|
||||||
if (isPipeline && isFailover)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("Transformer " + transformerName(name) +
|
|
||||||
" cannot have pipeline and failover sections. Read from " + readFrom);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Local transforms may override each other or be invalid
|
|
||||||
int indexToRemove = removeInvalidTransformer(i, combinedTransformers, registry, transformAndItsOrigin,
|
|
||||||
transformer, name, readFrom, isPipeline, isFailover);
|
|
||||||
|
|
||||||
// If required remove the requested transform
|
|
||||||
if (indexToRemove >= 0)
|
|
||||||
{
|
|
||||||
combinedTransformers.remove(indexToRemove);
|
|
||||||
// this may also require the current index i to be changed so we don't skip one.
|
|
||||||
if (i >= indexToRemove)
|
|
||||||
{
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (IllegalArgumentException e)
|
|
||||||
{
|
|
||||||
String msg = e.getMessage();
|
|
||||||
registry.logError(msg);
|
|
||||||
combinedTransformers.remove(i--);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return combinedTransformers;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int removeInvalidTransformer(int i, List<TransformAndItsOrigin> combinedTransformers,
|
|
||||||
TransformServiceRegistryImpl registry,
|
|
||||||
TransformAndItsOrigin transformAndItsOrigin, Transformer transformer,
|
|
||||||
String name, String readFrom, boolean isPipeline, boolean isFailover)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static String transformerName(String name)
|
|
||||||
{
|
|
||||||
return name == null ? " without a name" : "\"" + name + "\"";
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort transformers so there are no forward references, if that is possible.
|
|
||||||
private List<TransformAndItsOrigin> sortTransformers(List<TransformAndItsOrigin> original, TransformServiceRegistryImpl registry)
|
|
||||||
{
|
|
||||||
List<TransformAndItsOrigin> transformers = new ArrayList<>(original.size());
|
|
||||||
List<TransformAndItsOrigin> todo = new ArrayList<>(original.size());
|
|
||||||
Set<String> transformerNames = new HashSet<>();
|
|
||||||
boolean added;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
added = false;
|
|
||||||
for (TransformAndItsOrigin entry : original)
|
|
||||||
{
|
|
||||||
String name = entry.transformer.getTransformerName();
|
|
||||||
List<TransformStep> pipeline = entry.transformer.getTransformerPipeline();
|
|
||||||
Set<String> referencedTransformerNames = new HashSet<>();
|
|
||||||
boolean addEntry = true;
|
|
||||||
if (pipeline != null)
|
|
||||||
{
|
|
||||||
for (TransformStep step : pipeline)
|
|
||||||
{
|
|
||||||
String stepName = step.getTransformerName();
|
|
||||||
referencedTransformerNames.add(stepName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
List<String> failover = entry.transformer.getTransformerFailover();
|
|
||||||
if (failover != null)
|
|
||||||
{
|
|
||||||
referencedTransformerNames.addAll(failover);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (String referencedTransformerName : referencedTransformerNames)
|
|
||||||
{
|
|
||||||
if (!transformerNames.contains(referencedTransformerName))
|
|
||||||
{
|
|
||||||
todo.add(entry);
|
|
||||||
addEntry = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (addEntry)
|
|
||||||
{
|
|
||||||
transformers.add(entry);
|
|
||||||
added = true;
|
|
||||||
if (name != null)
|
|
||||||
{
|
|
||||||
transformerNames.add(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
original.clear();
|
|
||||||
original.addAll(todo);
|
|
||||||
todo.clear();
|
|
||||||
}
|
|
||||||
while (added && !original.isEmpty());
|
|
||||||
|
|
||||||
transformers.addAll(todo);
|
|
||||||
|
|
||||||
for (TransformAndItsOrigin transformAndItsOrigin : original)
|
|
||||||
{
|
|
||||||
String name = transformAndItsOrigin.getTransformer().getTransformerName();
|
|
||||||
registry.logError("Transformer " + transformerName(name) +
|
|
||||||
" ignored as step transforms do not exist. Read from " + transformAndItsOrigin.readFrom);
|
|
||||||
}
|
|
||||||
|
|
||||||
return transformers;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void addWildcardSupportedSourceAndTarget(List<TransformAndItsOrigin> combinedTransformers)
|
|
||||||
{
|
|
||||||
Map<String, Transformer> transformers = new HashMap<>();
|
|
||||||
combinedTransformers.forEach(ct -> transformers.put(ct.transformer.getTransformerName(), ct.transformer));
|
|
||||||
|
|
||||||
combinedTransformers.forEach(transformAndItsOrigin ->
|
|
||||||
{
|
|
||||||
Transformer transformer = transformAndItsOrigin.transformer;
|
|
||||||
|
|
||||||
// If there are no SupportedSourceAndTarget, then work out all the wildcard combinations.
|
|
||||||
if (transformer.getSupportedSourceAndTargetList().isEmpty())
|
|
||||||
{
|
|
||||||
List<TransformStep> pipeline = transformer.getTransformerPipeline();
|
|
||||||
List<String> failover = transformer.getTransformerFailover();
|
|
||||||
boolean isPipeline = pipeline != null && !pipeline.isEmpty();
|
|
||||||
boolean isFailover = failover != null && !failover.isEmpty();
|
|
||||||
if (isFailover)
|
|
||||||
{
|
|
||||||
// Copy all SupportedSourceAndTarget values from each step transformer
|
|
||||||
Set<SupportedSourceAndTarget> supportedSourceAndTargets = failover.stream().flatMap(
|
|
||||||
name -> transformers.get(name).getSupportedSourceAndTargetList().stream()).
|
|
||||||
collect(Collectors.toSet());
|
|
||||||
transformer.setSupportedSourceAndTargetList(supportedSourceAndTargets);
|
|
||||||
}
|
|
||||||
else if (isPipeline)
|
|
||||||
{
|
|
||||||
// Build up SupportedSourceAndTarget values. The list of source types and max sizes will come from the
|
|
||||||
// initial step transformer that have a target mimetype that matches the first intermediate mimetype.
|
|
||||||
// We then step through all intermediate transformers checking the next intermediate type is supported.
|
|
||||||
// When we get to the last step transformer, it provides all the target mimetypes based on the previous
|
|
||||||
// intermediate mimeype. Any combinations supported by the first transformer are excluded.
|
|
||||||
boolean first = true;
|
|
||||||
String sourceMediaType = null;
|
|
||||||
Set<SupportedSourceAndTarget> sourceMediaTypesAndMaxSizes = null;
|
|
||||||
Set<String> firstTransformOptions = null;
|
|
||||||
for (TransformStep step : pipeline)
|
|
||||||
{
|
|
||||||
String name = step.getTransformerName();
|
|
||||||
Transformer stepTransformer = transformers.get(name);
|
|
||||||
if (stepTransformer == null)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
String stepTrg = step.getTargetMediaType();
|
|
||||||
if (first)
|
|
||||||
{
|
|
||||||
first = false;
|
|
||||||
sourceMediaTypesAndMaxSizes = stepTransformer.getSupportedSourceAndTargetList().stream().
|
|
||||||
filter(s -> stepTrg.equals(s.getTargetMediaType())).
|
|
||||||
collect(Collectors.toSet());
|
|
||||||
sourceMediaType = stepTrg;
|
|
||||||
firstTransformOptions = stepTransformer.getTransformOptions();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
final String src = sourceMediaType;
|
|
||||||
if (stepTrg == null) // if final step
|
|
||||||
{
|
|
||||||
// Create a cartesian product of sourceMediaType,MaxSourceSize and TargetMediaType where
|
|
||||||
// the source matches the last intermediate.
|
|
||||||
Set<SupportedSourceAndTarget> supportedSourceAndTargets = sourceMediaTypesAndMaxSizes.stream().
|
|
||||||
flatMap(s -> stepTransformer.getSupportedSourceAndTargetList().stream().
|
|
||||||
filter(st ->
|
|
||||||
{
|
|
||||||
String targetMimetype = st.getTargetMediaType();
|
|
||||||
return st.getSourceMediaType().equals(src) &&
|
|
||||||
!(isMetadataExtractMimetype(targetMimetype) ||
|
|
||||||
isMetadataEmbedMimetype(targetMimetype));
|
|
||||||
}).
|
|
||||||
map(t -> t.getTargetMediaType()).
|
|
||||||
map(trg -> SupportedSourceAndTarget.builder().
|
|
||||||
withSourceMediaType(s.getSourceMediaType()).
|
|
||||||
withMaxSourceSizeBytes(s.getMaxSourceSizeBytes()).
|
|
||||||
withPriority(s.getPriority()).
|
|
||||||
withTargetMediaType(trg).build())).
|
|
||||||
collect(Collectors.toSet());
|
|
||||||
|
|
||||||
// Exclude duplicates with the first transformer, if it has the same options.
|
|
||||||
// There is no point doing more work.
|
|
||||||
Set<String> transformOptions = transformer.getTransformOptions();
|
|
||||||
if (sameOptions(transformOptions, firstTransformOptions))
|
|
||||||
{
|
|
||||||
supportedSourceAndTargets.removeAll(sourceMediaTypesAndMaxSizes);
|
|
||||||
}
|
|
||||||
|
|
||||||
transformer.setSupportedSourceAndTargetList(supportedSourceAndTargets);
|
|
||||||
}
|
|
||||||
else // if intermediate step
|
|
||||||
{
|
|
||||||
// Check source to target is supported (it normally is)
|
|
||||||
if (!stepTransformer.getSupportedSourceAndTargetList().stream().
|
|
||||||
anyMatch(st -> st.getSourceMediaType().equals(src) &&
|
|
||||||
st.getTargetMediaType().equals(stepTrg)))
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceMediaType = stepTrg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean sameOptions(Set<String> transformOptionNames1, Set<String> transformOptionNames2)
|
|
||||||
{
|
|
||||||
// They have the same names
|
|
||||||
if (transformOptionNames1.equals(transformOptionNames2))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check the actual options.
|
|
||||||
Set<TransformOption> transformOptions1 = getTransformOptions(transformOptionNames1);
|
|
||||||
Set<TransformOption> transformOptions2 = getTransformOptions(transformOptionNames2);
|
|
||||||
return transformOptions1.equals(transformOptions2);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Set<TransformOption> getTransformOptions(Set<String> transformOptionNames)
|
|
||||||
{
|
|
||||||
Set<TransformOption> transformOptions = new HashSet<>();
|
|
||||||
transformOptionNames.forEach(name->transformOptions.addAll(combinedTransformOptions.get(name)));
|
|
||||||
return transformOptions;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -175,6 +175,12 @@ public abstract class TransformServiceRegistryImpl extends AbstractTransformRegi
|
|||||||
getLog().error(msg);
|
getLog().error(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void logWarn(String msg)
|
||||||
|
{
|
||||||
|
getLog().warn(msg);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String findTransformerName(final String sourceMimetype, final long sourceSizeInBytes,
|
public String findTransformerName(final String sourceMimetype, final long sourceSizeInBytes,
|
||||||
final String targetMimetype, final Map<String, String> actualOptions,
|
final String targetMimetype, final Map<String, String> actualOptions,
|
||||||
|
@@ -235,7 +235,6 @@ import org.junit.runners.Suite;
|
|||||||
org.alfresco.repo.events.ClientUtilTest.class,
|
org.alfresco.repo.events.ClientUtilTest.class,
|
||||||
org.alfresco.repo.rendition2.RenditionService2Test.class,
|
org.alfresco.repo.rendition2.RenditionService2Test.class,
|
||||||
org.alfresco.repo.rendition2.TransformationOptionsConverterTest.class,
|
org.alfresco.repo.rendition2.TransformationOptionsConverterTest.class,
|
||||||
org.alfresco.transform.client.registry.TransformServiceRegistryConfigTest.class,
|
|
||||||
|
|
||||||
org.alfresco.repo.event2.RepoEvent2UnitSuite.class,
|
org.alfresco.repo.event2.RepoEvent2UnitSuite.class,
|
||||||
|
|
||||||
|
@@ -28,16 +28,19 @@ package org.alfresco.transform.client.registry;
|
|||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import org.alfresco.repo.content.MimetypeMap;
|
import org.alfresco.repo.content.MimetypeMap;
|
||||||
import org.alfresco.repo.content.transform.AbstractLocalTransform;
|
import org.alfresco.repo.content.transform.AbstractLocalTransform;
|
||||||
import org.alfresco.repo.content.transform.LocalCombinedConfig;
|
|
||||||
import org.alfresco.repo.content.transform.LocalPipelineTransform;
|
import org.alfresco.repo.content.transform.LocalPipelineTransform;
|
||||||
import org.alfresco.repo.content.transform.LocalTransformImpl;
|
import org.alfresco.repo.content.transform.LocalTransformImpl;
|
||||||
import org.alfresco.repo.content.transform.LocalTransformServiceRegistry;
|
import org.alfresco.repo.content.transform.LocalTransformServiceRegistry;
|
||||||
import org.alfresco.repo.content.transform.TransformerDebug;
|
import org.alfresco.repo.content.transform.TransformerDebug;
|
||||||
import org.alfresco.transform.client.model.config.SupportedSourceAndTarget;
|
import org.alfresco.transform.client.model.config.SupportedSourceAndTarget;
|
||||||
import org.alfresco.transform.client.model.config.TransformOption;
|
import org.alfresco.transform.client.model.config.TransformOption;
|
||||||
|
import org.alfresco.transform.client.model.config.TransformOptionGroup;
|
||||||
|
import org.alfresco.transform.client.model.config.TransformOptionValue;
|
||||||
import org.alfresco.transform.client.model.config.Transformer;
|
import org.alfresco.transform.client.model.config.Transformer;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.log4j.Level;
|
||||||
|
import org.apache.log4j.LogManager;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
@@ -48,6 +51,7 @@ import java.io.IOException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
@@ -55,7 +59,9 @@ import java.util.Set;
|
|||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import static java.util.Collections.emptyMap;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotEquals;
|
import static org.junit.Assert.assertNotEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
@@ -63,11 +69,9 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extends the {@link TransformServiceRegistryConfigTest} (used to test the config received from the Transform Service)
|
* Testing LocalTransformServiceRegistry.
|
||||||
* so that configuration for the local transformations may be tested. This includes pipelines and options specific
|
|
||||||
* transform steps.
|
|
||||||
*/
|
*/
|
||||||
public class LocalTransformServiceRegistryConfigTest extends TransformServiceRegistryConfigTest
|
public class LocalTransformServiceRegistryConfigTest extends TransformRegistryTest
|
||||||
{
|
{
|
||||||
public static final String HARD_CODED_VALUE = "hard coded value";
|
public static final String HARD_CODED_VALUE = "hard coded value";
|
||||||
|
|
||||||
@@ -135,6 +139,12 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
|
|||||||
super.logError(msg);
|
super.logError(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void logWarn(String msg)
|
||||||
|
{
|
||||||
|
logError(msg);
|
||||||
|
}
|
||||||
|
|
||||||
public Data assertDataChanged(Data prevData, String msg)
|
public Data assertDataChanged(Data prevData, String msg)
|
||||||
{
|
{
|
||||||
// If the data changes, there has been a read
|
// If the data changes, there has been a read
|
||||||
@@ -169,10 +179,14 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
|
|||||||
|
|
||||||
private static Log log = LogFactory.getLog(LocalTransformServiceRegistry.class);
|
private static Log log = LogFactory.getLog(LocalTransformServiceRegistry.class);
|
||||||
|
|
||||||
|
public static final String PNG = "image/png";
|
||||||
|
public static final String TIFF = "image/tiff";
|
||||||
|
|
||||||
|
public static final ObjectMapper JSON_OBJECT_MAPPER = new ObjectMapper();
|
||||||
|
|
||||||
private static final String LOCAL_TRANSFORM_SERVICE_CONFIG = "alfresco/local-transform-service-config-test.json";
|
private static final String LOCAL_TRANSFORM_SERVICE_CONFIG = "alfresco/local-transform-service-config-test.json";
|
||||||
private static final String LOCAL_TRANSFORM_SERVICE_CONFIG_PIPELINE = "alfresco/local-transform-service-config-pipeline-test.json";
|
private static final String LOCAL_TRANSFORM_SERVICE_CONFIG_PIPELINE = "alfresco/local-transform-service-config-pipeline-test.json";
|
||||||
|
|
||||||
private static final ObjectMapper JSON_OBJECT_MAPPER = new ObjectMapper();
|
|
||||||
private static final String LOCAL_TRANSFORM = "localTransform.";
|
private static final String LOCAL_TRANSFORM = "localTransform.";
|
||||||
private static final String URL = ".url";
|
private static final String URL = ".url";
|
||||||
|
|
||||||
@@ -202,8 +216,10 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
|
|||||||
initTestData();
|
initTestData();
|
||||||
|
|
||||||
super.setUp();
|
super.setUp();
|
||||||
|
LogManager.getLogger(LocalTransformServiceRegistryConfigTest.class).setLevel(Level.DEBUG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
protected LocalTransformServiceRegistry buildTransformServiceRegistryImpl() throws Exception
|
protected LocalTransformServiceRegistry buildTransformServiceRegistryImpl() throws Exception
|
||||||
{
|
{
|
||||||
registry = new TestLocalTransformServiceRegistry();
|
registry = new TestLocalTransformServiceRegistry();
|
||||||
@@ -222,19 +238,6 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
|
|||||||
return (System.currentTimeMillis() - startMs) + "ms: ";
|
return (System.currentTimeMillis() - startMs) + "ms: ";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getTransformServiceConfig()
|
|
||||||
{
|
|
||||||
return LOCAL_TRANSFORM_SERVICE_CONFIG;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String getTransformServiceConfigPipeline()
|
|
||||||
{
|
|
||||||
return LOCAL_TRANSFORM_SERVICE_CONFIG_PIPELINE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getExpectedTransformsForTestJsonPipeline()
|
protected int getExpectedTransformsForTestJsonPipeline()
|
||||||
{
|
{
|
||||||
// imagemagick
|
// imagemagick
|
||||||
@@ -259,7 +262,7 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
|
|||||||
*/
|
*/
|
||||||
private void retrieveLocalTransformList(String path)
|
private void retrieveLocalTransformList(String path)
|
||||||
{
|
{
|
||||||
CombinedConfig combinedConfig = new LocalCombinedConfig(log);
|
CombinedConfig combinedConfig = new CombinedConfig(log);
|
||||||
combinedConfig.addLocalConfig(path);
|
combinedConfig.addLocalConfig(path);
|
||||||
combinedConfig.register(registry);
|
combinedConfig.register(registry);
|
||||||
mapOfTransformOptions = combinedConfig.combinedTransformOptions;
|
mapOfTransformOptions = combinedConfig.combinedTransformOptions;
|
||||||
@@ -379,11 +382,166 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void register(String path) throws IOException
|
||||||
|
{
|
||||||
|
CombinedConfig combinedConfig = new CombinedConfig(log);
|
||||||
|
combinedConfig.addLocalConfig(path);
|
||||||
|
combinedConfig.register((TransformServiceRegistryImpl)registry);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@Override
|
|
||||||
public void testJsonConfig() throws IOException
|
public void testJsonConfig() throws IOException
|
||||||
{
|
{
|
||||||
internalTestJsonConfig(64, 70);
|
register(LOCAL_TRANSFORM_SERVICE_CONFIG);
|
||||||
|
|
||||||
|
// Check the count of transforms supported
|
||||||
|
assertEquals("The number of UNIQUE source to target mimetypes transforms has changed. Config change?",
|
||||||
|
64, countSupportedTransforms(true));
|
||||||
|
assertEquals("The number of source to target mimetypes transforms has changed. " +
|
||||||
|
"There may be multiple transformers for the same combination. Config change?",
|
||||||
|
70, countSupportedTransforms(false));
|
||||||
|
|
||||||
|
// Check a supported transform for each transformer.
|
||||||
|
assertSupported(DOC, 1234, PDF, emptyMap(), null, ""); // libreoffice
|
||||||
|
assertSupported(DOC, 1234, PDF, emptyMap(), null, ""); // libreoffice
|
||||||
|
assertSupported(PDF, 1234, PNG, emptyMap(), null, ""); // pdfrenderer
|
||||||
|
assertSupported(JPEG,1234, GIF, emptyMap(), null, ""); // imagemagick
|
||||||
|
assertSupported(MSG, 1234, TXT, emptyMap(), null, ""); // tika
|
||||||
|
assertSupported(MSG, 1234, GIF, emptyMap(), null, ""); // officeToImageViaPdf
|
||||||
|
|
||||||
|
Map<String, String> invalidPdfOptions = new HashMap<>();
|
||||||
|
invalidPdfOptions.put("allowEnlargement", "false");
|
||||||
|
assertSupported(DOC, 1234, PDF, invalidPdfOptions, null, "Invalid as there is a extra option");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testJsonPipeline() throws IOException
|
||||||
|
{
|
||||||
|
register(LOCAL_TRANSFORM_SERVICE_CONFIG_PIPELINE);
|
||||||
|
|
||||||
|
// Check the count of transforms supported
|
||||||
|
int expectedTransforms = getExpectedTransformsForTestJsonPipeline();
|
||||||
|
assertEquals("The number of UNIQUE source to target mimetypes transforms has changed. Config change?",
|
||||||
|
expectedTransforms, countSupportedTransforms(true));
|
||||||
|
assertEquals("The number of source to target mimetypes transforms has changed. " +
|
||||||
|
"There may be multiple transformers for the same combination. Config change?",
|
||||||
|
expectedTransforms, countSupportedTransforms(false));
|
||||||
|
|
||||||
|
// Check required and optional default correctly
|
||||||
|
Map<String, List<SupportedTransform>> transformsToWord =
|
||||||
|
registry.getData().getTransforms().get(DOC);
|
||||||
|
List<SupportedTransform> supportedTransforms = transformsToWord.get(GIF);
|
||||||
|
SupportedTransform supportedTransform = supportedTransforms.get(0);
|
||||||
|
|
||||||
|
Set<TransformOption> transformOptionsSet = supportedTransform.getTransformOptions().getTransformOptions();
|
||||||
|
|
||||||
|
Iterator<TransformOption> iterator = transformOptionsSet.iterator();
|
||||||
|
assertTrue("Expected transform values", iterator.hasNext());
|
||||||
|
// Because Set is unordered we don't know which TransformOptionGroup we retrieve
|
||||||
|
TransformOptionGroup transformOptions1 = (TransformOptionGroup)iterator.next();
|
||||||
|
|
||||||
|
assertTrue("Expected transform values", iterator.hasNext());
|
||||||
|
TransformOptionGroup transformOptions2 = (TransformOptionGroup)iterator.next();
|
||||||
|
|
||||||
|
TransformOptionGroup imagemagick;
|
||||||
|
TransformOptionGroup pdf;
|
||||||
|
|
||||||
|
if(containsTransformOptionValueName(transformOptions1, "alphaRemove"))
|
||||||
|
{
|
||||||
|
imagemagick = transformOptions1;
|
||||||
|
pdf = transformOptions2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
imagemagick = transformOptions2;
|
||||||
|
pdf = transformOptions1;
|
||||||
|
}
|
||||||
|
|
||||||
|
TransformOptionValue alphaRemove = (TransformOptionValue)retrieveTransformOptionByPropertyName(imagemagick, "alphaRemove", "TransformOptionValue");
|
||||||
|
TransformOptionGroup crop = (TransformOptionGroup)retrieveTransformOptionByPropertyName(imagemagick, "crop", "TransformOptionGroup");
|
||||||
|
TransformOptionValue cropGravity = (TransformOptionValue)retrieveTransformOptionByPropertyName(crop, "cropGravity", "TransformOptionValue");
|
||||||
|
TransformOptionValue cropWidth = (TransformOptionValue)retrieveTransformOptionByPropertyName(crop, "cropWidth", "TransformOptionValue");
|
||||||
|
|
||||||
|
assertTrue("The holding group should be required", supportedTransform.getTransformOptions().isRequired());
|
||||||
|
assertFalse("imagemagick should be optional as it is not set", imagemagick.isRequired());
|
||||||
|
assertFalse("pdf should be optional as required is not set", pdf.isRequired());
|
||||||
|
assertEquals("alphaRemove", alphaRemove.getName());
|
||||||
|
assertEquals("cropGravity", cropGravity.getName());
|
||||||
|
assertEquals("cropWidth", cropWidth.getName());
|
||||||
|
assertFalse("alphaRemove should be optional as required is not set", alphaRemove.isRequired());
|
||||||
|
assertFalse("crop should be optional as required is not set", crop.isRequired());
|
||||||
|
assertTrue("cropGravity should be required as it is set", cropGravity.isRequired());
|
||||||
|
assertFalse("cropWidth should be optional as required is not set", cropWidth.isRequired());
|
||||||
|
|
||||||
|
// Check a supported transform for each transformer.
|
||||||
|
assertSupported(DOC,1234, GIF, emptyMap(), null, "");
|
||||||
|
assertSupported(DOC,1234, PNG, emptyMap(), null, "");
|
||||||
|
assertSupported(DOC,1234, JPEG, emptyMap(), null, "");
|
||||||
|
assertSupported(DOC,1234, TIFF, emptyMap(), null, "");
|
||||||
|
|
||||||
|
Map<String, String> actualOptions = new HashMap<>();
|
||||||
|
actualOptions.put("thumbnail", "true");
|
||||||
|
actualOptions.put("resizeWidth", "100");
|
||||||
|
actualOptions.put("resizeHeight", "100");
|
||||||
|
actualOptions.put("allowEnlargement", "false");
|
||||||
|
actualOptions.put("maintainAspectRatio", "true");
|
||||||
|
assertSupported(DOC,1234, PNG, actualOptions, null, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
private TransformOption retrieveTransformOptionByPropertyName (TransformOptionGroup transformOptionGroup, String propertyName, String propertyType)
|
||||||
|
{
|
||||||
|
Iterator<TransformOption> iterator = transformOptionGroup.getTransformOptions().iterator();
|
||||||
|
|
||||||
|
List<TransformOption> transformOptionsList = new ArrayList<>();
|
||||||
|
while(iterator.hasNext())
|
||||||
|
{
|
||||||
|
transformOptionsList.add(iterator.next());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (TransformOption t : transformOptionsList)
|
||||||
|
{
|
||||||
|
if (t instanceof TransformOptionValue)
|
||||||
|
{
|
||||||
|
TransformOptionValue value = (TransformOptionValue) t;
|
||||||
|
if (propertyType.equalsIgnoreCase("TransformOptionValue"))
|
||||||
|
{
|
||||||
|
if (value.getName().equalsIgnoreCase(propertyName))
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (value.getName().contains(propertyName))
|
||||||
|
return transformOptionGroup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TransformOption result = retrieveTransformOptionByPropertyName((TransformOptionGroup)t, propertyName, propertyType);
|
||||||
|
if (result != null)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean containsTransformOptionValueName (TransformOptionGroup transformOptionGroup, String propertyName)
|
||||||
|
{
|
||||||
|
return retrieveTransformOptionByPropertyName(transformOptionGroup, propertyName, "TransformOptionValue") != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int countSupportedTransforms(boolean unique)
|
||||||
|
{
|
||||||
|
int count = 0;
|
||||||
|
int uniqueCount = 0;
|
||||||
|
for (Map<String, List<SupportedTransform>> targetMap : registry.getData().getTransforms().values())
|
||||||
|
{
|
||||||
|
for (List<SupportedTransform> supportedTransforms : targetMap.values())
|
||||||
|
{
|
||||||
|
uniqueCount++;
|
||||||
|
count += supportedTransforms.size();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return unique ? uniqueCount : count;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -635,7 +793,7 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
|
|||||||
public void testNoName()
|
public void testNoName()
|
||||||
{
|
{
|
||||||
retrieveLocalTransformList("alfresco/local-transform-service-config-no-name-test.json");
|
retrieveLocalTransformList("alfresco/local-transform-service-config-no-name-test.json");
|
||||||
registry.assertErrorLogged("Local transformer names may not be null.*no-name-test.*");
|
registry.assertErrorLogged("Transformer names may not be null.*no-name-test.*");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -649,7 +807,7 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
|
|||||||
public void testTEngineDuplicateNames()
|
public void testTEngineDuplicateNames()
|
||||||
{
|
{
|
||||||
retrieveLocalTransformList("alfresco/local-transform-service-config-dup-name-test.json");
|
retrieveLocalTransformList("alfresco/local-transform-service-config-dup-name-test.json");
|
||||||
registry.assertErrorLogged("Local T-Engine transformer .* must be a unique name.*dup-name.*");
|
registry.assertErrorLogged("Transformer \"pdfrenderer\" must be a unique name.*dup-name.*");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -657,21 +815,22 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
|
|||||||
{
|
{
|
||||||
registry.setResetBaseUrl(false);
|
registry.setResetBaseUrl(false);
|
||||||
retrieveLocalTransformList("alfresco/local-transform-service-config-no-base-url-test.json");
|
retrieveLocalTransformList("alfresco/local-transform-service-config-no-base-url-test.json");
|
||||||
registry.assertErrorLogged("Local T-Engine transformer .* must have its baseUrl set .*no-base-url.*");
|
registry.assertErrorLogged("Single step transformers \\(such as \"pdfrenderer\"\\) must be defined in a " +
|
||||||
|
"T-Engine rather than in a pipeline file, unless they are overriding an existing single step definition.*no-base-url.*");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPipelineMissingStepTransform()
|
public void testPipelineMissingStepTransform()
|
||||||
{
|
{
|
||||||
retrieveLocalTransformList("alfresco/transform-service-config-pipeline-missing-step-test.json");
|
retrieveLocalTransformList("alfresco/transform-service-config-pipeline-missing-step-test.json");
|
||||||
registry.assertErrorLogged("Transformer .* ignored as step transforms do not exist.*pipeline-missing-step.*");
|
registry.assertErrorLogged("Transformer \"missingPdfrenderer\" ignored as step transforms \\(\"pdfrenderer\"\\) do not exist.*pipeline-missing-step-test.*");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFailoverMissingStepTransform()
|
public void testFailoverMissingStepTransform()
|
||||||
{
|
{
|
||||||
retrieveLocalTransformList("alfresco/transform-service-config-failover-missing-step-test.json");
|
retrieveLocalTransformList("alfresco/transform-service-config-failover-missing-step-test.json");
|
||||||
registry.assertErrorLogged("Transformer .* ignored as step transforms do not exist.*failover-missing-step.*");
|
registry.assertErrorLogged("Transformer \"missingPdfrenderer\" ignored as step transforms \\(\"pdfrenderer\"\\) do not exist.*failover-missing-step-test.*");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@@ -1,295 +0,0 @@
|
|||||||
/*
|
|
||||||
* #%L
|
|
||||||
* Alfresco Repository
|
|
||||||
* %%
|
|
||||||
* Copyright (C) 2005 - 2019 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.client.registry;
|
|
||||||
|
|
||||||
import static java.util.Collections.emptyMap;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertFalse;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.alfresco.transform.client.model.config.TransformOption;
|
|
||||||
import org.alfresco.transform.client.model.config.TransformOptionGroup;
|
|
||||||
import org.alfresco.transform.client.model.config.TransformOptionValue;
|
|
||||||
import org.alfresco.transform.client.registry.SupportedTransform;
|
|
||||||
import org.alfresco.transform.client.registry.TransformRegistryTest;
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.apache.log4j.Level;
|
|
||||||
import org.apache.log4j.LogManager;
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test the config received from the Transform Service about what it supports.
|
|
||||||
*
|
|
||||||
* @author adavis
|
|
||||||
*/
|
|
||||||
public class TransformServiceRegistryConfigTest extends TransformRegistryTest
|
|
||||||
{
|
|
||||||
private static Log log = LogFactory.getLog(TransformServiceRegistryConfigTest.class);
|
|
||||||
|
|
||||||
public static final String PNG = "image/png";
|
|
||||||
public static final String TIFF = "image/tiff";
|
|
||||||
|
|
||||||
private static final String TRANSFORM_SERVICE_CONFIG = "alfresco/transform-service-config-test.json";
|
|
||||||
private static final String TRANSFORM_SERVICE_CONFIG_PIPELINE = "alfresco/transform-service-config-pipeline-test.json";
|
|
||||||
|
|
||||||
public static final ObjectMapper JSON_OBJECT_MAPPER = new ObjectMapper();
|
|
||||||
|
|
||||||
@Before
|
|
||||||
@Override
|
|
||||||
public void setUp() throws Exception
|
|
||||||
{
|
|
||||||
super.setUp();
|
|
||||||
LogManager.getLogger(TransformServiceRegistryConfigTest.class).setLevel(Level.DEBUG);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected TransformServiceRegistryImpl buildTransformServiceRegistryImpl() throws Exception
|
|
||||||
{
|
|
||||||
TransformServiceRegistryImpl registry = new TransformServiceRegistryImpl()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean readConfig() throws IOException
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Log getLog()
|
|
||||||
{
|
|
||||||
return log;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
registry.setJsonObjectMapper(JSON_OBJECT_MAPPER);
|
|
||||||
registry.setCronExpression(null); // just read once
|
|
||||||
registry.afterPropertiesSet();
|
|
||||||
return registry;
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void tearDown()
|
|
||||||
{
|
|
||||||
// shut down
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getTransformServiceConfig()
|
|
||||||
{
|
|
||||||
return TRANSFORM_SERVICE_CONFIG;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected String getTransformServiceConfigPipeline()
|
|
||||||
{
|
|
||||||
return TRANSFORM_SERVICE_CONFIG_PIPELINE;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void register(String path) throws IOException
|
|
||||||
{
|
|
||||||
CombinedConfig combinedConfig = new CombinedConfig(log);
|
|
||||||
combinedConfig.addLocalConfig(path);
|
|
||||||
combinedConfig.register((TransformServiceRegistryImpl)registry);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testJsonConfig() throws IOException
|
|
||||||
{
|
|
||||||
internalTestJsonConfig(60, 60);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void internalTestJsonConfig(int expectedSourceTargetUniqueCount, int expectedSourceTargetCount) throws IOException
|
|
||||||
{
|
|
||||||
register(getTransformServiceConfig());
|
|
||||||
|
|
||||||
// Check the count of transforms supported
|
|
||||||
assertEquals("The number of UNIQUE source to target mimetypes transforms has changed. Config change?",
|
|
||||||
expectedSourceTargetUniqueCount, countSupportedTransforms(true));
|
|
||||||
assertEquals("The number of source to target mimetypes transforms has changed. " +
|
|
||||||
"There may be multiple transformers for the same combination. Config change?",
|
|
||||||
expectedSourceTargetCount, countSupportedTransforms(false));
|
|
||||||
|
|
||||||
// Check a supported transform for each transformer.
|
|
||||||
assertSupported(DOC, 1234, PDF, emptyMap(), null, ""); // libreoffice
|
|
||||||
assertSupported(DOC, 1234, PDF, emptyMap(), null, ""); // libreoffice
|
|
||||||
assertSupported(PDF, 1234, PNG, emptyMap(), null, ""); // pdfrenderer
|
|
||||||
assertSupported(JPEG,1234, GIF, emptyMap(), null, ""); // imagemagick
|
|
||||||
assertSupported(MSG, 1234, TXT, emptyMap(), null, ""); // tika
|
|
||||||
assertSupported(MSG, 1234, GIF, emptyMap(), null, ""); // officeToImageViaPdf
|
|
||||||
|
|
||||||
Map<String, String> invalidPdfOptions = new HashMap<>();
|
|
||||||
invalidPdfOptions.put("allowEnlargement", "false");
|
|
||||||
assertSupported(DOC, 1234, PDF, invalidPdfOptions, null, "Invalid as there is a extra option");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testJsonPipeline() throws IOException
|
|
||||||
{
|
|
||||||
register(getTransformServiceConfigPipeline());
|
|
||||||
|
|
||||||
// Check the count of transforms supported
|
|
||||||
int expectedTransforms = getExpectedTransformsForTestJsonPipeline();
|
|
||||||
assertEquals("The number of UNIQUE source to target mimetypes transforms has changed. Config change?",
|
|
||||||
expectedTransforms, countSupportedTransforms(true));
|
|
||||||
assertEquals("The number of source to target mimetypes transforms has changed. " +
|
|
||||||
"There may be multiple transformers for the same combination. Config change?",
|
|
||||||
expectedTransforms, countSupportedTransforms(false));
|
|
||||||
|
|
||||||
// Check required and optional default correctly
|
|
||||||
Map<String, List<SupportedTransform>> transformsToWord =
|
|
||||||
registry.getData().getTransforms().get(DOC);
|
|
||||||
List<SupportedTransform> supportedTransforms = transformsToWord.get(GIF);
|
|
||||||
SupportedTransform supportedTransform = supportedTransforms.get(0);
|
|
||||||
|
|
||||||
Set<TransformOption> transformOptionsSet = supportedTransform.getTransformOptions().getTransformOptions();
|
|
||||||
|
|
||||||
Iterator<TransformOption> iterator = transformOptionsSet.iterator();
|
|
||||||
assertTrue("Expected transform values", iterator.hasNext());
|
|
||||||
// Because Set is unordered we don't know which TransformOptionGroup we retrieve
|
|
||||||
TransformOptionGroup transformOptions1 = (TransformOptionGroup)iterator.next();
|
|
||||||
|
|
||||||
assertTrue("Expected transform values", iterator.hasNext());
|
|
||||||
TransformOptionGroup transformOptions2 = (TransformOptionGroup)iterator.next();
|
|
||||||
|
|
||||||
TransformOptionGroup imagemagick;
|
|
||||||
TransformOptionGroup pdf;
|
|
||||||
|
|
||||||
if(containsTransformOptionValueName(transformOptions1, "alphaRemove"))
|
|
||||||
{
|
|
||||||
imagemagick = transformOptions1;
|
|
||||||
pdf = transformOptions2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
imagemagick = transformOptions2;
|
|
||||||
pdf = transformOptions1;
|
|
||||||
}
|
|
||||||
|
|
||||||
TransformOptionValue alphaRemove = (TransformOptionValue)retrieveTransformOptionByPropertyName(imagemagick, "alphaRemove", "TransformOptionValue");
|
|
||||||
TransformOptionGroup crop = (TransformOptionGroup)retrieveTransformOptionByPropertyName(imagemagick, "crop", "TransformOptionGroup");
|
|
||||||
TransformOptionValue cropGravity = (TransformOptionValue)retrieveTransformOptionByPropertyName(crop, "cropGravity", "TransformOptionValue");
|
|
||||||
TransformOptionValue cropWidth = (TransformOptionValue)retrieveTransformOptionByPropertyName(crop, "cropWidth", "TransformOptionValue");
|
|
||||||
|
|
||||||
assertTrue("The holding group should be required", supportedTransform.getTransformOptions().isRequired());
|
|
||||||
assertFalse("imagemagick should be optional as it is not set", imagemagick.isRequired());
|
|
||||||
assertFalse("pdf should be optional as required is not set", pdf.isRequired());
|
|
||||||
assertEquals("alphaRemove", alphaRemove.getName());
|
|
||||||
assertEquals("cropGravity", cropGravity.getName());
|
|
||||||
assertEquals("cropWidth", cropWidth.getName());
|
|
||||||
assertFalse("alphaRemove should be optional as required is not set", alphaRemove.isRequired());
|
|
||||||
assertFalse("crop should be optional as required is not set", crop.isRequired());
|
|
||||||
assertTrue("cropGravity should be required as it is set", cropGravity.isRequired());
|
|
||||||
assertFalse("cropWidth should be optional as required is not set", cropWidth.isRequired());
|
|
||||||
|
|
||||||
// Check a supported transform for each transformer.
|
|
||||||
assertSupported(DOC,1234, GIF, emptyMap(), null, "");
|
|
||||||
assertSupported(DOC,1234, PNG, emptyMap(), null, "");
|
|
||||||
assertSupported(DOC,1234, JPEG, emptyMap(), null, "");
|
|
||||||
assertSupported(DOC,1234, TIFF, emptyMap(), null, "");
|
|
||||||
|
|
||||||
Map<String, String> actualOptions = new HashMap<>();
|
|
||||||
actualOptions.put("thumbnail", "true");
|
|
||||||
actualOptions.put("resizeWidth", "100");
|
|
||||||
actualOptions.put("resizeHeight", "100");
|
|
||||||
actualOptions.put("allowEnlargement", "false");
|
|
||||||
actualOptions.put("maintainAspectRatio", "true");
|
|
||||||
assertSupported(DOC,1234, PNG, actualOptions, null, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
private TransformOption retrieveTransformOptionByPropertyName (TransformOptionGroup transformOptionGroup, String propertyName, String propertyType)
|
|
||||||
{
|
|
||||||
Iterator<TransformOption> iterator = transformOptionGroup.getTransformOptions().iterator();
|
|
||||||
|
|
||||||
List<TransformOption> transformOptionsList = new ArrayList<>();
|
|
||||||
while(iterator.hasNext())
|
|
||||||
{
|
|
||||||
transformOptionsList.add(iterator.next());
|
|
||||||
}
|
|
||||||
|
|
||||||
for (TransformOption t : transformOptionsList)
|
|
||||||
{
|
|
||||||
if (t instanceof TransformOptionValue)
|
|
||||||
{
|
|
||||||
TransformOptionValue value = (TransformOptionValue) t;
|
|
||||||
if (propertyType.equalsIgnoreCase("TransformOptionValue"))
|
|
||||||
{
|
|
||||||
if (value.getName().equalsIgnoreCase(propertyName))
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (value.getName().contains(propertyName))
|
|
||||||
return transformOptionGroup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TransformOption result = retrieveTransformOptionByPropertyName((TransformOptionGroup)t, propertyName, propertyType);
|
|
||||||
if (result != null)
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean containsTransformOptionValueName (TransformOptionGroup transformOptionGroup, String propertyName)
|
|
||||||
{
|
|
||||||
return retrieveTransformOptionByPropertyName(transformOptionGroup, propertyName, "TransformOptionValue") != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int getExpectedTransformsForTestJsonPipeline()
|
|
||||||
{
|
|
||||||
// {"sourceMediaType": "application/msword", "targetMediaType": "image/gif" },
|
|
||||||
// {"sourceMediaType": "application/msword", "targetMediaType": "image/jpeg"},
|
|
||||||
// {"sourceMediaType": "application/msword", "targetMediaType": "image/png" },
|
|
||||||
// {"sourceMediaType": "application/msword", "targetMediaType": "image/tiff"}
|
|
||||||
return 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int countSupportedTransforms(boolean unique)
|
|
||||||
{
|
|
||||||
int count = 0;
|
|
||||||
int uniqueCount = 0;
|
|
||||||
for (Map<String, List<SupportedTransform>> targetMap : registry.getData().getTransforms().values())
|
|
||||||
{
|
|
||||||
for (List<SupportedTransform> supportedTransforms : targetMap.values())
|
|
||||||
{
|
|
||||||
uniqueCount++;
|
|
||||||
count += supportedTransforms.size();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return unique ? uniqueCount : count;
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,47 +0,0 @@
|
|||||||
{
|
|
||||||
"transformOptions": {
|
|
||||||
"imageMagickOptions": [
|
|
||||||
{"value": {"name": "alphaRemove"}},
|
|
||||||
{"value": {"name": "autoOrient"}},
|
|
||||||
{"value": {"name": "startPage"}},
|
|
||||||
{"value": {"name": "endPage"}},
|
|
||||||
{"group": {"transformOptions": [
|
|
||||||
{"value": {"required": "true", "name": "cropGravity"}},
|
|
||||||
{"value": {"name": "cropWidth"}},
|
|
||||||
{"value": {"name": "cropHeight"}},
|
|
||||||
{"value": {"name": "cropPercentage"}},
|
|
||||||
{"value": {"name": "cropXOffset"}},
|
|
||||||
{"value": {"name": "cropYOffset"}}
|
|
||||||
]}},
|
|
||||||
{"group": {"transformOptions": [
|
|
||||||
{"value": {"name": "thumbnail"}},
|
|
||||||
{"value": {"name": "resizeHeight"}},
|
|
||||||
{"value": {"name": "resizeWidth"}},
|
|
||||||
{"value": {"name": "resizePercentage"}},
|
|
||||||
{"value": {"name": "allowEnlargement"}},
|
|
||||||
{"value": {"name": "maintainAspectRatio"}}
|
|
||||||
]}}
|
|
||||||
],
|
|
||||||
"pdfRendererOptions": [
|
|
||||||
{"value": {"name": "page"}},
|
|
||||||
{"value": {"name": "width"}},
|
|
||||||
{"value": {"name": "height"}},
|
|
||||||
{"value": {"name": "allowPdfEnlargement"}},
|
|
||||||
{"value": {"name": "maintainPdfAspectRatio"}}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"transformers": [
|
|
||||||
{
|
|
||||||
"supportedSourceAndTargetList": [
|
|
||||||
{"sourceMediaType": "application/msword", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "application/msword", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "application/msword", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "application/msword", "targetMediaType": "image/tiff"}
|
|
||||||
],
|
|
||||||
"transformOptions": [
|
|
||||||
"pdfRendererOptions",
|
|
||||||
"imageMagickOptions"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@@ -1,144 +0,0 @@
|
|||||||
{
|
|
||||||
"transformOptions": {
|
|
||||||
"imageMagickOptions": [
|
|
||||||
{"value": {"name": "alphaRemove"}},
|
|
||||||
{"value": {"name": "autoOrient"}},
|
|
||||||
{"value": {"name": "startPage"}},
|
|
||||||
{"value": {"name": "endPage"}},
|
|
||||||
{"group": {"transformOptions": [
|
|
||||||
{"value": {"name": "cropGravity"}},
|
|
||||||
{"value": {"name": "cropWidth"}},
|
|
||||||
{"value": {"name": "cropHeight"}},
|
|
||||||
{"value": {"name": "cropPercentage"}},
|
|
||||||
{"value": {"name": "cropXOffset"}},
|
|
||||||
{"value": {"name": "cropYOffset"}}
|
|
||||||
]}},
|
|
||||||
{"group": {"transformOptions": [
|
|
||||||
{"value": {"name": "thumbnail"}},
|
|
||||||
{"value": {"name": "resizeHeight"}},
|
|
||||||
{"value": {"name": "resizeWidth"}},
|
|
||||||
{"value": {"name": "resizePercentage"}},
|
|
||||||
{"value": {"name": "allowEnlargement"}},
|
|
||||||
{"value": {"name": "maintainAspectRatio"}}
|
|
||||||
]}}
|
|
||||||
],
|
|
||||||
"tikaOptions": [
|
|
||||||
{"value": {"name": "transform"}},
|
|
||||||
{"value": {"name": "includeContents"}},
|
|
||||||
{"value": {"name": "notExtractBookmarksText"}},
|
|
||||||
{"value": {"name": "targetMimetype"}},
|
|
||||||
{"value": {"name": "targetEncoding"}}
|
|
||||||
],
|
|
||||||
"pdfRendererOptions": [
|
|
||||||
{"value": {"name": "page"}},
|
|
||||||
{"value": {"name": "width"}},
|
|
||||||
{"value": {"name": "height"}},
|
|
||||||
{"value": {"name": "allowPdfEnlargement"}},
|
|
||||||
{"value": {"name": "maintainPdfAspectRatio"}}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"transformers": [
|
|
||||||
{
|
|
||||||
"supportedSourceAndTargetList": [
|
|
||||||
{"sourceMediaType": "image/gif", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "image/gif", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "image/gif", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "image/gif", "targetMediaType": "image/tiff"},
|
|
||||||
|
|
||||||
{"sourceMediaType": "image/jpeg", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "image/jpeg", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "image/jpeg", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "image/jpeg", "targetMediaType": "image/tiff"},
|
|
||||||
|
|
||||||
{"sourceMediaType": "image/png", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "image/png", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "image/png", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "image/png", "targetMediaType": "image/tiff"},
|
|
||||||
|
|
||||||
{"sourceMediaType": "image/tiff", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "image/tiff", "targetMediaType": "image/tiff"}
|
|
||||||
],
|
|
||||||
"transformOptions": [
|
|
||||||
"imageMagickOptions"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"supportedSourceAndTargetList": [
|
|
||||||
{"sourceMediaType": "application/pdf", "maxSourceSizeBytes": 26214400, "targetMediaType": "text/plain" },
|
|
||||||
{"sourceMediaType": "application/msword", "targetMediaType": "text/plain"},
|
|
||||||
{"sourceMediaType": "application/vnd.ms-excel", "targetMediaType": "text/plain" },
|
|
||||||
{"sourceMediaType": "application/vnd.ms-powerpoint", "targetMediaType": "text/plain" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "targetMediaType": "text/plain"},
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "targetMediaType": "text/plain" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "targetMediaType": "text/plain" },
|
|
||||||
{"sourceMediaType": "application/vnd.ms-outlook", "targetMediaType": "text/plain"}
|
|
||||||
],
|
|
||||||
"transformOptions": [
|
|
||||||
"tikaOptions"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"supportedSourceAndTargetList": [
|
|
||||||
{"sourceMediaType": "application/pdf", "targetMediaType": "image/png" }
|
|
||||||
],
|
|
||||||
"transformOptions": [
|
|
||||||
"pdfRendererOptions"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"supportedSourceAndTargetList": [
|
|
||||||
{"sourceMediaType": "application/msword", "targetMediaType": "application/msword" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "targetMediaType": "application/msword" },
|
|
||||||
{"sourceMediaType": "application/msword", "maxSourceSizeBytes": 10485760, "targetMediaType": "application/pdf" },
|
|
||||||
{"sourceMediaType": "application/vnd.ms-excel", "maxSourceSizeBytes": 10485760, "targetMediaType": "application/pdf"},
|
|
||||||
{"sourceMediaType": "application/vnd.ms-powerpoint", "maxSourceSizeBytes": 6291456, "targetMediaType": "application/pdf" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "maxSourceSizeBytes": 786432, "targetMediaType": "application/pdf" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "maxSourceSizeBytes": 1572864, "targetMediaType": "application/pdf"},
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "maxSourceSizeBytes": 4194304, "targetMediaType": "application/pdf" },
|
|
||||||
{"sourceMediaType": "application/vnd.ms-outlook", "targetMediaType": "application/pdf"}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"supportedSourceAndTargetList": [
|
|
||||||
{"sourceMediaType": "application/msword", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "application/msword", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "application/msword", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "application/msword", "targetMediaType": "image/tiff"},
|
|
||||||
|
|
||||||
{"sourceMediaType": "application/vnd.ms-excel", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "application/vnd.ms-excel", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "application/vnd.ms-excel", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "application/vnd.ms-excel", "targetMediaType": "image/tiff"},
|
|
||||||
|
|
||||||
{"sourceMediaType": "application/vnd.ms-powerpoint", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "application/vnd.ms-powerpoint", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "application/vnd.ms-powerpoint", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "application/vnd.ms-powerpoint", "targetMediaType": "image/tiff"},
|
|
||||||
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "targetMediaType": "image/tiff"},
|
|
||||||
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "targetMediaType": "image/tiff"},
|
|
||||||
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "application/vnd.openxmlformats-officedocument.presentationml.presentation", "targetMediaType": "image/tiff"},
|
|
||||||
|
|
||||||
{"sourceMediaType": "application/vnd.ms-outlook", "targetMediaType": "image/gif" },
|
|
||||||
{"sourceMediaType": "application/vnd.ms-outlook", "targetMediaType": "image/jpeg"},
|
|
||||||
{"sourceMediaType": "application/vnd.ms-outlook", "targetMediaType": "image/png" },
|
|
||||||
{"sourceMediaType": "application/vnd.ms-outlook", "targetMediaType": "image/tiff"}
|
|
||||||
],
|
|
||||||
"transformOptions": [
|
|
||||||
"pdfRendererOptions",
|
|
||||||
"imageMagickOptions"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
Reference in New Issue
Block a user