Repo-4453 : Refactor transform code to use alfresco-transform-model (#541)

Add alfresco-transform-model as depenendy
   Remove TransformOption TransformOptionGroup TransformOptionValue and AbstractTransformOption
   Remove Transformer TransformStep and SupportedSourceAndTarget
   Refactor to use TransformOption* from alfresco-transform-model
   Refactor code to use InlineTransformer instead of Transformer
   Refactor failing test to use new TransformerInline default constructor
This commit is contained in:
Alexandru-Eusebiu Epure
2019-08-05 15:24:57 +03:00
committed by GitHub
parent ad806e2ebc
commit 1c52eec8c5
15 changed files with 214 additions and 606 deletions

View File

@@ -65,6 +65,7 @@
<dependency.pdfbox.version>2.0.16</dependency.pdfbox.version>
<dependency.cxf.version>3.3.2</dependency.cxf.version>
<dependency.jackson.version>2.9.9</dependency.jackson.version>
<dependency.transform.model.version>1.0.2.5</dependency.transform.model.version>
</properties>
<dependencyManagement>
@@ -987,6 +988,13 @@
</exclusions>
</dependency>
<!-- Transform dependencies -->
<dependency>
<groupId>org.alfresco</groupId>
<artifactId>alfresco-transform-model</artifactId>
<version>${dependency.transform.model.version}</version>
</dependency>
<!-- Test dependencies -->
<dependency>
<groupId>org.mockito</groupId>

View File

@@ -30,10 +30,10 @@ import org.alfresco.service.cmr.repository.ContentWriter;
import org.alfresco.service.cmr.repository.MimetypeService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.transform.client.model.config.CombinedConfig;
import org.alfresco.transform.client.model.config.InlineTransformer;
import org.alfresco.transform.client.model.config.TransformServiceRegistry;
import org.alfresco.transform.client.model.config.TransformServiceRegistryImpl;
import org.alfresco.transform.client.model.config.TransformStep;
import org.alfresco.transform.client.model.config.Transformer;
import org.alfresco.util.PropertyCheck;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -157,7 +157,7 @@ public class LocalTransformServiceRegistry extends TransformServiceRegistryImpl
}
@Override
protected void register(Transformer transformer, String baseUrl, String readFrom)
protected void register(InlineTransformer transformer, String baseUrl, String readFrom)
{
try
{

View File

@@ -1,46 +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.model.config;
/**
* Abstract implementation of TransformOption.
*/
public abstract class AbstractTransformOption implements TransformOption
{
private boolean required;
@Override
public boolean isRequired()
{
return required;
}
@Override
public void setRequired(boolean required)
{
this.required = required;
}
}

View File

@@ -32,13 +32,13 @@ package org.alfresco.transform.client.model.config;
public class ChildTransformer
{
private boolean required;
private Transformer transformer;
private InlineTransformer transformer;
public ChildTransformer()
{
}
public ChildTransformer(boolean required, Transformer transformer)
public ChildTransformer(boolean required, InlineTransformer transformer)
{
this.required = required;
this.transformer = transformer;
@@ -54,12 +54,12 @@ public class ChildTransformer
this.required = required;
}
public Transformer getTransformer()
public InlineTransformer getTransformer()
{
return transformer;
}
public void setTransformer(Transformer transformer)
public void setTransformer(InlineTransformer transformer)
{
this.transformer = transformer;
}

View File

@@ -91,11 +91,11 @@ public class CombinedConfig
static class TransformAndItsOrigin
{
final Transformer transform;
final InlineTransformer transform;
final String baseUrl;
final String readFrom;
TransformAndItsOrigin(Transformer transform, String baseUrl, String readFrom)
TransformAndItsOrigin(InlineTransformer transform, String baseUrl, String readFrom)
{
this.transform = transform;
this.baseUrl = baseUrl;
@@ -327,7 +327,7 @@ public class CombinedConfig
try
{
Transformer transform = jsonObjectMapper.convertValue(entity.node, Transformer.class);
InlineTransformer transform = jsonObjectMapper.convertValue(entity.node, InlineTransformer.class);
transforms.add(new TransformAndItsOrigin(transform, entity.baseUrl, entity.readFrom));
}
catch (IllegalArgumentException e)

View File

@@ -1,95 +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.model.config;
/**
* Represents a single source and target combination supported by a transformer. File extensions are used to keep the
* json human readable. Each par also has an optional maximum size for the source content.
*/
public class SupportedSourceAndTarget
{
private String sourceMediaType;
private long maxSourceSizeBytes = -1;
private String targetMediaType;
private int priority = 50;
public SupportedSourceAndTarget()
{
}
public SupportedSourceAndTarget(String sourceMediaType, String targetMediaType, long maxSourceSizeBytes)
{
this(sourceMediaType, targetMediaType, maxSourceSizeBytes, 50);
}
public SupportedSourceAndTarget(String sourceMediaType, String targetMediaType, long maxSourceSizeBytes, int priority)
{
setSourceMediaType(sourceMediaType);
setMaxSourceSizeBytes(maxSourceSizeBytes);
setTargetMediaType(targetMediaType);
setPriority(priority);
}
public String getSourceMediaType()
{
return sourceMediaType;
}
public void setSourceMediaType(String sourceMediaType)
{
this.sourceMediaType = sourceMediaType;
}
public long getMaxSourceSizeBytes()
{
return maxSourceSizeBytes;
}
public void setMaxSourceSizeBytes(long maxSourceSizeBytes)
{
this.maxSourceSizeBytes = maxSourceSizeBytes;
}
public String getTargetMediaType()
{
return targetMediaType;
}
public void setTargetMediaType(String targetMediaType)
{
this.targetMediaType = targetMediaType;
}
public int getPriority()
{
return priority;
}
public void setPriority(int priority)
{
this.priority = priority;
}
}

View File

@@ -1,45 +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.model.config;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
/**
* Represents an individual transformer option or group of options that are required or optional (default).
*/
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
@JsonSubTypes.Type(value = TransformOptionValue.class, name = "value"),
@JsonSubTypes.Type(value = TransformOptionGroup.class, name = "group")
})
public interface TransformOption
{
boolean isRequired();
void setRequired(boolean required);
}

View File

@@ -1,60 +0,0 @@
/*
* #%L
* Alfresco Repository
* %%
* Copyright (C) 2005 - 2018 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.model.config;
import java.util.List;
/**
* Represents a group of one or more options. If the group is optional, child options that are marked as required are
* only required if any child in the group is supplied by the client. If the group is required, child options are
* optional or required based on their own setting alone.
*
* In a pipeline transformation, a group of options
*/
public class TransformOptionGroup extends AbstractTransformOption
{
List<TransformOption> transformOptions;
public TransformOptionGroup()
{
}
public TransformOptionGroup(boolean required, List<TransformOption> transformOptions)
{
setRequired(required);
setTransformOptions(transformOptions);
}
public List<TransformOption> getTransformOptions()
{
return transformOptions;
}
public void setTransformOptions(List<TransformOption> transformOptions)
{
this.transformOptions = transformOptions;
}
}

View File

@@ -1,54 +0,0 @@
/*
* #%L
* Alfresco Repository
* %%
* Copyright (C) 2005 - 2018 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.model.config;
/**
* Represents a single transformation option.
*/
public class TransformOptionValue extends AbstractTransformOption
{
private String name;
public TransformOptionValue()
{
}
public TransformOptionValue(boolean required, String name)
{
setRequired(required);
setName(name);
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}

View File

@@ -39,10 +39,14 @@ import java.io.Reader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean;
import static org.alfresco.repo.rendition2.RenditionDefinition2.TIMEOUT;
@@ -73,7 +77,7 @@ public abstract class TransformServiceRegistryImpl implements TransformServiceRe
private String name;
private int priority;
public SupportedTransform(Data data, String name, List<TransformOption> transformOptions, long maxSourceSizeBytes, int priority)
public SupportedTransform(Data data, String name, Set<TransformOption> transformOptions, long maxSourceSizeBytes, int priority)
{
// Logically the top level TransformOptionGroup is required, so that child options are optional or required
// based on their own setting.
@@ -180,11 +184,11 @@ public abstract class TransformServiceRegistryImpl implements TransformServiceRe
public void register(Reader reader, String readFrom) throws IOException
{
List<Transformer> transformers = jsonObjectMapper.readValue(reader, new TypeReference<List<Transformer>>(){});
List<InlineTransformer> transformers = jsonObjectMapper.readValue(reader, new TypeReference<List<InlineTransformer>>(){});
transformers.forEach(t -> register(t, null, readFrom));
}
protected void register(Transformer transformer, String baseUrl, String readFrom)
protected void register(InlineTransformer transformer, String baseUrl, String readFrom)
{
Data data = getData();
data.transformerCount++;
@@ -364,7 +368,7 @@ public abstract class TransformServiceRegistryImpl implements TransformServiceRe
boolean added = false;
boolean required = false;
List<TransformOption> optionList = transformOptionGroup.getTransformOptions();
Set<TransformOption> optionList = transformOptionGroup.getTransformOptions();
if (optionList != null && !optionList.isEmpty())
{
// We need to avoid adding options from a group that is required but its parents are not.

View File

@@ -1,66 +0,0 @@
/*
* #%L
* Alfresco Repository
* %%
* Copyright (C) 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.model.config;
/**
* Represents a single transform step in a transform pipeline. The last step in the pipeline does not specify the
* target type as that is based on the supported types and what has been requested.
*/
public class TransformStep
{
private String transformerName;
private String targetMediaType;
public TransformStep()
{
}
public TransformStep(String transformerName, String targetMediaType)
{
setTransformerName(transformerName);
setTargetMediaType(targetMediaType);
}
public String getTransformerName()
{
return transformerName;
}
public void setTransformerName(String transformerName)
{
this.transformerName = transformerName;
}
public String getTargetMediaType()
{
return targetMediaType;
}
public void setTargetMediaType(String targetMediaType)
{
this.targetMediaType = targetMediaType;
}
}

View File

@@ -1,116 +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.model.config;
import java.util.List;
import org.alfresco.transform.client.model.config.TransformServiceRegistry;
/**
* Represents a set of transformations supported by the Transform Service or Local Transform Service Registry that
* share the same transform options. Each may be an actual transformer or a pipeline of multiple transformers. It is
* possible that more than one transformer may able to perform a transformation from one mimetype to another. The actual
* selection of transformer is up to the Transform Service or Local Transform Service Registry to decide. Clients may
* use {@link TransformServiceRegistry#isSupported(String, long, String, java.util.Map, String)} to decide
* if they should send a request to the Transform Service. As a result clients have a simple generic view of
* transformations which allows new transformations to be added without the need to change client data structures other
* than to define new name value pairs. For this to work the Transform Service defines unique names for each option.
* <ul>
* <li>transformerName - is optional but if supplied should be unique. The client should infer nothing from the name
* as it is simply a label, but the Local Transform Service Registry will use the name in pipelines.</lI>
* <li>transformOptions - a grouping of individual transformer transformOptions. The group may be optional and may
* contain nested transformOptions.</li>
* </ul>
* For local transforms, this structure is extended when defining a pipeline transform.
* <ul>
* <li>transformerPipeline - an array of pairs of transformer name and target extension for each transformer in the
* pipeline. The last one should not have an extension as that is defined by the request and should be in the
* supported list.</li>
* </ul>
*/
public class Transformer
{
private String transformerName;
private List<TransformStep> transformerPipeline;
private List<TransformOption> transformOptions;
private List<SupportedSourceAndTarget> supportedSourceAndTargetList;
public Transformer()
{
}
public Transformer(String transformerName, List<TransformOption> transformOptions, List<SupportedSourceAndTarget> supportedSourceAndTargetList)
{
setTransformerName(transformerName);
setTransformOptions(transformOptions);
setSupportedSourceAndTargetList(supportedSourceAndTargetList);
}
public Transformer(String transformerName, List<TransformStep> transformerPipeline, List<TransformOption> transformOptions, List<SupportedSourceAndTarget> supportedSourceAndTargetList)
{
this(transformerName, transformOptions, supportedSourceAndTargetList);
setTransformerPipeline(transformerPipeline);
}
public String getTransformerName()
{
return transformerName;
}
public void setTransformerName(String transformerName)
{
this.transformerName = transformerName;
}
public List<TransformStep> getTransformerPipeline()
{
return transformerPipeline;
}
public void setTransformerPipeline(List<TransformStep> transformerPipeline)
{
this.transformerPipeline = transformerPipeline;
}
public List<TransformOption> getTransformOptions()
{
return transformOptions;
}
public void setTransformOptions(List<TransformOption> transformOptions)
{
this.transformOptions = transformOptions;
}
public List<SupportedSourceAndTarget> getSupportedSourceAndTargetList()
{
return supportedSourceAndTargetList;
}
public void setSupportedSourceAndTargetList(List<SupportedSourceAndTarget> supportedSourceAndTargetList)
{
this.supportedSourceAndTargetList = supportedSourceAndTargetList;
}
}

View File

@@ -282,7 +282,7 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
officeToImageViaPdfSupportedTransformation.put("application/vnd.ms-outlook", targetMimetype);
}
protected String getBaseUrl(Transformer transformer)
protected String getBaseUrl(InlineTransformer transformer)
{
return LOCAL_TRANSFORM+transformer.getTransformerName()+".url";
}
@@ -319,7 +319,7 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
case "imagemagick":
assertEquals(t.transform.getTransformerName() + " incorrect number of supported transform", 14, t.transform.getSupportedSourceAndTargetList().size());
assertEquals( t.transform.getTransformerName() + "incorrect number of transform options", 6, t.transform.getTransformOptions().size());
assertNull(t.transform.getTransformerName() + " expected to not be a transformer pipeline", t.transform.getTransformerPipeline());
assertEquals(t.transform.getTransformerName() + " expected to not be a transformer pipeline", t.transform.getTransformerPipeline().size(), 0);
//Test supportedSourceAndTargetList
for ( SupportedSourceAndTarget ssat: t.transform.getSupportedSourceAndTargetList())
@@ -332,7 +332,7 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
case "tika":
assertEquals(t.transform.getTransformerName() + " incorrect number of supported transform", 8, t.transform.getSupportedSourceAndTargetList().size());
assertEquals( t.transform.getTransformerName() + "incorrect number of transform options", 5, t.transform.getTransformOptions().size());
assertNull(t.transform.getTransformerName() + " expected to not be a transformer pipeline", t.transform.getTransformerPipeline());
assertEquals(t.transform.getTransformerName() + " expected to not be a transformer pipeline", t.transform.getTransformerPipeline().size(), 0);
//Test supportedSourceAndTargetList
for ( SupportedSourceAndTarget ssat: t.transform.getSupportedSourceAndTargetList())
@@ -345,7 +345,7 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
case "pdfrenderer":
assertEquals(t.transform.getTransformerName() + " incorrect number of supported transform", 1, t.transform.getSupportedSourceAndTargetList().size());
assertEquals( t.transform.getTransformerName() + "incorrect number of transform options", 5, t.transform.getTransformOptions().size());
assertNull(t.transform.getTransformerName() + " expected to not be a transformer pipeline", t.transform.getTransformerPipeline());
assertEquals(t.transform.getTransformerName() + " expected to not be a transformer pipeline", t.transform.getTransformerPipeline().size(), 0);
//Test supportedSourceAndTargetList
for ( SupportedSourceAndTarget ssat: t.transform.getSupportedSourceAndTargetList())
@@ -357,8 +357,8 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
case "libreoffice":
assertEquals(t.transform.getTransformerName() + " incorrect number of supported transform", 9, t.transform.getSupportedSourceAndTargetList().size());
assertNull( t.transform.getTransformerName() + "incorrect number of transform options", t.transform.getTransformOptions());
assertNull(t.transform.getTransformerName() + " expected to not be a transformer pipeline", t.transform.getTransformerPipeline());
assertEquals( t.transform.getTransformerName() + "incorrect number of transform options", t.transform.getTransformOptions().size(), 0);
assertEquals(t.transform.getTransformerName() + " expected to not be a transformer pipeline", t.transform.getTransformerPipeline().size(), 0);
//Test supportedSourceAndTargetList
for ( SupportedSourceAndTarget ssat: t.transform.getSupportedSourceAndTargetList())
@@ -371,7 +371,7 @@ public class LocalTransformServiceRegistryConfigTest extends TransformServiceReg
case "officeToImageViaPdf":
assertEquals(t.transform.getTransformerName() + " incorrect number of supported transform", 28, t.transform.getSupportedSourceAndTargetList().size());
assertEquals( t.transform.getTransformerName() + "incorrect number of transform options", 2, t.transform.getTransformOptions().size());
assertNotNull(t.transform.getTransformerName() + " expected to be a transformer pipeline", t.transform.getTransformerPipeline());
assertEquals(t.transform.getTransformerName() + " expected to be a transformer pipeline", t.transform.getTransformerPipeline().size(), 3);
//Test supportedSourceAndTargetList
for ( SupportedSourceAndTarget ssat: t.transform.getSupportedSourceAndTargetList())

View File

@@ -26,18 +26,20 @@
package org.alfresco.transform.client.model.config;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Helper class that builds a {@link Transformer} given the source and target types and a pipeline of Transformers
* Helper class that builds a {@link InlineTransformer} given the source and target types and a pipeline of Transformers
* for creating intermediary content.
*/
public class TransformBuilder
{
public Transformer buildPipeLine(String name, List<SupportedSourceAndTarget> sourceAndTargetList,
public InlineTransformer buildPipeLine(String name, Set<SupportedSourceAndTarget> sourceAndTargetList,
List<ChildTransformer> transformerList)
{
List<TransformOption> options = new ArrayList<>(transformerList.size());
Set<TransformOption> options = new HashSet<>(transformerList.size());
transformerList.forEach(t ->
{
// Avoid creating an enpty TransformOptionGroup if the transformer has no options.
@@ -47,6 +49,6 @@ public class TransformBuilder
options.add(new TransformOptionGroup(t.isRequired(), t.getTransformer().getTransformOptions()));
}
});
return new Transformer(name, options, sourceAndTargetList);
return new InlineTransformer(name, options, sourceAndTargetList);
}
}

View File

@@ -41,14 +41,18 @@ import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -79,7 +83,7 @@ public class TransformServiceRegistryConfigTest
private TransformServiceRegistryImpl registry;
protected TransformBuilder builder;
protected Transformer transformer;
protected InlineTransformer transformer;
@Before
public void setUp() throws Exception
@@ -176,11 +180,11 @@ public class TransformServiceRegistryConfigTest
}
}
private void assertTransformOptions(List<TransformOption> transformOptions) throws Exception
private void assertTransformOptions(Set<TransformOption> transformOptions) throws Exception
{
transformer = new Transformer("name",
transformer = new InlineTransformer("name",
transformOptions,
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(DOC, TXT, -1),
new SupportedSourceAndTarget(XLS, TXT, 1024000)));
@@ -193,14 +197,14 @@ public class TransformServiceRegistryConfigTest
assertTrue(registry.isSupported(DOC, 1024001, TXT, null, null));
}
protected String getBaseUrl(Transformer transformer)
protected String getBaseUrl(InlineTransformer transformer)
{
return null;
}
private void assertTransformerName(String sourceMimetype, long sourceSizeInBytes, String targetMimetype,
Map<String, String> actualOptions, String expectedTransformerName,
Transformer... transformers) throws Exception
InlineTransformer... transformers) throws Exception
{
buildAndPopulateRegistry(transformers);
String transformerName = registry.getTransformerName(sourceMimetype, sourceSizeInBytes, targetMimetype, actualOptions, null);
@@ -215,16 +219,16 @@ public class TransformServiceRegistryConfigTest
private void assertSupported(String sourceMimetype, long sourceSizeInBytes, String targetMimetype,
Map<String, String> actualOptions, String unsupportedMsg,
Transformer... transformers) throws Exception
InlineTransformer... transformers) throws Exception
{
buildAndPopulateRegistry(transformers);
assertSupported(sourceMimetype, sourceSizeInBytes, targetMimetype, actualOptions, null, unsupportedMsg);
}
private void buildAndPopulateRegistry(Transformer[] transformers) throws Exception
private void buildAndPopulateRegistry(InlineTransformer[] transformers) throws Exception
{
registry = buildTransformServiceRegistryImpl();
for (Transformer transformer : transformers)
for (InlineTransformer transformer : transformers)
{
registry.register(transformer, getBaseUrl(transformer), getClass().getName());
}
@@ -266,56 +270,56 @@ public class TransformServiceRegistryConfigTest
@Test
public void testReadWriteJson() throws IOException
{
Transformer libreoffice = new Transformer("libreoffice",
InlineTransformer libreoffice = new InlineTransformer("libreoffice",
null, // there are no options
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(DOC, PDF, -1),
new SupportedSourceAndTarget(XLS, PDF, 1024000),
new SupportedSourceAndTarget(PPT, PDF, -1),
new SupportedSourceAndTarget(MSG, PDF, -1)));
Transformer pdfrenderer = new Transformer("pdfrenderer",
Arrays.asList(
InlineTransformer pdfrenderer = new InlineTransformer("pdfrenderer",
Set.of(
new TransformOptionValue(false, "page"),
new TransformOptionValue(false, "width"),
new TransformOptionValue(false, "height"),
new TransformOptionValue(false, "allowPdfEnlargement"),
new TransformOptionValue(false, "maintainPdfAspectRatio")),
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(PDF, PNG, -1)));
Transformer tika = new Transformer("tika",
Arrays.asList(
InlineTransformer tika = new InlineTransformer("tika",
Set.of(
new TransformOptionValue(false, "transform"),
new TransformOptionValue(false, "includeContents"),
new TransformOptionValue(false, "notExtractBookmarksText"),
new TransformOptionValue(false, "targetMimetype"),
new TransformOptionValue(false, "targetEncoding")),
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(PDF, TXT, -1),
new SupportedSourceAndTarget(DOC, TXT, -1),
new SupportedSourceAndTarget(XLS, TXT, 1024000),
new SupportedSourceAndTarget(PPT, TXT, -1),
new SupportedSourceAndTarget(MSG, TXT, -1)));
Transformer imagemagick = new Transformer("imagemagick",
Arrays.asList(
InlineTransformer imagemagick = new InlineTransformer("imagemagick",
Set.of(
new TransformOptionValue(false, "alphaRemove"),
new TransformOptionValue(false, "autoOrient"),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "cropGravity"),
new TransformOptionValue(false, "cropWidth"),
new TransformOptionValue(false, "cropHeight"),
new TransformOptionValue(false, "cropPercentage"),
new TransformOptionValue(false, "cropXOffset"),
new TransformOptionValue(false, "cropYOffset"))),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "thumbnail"),
new TransformOptionValue(false, "resizeHeight"),
new TransformOptionValue(false, "resizeWidth"),
new TransformOptionValue(false, "resizePercentage"),
new TransformOptionValue(false, "maintainAspectRatio")))),
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(GIF, GIF, -1),
new SupportedSourceAndTarget(GIF, JPEG, -1),
new SupportedSourceAndTarget(GIF, PNG, -1),
@@ -336,8 +340,8 @@ public class TransformServiceRegistryConfigTest
new SupportedSourceAndTarget(TIFF, PNG, -1),
new SupportedSourceAndTarget(TIFF, TIFF, -1)));
Transformer officeToImage = builder.buildPipeLine("transformer1",
Arrays.asList(
InlineTransformer officeToImage = builder.buildPipeLine("transformer1",
Set.of(
new SupportedSourceAndTarget(DOC, GIF, -1),
new SupportedSourceAndTarget(DOC, JPEG, -1),
new SupportedSourceAndTarget(DOC, PNG, -1),
@@ -359,7 +363,7 @@ public class TransformServiceRegistryConfigTest
new ChildTransformer(false, pdfrenderer), // to png
new ChildTransformer(true, imagemagick))); // to other image formats
List<Transformer> transformers1 = Arrays.asList(libreoffice, tika, pdfrenderer, imagemagick, officeToImage);
List<InlineTransformer> transformers1 = Arrays.asList(libreoffice, tika, pdfrenderer, imagemagick, officeToImage);
File tempFile = File.createTempFile("test", ".json");
ObjectMapper objectMapper = new ObjectMapper();
@@ -433,13 +437,35 @@ public class TransformServiceRegistryConfigTest
List<TransformServiceRegistryImpl.SupportedTransform> supportedTransforms = transformsToWord.get(GIF);
TransformServiceRegistryImpl.SupportedTransform supportedTransform = supportedTransforms.get(0);
TransformOptionGroup imagemagick = (TransformOptionGroup)supportedTransform.transformOptions.transformOptions.get(0);
TransformOptionGroup pdf = (TransformOptionGroup)supportedTransform.transformOptions.transformOptions.get(1);
Set<TransformOption> transformOptionsSet = supportedTransform.transformOptions.getTransformOptions();
System.out.println("Nothing");
TransformOptionValue alphaRemove = (TransformOptionValue)imagemagick.transformOptions.get(0);
TransformOptionGroup crop = (TransformOptionGroup)imagemagick.transformOptions.get(4);
TransformOptionValue cropGravity = (TransformOptionValue)crop.transformOptions.get(0);
TransformOptionValue cropWidth = (TransformOptionValue)crop.transformOptions.get(1);
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.transformOptions.isRequired());
assertFalse("imagemagick should be optional as it is not set", imagemagick.isRequired());
@@ -467,6 +493,56 @@ public class TransformServiceRegistryConfigTest
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)
{
if (retrieveTransformOptionByPropertyName(transformOptionGroup, propertyName, "TransformOptionValue") != null)
return true;
return false;
}
private boolean containsTransformOptionGroupeName (TransformOptionGroup transformOptionGroup, String propertyName)
{
if (retrieveTransformOptionByPropertyName(transformOptionGroup, propertyName, "TransformOptionGroup") != null)
return true;
return false;
}
protected int getExpectedTransformsForTestJsonPipeline()
{
return 4;
@@ -491,14 +567,14 @@ public class TransformServiceRegistryConfigTest
public void testOptionalGroups()
{
TransformOptionGroup transformOptionGroup =
new TransformOptionGroup(true, Arrays.asList(
new TransformOptionGroup(true, Set.of(
new TransformOptionValue(false, "1"),
new TransformOptionValue(true, "2"),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "3.1"),
new TransformOptionValue(false, "3.2"),
new TransformOptionValue(false, "3.3"))),
new TransformOptionGroup(false, Arrays.asList( // OPTIONAL
new TransformOptionGroup(false, Set.of( // OPTIONAL
new TransformOptionValue(false, "4.1"),
new TransformOptionValue(true, "4.2"),
new TransformOptionValue(false, "4.3")))));
@@ -515,14 +591,14 @@ public class TransformServiceRegistryConfigTest
public void testRequiredGroup()
{
TransformOptionGroup transformOptionGroup =
new TransformOptionGroup(true, Arrays.asList(
new TransformOptionGroup(true, Set.of(
new TransformOptionValue(false, "1"),
new TransformOptionValue(true, "2"),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "3.1"),
new TransformOptionValue(false, "3.2"),
new TransformOptionValue(false, "3.3"))),
new TransformOptionGroup(true, Arrays.asList( // REQUIRED
new TransformOptionGroup(true, Set.of( // REQUIRED
new TransformOptionValue(false, "4.1"),
new TransformOptionValue(true, "4.2"),
new TransformOptionValue(false, "4.3")))));
@@ -538,49 +614,49 @@ public class TransformServiceRegistryConfigTest
public void testNesstedGrpups()
{
TransformOptionGroup transformOptionGroup =
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "1"),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "1.2"),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "1.2.3"))))))),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "2"),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "2.2"),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "2.2.1.2"))))))))),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(true, "3"), // REQUIRED
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionGroup(false, Set.of(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "3.1.1.2"))))))))),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "4"),
new TransformOptionGroup(true, Arrays.asList( // REQUIRED
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(true, Set.of( // REQUIRED
new TransformOptionGroup(false, Set.of(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "4.1.1.2"))))))))),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "5"),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(true, Arrays.asList( // REQUIRED
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionGroup(true, Set.of( // REQUIRED
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "5.1.1.2"))))))))),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "6"),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(true, Arrays.asList( // REQUIRED
new TransformOptionGroup(false, Set.of(
new TransformOptionGroup(false, Set.of(
new TransformOptionGroup(true, Set.of( // REQUIRED
new TransformOptionValue(false, "6.1.1.2"))))))))),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(false, "7"),
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Arrays.asList(
new TransformOptionGroup(false, Set.of(
new TransformOptionGroup(false, Set.of(
new TransformOptionGroup(false, Set.of(
new TransformOptionValue(true, "7.1.1.2"))))))))) // REQUIRED
));
@@ -624,7 +700,7 @@ public class TransformServiceRegistryConfigTest
@Test
public void testNoActualOptions() throws Exception
{
assertTransformOptions(Arrays.asList(
assertTransformOptions(Set.of(
new TransformOptionValue(false, "option1"),
new TransformOptionValue(false, "option2")));
}
@@ -632,19 +708,19 @@ public class TransformServiceRegistryConfigTest
@Test
public void testNoTrasformOptions() throws Exception
{
assertTransformOptions(Collections.emptyList());
assertTransformOptions(Collections.emptySet());
assertTransformOptions(null);
}
@Test
public void testSupported() throws Exception
{
transformer = new Transformer("name",
Arrays.asList(
transformer = new InlineTransformer("name",
Set.of(
new TransformOptionValue(false, "page"),
new TransformOptionValue(false, "width"),
new TransformOptionValue(false, "height")),
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(DOC, GIF, 102400),
new SupportedSourceAndTarget(DOC, JPEG, -1),
new SupportedSourceAndTarget(MSG, GIF, -1)));
@@ -665,12 +741,12 @@ public class TransformServiceRegistryConfigTest
public void testCache()
{
// Note: transformNames are an alias for a set of actualOptions and the target mimetpe. The source mimetype may change.
transformer = new Transformer("name",
Arrays.asList(
transformer = new InlineTransformer("name",
Set.of(
new TransformOptionValue(false, "page"),
new TransformOptionValue(false, "width"),
new TransformOptionValue(false, "height")),
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(DOC, GIF, 102400),
new SupportedSourceAndTarget(MSG, GIF, -1)));
@@ -691,16 +767,16 @@ public class TransformServiceRegistryConfigTest
@Test
public void testGetTransformerName() throws Exception
{
Transformer t1 = new Transformer("transformer1", null,
Arrays.asList(new SupportedSourceAndTarget(MSG, GIF, 100, 50)));
Transformer t2 = new Transformer("transformer2", null,
Arrays.asList(new SupportedSourceAndTarget(MSG, GIF, 200, 60)));
Transformer t3 = new Transformer("transformer3", null,
Arrays.asList(new SupportedSourceAndTarget(MSG, GIF, 200, 40)));
Transformer t4 = new Transformer("transformer4", null,
Arrays.asList(new SupportedSourceAndTarget(MSG, GIF, -1, 100)));
Transformer t5 = new Transformer("transformer5", null,
Arrays.asList(new SupportedSourceAndTarget(MSG, GIF, -1, 80)));
InlineTransformer t1 = new InlineTransformer("transformer1", null,
Set.of(new SupportedSourceAndTarget(MSG, GIF, 100, 50)));
InlineTransformer t2 = new InlineTransformer("transformer2", null,
Set.of(new SupportedSourceAndTarget(MSG, GIF, 200, 60)));
InlineTransformer t3 = new InlineTransformer("transformer3", null,
Set.of(new SupportedSourceAndTarget(MSG, GIF, 200, 40)));
InlineTransformer t4 = new InlineTransformer("transformer4", null,
Set.of(new SupportedSourceAndTarget(MSG, GIF, -1, 100)));
InlineTransformer t5 = new InlineTransformer("transformer5", null,
Set.of(new SupportedSourceAndTarget(MSG, GIF, -1, 80)));
Map<String, String> actualOptions = null;
@@ -722,28 +798,28 @@ public class TransformServiceRegistryConfigTest
@Test
public void testMultipleTransformers() throws Exception
{
Transformer transformer1 = new Transformer("transformer1",
Arrays.asList(
InlineTransformer transformer1 = new InlineTransformer("transformer1",
Set.of(
new TransformOptionValue(false, "page"),
new TransformOptionValue(false, "width"),
new TransformOptionValue(false, "height")),
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(DOC, GIF, 102400),
new SupportedSourceAndTarget(DOC, JPEG, -1),
new SupportedSourceAndTarget(MSG, GIF, -1)));
Transformer transformer2 = new Transformer("transformer2",
Arrays.asList(
InlineTransformer transformer2 = new InlineTransformer("transformer2",
Set.of(
new TransformOptionValue(false, "opt1"),
new TransformOptionValue(false, "opt2")),
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(PDF, GIF, -1),
new SupportedSourceAndTarget(PPT, JPEG, -1)));
Transformer transformer3 = new Transformer("transformer3",
Arrays.asList(
InlineTransformer transformer3 = new InlineTransformer("transformer3",
Set.of(
new TransformOptionValue(false, "opt1")),
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(DOC, GIF, -1)));
Map<String, String> actualOptions = null;
@@ -769,18 +845,18 @@ public class TransformServiceRegistryConfigTest
@Test
public void testPipeline() throws Exception
{
Transformer transformer1 = new Transformer("transformer1",
InlineTransformer transformer1 = new InlineTransformer("transformer1",
null, // there are no options
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(DOC, PDF, -1),
new SupportedSourceAndTarget(MSG, PDF, -1)));
Transformer transformer2 = new Transformer("transformer2",
Arrays.asList(
InlineTransformer transformer2 = new InlineTransformer("transformer2",
Set.of(
new TransformOptionValue(false, "page"),
new TransformOptionValue(false, "width"),
new TransformOptionValue(false, "height")),
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(PDF, GIF, -1),
new SupportedSourceAndTarget(PDF, JPEG, -1)));
@@ -797,7 +873,7 @@ public class TransformServiceRegistryConfigTest
assertSupported(DOC, 1024, GIF, buildActualOptions("page, width, startPage"), "startPage is not an option");
// Add options to the first transformer
transformer1.setTransformOptions(Arrays.asList(
transformer1.setTransformOptions(Set.of(
new TransformOptionValue(false, "startPage"),
new TransformOptionValue(false, "endPage")));
buildPipelineTransformer(transformer1, transformer2);
@@ -806,10 +882,10 @@ public class TransformServiceRegistryConfigTest
assertSupported(DOC, 1024, GIF, buildActualOptions("page, width, startPage"), null);
}
private void buildPipelineTransformer(Transformer transformer1, Transformer transformer2)
private void buildPipelineTransformer(InlineTransformer transformer1, InlineTransformer transformer2)
{
transformer = builder.buildPipeLine("transformer1",
Arrays.asList(
Set.of(
new SupportedSourceAndTarget(DOC, GIF, -1),
new SupportedSourceAndTarget(DOC, JPEG, -1),
new SupportedSourceAndTarget(MSG, GIF, -1)),