Java tutorial
/* * Copyright (C) 2012 Nicolas A. Brard-Nault * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sitemap4j.dom4j; import java.util.Iterator; import org.dom4j.Document; import org.dom4j.Element; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.sitemap4j.reader.RawSiteMap; import org.sitemap4j.reader.SiteMapReader; import org.sitemap4j.reader.UnableToParseSiteMapException; import org.sitemap4j.sitemap.SiteMap; import org.sitemap4j.sitemap.url.ChangeFrequency; import org.sitemap4j.sitemap.url.Location; import org.sitemap4j.sitemap.url.Priority; import org.sitemap4j.sitemap.url.SiteMapUrl; import org.sitemap4j.sitemap.url.SiteMapUrl.Builder; import com.google.common.collect.UnmodifiableIterator; /** * This implementation returns a SiteMap object to which is delegated the reading of the XML * input stream. The reading is done on an as-needed basis. * * @since 1.0 */ public class Dom4jSiteMapReader implements SiteMapReader { @Override public SiteMap read(final RawSiteMap rawSiteMap) throws UnableToParseSiteMapException { final Document document = Dom4jHelper.getDocumentFromRawSiteMap(rawSiteMap); final Element rootElement = document.getRootElement(); return new SiteMap() { @Override public Iterator<SiteMapUrl> iterator() { final Iterator<?> iterator = rootElement.elementIterator("url"); return new UnmodifiableIterator<SiteMapUrl>() { @Override public boolean hasNext() { return iterator.hasNext(); } @Override public SiteMapUrl next() { try { return extractSiteMapUrlFromElement((Element) iterator.next()); } catch (final UnableToParseSiteMapException e) { throw new RuntimeException(e); } } }; } }; } private static SiteMapUrl extractSiteMapUrlFromElement(final Element urlElement) throws UnableToParseSiteMapException { try { final Builder builder = SiteMapUrl.Builder.get(); final Element locationElement = urlElement.element("loc"); final Element lastModificationTimeElement = urlElement.element("lastmod"); final Element changeFrequencyElement = urlElement.element("changefreq"); final Element priorityElement = urlElement.element("priority"); builder.withLocation(Location.fromString(locationElement.getText())); if (lastModificationTimeElement != null) { builder.withLastModificationTime( new DateTime(lastModificationTimeElement.getText(), DateTimeZone.UTC)); } if (changeFrequencyElement != null) { builder.withChangeFrequency(ChangeFrequency.fromString(changeFrequencyElement.getText())); } if (priorityElement != null) { builder.withPriority(Priority.fromFloat(Float.valueOf(priorityElement.getText()))); } return builder.build(); } catch (final Throwable e) { throw new UnableToParseSiteMapException(e); } } public static Dom4jSiteMapReader create() { return new Dom4jSiteMapReader(); } }