com.enonic.cms.upgrade.task.datasource.DataSourceConverter2.java Source code

Java tutorial

Introduction

Here is the source code for com.enonic.cms.upgrade.task.datasource.DataSourceConverter2.java

Source

/*
 * Copyright 2000-2013 Enonic AS
 * http://www.enonic.com/license
 */

package com.enonic.cms.upgrade.task.datasource;

import java.util.List;

import org.jdom.Comment;
import org.jdom.Element;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;

import com.enonic.cms.upgrade.task.datasource.method.DataSourceMethodConverter;
import com.enonic.cms.upgrade.task.datasource.method.DataSourceMethodConverters;
import com.enonic.cms.upgrade.task.datasource.method.MethodElementBuilder;

import static com.enonic.cms.upgrade.task.datasource.JDOMDocumentHelper.copyAttributeIfExists;
import static com.enonic.cms.upgrade.task.datasource.JDOMDocumentHelper.findElements;
import static com.enonic.cms.upgrade.task.datasource.JDOMDocumentHelper.getTextNode;

public final class DataSourceConverter2 extends DataSourceConverter {
    private final DataSourceMethodConverters converters;

    private final XMLOutputter xmlOutputter;

    public DataSourceConverter2(final DataSourceConverterLogger logger) {
        super(logger);
        this.converters = new DataSourceMethodConverters();
        this.xmlOutputter = new XMLOutputter(Format.getCompactFormat());
    }

    @Override
    public Element convert(final Element root) throws Exception {
        final Element result = new Element(root.getName());
        copyAttributeIfExists(root, result, "result-element");
        convertContext(root, result);

        for (final Element child : findElements(root, "datasource")) {
            convertMethod(child, result);
        }

        return result;
    }

    private MethodElementBuilder method(final String name) {
        return new MethodElementBuilder(name);
    }

    private void convertContext(final Element source, final Element target) {
        if ("true".equals(source.getAttributeValue("cookie-context"))) {
            target.addContent(method("getCookieContext").resultElement("context").build());
        }

        if ("true".equals(source.getAttributeValue("http-context"))) {
            target.addContent(method("getHttpContext").resultElement("context").build());
        }

        if ("true".equals(source.getAttributeValue("session-context"))) {
            target.addContent(method("getSessionContext").resultElement("context").build());
        }
    }

    private String[] findParameterValues(final Element source) {
        final List<String> list = Lists.newArrayList();
        for (final Element child : findElements(source, "parameter")) {
            list.add(getTextNode(child));
        }

        return Iterables.toArray(list, String.class);
    }

    private void convertMethod(final Element source, final Element result) {
        final String name = source.getAttributeValue("name");
        final String[] params = findParameterValues(source);

        final Element target = createMethod(name, params);

        if (target == null) {
            result.addContent(createComment(name, params, source));
            return;
        }

        copyAttributeIfExists(source, target, "result-element");
        copyAttributeIfExists(source, target, "cache");
        copyAttributeIfExists(source, target, "condition");
        result.addContent(target);
    }

    private Element createMethod(final String name, final String[] params) {
        final DataSourceMethodConverter converter = this.converters.get(name);
        if (converter == null) {
            return createExtension(name, params);
        }

        return converter.convert(params);
    }

    private Comment createComment(final String name, final String[] params, final Element elem) {
        this.logger.logWarning(currentContext + " : method name[" + name + "]with[" + params.length
                + "] parameters not found. Commenting out.");

        return new Comment(this.xmlOutputter.outputString(elem));
    }

    private Element createExtension(final String name, final String[] params) {
        if (!name.contains(".")) {
            return null;
        }

        final MethodElementBuilder builder = method("invokeExtension");
        builder.param("name", name);

        for (int i = 0; i < params.length; i++) {
            builder.param("param" + (i + 1), params[i]);
        }

        return builder.build();
    }
}