org.sitemap4j.dom4j.Dom4jSiteMapReader.java Source code

Java tutorial

Introduction

Here is the source code for org.sitemap4j.dom4j.Dom4jSiteMapReader.java

Source

/*
 * 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();
    }
}