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:
Alan Davis
2021-08-20 15:49:10 +01:00
committed by GitHub
parent 42d1176ccf
commit b84e1f8100
11 changed files with 210 additions and 986 deletions

View File

@@ -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>

View File

@@ -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>

View File

@@ -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;
}
}

View File

@@ -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()
{ {

View File

@@ -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;
} }
} }

View File

@@ -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,

View File

@@ -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,

View File

@@ -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

View File

@@ -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;
}
}

View File

@@ -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"
]
}
]
}

View File

@@ -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"
]
}
]
}