From e9cabcf104be73e29dcbaf823764370a5d08f0f1 Mon Sep 17 00:00:00 2001 From: thorkarlsson Date: Tue, 30 Oct 2018 14:04:45 +0700 Subject: [PATCH 1/7] Add Google extended sitemap url with support to add multiple image tags to a single URL entry --- .../GoogleExtensionSitemapGenerator.java | 103 +++++++++++ .../GoogleExtensionSitemapUrl.java | 74 ++++++++ .../com/redfin/sitemapgenerator/Image.java | 100 +++++++++++ .../GoogleExtensionSitemapUrlTest.java | 170 ++++++++++++++++++ .../SitemapGeneratorTest.java | 15 +- 5 files changed, 461 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapGenerator.java create mode 100644 src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java create mode 100644 src/main/java/com/redfin/sitemapgenerator/Image.java create mode 100644 src/test/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrlTest.java diff --git a/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapGenerator.java b/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapGenerator.java new file mode 100644 index 0000000..9d09bd5 --- /dev/null +++ b/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapGenerator.java @@ -0,0 +1,103 @@ +package com.redfin.sitemapgenerator; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; + +/** + * Builds an extended sitemap with google support for google extensions. To configure options use {@link #builder(URL, File)} + * @see Manage your sitemaps + * */ +public class GoogleExtensionSitemapGenerator extends SitemapGenerator { + + GoogleExtensionSitemapGenerator(AbstractSitemapGeneratorOptions options) { + super(options, new GoogleExtensionSitemapGenerator.Renderer()); + } + + /** Configures the generator with a base URL and directory to write the sitemap files. + * + * @param baseUrl All URLs in the generated sitemap(s) should appear under this base URL + * @param baseDir Sitemap files will be generated in this directory as either "sitemap.xml" or "sitemap1.xml" "sitemap2.xml" and so on. + * @throws MalformedURLException + */ + public GoogleExtensionSitemapGenerator(String baseUrl, File baseDir) + throws MalformedURLException { + this(new SitemapGeneratorOptions(baseUrl, baseDir)); + } + + /**Configures the generator with a base URL and directory to write the sitemap files. + * + * @param baseUrl All URLs in the generated sitemap(s) should appear under this base URL + * @param baseDir Sitemap files will be generated in this directory as either "sitemap.xml" or "sitemap1.xml" "sitemap2.xml" and so on. + */ + public GoogleExtensionSitemapGenerator(URL baseUrl, File baseDir) { + this(new SitemapGeneratorOptions(baseUrl, baseDir)); + } + + /**Configures the generator with a base URL and a null directory. The object constructed + * is not intended to be used to write to files. Rather, it is intended to be used to obtain + * XML-formatted strings that represent sitemaps. + * + * @param baseUrl All URLs in the generated sitemap(s) should appear under this base URL + */ + public GoogleExtensionSitemapGenerator(String baseUrl) throws MalformedURLException { + this(new SitemapGeneratorOptions(new URL(baseUrl))); + } + + /**Configures the generator with a base URL and a null directory. The object constructed + * is not intended to be used to write to files. Rather, it is intended to be used to obtain + * XML-formatted strings that represent sitemaps. + * + * @param baseUrl All URLs in the generated sitemap(s) should appear under this base URL + */ + public GoogleExtensionSitemapGenerator(URL baseUrl) { + this(new SitemapGeneratorOptions(baseUrl)); + } + + /** Configures a builder so you can specify sitemap generator options + * + * @param baseUrl All URLs in the generated sitemap(s) should appear under this base URL + * @param baseDir Sitemap files will be generated in this directory as either "sitemap.xml" or "sitemap1.xml" "sitemap2.xml" and so on. + * @return a builder; call .build() on it to make a sitemap generator + */ + public static SitemapGeneratorBuilder builder(URL baseUrl, File baseDir) { + return new SitemapGeneratorBuilder(baseUrl, baseDir, GoogleExtensionSitemapGenerator.class); + } + + /** Configures a builder so you can specify sitemap generator options + * + * @param baseUrl All URLs in the generated sitemap(s) should appear under this base URL + * @param baseDir Sitemap files will be generated in this directory as either "sitemap.xml" or "sitemap1.xml" "sitemap2.xml" and so on. + * @return a builder; call .build() on it to make a sitemap generator + * @throws MalformedURLException + */ + public static SitemapGeneratorBuilder builder(String baseUrl, File baseDir) throws MalformedURLException { + return new SitemapGeneratorBuilder(baseUrl, baseDir, GoogleExtensionSitemapGenerator.class); + } + + private static class Renderer extends AbstractSitemapUrlRenderer implements ISitemapUrlRenderer { + + public Class getUrlClass() { + return GoogleExtensionSitemapUrl.class; + } + + public String getXmlNamespaces() { + return "xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\""; + } + + public void render(GoogleExtensionSitemapUrl url, StringBuilder sb, W3CDateFormat dateFormat) { + StringBuilder tagSb = new StringBuilder(); + + for(Image image : url.getImages()) { + tagSb.append(" \n"); + renderTag(tagSb, "image", "loc", image.getUrl()); + renderTag(tagSb, "image", "caption", image.getCaption()); + renderTag(tagSb, "image", "title", image.getTitle()); + renderTag(tagSb, "image", "geo_location", image.getGeoLocation()); + renderTag(tagSb, "image", "license", image.getLicense()); + tagSb.append(" \n"); + } + super.render(url, sb, dateFormat, tagSb.toString()); + } + } +} diff --git a/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java b/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java new file mode 100644 index 0000000..2ce4a05 --- /dev/null +++ b/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java @@ -0,0 +1,74 @@ +package com.redfin.sitemapgenerator; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** Configurable sitemap url with support for Google extensions + * @see Manage your sitemaps + * + * TODO Add support for video tags and news tags + */ +public class GoogleExtensionSitemapUrl extends WebSitemapUrl { + + private final List images; + + public GoogleExtensionSitemapUrl(String url) throws MalformedURLException { + this(new Options(url)); + } + + public GoogleExtensionSitemapUrl(URL url) { + this(new Options(url)); + } + + public GoogleExtensionSitemapUrl(Options options) { + super(options); + this.images = options.images; + } + + public void addImage(Image image) { + this.images.add(image); + if(this.images.size() > 1000) { + throw new RuntimeException("A URL cannot have more than 1000 image tags"); + } + } + + /** Options to configure Google Extension URLs */ + public static class Options extends AbstractSitemapUrlOptions { + private List images; + + + public Options(URL url) { + super(url, GoogleExtensionSitemapUrl.class); + images = new ArrayList(); + } + + public Options(String url) throws MalformedURLException { + super(url, GoogleExtensionSitemapUrl.class); + images = new ArrayList(); + } + + public Options images(List images) { + if(images != null && images.size() > 1000) { + throw new RuntimeException("A URL cannot have more than 1000 image tags"); + } + this.images = images; + return this; + } + + public Options images(Image...images) { + if(images.length > 1000) { + throw new RuntimeException("A URL cannot have more than 1000 image tags"); + } + return images(Arrays.asList(images)); + + } + } + + /**Retrieves list of images*/ + public List getImages() { + return this.images; + } +} diff --git a/src/main/java/com/redfin/sitemapgenerator/Image.java b/src/main/java/com/redfin/sitemapgenerator/Image.java new file mode 100644 index 0000000..d1773be --- /dev/null +++ b/src/main/java/com/redfin/sitemapgenerator/Image.java @@ -0,0 +1,100 @@ +package com.redfin.sitemapgenerator; + +import java.net.MalformedURLException; +import java.net.URL; + +/** + * Represent a single image and image properties for use in extended sitemaps + * @see Image sitemaps + */ +public class Image { + private final URL url; + private final String title; + private final String caption; + private final String geoLocation; + private final URL license; + + public Image(String url) throws MalformedURLException { + this(new URL(url)); + } + + public Image(URL url) { + this.url = url; + this.title = null; + this.caption = null; + this.geoLocation = null; + this.license = null; + } + + public Image(URL url, String title, String caption, String geoLocation, String license) throws MalformedURLException { + this(url, title, caption, geoLocation, new URL(license)); + } + + public Image(URL url, String title, String caption, String geoLocation, URL license) { + this.url = url; + this.title = title; + this.caption = caption; + this.geoLocation = geoLocation; + this.license = license; + } + + + /** Retrieves URL of Image*/ + public URL getUrl() { return url; } + + /** Retrieves title of image*/ + public String getTitle() { return title; } + + /** Retrieves captionof image*/ + public String getCaption() { return caption; } + + /** Retrieves geolocation string of image*/ + public String getGeoLocation() { return geoLocation; } + + /** Retrieves license string of image*/ + public URL getLicense() { return license; } + + public static class ImageBuilder { + private URL url; + private String title; + private String caption; + private String geoLocation; + private URL license; + + public ImageBuilder(String url) throws MalformedURLException { + this(new URL(url)); + } + + public ImageBuilder(URL url) { + this.url = url; + } + + public ImageBuilder title(String title) { + this.title = title; + return this; + } + + public ImageBuilder caption(String caption) { + this.caption = caption; + return this; + } + + public ImageBuilder geoLocation(String geoLocation) { + this.geoLocation = geoLocation; + return this; + } + + public ImageBuilder license(String license) throws MalformedURLException { + return license(new URL(license)); + } + + public ImageBuilder license(URL license) { + this.license = license; + return this; + } + + public Image build() { + return new Image(url, title, caption, geoLocation, license); + } + } +} diff --git a/src/test/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrlTest.java b/src/test/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrlTest.java new file mode 100644 index 0000000..dee0287 --- /dev/null +++ b/src/test/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrlTest.java @@ -0,0 +1,170 @@ +package com.redfin.sitemapgenerator; + +import junit.framework.TestCase; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class GoogleExtensionSitemapUrlTest extends TestCase { + + private static final URL LANDING_URL = newURL("http://www.example.com/index.html"); + private static final URL CONTENT_URL = newURL("http://www.example.com/index.flv"); + File dir; + GoogleExtensionSitemapGenerator wsg; + + private static URL newURL(String url) { + try { + return new URL(url); + } catch (MalformedURLException e) {} + return null; + } + + public void setUp() throws Exception { + dir = File.createTempFile(GoogleVideoSitemapUrlTest.class.getSimpleName(), ""); + dir.delete(); + dir.mkdir(); + dir.deleteOnExit(); + } + + public void tearDown() { + wsg = null; + for (File file : dir.listFiles()) { + file.deleteOnExit(); + file.delete(); + } + dir.delete(); + dir = null; + } + + public void testSimpleUrl() throws Exception { + wsg = new GoogleExtensionSitemapGenerator("http://www.example.com", dir); + GoogleExtensionSitemapUrl url = new GoogleExtensionSitemapUrl(LANDING_URL); + url.addImage(new Image("http://cdn.example.com/image1.jpg")); + url.addImage(new Image("http://cdn.example.com/image2.jpg")); + wsg.addUrl(url); + String expected = "\n" + + "\n" + + " \n" + + " http://www.example.com/index.html\n" + + " \n" + + " http://cdn.example.com/image1.jpg\n" + + " \n" + + " \n" + + " http://cdn.example.com/image2.jpg\n" + + " \n" + + " \n" + + ""; + String sitemap = writeSingleSiteMap(wsg); + assertEquals(expected, sitemap); + } + + public void testBaseOptions() throws Exception { + wsg = new GoogleExtensionSitemapGenerator("http://www.example.com", dir); + GoogleExtensionSitemapUrl url = new GoogleExtensionSitemapUrl.Options(LANDING_URL) + .images(new Image("http://cdn.example.com/image1.jpg"), new Image("http://cdn.example.com/image2.jpg")) + .priority(0.5) + .changeFreq(ChangeFreq.WEEKLY) + .lastMod(new Date(0)) + .build(); + wsg.addUrl(url); + + String expected = "\n" + + "\n" + + " \n" + + " http://www.example.com/index.html\n" + + " 1970-01-01T08:00+08:00\n" + + " weekly\n" + + " 0.5\n" + + " \n" + + " http://cdn.example.com/image1.jpg\n" + + " \n" + + " \n" + + " http://cdn.example.com/image2.jpg\n" + + " \n" + + " \n" + + ""; + + String sitemap = writeSingleSiteMap(wsg); + assertEquals(expected, sitemap); + } + + public void testImageOptions() throws Exception { + wsg = new GoogleExtensionSitemapGenerator("http://www.example.com", dir); + GoogleExtensionSitemapUrl url = new GoogleExtensionSitemapUrl.Options(LANDING_URL) + .images(new Image.ImageBuilder("http://cdn.example.com/image1.jpg") + .title("image1.jpg") + .caption("An image of the number 1") + .geoLocation("Pyongyang, North Korea") + .license("http://cdn.example.com/licenses/imagelicense.txt") + .build(), + new Image.ImageBuilder("http://cdn.example.com/image2.jpg") + .title("image2.jpg") + .caption("An image of the number 2") + .geoLocation("Pyongyang, North Korea") + .license("http://cdn.example.com/licenses/imagelicense.txt") + .build()) + .priority(0.5) + .changeFreq(ChangeFreq.WEEKLY) + .lastMod(new Date(0)) + .build(); + wsg.addUrl(url); + + String expected = "\n" + + "\n" + + " \n" + + " http://www.example.com/index.html\n" + + " 1970-01-01T08:00+08:00\n" + + " weekly\n" + + " 0.5\n" + + " \n" + + " http://cdn.example.com/image1.jpg\n" + + " An image of the number 1\n" + + " image1.jpg\n" + + " Pyongyang, North Korea\n" + + " http://cdn.example.com/licenses/imagelicense.txt\n" + + " \n" + + " \n" + + " http://cdn.example.com/image2.jpg\n" + + " An image of the number 2\n" + + " image2.jpg\n" + + " Pyongyang, North Korea\n" + + " http://cdn.example.com/licenses/imagelicense.txt\n" + + " \n" + + " \n" + + ""; + + String sitemap = writeSingleSiteMap(wsg); + assertEquals(expected, sitemap); + } + + public void testTooManyImages() throws Exception { + wsg = new GoogleExtensionSitemapGenerator("http://www.example.com", dir); + List images = new ArrayList(); + for(int i = 0; i <= 1000; i++) { + images.add(new Image("http://cdn.example.com/image" + i + ".jpg")); + } + try { + GoogleExtensionSitemapUrl url = new GoogleExtensionSitemapUrl.Options(LANDING_URL) + .images(images) + .priority(0.5) + .changeFreq(ChangeFreq.WEEKLY) + .lastMod(new Date(0)) + .build(); + fail("Too many images allowed"); + } catch (RuntimeException r) {} + } + + + + private String writeSingleSiteMap(GoogleExtensionSitemapGenerator wsg) { + List files = wsg.write(); + assertEquals("Too many files: " + files.toString(), 1, files.size()); + assertEquals("Sitemap misnamed", "sitemap.xml", files.get(0).getName()); + return TestUtil.slurpFileAndDelete(files.get(0)); + } + +} diff --git a/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java b/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java index 29c2d3c..1051023 100644 --- a/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java +++ b/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java @@ -154,7 +154,20 @@ public class SitemapGeneratorTest extends TestCase { String sitemap = writeSingleSiteMap(wsg); assertEquals(expected, sitemap); } - + + public void testUrlWithImages() throws Exception { + W3CDateFormat df = new W3CDateFormat(); + df.setTimeZone(W3CDateFormat.ZULU); + wsg = WebSitemapGenerator.builder("http://www.example.com", dir).dateFormat(df).autoValidate(true).build(); + + WebSitemapUrl url = new WebSitemapUrl.Options("http://www.example.com") + .build(); + wsg.addUrl(url); + + String sitemap = writeSingleSiteMap(wsg); + System.out.println(sitemap); + } + public void testBadUrl() throws Exception { wsg = new WebSitemapGenerator("http://www.example.com", dir); try { From 0ea636d005fb987366e784680559852645f1c60d Mon Sep 17 00:00:00 2001 From: thorkarlsson Date: Tue, 30 Oct 2018 14:12:30 +0700 Subject: [PATCH 2/7] Remove old version of image test --- .../sitemapgenerator/SitemapGeneratorTest.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java b/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java index 1051023..ac0be52 100644 --- a/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java +++ b/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java @@ -155,19 +155,6 @@ public class SitemapGeneratorTest extends TestCase { assertEquals(expected, sitemap); } - public void testUrlWithImages() throws Exception { - W3CDateFormat df = new W3CDateFormat(); - df.setTimeZone(W3CDateFormat.ZULU); - wsg = WebSitemapGenerator.builder("http://www.example.com", dir).dateFormat(df).autoValidate(true).build(); - - WebSitemapUrl url = new WebSitemapUrl.Options("http://www.example.com") - .build(); - wsg.addUrl(url); - - String sitemap = writeSingleSiteMap(wsg); - System.out.println(sitemap); - } - public void testBadUrl() throws Exception { wsg = new WebSitemapGenerator("http://www.example.com", dir); try { From 984d3ee661eaea7d0e6fec0318274c93926dfee2 Mon Sep 17 00:00:00 2001 From: Matthias Kurz Date: Sat, 26 Jan 2019 22:51:35 +0100 Subject: [PATCH 3/7] Spaces --- .../java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java b/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java index ac0be52..29c2d3c 100644 --- a/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java +++ b/src/test/java/com/redfin/sitemapgenerator/SitemapGeneratorTest.java @@ -154,7 +154,7 @@ public class SitemapGeneratorTest extends TestCase { String sitemap = writeSingleSiteMap(wsg); assertEquals(expected, sitemap); } - + public void testBadUrl() throws Exception { wsg = new WebSitemapGenerator("http://www.example.com", dir); try { From 3d11a1a9ef70dea6cc52d3047bc41296bac77ab2 Mon Sep 17 00:00:00 2001 From: Matthias Kurz Date: Sat, 26 Jan 2019 23:00:11 +0100 Subject: [PATCH 4/7] Removed TODO's They are done already --- .../com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java b/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java index 2ce4a05..c8f30d6 100644 --- a/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java +++ b/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java @@ -8,8 +8,6 @@ import java.util.List; /** Configurable sitemap url with support for Google extensions * @see Manage your sitemaps - * - * TODO Add support for video tags and news tags */ public class GoogleExtensionSitemapUrl extends WebSitemapUrl { From 7bbc640e6ea79166baeb8ffb4c0adbb37dcbd8d3 Mon Sep 17 00:00:00 2001 From: Matthias Kurz Date: Sat, 26 Jan 2019 23:02:02 +0100 Subject: [PATCH 5/7] Renamed GoogleExtension* classes/files to GoogleImage* --- ....java => GoogleImageSitemapGenerator.java} | 30 +++++++++---------- ...mapUrl.java => GoogleImageSitemapUrl.java} | 14 ++++----- ...st.java => GoogleImageSitemapUrlTest.java} | 22 +++++++------- 3 files changed, 33 insertions(+), 33 deletions(-) rename src/main/java/com/redfin/sitemapgenerator/{GoogleExtensionSitemapGenerator.java => GoogleImageSitemapGenerator.java} (72%) rename src/main/java/com/redfin/sitemapgenerator/{GoogleExtensionSitemapUrl.java => GoogleImageSitemapUrl.java} (80%) rename src/test/java/com/redfin/sitemapgenerator/{GoogleExtensionSitemapUrlTest.java => GoogleImageSitemapUrlTest.java} (88%) diff --git a/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapGenerator.java b/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapGenerator.java similarity index 72% rename from src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapGenerator.java rename to src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapGenerator.java index 9d09bd5..ab38c8d 100644 --- a/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapGenerator.java +++ b/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapGenerator.java @@ -8,10 +8,10 @@ import java.net.URL; * Builds an extended sitemap with google support for google extensions. To configure options use {@link #builder(URL, File)} * @see Manage your sitemaps * */ -public class GoogleExtensionSitemapGenerator extends SitemapGenerator { +public class GoogleImageSitemapGenerator extends SitemapGenerator { - GoogleExtensionSitemapGenerator(AbstractSitemapGeneratorOptions options) { - super(options, new GoogleExtensionSitemapGenerator.Renderer()); + GoogleImageSitemapGenerator(AbstractSitemapGeneratorOptions options) { + super(options, new GoogleImageSitemapGenerator.Renderer()); } /** Configures the generator with a base URL and directory to write the sitemap files. @@ -20,7 +20,7 @@ public class GoogleExtensionSitemapGenerator extends SitemapGenerator builder(URL baseUrl, File baseDir) { - return new SitemapGeneratorBuilder(baseUrl, baseDir, GoogleExtensionSitemapGenerator.class); + public static SitemapGeneratorBuilder builder(URL baseUrl, File baseDir) { + return new SitemapGeneratorBuilder(baseUrl, baseDir, GoogleImageSitemapGenerator.class); } /** Configures a builder so you can specify sitemap generator options @@ -71,21 +71,21 @@ public class GoogleExtensionSitemapGenerator extends SitemapGenerator builder(String baseUrl, File baseDir) throws MalformedURLException { - return new SitemapGeneratorBuilder(baseUrl, baseDir, GoogleExtensionSitemapGenerator.class); + public static SitemapGeneratorBuilder builder(String baseUrl, File baseDir) throws MalformedURLException { + return new SitemapGeneratorBuilder(baseUrl, baseDir, GoogleImageSitemapGenerator.class); } - private static class Renderer extends AbstractSitemapUrlRenderer implements ISitemapUrlRenderer { + private static class Renderer extends AbstractSitemapUrlRenderer implements ISitemapUrlRenderer { - public Class getUrlClass() { - return GoogleExtensionSitemapUrl.class; + public Class getUrlClass() { + return GoogleImageSitemapUrl.class; } public String getXmlNamespaces() { return "xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\""; } - public void render(GoogleExtensionSitemapUrl url, StringBuilder sb, W3CDateFormat dateFormat) { + public void render(GoogleImageSitemapUrl url, StringBuilder sb, W3CDateFormat dateFormat) { StringBuilder tagSb = new StringBuilder(); for(Image image : url.getImages()) { diff --git a/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java b/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrl.java similarity index 80% rename from src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java rename to src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrl.java index c8f30d6..1ce272f 100644 --- a/src/main/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrl.java +++ b/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrl.java @@ -9,19 +9,19 @@ import java.util.List; /** Configurable sitemap url with support for Google extensions * @see Manage your sitemaps */ -public class GoogleExtensionSitemapUrl extends WebSitemapUrl { +public class GoogleImageSitemapUrl extends WebSitemapUrl { private final List images; - public GoogleExtensionSitemapUrl(String url) throws MalformedURLException { + public GoogleImageSitemapUrl(String url) throws MalformedURLException { this(new Options(url)); } - public GoogleExtensionSitemapUrl(URL url) { + public GoogleImageSitemapUrl(URL url) { this(new Options(url)); } - public GoogleExtensionSitemapUrl(Options options) { + public GoogleImageSitemapUrl(Options options) { super(options); this.images = options.images; } @@ -34,17 +34,17 @@ public class GoogleExtensionSitemapUrl extends WebSitemapUrl { } /** Options to configure Google Extension URLs */ - public static class Options extends AbstractSitemapUrlOptions { + public static class Options extends AbstractSitemapUrlOptions { private List images; public Options(URL url) { - super(url, GoogleExtensionSitemapUrl.class); + super(url, GoogleImageSitemapUrl.class); images = new ArrayList(); } public Options(String url) throws MalformedURLException { - super(url, GoogleExtensionSitemapUrl.class); + super(url, GoogleImageSitemapUrl.class); images = new ArrayList(); } diff --git a/src/test/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrlTest.java b/src/test/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrlTest.java similarity index 88% rename from src/test/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrlTest.java rename to src/test/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrlTest.java index dee0287..7c57edc 100644 --- a/src/test/java/com/redfin/sitemapgenerator/GoogleExtensionSitemapUrlTest.java +++ b/src/test/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrlTest.java @@ -9,12 +9,12 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -public class GoogleExtensionSitemapUrlTest extends TestCase { +public class GoogleImageSitemapUrlTest extends TestCase { private static final URL LANDING_URL = newURL("http://www.example.com/index.html"); private static final URL CONTENT_URL = newURL("http://www.example.com/index.flv"); File dir; - GoogleExtensionSitemapGenerator wsg; + GoogleImageSitemapGenerator wsg; private static URL newURL(String url) { try { @@ -41,8 +41,8 @@ public class GoogleExtensionSitemapUrlTest extends TestCase { } public void testSimpleUrl() throws Exception { - wsg = new GoogleExtensionSitemapGenerator("http://www.example.com", dir); - GoogleExtensionSitemapUrl url = new GoogleExtensionSitemapUrl(LANDING_URL); + wsg = new GoogleImageSitemapGenerator("http://www.example.com", dir); + GoogleImageSitemapUrl url = new GoogleImageSitemapUrl(LANDING_URL); url.addImage(new Image("http://cdn.example.com/image1.jpg")); url.addImage(new Image("http://cdn.example.com/image2.jpg")); wsg.addUrl(url); @@ -63,8 +63,8 @@ public class GoogleExtensionSitemapUrlTest extends TestCase { } public void testBaseOptions() throws Exception { - wsg = new GoogleExtensionSitemapGenerator("http://www.example.com", dir); - GoogleExtensionSitemapUrl url = new GoogleExtensionSitemapUrl.Options(LANDING_URL) + wsg = new GoogleImageSitemapGenerator("http://www.example.com", dir); + GoogleImageSitemapUrl url = new GoogleImageSitemapUrl.Options(LANDING_URL) .images(new Image("http://cdn.example.com/image1.jpg"), new Image("http://cdn.example.com/image2.jpg")) .priority(0.5) .changeFreq(ChangeFreq.WEEKLY) @@ -93,8 +93,8 @@ public class GoogleExtensionSitemapUrlTest extends TestCase { } public void testImageOptions() throws Exception { - wsg = new GoogleExtensionSitemapGenerator("http://www.example.com", dir); - GoogleExtensionSitemapUrl url = new GoogleExtensionSitemapUrl.Options(LANDING_URL) + wsg = new GoogleImageSitemapGenerator("http://www.example.com", dir); + GoogleImageSitemapUrl url = new GoogleImageSitemapUrl.Options(LANDING_URL) .images(new Image.ImageBuilder("http://cdn.example.com/image1.jpg") .title("image1.jpg") .caption("An image of the number 1") @@ -142,13 +142,13 @@ public class GoogleExtensionSitemapUrlTest extends TestCase { } public void testTooManyImages() throws Exception { - wsg = new GoogleExtensionSitemapGenerator("http://www.example.com", dir); + wsg = new GoogleImageSitemapGenerator("http://www.example.com", dir); List images = new ArrayList(); for(int i = 0; i <= 1000; i++) { images.add(new Image("http://cdn.example.com/image" + i + ".jpg")); } try { - GoogleExtensionSitemapUrl url = new GoogleExtensionSitemapUrl.Options(LANDING_URL) + GoogleImageSitemapUrl url = new GoogleImageSitemapUrl.Options(LANDING_URL) .images(images) .priority(0.5) .changeFreq(ChangeFreq.WEEKLY) @@ -160,7 +160,7 @@ public class GoogleExtensionSitemapUrlTest extends TestCase { - private String writeSingleSiteMap(GoogleExtensionSitemapGenerator wsg) { + private String writeSingleSiteMap(GoogleImageSitemapGenerator wsg) { List files = wsg.write(); assertEquals("Too many files: " + files.toString(), 1, files.size()); assertEquals("Sitemap misnamed", "sitemap.xml", files.get(0).getName()); From edcec3bd5c6a65cfd06e046bc258acfe57847480 Mon Sep 17 00:00:00 2001 From: Matthias Kurz Date: Sun, 27 Jan 2019 14:09:36 +0100 Subject: [PATCH 6/7] Change comments --- .../sitemapgenerator/GoogleImageSitemapGenerator.java | 2 +- .../com/redfin/sitemapgenerator/GoogleImageSitemapUrl.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapGenerator.java b/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapGenerator.java index ab38c8d..6961a6a 100644 --- a/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapGenerator.java +++ b/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapGenerator.java @@ -5,7 +5,7 @@ import java.net.MalformedURLException; import java.net.URL; /** - * Builds an extended sitemap with google support for google extensions. To configure options use {@link #builder(URL, File)} + * Builds a sitemap for Google Image search. To configure options use {@link #builder(URL, File)} * @see Manage your sitemaps * */ public class GoogleImageSitemapGenerator extends SitemapGenerator { diff --git a/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrl.java b/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrl.java index 1ce272f..5e18c80 100644 --- a/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrl.java +++ b/src/main/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrl.java @@ -6,8 +6,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -/** Configurable sitemap url with support for Google extensions - * @see Manage your sitemaps +/** One configurable Google Image Search URL. To configure, use {@link Options} + * + * @see Options + * @see Creating Image Sitemaps */ public class GoogleImageSitemapUrl extends WebSitemapUrl { From 954b0d3c4277ec60846fe2b17587bc8f2aa305c4 Mon Sep 17 00:00:00 2001 From: Matthias Kurz Date: Sun, 27 Jan 2019 14:16:34 +0100 Subject: [PATCH 7/7] Remove last modified in tests, causes problems (timezones) --- .../redfin/sitemapgenerator/GoogleImageSitemapUrlTest.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/test/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrlTest.java b/src/test/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrlTest.java index 7c57edc..d6f694f 100644 --- a/src/test/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrlTest.java +++ b/src/test/java/com/redfin/sitemapgenerator/GoogleImageSitemapUrlTest.java @@ -68,7 +68,6 @@ public class GoogleImageSitemapUrlTest extends TestCase { .images(new Image("http://cdn.example.com/image1.jpg"), new Image("http://cdn.example.com/image2.jpg")) .priority(0.5) .changeFreq(ChangeFreq.WEEKLY) - .lastMod(new Date(0)) .build(); wsg.addUrl(url); @@ -76,7 +75,6 @@ public class GoogleImageSitemapUrlTest extends TestCase { "\n" + " \n" + " http://www.example.com/index.html\n" + - " 1970-01-01T08:00+08:00\n" + " weekly\n" + " 0.5\n" + " \n" + @@ -109,7 +107,6 @@ public class GoogleImageSitemapUrlTest extends TestCase { .build()) .priority(0.5) .changeFreq(ChangeFreq.WEEKLY) - .lastMod(new Date(0)) .build(); wsg.addUrl(url); @@ -117,7 +114,6 @@ public class GoogleImageSitemapUrlTest extends TestCase { "\n" + " \n" + " http://www.example.com/index.html\n" + - " 1970-01-01T08:00+08:00\n" + " weekly\n" + " 0.5\n" + " \n" + @@ -152,7 +148,6 @@ public class GoogleImageSitemapUrlTest extends TestCase { .images(images) .priority(0.5) .changeFreq(ChangeFreq.WEEKLY) - .lastMod(new Date(0)) .build(); fail("Too many images allowed"); } catch (RuntimeException r) {}