Skip to content
This repository has been archived by the owner on Jan 17, 2022. It is now read-only.

Commit

Permalink
Merge branches 'feature/article-type-determination' and 'master' of g…
Browse files Browse the repository at this point in the history
…ithub.com:Financial-Times/methode-article-mapper into feature/article-type-determination
  • Loading branch information
radutudor committed Jun 15, 2017
2 parents de25803 + 389e714 commit 4257dae
Show file tree
Hide file tree
Showing 14 changed files with 305 additions and 189 deletions.
16 changes: 11 additions & 5 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@
<junit.version>4.11</junit.version>
<mockito-core.version>1.9.5</mockito-core.version>
<jersey-version>1.18.1</jersey-version>
<hamcrest.version>1.3</hamcrest.version>
<jmustache.version>1.12</jmustache.version>
<cucumber.version>1.1.5</cucumber.version>
<xmlunit.version>1.5</xmlunit.version>
<wiremock.version>1.40</wiremock.version>
<uuid-utils.version>1.0.2</uuid-utils.version>
<!-- Plugins -->
<findbugs.version>2.5.2</findbugs.version>
<checkstyle.version>2.10</checkstyle.version>
Expand All @@ -31,11 +37,6 @@
<maven-resources-plugin.version>2.6</maven-resources-plugin.version>
<maven-jar-plugin.version>2.3.2</maven-jar-plugin.version>
<target-jdk>1.8</target-jdk>
<hamcrest.version>1.3</hamcrest.version>
<jmustache.version>1.12</jmustache.version>
<cucumber.version>1.1.5</cucumber.version>
<xmlunit.version>1.5</xmlunit.version>
<wiremock.version>1.40</wiremock.version>
</properties>

