org.focusns.common.web.page.config.xml.XmlPageFactory.java Source code

Java tutorial

Introduction

Here is the source code for org.focusns.common.web.page.config.xml.XmlPageFactory.java

Source

package org.focusns.common.web.page.config.xml;

/*
 * #%L
 * FocusSNS Runtime
 * %%
 * Copyright (C) 2011 - 2013 FocusSNS
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation, either version 2.1 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Lesser Public License for more details.
 *
 * You should have received a copy of the GNU General Lesser Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/lgpl-2.1.html>.
 * #L%
 */

import org.focusns.common.web.page.config.PageConfig;
import org.focusns.common.web.page.config.PositionConfig;
import org.focusns.common.web.page.config.WidgetConfig;
import org.focusns.common.xml.XmlParser;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternUtils;
import org.springframework.util.StringUtils;
import org.springframework.util.xml.DomUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class XmlPageFactory extends AbstractPageFactory implements ResourceLoaderAware {

    private String prefix = "/WEB-INF/pages";
    private String suffix = ".xml";

    private ResourceLoader resourceLoader;

    private XmlParser xmlParser = new XmlParser();

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }

    public void setSuffix(String suffix) {
        this.suffix = suffix;
    }

    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }

    @Override
    protected List<PageConfig> loadPages() throws Exception {
        //
        Map<String, PageConfig> abstractPageConfigMap = new HashMap<String, PageConfig>();
        List<PageConfig> pageConfigList = new ArrayList<PageConfig>();
        //
        ResourcePatternResolver rpr = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
        Resource[] resources = rpr.getResources(prefix + "/**/*" + suffix);
        // parse abstract pages
        for (Resource resource : resources) {
            Document xmlDoc = xmlParser.parseAndValidate(resource);
            Element pagesEle = xmlDoc.getDocumentElement();
            List<Element> pageEles = DomUtils.getChildElementsByTagName(pagesEle, "page");
            for (Element pageEle : pageEles) {
                String abstractAttr = pageEle.getAttribute("abstract");
                if (StringUtils.hasText(abstractAttr)) {
                    PageConfig pageConfig = parsePageConfigFile(pageEle);
                    abstractPageConfigMap.put(abstractAttr, pageConfig);
                }
            }
        }
        // parse pages
        for (Resource resource : resources) {
            Document xmlDoc = xmlParser.parseAndValidate(resource);
            Element pagesEle = xmlDoc.getDocumentElement();
            List<Element> pageEles = DomUtils.getChildElementsByTagName(pagesEle, "page");
            for (Element pageEle : pageEles) {
                String abstractAttr = pageEle.getAttribute("abstract");
                if (!StringUtils.hasText(abstractAttr)) {
                    PageConfig pageConfig = parsePageConfigFile(pageEle);
                    pageConfigList.add(pageConfig);
                }
            }
        }
        // merges pages
        List<PageConfig> mergedPageConfigList = new ArrayList<PageConfig>();
        for (PageConfig pageConfig : pageConfigList) {
            String extendsTarget = pageConfig.getParameters().get("extends");
            if (StringUtils.hasText(extendsTarget)) {
                PageConfig abstractPageConfig = abstractPageConfigMap.get(extendsTarget);
                //
                PageConfig newPageConfig = new PageConfig(pageConfig.getPath(), pageConfig.getLayout());
                newPageConfig.setAuthority(pageConfig.getAuthority());
                newPageConfig.setParameters(pageConfig.getParameters());
                // add widget from abstract page
                for (String position : abstractPageConfig.getPositionConfigMap().keySet()) {
                    PositionConfig abstractPositionConfig = abstractPageConfig.getPositionConfigMap().get(position);
                    newPageConfig.addPositionConfig(abstractPositionConfig);
                }
                // add widget from extends page
                for (String position : pageConfig.getPositionConfigMap().keySet()) {
                    PositionConfig positionConfig = pageConfig.getPositionConfigMap().get(position);
                    newPageConfig.addPositionConfig(positionConfig);
                }
                //
                mergedPageConfigList.add(newPageConfig);
            } else {
                mergedPageConfigList.add(pageConfig);
            }
        }
        //
        return mergedPageConfigList;
    }

    private PageConfig parsePageConfigFile(Element pageEle) {
        //
        String path = pageEle.getAttribute("path");
        String layout = pageEle.getAttribute("layout");
        String authority = pageEle.getAttribute("authority");
        Map<String, String> parameters = getParameters(pageEle);
        //
        PageConfig pageConfig = new PageConfig(path, layout);
        pageConfig.setAuthority(authority);
        pageConfig.setParameters(parameters);
        List<Element> positionEles = DomUtils.getChildElementsByTagName(pageEle, "position");
        for (Element positionEle : positionEles) {
            //
            String position = positionEle.getAttribute("name");
            PositionConfig positionConfig = new PositionConfig(pageConfig);
            positionConfig.setName(position);
            List<Element> widgetEles = DomUtils.getChildElementsByTagName(positionEle, "widget");
            for (Element widgetEle : widgetEles) {
                //
                String styleId = widgetEle.getAttribute("styleId");
                String styleClass = widgetEle.getAttribute("styleClass");
                //
                String context = widgetEle.getAttribute("context");
                String target = widgetEle.getAttribute("target");
                String mode = widgetEle.getAttribute("mode");
                String cache = widgetEle.getAttribute("cache");
                String order = widgetEle.getAttribute("order");
                //
                WidgetConfig widgetConfig = new WidgetConfig(positionConfig);
                widgetConfig.setStyleId(styleId);
                widgetConfig.setStyleClass(styleClass);
                widgetConfig.setContext(context);
                widgetConfig.setTarget(target);
                widgetConfig.setMode(mode);
                widgetConfig.setCache("".equals(cache) ? 0 : Integer.parseInt(cache));
                widgetConfig.setOrder("".equals(order) ? 0 : Integer.parseInt(order));
                // preference element
                Element preferenceEle = DomUtils.getChildElementByTagName(widgetEle, "preference");
                if (preferenceEle != null) {
                    for (Element prefEle : DomUtils.getChildElements(preferenceEle)) {
                        String name = prefEle.getAttribute("name");
                        String value = DomUtils.getTextValue(prefEle);
                        widgetConfig.getPreferences().put(name, value);
                    }
                }
                // navigation
                Element navigationEle = DomUtils.getChildElementByTagName(widgetEle, "navigation");
                if (navigationEle != null) {
                    Map<String, String> navigationMap = new HashMap<String, String>();
                    List<Element> eventEles = DomUtils.getChildElementsByTagName(navigationEle, "event");
                    for (Element eventEle : eventEles) {
                        String eventOn = eventEle.getAttribute("on");
                        String eventTo = DomUtils.getTextValue(eventEle);
                        navigationMap.put(eventOn, eventTo);
                    }
                    widgetConfig.setNavigationMap(navigationMap);
                }
                // validation
                Element validationEle = DomUtils.getChildElementByTagName(widgetEle, "validation");
                if (validationEle != null) {
                    widgetConfig.setValidationForm(validationEle.getAttribute("formId"));
                    Element targetEle = DomUtils.getChildElementByTagName(validationEle, "target");
                    if (targetEle != null) {
                        widgetConfig.setValidationTarget(DomUtils.getTextValue(targetEle).trim());
                    }
                    Element groupsEle = DomUtils.getChildElementByTagName(validationEle, "groups");
                    if (groupsEle != null) {
                        List<String> validationGroups = new ArrayList<String>();
                        List<Element> groupEles = DomUtils.getChildElementsByTagName(groupsEle, "group");
                        for (Element groupEle : groupEles) {
                            validationGroups.add(DomUtils.getTextValue(groupEle).trim());
                        }
                        widgetConfig.setValidationGroups(validationGroups);
                    }
                }
                //
                positionConfig.addWidgetConfig(widgetConfig);
                // pageConfig.addWidgetConfig(position, widgetConfig);
            }
            pageConfig.addPositionConfig(positionConfig);
        }
        //
        return pageConfig;
    }

    private Map<String, String> getParameters(Element pageEle) {
        Map<String, String> parameters = new HashMap<String, String>();
        NamedNodeMap nnm = pageEle.getAttributes();
        for (int i = 0; i < nnm.getLength(); i++) {
            Node node = nnm.item(i);
            String paramName = node.getNodeName();
            String paramValue = node.getNodeValue();
            parameters.put(paramName, paramValue);
        }
        return parameters;
    }

}