Initial checkin of Dynamic MOXy Flickr example
diff --git a/moxy/dynamic/flickr/.classpath b/moxy/dynamic/flickr/.classpath
new file mode 100644
index 0000000..af50fd9
--- /dev/null
+++ b/moxy/dynamic/flickr/.classpath
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry including="**/*.java" kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/moxy/dynamic/flickr/.project b/moxy/dynamic/flickr/.project
new file mode 100644
index 0000000..f1c7336
--- /dev/null
+++ b/moxy/dynamic/flickr/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>flickr</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/moxy/dynamic/flickr/.settings/org.eclipse.core.resources.prefs b/moxy/dynamic/flickr/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..29abf99
--- /dev/null
+++ b/moxy/dynamic/flickr/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/<project>=UTF-8
diff --git a/moxy/dynamic/flickr/.settings/org.eclipse.jdt.core.prefs b/moxy/dynamic/flickr/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..60105c1
--- /dev/null
+++ b/moxy/dynamic/flickr/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/moxy/dynamic/flickr/.settings/org.eclipse.m2e.core.prefs b/moxy/dynamic/flickr/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/moxy/dynamic/flickr/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/moxy/dynamic/flickr/README.md b/moxy/dynamic/flickr/README.md
new file mode 100644
index 0000000..eae8c06
--- /dev/null
+++ b/moxy/dynamic/flickr/README.md
@@ -0,0 +1,17 @@
+EclipseLink Dynamic MOXy Flickr Example
+---------------------------------------
+
+This example will demonstrate how to use MOXy's Dynamic JAXB features to work with public JSON and XML feeds, without having to create concrete Java classes. The following concepts are demonstrated:
+
+* Mapping to JSON and XML data without writing or generating concrete Java classes
+* Using multiple MOXy metadata files to modularize your metadata
+* Bootstrapping a DynamicJAXBContext from multiple MOXy metadata files
+* Using a single DynamicJAXBContext to read both JSON and XML data
+* Using DynamicEntity APIs to interact with mapped data
+* Using XPath Predicates to map to an attribute based on another attribute value
+* Using UnmarshallerProperties.JSON_INCLUDE_ROOT to read JSON that does not have a root element
+* Using Marshaller.JAXB_FRAGMENT to omit the XML preamble when writing
+
+The example application uses Dynamic MOXy to read a JSON stream from Reddit, an XML stream from Flickr, and uses the data from both to create an HTML file.
+
+[http://wiki.eclipse.org/EclipseLink/Examples/MOXy/Dynamic/Flickr](http://wiki.eclipse.org/EclipseLink/Examples/MOXy/Dynamic/Flickr)
\ No newline at end of file
diff --git a/moxy/dynamic/flickr/pom.xml b/moxy/dynamic/flickr/pom.xml
new file mode 100644
index 0000000..6820ecf
--- /dev/null
+++ b/moxy/dynamic/flickr/pom.xml
@@ -0,0 +1,153 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>eclipselink.example.moxy.dynamic</groupId>
+    <artifactId>flicker</artifactId>
+    <version>2.4.2-RC2</version>
+
+    <name>EclipseLink Dynamic MOXy Flickr Example</name>
+    <url>http://wiki.eclipse.org/EclipseLink/Examples/MOXy</url>
+
+    <scm>
+        <connection>git://git.eclipse.org/gitroot/eclipselink/examples.git</connection>
+        <url>http://git.eclipse.org/c/eclipselink/examples.git/</url>
+    </scm>
+
+    <licenses>
+        <license>
+            <name>EPL: Eclipse Public License</name>
+            <url>http://www.eclipse.org/legal/epl-v10.html</url>
+        </license>
+        <license>
+            <name>EDL: Eclipse Distribution License</name>
+            <url>http://www.eclipse.org/org/documents/edl-v10.php</url>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <name>Rick Barkhouse</name>
+            <organization>Oracle</organization>
+            <email>rick.barkhouse@oracle.com</email>
+        </developer>
+    </developers>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <eclipselink.groupid>org.eclipse.persistence</eclipselink.groupid>
+        <eclipselink.artifactid>eclipselink</eclipselink.artifactid>
+        <eclipselink.version>2.4.2-RC2</eclipselink.version>
+    </properties>
+
+    <repositories>
+        <repository>
+            <id>Java.net</id>
+            <url>http://download.java.net/maven/2/</url>
+        </repository>
+        <repository>
+            <id>EclipseLink</id>
+            <url>http://download.eclipse.org/rt/eclipselink/maven.repo</url>
+        </repository>
+    </repositories>
+
+    <dependencies>
+        <dependency>
+            <groupId>${eclipselink.groupid}</groupId>
+            <artifactId>${eclipselink.artifactid}</artifactId>
+            <version>${eclipselink.version}</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>commonj.sdo</artifactId>
+                    <groupId>commonj.sdo</groupId>
+                </exclusion>
+            </exclusions>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.11</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>javax</groupId>
+            <artifactId>javaee-api</artifactId>
+            <version>6.0</version>
+            <scope>provided</scope>
+        </dependency>
+
+        <!-- Alchemy, for extracting keywords in this example -->
+        <dependency>
+            <groupId>com.likethecolor</groupId>
+            <artifactId>alchemy</artifactId>
+            <version>1.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-nop</artifactId>
+            <version>1.7.0</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <defaultGoal>install</defaultGoal>
+
+        <!-- ensure jaxb.properties copied to target/classes -->
+        <resources>
+            <resource>
+                <directory>src/main/java</directory>
+                <excludes>
+                    <exclude>**/*.java</exclude>
+                </excludes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+            </resource>
+        </resources>
+
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <version>1.2.1</version>
+                <executions>
+                    <execution>
+                        <phase>install</phase>
+                        <goals>
+                            <goal>java</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <classpathScope>test</classpathScope>
+                    <mainClass>eclipselink.example.moxy.dynamic.flickr.Main</mainClass>
+                    <systemProperties>
+                        <systemProperty>
+                            <key>java.net.useSystemProxies</key>
+                            <value>true</value>
+                        </systemProperty>
+                        <!--
+                        <systemProperty> <key>proxySet</key> <value>true</value> </systemProperty>
+                        <systemProperty> <key>proxyHost</key> <value>www.proxy.com</value> </systemProperty>
+                        <systemProperty> <key>proxyPort</key> <value>80</value> </systemProperty>
+                        -->
+                    </systemProperties>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>2.5.1</version>
+                <configuration>
+                    <source>1.6</source>
+                    <target>1.6</target>
+                </configuration>
+            </plugin>
+
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/moxy/dynamic/flickr/src/main/java/eclipselink/example/moxy/dynamic/flickr/Main.java b/moxy/dynamic/flickr/src/main/java/eclipselink/example/moxy/dynamic/flickr/Main.java
new file mode 100644
index 0000000..43455a1
--- /dev/null
+++ b/moxy/dynamic/flickr/src/main/java/eclipselink/example/moxy/dynamic/flickr/Main.java
@@ -0,0 +1,356 @@
+/*******************************************************************************
+ * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved.
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0
+ * which accompanies this distribution.
+ *
+ * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
+ * and the Eclipse Distribution License is available at
+ * http://www.eclipse.org/org/documents/edl-v10.php.
+ ******************************************************************************/
+package eclipselink.example.moxy.dynamic.flickr;
+
+import java.awt.Desktop;
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Random;
+import java.util.StringTokenizer;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.transform.stream.StreamSource;
+
+import org.eclipse.persistence.dynamic.DynamicEntity;
+import org.eclipse.persistence.jaxb.JAXBContextProperties;
+import org.eclipse.persistence.jaxb.MarshallerProperties;
+import org.eclipse.persistence.jaxb.UnmarshallerProperties;
+import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
+import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory;
+import org.eclipse.persistence.oxm.MediaType;
+
+import com.likethecolor.alchemy.api.Client;
+import com.likethecolor.alchemy.api.call.RankedConceptsCall;
+import com.likethecolor.alchemy.api.call.type.CallTypeText;
+import com.likethecolor.alchemy.api.entity.ConceptAlchemyEntity;
+import com.likethecolor.alchemy.api.entity.Response;
+import com.likethecolor.alchemy.api.params.ConceptParams;
+
+public class Main {
+
+    // The JAXBContext that we will use to read Reddit / Flickr data, and write HTML
+    private DynamicJAXBContext context;
+
+    // RedditPost:url -> RedditPost
+    HashMap<Object, DynamicEntity> redditMap;
+    // RedditPost:url -> FlickrResults
+    HashMap<Object, DynamicEntity> flickrMap;
+
+    File outputFile;
+
+    // ========================================================================
+
+    public static void main(String[] args) {
+        new Main().run();
+    }
+
+    private void run() {
+        try {
+            writeJsonBindings();
+
+            init();
+
+            readRedditPosts();
+            findFlickrResults();
+            writeHtml();
+            launchSystemBrowser();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void init() throws Exception {
+        ClassLoader loader = Thread.currentThread().getContextClassLoader();
+
+        InputStream redditBindings = loader.getResourceAsStream(REDDIT_BINDINGS);
+        InputStream flickrBindings = loader.getResourceAsStream(FLICKR_BINDINGS);
+        InputStream htmlBindings = loader.getResourceAsStream(HTML_BINDINGS);
+
+        ArrayList<InputStream> dataBindings = new ArrayList<InputStream>(3);
+        dataBindings.add(redditBindings);
+        dataBindings.add(flickrBindings);
+        dataBindings.add(htmlBindings);
+
+        Map<String, Object> properties = new HashMap<String, Object>();
+        properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, dataBindings);
+        context = DynamicJAXBContextFactory.createContextFromOXM(loader, properties);
+
+        redditMap = new HashMap<Object, DynamicEntity>();
+        flickrMap = new HashMap<Object, DynamicEntity>();
+
+        outputFile = new File("output.html");
+    }
+
+    private void readRedditPosts() throws Exception {
+        Unmarshaller u = context.createUnmarshaller();
+        u.setProperty(UnmarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
+        u.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);
+
+        Class<? extends DynamicEntity> redditResultsClass = context.newDynamicEntity("eclipselink.example.moxy.dynamic.flickr.RedditResults").getClass();
+
+        System.out.println();
+        System.out.print("Reading Today's Hot Topics from Reddit r/" + SUBREDDIT + "... ");
+        DynamicEntity redditResults = u.unmarshal(new StreamSource(REDDIT_URL), redditResultsClass).getValue();
+        System.out.println("Done.");
+
+        ArrayList<DynamicEntity> posts = redditResults.get("posts");
+        for (DynamicEntity post : posts) {
+            redditMap.put(post.get("url"), post);
+        }
+    }
+
+    private void findFlickrResults() throws Exception {
+        for (Object postUrl : redditMap.keySet()) {
+            DynamicEntity post = redditMap.get(postUrl);
+
+            System.out.println();
+            System.out.println("Headline: [" + post.get("title") + "]");
+
+            String keywords = extractConcepts(post.get("title").toString());
+
+            String flickrUrlString = FLICKR_URL + keywords;
+            System.out.print("Searching Flickr: [" + flickrUrlString + "]... ");
+            InputStream flickrStream = new URL(flickrUrlString).openConnection().getInputStream();
+            System.out.println("Done.");
+
+            Unmarshaller u = context.createUnmarshaller();
+            DynamicEntity flickrResults = (DynamicEntity) u.unmarshal(flickrStream);
+
+            flickrMap.put(postUrl, flickrResults);
+
+            ArrayList<DynamicEntity> flickerItems = flickrResults.get("items");
+            if (flickerItems != null) {
+                int size = flickerItems.size();
+                if (size >= IMAGE_LIMIT) {
+                    size = IMAGE_LIMIT;
+                }
+                for (int i = 0; i < size; i++) {
+                    System.out.println("\t" + flickerItems.get(i).get("imageUrl"));
+                }
+            } else {
+                System.out.println("\tNo results found.");
+            }
+        }
+    }
+
+    private void writeHtml() throws Exception {
+        DynamicEntity html = context.newDynamicEntity("eclipselink.example.moxy.dynamic.flickr.HtmlPage");
+        html.set("title", "TopLink MOXy - Dynamic JAXB");
+        html.set("css", "style.css");
+        html.set("rel", "stylesheet");
+        html.set("type", "text/css");
+        html.set("media", "screen");
+
+        DynamicEntity body = context.newDynamicEntity("eclipselink.example.moxy.dynamic.flickr.HtmlBody");
+        body.set("title", "Reddit /" + SUBREDDIT + " - Today's Top Posts");
+
+        ArrayList<DynamicEntity> divs = new ArrayList<DynamicEntity>();
+
+        for (Object postUrl : redditMap.keySet()) {
+            DynamicEntity post = redditMap.get(postUrl);
+            DynamicEntity flickrResults = flickrMap.get(postUrl);
+
+            // Article Link
+            // ================================================================
+
+            DynamicEntity redditDiv = context.newDynamicEntity("eclipselink.example.moxy.dynamic.flickr.HtmlDiv");
+            redditDiv.set("id", "redditPost");
+
+            ArrayList<DynamicEntity> divContent = new ArrayList<DynamicEntity>();
+
+            DynamicEntity redditLink = context.newDynamicEntity("eclipselink.example.moxy.dynamic.flickr.HtmlTextLink");
+            redditLink.set("url", post.get("url"));
+            redditLink.set("title", post.get("title"));
+            divContent.add(redditLink);
+
+            redditDiv.set("span", divContent);
+
+            // Flickr description and images
+            // ================================================================
+
+            DynamicEntity flickrDiv = context.newDynamicEntity("eclipselink.example.moxy.dynamic.flickr.HtmlDiv");
+            flickrDiv.set("id", "flickrResults");
+
+            divContent = new ArrayList<DynamicEntity>();
+
+            DynamicEntity flickrDescription = context.newDynamicEntity("eclipselink.example.moxy.dynamic.flickr.HtmlText");
+            flickrDescription.set("text", flickrResults.get("description"));
+            divContent.add(flickrDescription);
+
+            ArrayList<DynamicEntity> flickrItems = flickrResults.get("items");
+
+            int counter = 0;
+            if (flickrItems != null) {
+                Collections.shuffle(flickrItems, new Random(System.nanoTime()));
+                for (DynamicEntity flickrItem : flickrItems) {
+                    DynamicEntity flickrImageLink = context.newDynamicEntity("eclipselink.example.moxy.dynamic.flickr.HtmlImageLink");
+                    flickrImageLink.set("url", flickrItem.get("flickrPage"));
+                    flickrImageLink.set("image", flickrItem.get("imageUrl"));
+                    flickrImageLink.set("height", HTML_IMAGE_HEIGHT);
+                    divContent.add(flickrImageLink);
+                    counter++;
+                    if (counter == IMAGE_LIMIT) {
+                        break;
+                    }
+                }
+            } else {
+                DynamicEntity noneText = context.newDynamicEntity("eclipselink.example.moxy.dynamic.flickr.HtmlText");
+                noneText.set("text", "No results found.");
+                divContent.add(noneText);
+            }
+            flickrDiv.set("span", divContent);
+
+            divs.add(redditDiv);
+            divs.add(flickrDiv);
+        }
+
+        body.set("divs", divs);
+
+        html.set("body", body);
+
+        Marshaller m = context.createMarshaller();
+        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+        m.setProperty(Marshaller.JAXB_FRAGMENT, true);
+        m.marshal(html, outputFile);
+    }
+
+    // ========================================================================
+
+    /**
+     * This method uses the AlchemyAPI web service to determine the "concepts"
+     * contained in the headline.  It does not use EclipseLink and is used solely for
+     * the purpose of this example application.
+     *
+     * @see <a href="http://www.alchemyapi.com">AlchemyAPI</a>
+     */
+    @SuppressWarnings("unchecked")
+    private String extractConcepts(String postTitle) {
+        try {
+            Client client = new Client(ALCHEMY_KEY);
+
+            ConceptParams params = new ConceptParams();
+            params.setMaxRetrieve(ALCHEMY_CONCEPTS_TO_RETURN);
+
+            CallTypeText callType = new CallTypeText(postTitle);
+            RankedConceptsCall call = new RankedConceptsCall(callType, params);
+            Response<ConceptAlchemyEntity> response = client.call(call);
+
+            String concepts = "";
+
+            Iterator<ConceptAlchemyEntity> it = response.iterator();
+            if (!it.hasNext()) {
+                // If Alchemy didn't find any concepts, use string length algorithm
+                return extractKeywords(postTitle);
+            } else {
+                while (it.hasNext()) {
+                    ConceptAlchemyEntity alchemyEntity = it.next();
+                    concepts +=  alchemyEntity.getConcept();
+                    if (it.hasNext()) {
+                        concepts += ",";
+                    }
+                }
+            }
+
+            concepts = concepts.replace(" ", "+");
+
+            return concepts;
+        } catch (Exception e) {
+            return extractKeywords(postTitle);
+        }
+    }
+
+    private String extractKeywords(String postTitle) {
+        StringTokenizer tokenizer = new StringTokenizer(postTitle, ",.!?()[]'\"- \t\n\r\f");
+
+        ArrayList<String> words = new ArrayList<String>();
+
+        while (tokenizer.hasMoreElements()) {
+            words.add(tokenizer.nextToken());
+        }
+
+        // Sort words, longest one first
+        Collections.sort(words, new StringLengthComparator());
+
+        String keywords = null;
+        if (words.size() > 1) {
+            keywords = words.get(0) + "," + words.get(1);
+        } else {
+            keywords = words.get(0);
+        }
+
+        return keywords;
+    }
+
+    private void launchSystemBrowser() {
+        try {
+            Desktop.getDesktop().browse(outputFile.toURI());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void writeJsonBindings() throws Exception {
+        ClassLoader loader = Thread.currentThread().getContextClassLoader();
+        InputStream bindingsXml = loader.getResourceAsStream("META-INF/bindings-flickr.xml");
+        JAXBContext ctx = JAXBContext.newInstance("org.eclipse.persistence.jaxb.xmlmodel");
+        Object bindings = ctx.createUnmarshaller().unmarshal(bindingsXml);
+
+        Marshaller m = ctx.createMarshaller();
+        m.setProperty(MarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
+        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+        m.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
+        m.marshal(bindings, System.out);
+    }
+
+    // ========================================================================
+
+    public class StringLengthComparator implements Comparator<String> {
+        public int compare(String o1, String o2) {
+            if (o1.length() > o2.length()) {
+                return -1;
+            } else if (o1.length() < o2.length()) {
+                return 1;
+            } else {
+                return 0;
+            }
+        }
+    }
+
+    // ========================================================================
+
+    // See http://www.reddit.com/dev/api
+    private final int REDDIT_LIMIT = 5;
+    private final String SUBREDDIT = "technology";
+    private final String REDDIT_URL = "http://www.reddit.com/r/" + SUBREDDIT + "/top/.json?sort=top&t=today&limit=" + REDDIT_LIMIT;
+
+    // See http://www.flickr.com/services/feeds/
+    private final int IMAGE_LIMIT = 6;
+    private final String FLICKR_URL = "http://api.flickr.com/services/feeds/photos_public.gne?safe_search=1&tags=";
+
+    private final String REDDIT_BINDINGS = "META-INF/bindings-reddit.xml";
+    private final String FLICKR_BINDINGS = "META-INF/bindings-flickr.json";
+    private final String HTML_BINDINGS = "META-INF/bindings-html.xml";
+
+    private final int ALCHEMY_CONCEPTS_TO_RETURN = 2;
+    private final String ALCHEMY_KEY = "/META-INF/a.key";
+
+    private final Integer HTML_IMAGE_HEIGHT = Integer.valueOf(80);
+
+}
\ No newline at end of file
diff --git a/moxy/dynamic/flickr/src/main/resources/META-INF/a.key b/moxy/dynamic/flickr/src/main/resources/META-INF/a.key
new file mode 100644
index 0000000..8f15722
--- /dev/null
+++ b/moxy/dynamic/flickr/src/main/resources/META-INF/a.key
@@ -0,0 +1 @@
+ae118f51d3ec0bf619166d70b3d7041fecc9ff87
\ No newline at end of file
diff --git a/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-flickr.json b/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-flickr.json
new file mode 100644
index 0000000..4f31316
--- /dev/null
+++ b/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-flickr.json
@@ -0,0 +1,40 @@
+{
+   "package-name" : "eclipselink.example.moxy.dynamic.flickr",
+   "xml-schema" : {
+      "element-form-default" : "QUALIFIED",
+      "namespace" : "http://www.w3.org/2005/Atom"
+   },
+   "java-types" : {
+      "java-type" : [ {
+         "name" : "eclipselink.example.moxy.dynamic.flickr.FlickrResults",
+         "xml-root-element" : {
+            "name" : "feed"
+         },
+         "java-attributes" : {
+            "xml-element" : [ {
+               "java-attribute" : "description",
+               "type" : "java.lang.String",
+               "xml-path" : "title/text()"
+            }, {
+               "java-attribute" : "items",
+               "container-type" : "java.util.ArrayList",
+               "type" : "eclipselink.example.moxy.dynamic.flickr.FlickrItem",
+               "xml-path" : "entry"
+            } ]
+         }
+      }, {
+         "name" : "eclipselink.example.moxy.dynamic.flickr.FlickrItem",
+         "java-attributes" : {
+            "xml-attribute" : [ {
+               "java-attribute" : "flickrPage",
+               "type" : "java.lang.String",
+               "xml-path" : "link[@rel='alternate']/@href"
+            }, {
+               "java-attribute" : "imageUrl",
+               "type" : "java.lang.String",
+               "xml-path" : "link[@type='image/jpeg']/@href"
+            } ]
+         }
+      } ]
+   }
+}
\ No newline at end of file
diff --git a/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-flickr.xml b/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-flickr.xml
new file mode 100644
index 0000000..dc4c802
--- /dev/null
+++ b/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-flickr.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema" package-name="eclipselink.example.moxy.dynamic.flickr">
+
+    <xml-schema element-form-default="QUALIFIED" namespace="http://www.w3.org/2005/Atom"/>
+
+    <java-types>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.FlickrResults">
+            <xml-root-element name="feed"/>
+            <java-attributes>
+                <xml-element java-attribute="description" xml-path="title/text()" type="java.lang.String"/>
+                <xml-element java-attribute="items" xml-path="entry" type="eclipselink.example.moxy.dynamic.flickr.FlickrItem" container-type="java.util.ArrayList"/>
+            </java-attributes>
+        </java-type>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.FlickrItem">
+            <java-attributes>
+                <xml-attribute java-attribute="flickrPage" xml-path="link[@rel='alternate']/@href" type="java.lang.String"/>
+                <xml-attribute java-attribute="imageUrl" xml-path="link[@type='image/jpeg']/@href" type="java.lang.String"/>
+            </java-attributes>
+        </java-type>
+
+    </java-types>
+
+</xml-bindings>
\ No newline at end of file
diff --git a/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-html.xml b/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-html.xml
new file mode 100644
index 0000000..674b6ff
--- /dev/null
+++ b/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-html.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    package-name="eclipselink.example.moxy.dynamic.flickr">
+
+    <java-types>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.HtmlPage">
+            <xml-root-element name="html" />
+            <java-attributes>
+                <xml-element java-attribute="title" xml-path="head/title/text()" type="java.lang.String" />
+                <xml-attribute java-attribute="css" xml-path="head/link/@href" type="java.lang.String" />
+                <xml-attribute java-attribute="rel" xml-path="head/link/@rel" type="java.lang.String" />
+                <xml-attribute java-attribute="type" xml-path="head/link/@type" type="java.lang.String" />
+                <xml-attribute java-attribute="media" xml-path="head/link/@media" type="java.lang.String" />
+                <xml-element java-attribute="body" xml-path="body" type="eclipselink.example.moxy.dynamic.flickr.HtmlBody" />
+            </java-attributes>
+        </java-type>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.HtmlBody">
+            <java-attributes>
+                <xml-element java-attribute="title" xml-path="p/h1/text()" type="java.lang.String" />
+                <xml-element java-attribute="divs" xml-path="p/p" type="eclipselink.example.moxy.dynamic.flickr.HtmlDiv" container-type="java.util.ArrayList" />
+            </java-attributes>
+        </java-type>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.HtmlDiv">
+            <java-attributes>
+                <xml-attribute java-attribute="id" xml-path="div/@id" type="java.lang.String" />
+                <xml-element java-attribute="span" type="eclipselink.example.moxy.dynamic.flickr.HtmlItem" container-type="java.util.ArrayList">
+                    <xml-element-wrapper name="div" />
+                </xml-element>
+            </java-attributes>
+        </java-type>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.HtmlItem"/>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.HtmlText" super-type="eclipselink.example.moxy.dynamic.flickr.HtmlItem">
+            <java-attributes>
+                <xml-element java-attribute="text" xml-path="p/small/text()" type="java.lang.String" />
+            </java-attributes>
+        </java-type>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.HtmlLink" super-type="eclipselink.example.moxy.dynamic.flickr.HtmlItem">
+            <java-attributes>
+                <xml-attribute java-attribute="url" xml-path="a/@href" type="java.lang.String" />
+            </java-attributes>
+        </java-type>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.HtmlTextLink" super-type="eclipselink.example.moxy.dynamic.flickr.HtmlLink">
+            <java-attributes>
+                <xml-element java-attribute="title" xml-path="a/text()" type="java.lang.String" />
+            </java-attributes>
+        </java-type>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.HtmlImageLink" super-type="eclipselink.example.moxy.dynamic.flickr.HtmlLink">
+            <java-attributes>
+                <xml-attribute java-attribute="image" xml-path="a/img/@src" type="java.lang.String" />
+                <xml-attribute java-attribute="width" xml-path="a/img/@width" type="java.lang.Integer" />
+                <xml-attribute java-attribute="height" xml-path="a/img/@height" type="java.lang.Integer" />
+            </java-attributes>
+        </java-type>
+
+    </java-types>
+
+</xml-bindings>
\ No newline at end of file
diff --git a/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-reddit.json b/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-reddit.json
new file mode 100644
index 0000000..011879c
--- /dev/null
+++ b/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-reddit.json
@@ -0,0 +1,31 @@
+{
+   "package-name" : "eclipselink.example.moxy.dynamic.flickr",
+   "java-types" : {
+      "java-type" : [ {
+         "name" : "eclipselink.example.moxy.dynamic.flickr.RedditResults",
+         "xml-root-element" : {
+         },
+         "java-attributes" : {
+            "xml-element" : [ {
+               "java-attribute" : "posts",
+               "container-type" : "java.util.ArrayList",
+               "type" : "eclipselink.example.moxy.dynamic.flickr.RedditPost",
+               "xml-path" : "data/children"
+            } ]
+         }
+      }, {
+         "name" : "eclipselink.example.moxy.dynamic.flickr.RedditPost",
+         "java-attributes" : {
+            "xml-element" : [ {
+               "java-attribute" : "title",
+               "type" : "java.lang.String",
+               "xml-path" : "data/title/text()"
+            }, {
+               "java-attribute" : "url",
+               "type" : "java.lang.String",
+               "xml-path" : "data/url/text()"
+            } ]
+         }
+      } ]
+   }
+}
\ No newline at end of file
diff --git a/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-reddit.xml b/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-reddit.xml
new file mode 100644
index 0000000..9f6f404
--- /dev/null
+++ b/moxy/dynamic/flickr/src/main/resources/META-INF/bindings-reddit.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="US-ASCII"?>
+<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema" package-name="eclipselink.example.moxy.dynamic.flickr">
+
+    <java-types>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.RedditResults">
+            <xml-root-element/>
+            <java-attributes>
+                <xml-element java-attribute="posts" xml-path="data/children" type="eclipselink.example.moxy.dynamic.flickr.RedditPost" container-type="java.util.ArrayList"/>
+            </java-attributes>
+        </java-type>
+
+        <java-type name="eclipselink.example.moxy.dynamic.flickr.RedditPost">
+            <java-attributes>
+                <xml-element java-attribute="title" xml-path="data/title/text()" type="java.lang.String"/>
+                <xml-element java-attribute="url" xml-path="data/url/text()" type="java.lang.String"/>
+            </java-attributes>
+        </java-type>
+
+    </java-types>
+
+</xml-bindings>
\ No newline at end of file
diff --git a/moxy/dynamic/flickr/style.css b/moxy/dynamic/flickr/style.css
new file mode 100644
index 0000000..eb912a3
--- /dev/null
+++ b/moxy/dynamic/flickr/style.css
@@ -0,0 +1,50 @@
+body {
+    margin: 4px;
+    padding: 4px;
+
+    background: #feffff; /* Old browsers */
+    background: -moz-linear-gradient(top,  #feffff 0%, #d2ebf9 100%); /* FF3.6+ */
+    background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#feffff), color-stop(100%,#d2ebf9)); /* Chrome,Safari4+ */
+    background: -webkit-linear-gradient(top,  #feffff 0%,#d2ebf9 100%); /* Chrome10+,Safari5.1+ */
+    background: -o-linear-gradient(top,  #feffff 0%,#d2ebf9 100%); /* Opera 11.10+ */
+    background: -ms-linear-gradient(top,  #feffff 0%,#d2ebf9 100%); /* IE10+ */
+    background: linear-gradient(to bottom,  #feffff 0%,#d2ebf9 100%); /* W3C */
+    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#feffff', endColorstr='#d2ebf9',GradientType=0 ); /* IE6-9 */
+
+
+    font: 14px/20px "Helvetica Neue", Helvetica, Arial, sans-serif;
+    color: #404040
+}
+
+a {
+    color: #3275c7;
+    text-decoration: none
+}
+
+a:hover,a:active {
+    outline: 0;
+    text-decoration: underline
+}
+
+small {
+    font-size: 75%
+}
+
+h1 {
+    font-size: 24px;
+    background: #3275c7;
+    color: #fff;
+    padding: 8px;
+    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25), 0 1px 0px
+        rgba(0, 0, 0, 0.25)
+}
+
+img {
+    margin-top:4px;
+    margin-bottom:4px;
+    margin-right:16px;
+    margin-left:16px;
+    -moz-box-shadow: 3px 3px 3px #666;
+    -webkit-box-shadow: 3px 3px 3px #666;
+    box-shadow: 3px 3px 3px #666;
+}
\ No newline at end of file