Package com.clarkparsia.empire.config.io.impl

Source Code of com.clarkparsia.empire.config.io.impl.XmlConfigReader

/*
* Copyright (c) 2009-2010 Clark & Parsia, LLC. <http://www.clarkparsia.com>
*
* 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 com.clarkparsia.empire.config.io.impl;

import com.clarkparsia.empire.config.io.ConfigReader;
import com.clarkparsia.empire.config.EmpireConfiguration;
import com.clarkparsia.empire.EmpireException;
import com.clarkparsia.empire.util.EmpireAnnotationProvider;
import com.clarkparsia.empire.util.BeanReflectUtil;

import java.io.InputStream;
import java.io.IOException;
import java.io.Reader;
import java.io.InputStreamReader;
import java.util.Map;
import java.util.HashMap;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

/**
* <p>ConfigReader implementation for reading configuration information from simple XML files.</p>
*
* @author   Michael Grove
* @since   0.6.4
* @version 0.6.5
*/
public class XmlConfigReader implements ConfigReader {
  /**
   * The logger
   */
  private static final Logger LOGGER = LoggerFactory.getLogger(ConfigReader.class.getName());

  private static final String NODE_ANNOTATION_PROVIDER = "annotationProvider";
  private static final String NODE_UNIT = "unit";

  private static final String NODE_NAME = "name";
  private static final String NODE_FACTORY = "factory";

  /**
   * @inheritDoc
   */
  public EmpireConfiguration read(final InputStream theStream) throws IOException, EmpireException {
    return read(new InputStreamReader(theStream));
  }

  /**
   * @inheritDoc
   */
  public EmpireConfiguration read(final Reader theStream) throws IOException, EmpireException {
    try {
      Document aDoc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(theStream));

      Map<String, String> aGeneralConfig = new HashMap<String, String>();
      Map<String, Map<String, String>> aUnitConfig = new HashMap<String, Map<String, String>>();

      Class<EmpireAnnotationProvider> aProvider = null;

      NodeList aEmpireChildren = aDoc.getDocumentElement().getChildNodes();
      for (int aIndex = 0; aIndex < aEmpireChildren.getLength(); aIndex++) {
        Node aChild = aEmpireChildren.item(aIndex);

        if (aChild.getNodeName().equals(NODE_ANNOTATION_PROVIDER)) {
          String aValue = aChild.getTextContent();

          try {
            aProvider = (Class<EmpireAnnotationProvider>) BeanReflectUtil.loadClass(aValue);
          }
          catch (ClassNotFoundException e) {
            LOGGER.warn("Annotation provider implementation '{}' cannot be found, please check your classpath.", aValue);
          }
          catch (ClassCastException e) {
            LOGGER.warn("Specified annotation provider implementation '{}' is not a valid EmpireAnnotationProvider.", aValue);
          }
        }
        else if (aChild.getNodeName().equals(NODE_UNIT)) {
          Map<String, String> aUnit = unitFromNode(aChild);

          aUnitConfig.put(aUnit.get(NODE_NAME), aUnit);
        }
        else {
          aGeneralConfig.put(aChild.getNodeName(), aChild.getTextContent());
        }
      }

      EmpireConfiguration aConfig = new EmpireConfiguration(aGeneralConfig, aUnitConfig);
      aConfig.setAnnotationProvider(aProvider);

      return aConfig;
    }
    catch (ParserConfigurationException e) {
      throw new IOException(e);
    }
    catch (SAXException e) {
      throw new IOException(e);
    }
  }

  private Map<String, String> unitFromNode(final Node theUnitNode) {
    Map<String, String> aUnit = new HashMap<String, String>();

    NodeList aChildren = theUnitNode.getChildNodes();
    for (int aIndex = 0; aIndex < aChildren.getLength(); aIndex++) {
      Node aChild = aChildren.item(aIndex);

      aUnit.put(aChild.getNodeName(), aChild.getTextContent());
    }

    return aUnit;
  }

  public static void main(String[] args) {
    String s = "<empire>\n" +
           "  <annotationProvider>com.clarkparsia.empire.util.PropertiesAnnotationProvider</annotationProvider>\n" +
              "  <foo>bar</foo>\n" +
           "  <baz>biz</baz>\n" +
           "\n" +
           "  <unit>\n" +
              "    <name>context1</name>\n" +
             "    <factory>com.clarkparsia.empire.sesame.RepositoryDataSourceFactory</factory>\n" +
             "    <url>http://localhost:8080/openrdf-sesame/</url>\n" +
             "    <repo>mem-rdf-db</repo>\n" +
           "  </unit>\n" +
             "\n" +
           "  <unit>\n" +
             "    <name>context2</name>\n" +
             "    <factory>com.clarkparsia.empire.jena.JenaTestDataSourceFactory</factory>\n" +
             "    <files>foo, bar, baz</files>\n" +
             "  </unit>\n" +
             "</empire>";
  }
}
TOP

Related Classes of com.clarkparsia.empire.config.io.impl.XmlConfigReader

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.