view flys-client/src/main/java/de/intevation/flys/client/server/ThemeListingServiceImpl.java @ 2540:e75b15818435

Added a style chooser to the style editor to provide predefined styles and implemented a service to request theme styles. flys-client/trunk@4471 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Raimund Renkert <raimund.renkert@intevation.de>
date Wed, 23 May 2012 08:59:49 +0000
parents
children cd068ff7966d
line wrap: on
line source
package de.intevation.flys.client.server;

import java.util.Map;
import java.util.HashMap;

import javax.xml.xpath.XPathConstants;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Element;

import org.apache.log4j.Logger;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import de.intevation.artifacts.common.utils.XMLUtils;

import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
import de.intevation.artifacts.httpclient.http.HttpClient;
import de.intevation.artifacts.httpclient.http.HttpClientImpl;

import de.intevation.flys.client.shared.exceptions.ServerException;
import de.intevation.flys.client.shared.model.Style;
import de.intevation.flys.client.shared.model.StyleSetting;
import de.intevation.flys.client.client.services.ThemeListingService;


/**
 * This interface provides a method to list themes filtered by name.
 *
 * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
 */
public class ThemeListingServiceImpl
extends      RemoteServiceServlet
implements   ThemeListingService
{
    private static final Logger logger =
        Logger.getLogger(ThemeListingServiceImpl.class);


    private static final String XPATH_THEME_GROUPS = "/themes/themegroup";
    /** The error message key that is thrown if an error occured while reading
     * the supported rivers from server.*/
    public static final String ERROR_NO_GROUPS_FOUND = "error_no_groups_found";


    public Map<String, Style> list(String locale, String name)
    throws ServerException
    {
        String url = getServletContext().getInitParameter("server-url");

        Document doc = XMLUtils.newDocument();

        XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator(
            doc,
            null,
            null);

        Element e = ec.create("theme");
        ec.addAttr(e, "name", name);
        doc.appendChild(e);
        HttpClient client = new HttpClientImpl(url, locale);

        try {
            Document res = client.callService(url, "themelisting", doc);

            NodeList themeGroups = (NodeList) XMLUtils.xpath(
                res,
                XPATH_THEME_GROUPS,
                XPathConstants.NODESET,
                null);

            if (themeGroups == null || themeGroups.getLength() == 0) {
                throw new ServerException(ERROR_NO_GROUPS_FOUND);
            }

            int count = themeGroups.getLength();

            Map<String, Style> theStyles = new HashMap<String, Style>(count);

            for (int i = 0; i < count; i++) {
                Element tmp = (Element)themeGroups.item(i);

                String groupName = tmp.getAttribute("name");
                NodeList theTheme = (NodeList) XMLUtils.xpath(
                    tmp,
                    "theme",
                    XPathConstants.NODESET,
                    null);

                for (int j = 0; j < theTheme.getLength(); j++) {
                    Element elem = (Element) theTheme.item(j);
                    theStyles.put(groupName, getStyle(elem));
                }
            }

            return theStyles;
        }
        catch (ConnectionException ce) {
            logger.error(ce, ce);
        }

        throw new ServerException(ERROR_NO_GROUPS_FOUND);
    }


    protected Style getStyle (Element element) {
        if (!element.getTagName().equals("theme")) {
            return null;
        }

        NodeList list = element.getElementsByTagName("field");
        Style style = new Style();

        style.setName (element.getAttribute("name"));
        style.setFacet (element.getAttribute("facet"));

        try {
            int ndx = Integer.parseInt(element.getAttribute("index"));
            style.setIndex (ndx);
        }
        catch(NumberFormatException nfe) {
            return null;
        }

        for(int i = 0; i < list.getLength(); i++) {
            Element e = (Element) list.item(i);
            StyleSetting set = new StyleSetting (
                e.getAttribute("name"),
                e.getAttribute("default"),
                e.getAttribute("display"),
                e.getAttribute("hints"),
                e.getAttribute("type"));
            style.appendStyleSetting(set);
        }
        return style;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org