Package co.pishfa.accelerate.initializer.core

Source Code of co.pishfa.accelerate.initializer.core.XmlMetaDataReader

package co.pishfa.accelerate.initializer.core;

import java.io.File;
import java.io.InputStream;

import org.apache.commons.lang3.StringUtils;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.jdom2.input.SAXBuilder;
import org.jdom2.input.sax.XMLReaderXSDFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import co.pishfa.accelerate.initializer.api.InitializerFactory;
import co.pishfa.accelerate.initializer.model.InitEntityMetaData;
import co.pishfa.accelerate.initializer.model.InitPropertyMetaData;

/**
* Reads {@link InitEntityMetaData} from an XML cofig file.
*
* @author Taha Ghasemi <taha.ghasemi@gmail.com>
*
*/
public class XmlMetaDataReader {

  private static final String INITIALIZER_METADATA_XSD = "/initializer-metadata.xsd";
  protected static final Namespace PISHFA_NS = Namespace.getNamespace("http://pishfa.co");

  private static final Logger log = LoggerFactory.getLogger(XmlMetaDataReader.class);

  protected InitializerFactory factory;

  public XmlMetaDataReader(InitializerFactory factory) {
    this.factory = factory;
  }

  public void processMetadata(InputStream input) throws Exception {
    Element root = getRootElement(input);
    for (Element entityElement : root.getChildren("entity", PISHFA_NS)) {
      InitEntityMetaData initEntity = processEntityElement(entityElement);
      factory.addInitEntity(initEntity);
    }
  }

  private Element getRootElement(InputStream configFile) throws Exception {
    File xsd = new File(getClass().getResource(INITIALIZER_METADATA_XSD).toURI());
    XMLReaderXSDFactory xsdFactory = new XMLReaderXSDFactory(xsd);
    SAXBuilder builder = new SAXBuilder(xsdFactory);
    Element root = builder.build(configFile).getRootElement();
    return root;
  }

  protected InitEntityMetaData processEntityElement(Element entityElement) throws ClassNotFoundException {
    String entityClazz = entityElement.getAttributeValue("class");
    String entityAlias = entityElement.getAttributeValue("alias");
    String entityKey = entityElement.getAttributeValue("key");
    InitEntityMetaData initEntity = new InitEntityMetaData(entityAlias, Class.forName(entityClazz), entityKey);
    String inherits = entityElement.getAttributeValue("inherits");
    if (!StringUtils.isEmpty(inherits)) {
      for (String inherit : inherits.split(",")) {
        InitEntityMetaData inheritEntity = factory.getInitEntityByAlias(inherit);
        if (inheritEntity != null) {
          for (InitPropertyMetaData property : inheritEntity.getProperties()) {
            initEntity.addProperty(property);
          }
        } else {
          log.error("Invalid alias " + inherit + " defined in inherits of entity " + initEntity.getAlias());
        }
      }
    }
    processEntityElementProperties(entityElement, initEntity);
    return initEntity;
  }

  protected void processEntityElementProperties(Element entityElement, InitEntityMetaData initEntity) {
    // read properties of an entity
    for (Element propertyElemement : entityElement.getChildren("property", PISHFA_NS)) {
      InitPropertyMetaData initProperty = processPropertyElement(propertyElemement);
      initEntity.addProperty(initProperty);
    }
  }

  protected InitPropertyMetaData processPropertyElement(Element propertyElemement) {
    String propName = propertyElemement.getAttributeValue("name");
    String propAlias = propertyElemement.getAttributeValue("alias");
    String propDefault = propertyElemement.getAttributeValue("default");
    String propDynamic = propertyElemement.getAttributeValue("dynamic");
    InitPropertyMetaData initProperty = new InitPropertyMetaData(propName, propAlias, propDefault,
        !"false".equals(propDynamic));
    return initProperty;
  }

}
TOP

Related Classes of co.pishfa.accelerate.initializer.core.XmlMetaDataReader

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.