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