<repositories>
Expand Down Expand Up @@ -97,6 +98,11 @@
<artifactId>jax-rs-build-info-resource</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.github.Financial-Times</groupId>
<artifactId>uuid-utils-java</artifactId>
<version>${uuid-utils.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.fasterxml.jackson.annotation.JsonProperty;

import java.net.URI;
import java.util.Date;

@JsonIgnoreProperties(ignoreUnknown = true)
public class EomFile {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import com.ft.api.jaxrs.errors.ClientError;
import com.ft.api.util.transactionid.TransactionIdUtils;
import com.ft.content.model.Content;
import com.ft.methodearticlemapper.exception.MethodeContentInvalidException;
import com.ft.methodearticlemapper.exception.MethodeContentNotEligibleForPublishException;
import com.ft.methodearticlemapper.exception.MethodeMarkedDeletedException;
import com.ft.methodearticlemapper.exception.MethodeMissingBodyException;
Expand All @@ -19,7 +18,6 @@

import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
Expand All @@ -46,7 +44,7 @@ public PostContentToTransformResource(EomFileProcessor eomFileProcessor) {
public final Content map(EomFile eomFile, @QueryParam("preview") boolean preview, @Context HttpHeaders httpHeaders) {
final String transactionId = TransactionIdUtils.getTransactionIdOrDie(httpHeaders);
final String uuid = eomFile.getUuid();
validateUuid(uuid, eomFile);
validateUuid(uuid);
return processRequest(uuid, preview, eomFile, transactionId);
}

Expand Down Expand Up @@ -83,19 +81,13 @@ private Content processRequest(String uuid, boolean preview, EomFile eomFile, St
}
}

private void validateUuid(String uuid, EomFile eomFile) {
private void validateUuid(String uuid) {
if (uuid == null) {
throw ClientError.status(400).context(null).reason(ErrorMessage.UUID_REQUIRED).exception();
}
try {

UUID resourceId = UUID.fromString(uuid);

if (!uuid.equals(eomFile.getUuid())) {
String errorMessage = String.format(ErrorMessage.CONFLICTING_UUID.toString(), uuid, eomFile.getUuid());
throw ClientError.status(409)
.error(errorMessage)
.exception(new MethodeContentInvalidException(resourceId, errorMessage));
if (!UUID.fromString(uuid).toString().equals(uuid)) {
throw new IllegalArgumentException("Invalid UUID: " + uuid);
}
} catch (IllegalArgumentException iae) {
throw ClientError.status(400)
Expand All @@ -105,14 +97,11 @@ private void validateUuid(String uuid, EomFile eomFile) {
}

enum ErrorMessage {
METHODE_FILE_NOT_FOUND("Article marked as deleted"),
UUID_REQUIRED("No UUID was passed"),
INVALID_UUID("The UUID passed was invalid"),
METHODE_CONTENT_TYPE_NOT_SUPPORTED("Invalid request - resource not an article"),
METHODE_FILE_NOT_FOUND("Article marked as deleted"),
NOT_WEB_CHANNEL("This is not a web channel story"),
METHODE_FIELD_MISSING("Required methode field [%s] is missing"),
DOCUMENT_STORE_API_UNAVAILABLE("Document store API was unavailable"),
CONFLICTING_UUID("UUID in the url [%s] and uuid in the payload [%s] are not the same");
METHODE_FIELD_MISSING("Required methode field [%s] is missing");

private final String text;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.ft.methodearticlemapper.transformation;

import com.ft.bodyprocessing.BodyProcessor;
import com.ft.uuidutils.DeriveUUID;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableSortedSet;

Expand All @@ -18,7 +19,6 @@
import com.ft.methodearticlemapper.methode.ContentSource;
import com.ft.methodearticlemapper.model.EomFile;
import com.ft.methodearticlemapper.transformation.eligibility.PublishEligibilityChecker;
import com.ft.methodearticlemapper.util.ImageSetUuidGenerator;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
Expand Down Expand Up @@ -56,6 +56,8 @@
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import static com.ft.uuidutils.DeriveUUID.Salts.IMAGE_SET;

public class EomFileProcessor {

private static final Logger LOGGER = LoggerFactory.getLogger(EomFileProcessor.class);
Expand Down Expand Up @@ -393,7 +395,7 @@ private String putMainImageReferenceInBodyNode(Node bodyNode, String mainImage)
private String generateMainImageUuid(XPath xpath, Document eomFileDocument) throws XPathExpressionException {
final String imageUuid = StringUtils.substringAfter(xpath.evaluate("/doc/lead/lead-images/web-master/@fileref", eomFileDocument), "uuid=");
if (!Strings.isNullOrEmpty(imageUuid)) {
return ImageSetUuidGenerator.fromImageUuid(UUID.fromString(imageUuid)).toString();
return DeriveUUID.with(IMAGE_SET).from(UUID.fromString(imageUuid)).toString();
}
return null;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.ft.methodearticlemapper.transformation;


import com.ft.bodyprocessing.BodyProcessingContext;
import com.ft.bodyprocessing.writer.BodyWriter;
import com.ft.bodyprocessing.xml.eventhandlers.BaseXMLEventHandler;
import com.ft.uuidutils.GenerateV3UUID;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import java.util.HashMap;

public class ImageSetXmlEventHandler extends BaseXMLEventHandler {

private static final Logger LOGGER = LoggerFactory.getLogger(ImageSetXmlEventHandler.class);

private static final String ID_ATTRIBUTE = "id";
private static final String FT_CONTENT_TAG = "ft-content";

@Override
public void handleStartElementEvent(StartElement event, XMLEventReader xmlEventReader, BodyWriter eventWriter,
BodyProcessingContext bodyProcessingContext) throws XMLStreamException {
String imageID = getIdFromImageSet(event);

if (StringUtils.isNotEmpty(imageID)) {
String generatedUUID = GenerateV3UUID.singleDigested(imageID).toString();

HashMap<String, String> attributes = new HashMap<>();
attributes.put("type", "http://www.ft.com/ontology/content/ImageSet");
attributes.put("url", "http://api.ft.com/content/" + generatedUUID);
attributes.put("data-embedded", "true");

eventWriter.writeStartTag(FT_CONTENT_TAG, attributes);
eventWriter.writeEndTag(FT_CONTENT_TAG);
}

skipUntilMatchingEndTag(event.getName().getLocalPart(), xmlEventReader);
}

private String getIdFromImageSet(StartElement event) {
Attribute idAttribute = event.getAttributeByName(new QName(ID_ATTRIBUTE));
if (idAttribute == null || StringUtils.isBlank(idAttribute.getValue())) {
LOGGER.warn("No id attribute or blank for {} required to generate uuid", event.getName().getLocalPart());
return null;
}

return idAttribute.getValue();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,13 @@
import com.ft.bodyprocessing.BodyProcessingContext;
import com.ft.bodyprocessing.writer.BodyWriter;
import com.ft.bodyprocessing.xml.eventhandlers.BaseXMLEventHandler;
import com.ft.methodearticlemapper.util.ImageSetUuidGenerator;
import com.ft.uuidutils.DeriveUUID;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static com.ft.uuidutils.DeriveUUID.Salts.IMAGE_SET;

public class InlineImageXmlEventHandler extends BaseXMLEventHandler {

private static final Logger LOGGER = LoggerFactory.getLogger(InlineImageXmlEventHandler.class);
Expand All @@ -36,7 +38,7 @@ public void handleStartElementEvent(StartElement event, XMLEventReader xmlEventR
String uuid = getUuidForImage(event);

if (StringUtils.isNotEmpty(uuid)) {
String imageSetUuid = ImageSetUuidGenerator.fromImageUuid(UUID.fromString(uuid)).toString();
String imageSetUuid = DeriveUUID.with(IMAGE_SET).from(UUID.fromString(uuid)).toString();

HashMap<String, String> attributes = new HashMap<>();
attributes.put("id", imageSetUuid);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,10 @@ public MethodeBodyTransformationXMLEventHandlerRegistry(final VideoMatcher video
"web-skybox-picture", "web-subhead", "web-thumbnail", "xref", "xrefs"
);

registerStartAndEndElementEventHandler(new SimpleTransformTagXmlEventHandler("h3", "class", "ft-subhead"), "subhead");
registerStartAndEndElementEventHandler(new SimpleTransformBlockElementEventHandler(new StAXTransformingBodyProcessor(this), "ft-timeline"), "timeline");
registerStartAndEndElementEventHandler(new SimpleTransformTagXmlEventHandler("h3", "class", "ft-subhead"), "subhead");
registerStartAndEndElementEventHandler(new SimpleTransformBlockElementEventHandler(new StAXTransformingBodyProcessor(this), "ft-timeline"), "timeline");

registerStartAndEndElementEventHandler(new ImageSetXmlEventHandler(),"image-set");
registerStartAndEndElementEventHandler(new InlineImageXmlEventHandler(),"web-inline-picture");
registerStartAndEndElementEventHandler(new WrappedHandlerXmlEventHandler(new InlineImageXmlEventHandler()),"timeline-image");
registerStartAndEndElementEventHandler(new SimpleTransformTagXmlEventHandler("strong"), "b");
Expand Down

This file was deleted.

0 comments on commit 4257dae

Please sign in to comment.