diff --git a/Klausuren/Sda1/2016Summer/Solve/src/main/java/de/hdm_stuttgart/mi/sda1/exam/movie_by_actor/Moviedb2MovieByActor.java b/Klausuren/Sda1/2016Summer/Solve/src/main/java/de/hdm_stuttgart/mi/sda1/exam/movie_by_actor/Moviedb2MovieByActor.java index 8ba8d445ce57b63be17cb9c2bbbe4f1ffc3c3d24..80fba8ed21d77ef0871233c64550dd545d7dcc94 100644 --- a/Klausuren/Sda1/2016Summer/Solve/src/main/java/de/hdm_stuttgart/mi/sda1/exam/movie_by_actor/Moviedb2MovieByActor.java +++ b/Klausuren/Sda1/2016Summer/Solve/src/main/java/de/hdm_stuttgart/mi/sda1/exam/movie_by_actor/Moviedb2MovieByActor.java @@ -1,10 +1,10 @@ package de.hdm_stuttgart.mi.sda1.exam.movie_by_actor; +import java.util.HashMap; import java.util.List; +import java.util.Map; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.filter.Filters; @@ -14,57 +14,61 @@ import org.jdom2.xpath.XPathFactory; import de.hdm_stuttgart.mi.unitmarking.jdom.DomFilter; public class Moviedb2MovieByActor implements DomFilter { - - final Logger log = LogManager.getLogger(Moviedb2MovieByActor.class); - - Element movieDb; - + + static private final String SEARCH_BY_ID_KEY = "searchById"; + + static { // Initialize static parameterized Xpath query object, + // see https://freedocs.mi.hdm-stuttgart.de/__slidedom.html#/sda1_dom_fig_domXpathVariables. + + final Map<String, Object> xpathVarsNamespacePrefix = new HashMap<>(); + + xpathVarsNamespacePrefix.put(SEARCH_BY_ID_KEY, null /* default namespace */); + + searchMovieByActorId = XPathFactory.instance().compile( + "/movieDb/movies/movie[cast/actor[@ref=$" + SEARCH_BY_ID_KEY + "]]", + Filters.element(), + xpathVarsNamespacePrefix); + } + + static private final XPathExpression<Element> searchMovieByActorId; + @Override public Document process(final Document input) { - + final Element html = new Element("html"); final Document htmlDoc = new Document(html); - + final Element body = new Element("body"); html.addContent(body); - + final Element dl = new Element("dl"); body.addContent(new Element("h1") .addContent("List of actors among with their corresponding films")) .addContent(dl); - - movieDb = input.getRootElement(); - - movieDb.getChild("persons").getChildren().stream().forEach( + + input.getRootElement().getChild("persons").getChildren().forEach( p -> addFilmsToActor(dl, p) - ); - + ); + return htmlDoc; } - - void addFilmsToActor(final Element dl, final Element person) { - - final String movies2actorId = "movie[cast/actor[@ref='" - + person.getAttributeValue("id") +"']]"; - - final XPathExpression<Element> xpath = - XPathFactory.instance().compile(movies2actorId, Filters.element()); - - final List<Element> titles = xpath.evaluate(movieDb.getChild("movies")); - - if (0 < titles.size()) { + + private void addFilmsToActor(final Element dl, final Element person) { + + searchMovieByActorId.setVariable(SEARCH_BY_ID_KEY, person.getAttributeValue("id")); + + final List<Element> movies = searchMovieByActorId.evaluate(person); + + if (0 < movies.size()) { final Element dt = new Element("dt"), dd = new Element("dd"); - + dl.addContent(dt).addContent(dd); dt.addContent(person.getChild("name").getText()); - - titles.stream() - .map(t -> t.getChild("title").getText()) - .forEach(s -> { - dd.addContent(new Element("p").addContent(s)); - }); + + movies.stream() + .map(t -> t.getChild("title").getText()) + .forEach(s -> dd.addContent(new Element("p").addContent(s))); } } - -} +} \ No newline at end of file