Package org.apache.tuscany.sca.contribution.processor.xml

Source Code of org.apache.tuscany.sca.contribution.processor.xml.AnyElementProcessor

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you 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 org.apache.tuscany.sca.contribution.processor.xml;

import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
import static javax.xml.stream.XMLStreamConstants.CHARACTERS;
import static javax.xml.stream.XMLStreamConstants.COMMENT;
import static javax.xml.stream.XMLStreamConstants.CDATA;

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

import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.XMLEvent;

import org.apache.tuscany.sca.contribution.Constants;
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;
import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
import org.apache.tuscany.sca.contribution.service.ContributionReadException;
import org.apache.tuscany.sca.contribution.service.ContributionResolveException;
import org.apache.tuscany.sca.monitor.Monitor;
import org.apache.tuscany.sca.contribution.processor.xml.XMLEventsStreamReader;

public class AnyElementProcessor implements StAXArtifactProcessor<Object> {
  private static final QName ANY_ELEMENT = new QName(Constants.XMLSCHEMA_NS,
      "anyElement");

  private XMLInputFactory xmlInputFactory;
  @SuppressWarnings("unused")
  private Monitor monitor;
  //Map<String, NamespaceContext> map = new HashMap<String, NamespaceContext>();

  public AnyElementProcessor(ModelFactoryExtensionPoint modelFactories,
      Monitor monitor) {
    xmlInputFactory = modelFactories.getFactory(XMLInputFactory.class);
    this.monitor = monitor;
  }

  public QName getArtifactType() {
    return ANY_ELEMENT;
  }

  public Class<Object> getModelType() {
    return Object.class;
  }

  /**
   * Reads the contetns of the unknown elements and generates a custom
   * implementation of XMLStreamReader i.e. XMLEventsStreamReader
   *
   * @param reader
   * @return
   * @throws XMLStreamException
   */
  @SuppressWarnings("unchecked")
  public Object read(XMLStreamReader reader) throws ContributionReadException, XMLStreamException {

    //Custom variables
    String currentElement = null;
    List eventsList = new ArrayList();
   
    Map<String, NamespaceContext> eventContext = new HashMap<String, NamespaceContext>();
   
    try{
      //Cast the block of unknown elements into document
      XMLDocumentStreamReader docReader = new XMLDocumentStreamReader(reader);
         
      XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(docReader);
     
      while (xmlEventReader.hasNext()) {
        XMLEvent event = xmlEventReader.nextEvent();
       
        //Populate the eventContext map with the current element's name and corresponding NamesapceContext
        if (currentElement != null && !(eventContext.containsKey(currentElement))) {
          eventContext.put(currentElement, reader.getNamespaceContext());
        }
       
        //Populate the list with the XMLEvents
        eventsList.add(event);
        if (event.isStartElement()) {
          currentElement = reader.getName().getLocalPart();
        }
        if (event.isEndDocument()) {
          return new XMLEventsStreamReader(eventsList, eventContext);
        }
      }
    }
    catch(Exception e){
      e.printStackTrace();
    }
    return null;
  }

  /**
   * Writes unknown portions back to the writer
   *
   * @param model
   * @param writer
   */
  public void write(Object model, XMLStreamWriter writer)
      throws XMLStreamException {
    if (!(model instanceof XMLStreamReader)) {
      return;
    }
    XMLStreamReader reader = (XMLStreamReader) model;
   
    int event = reader.getEventType();
    while (reader.hasNext()) {
      switch (event) {
      case START_ELEMENT:
                     
        writer.writeStartElement(reader.getPrefix(), reader
            .getLocalName(), reader.getNamespaceURI());
        for (int i = 1; i <= reader.getAttributeCount(); i++) {
          writer.writeAttribute(reader.getAttributePrefix(i), reader.getAttributeNamespace(i),
              reader.getAttributeLocalName(i), reader.getAttributeValue(i));
        }
        break;
       
      case CHARACTERS:
        writer.writeCharacters(reader.getText())
        break;
       
      case CDATA:       
        writer.writeCData(reader.getText());
        break;

      case END_ELEMENT:
        writer.writeEndElement();
        break;
      }
      if (reader.hasNext()) {
        event = reader.next();
      }
    }
  }

  public void resolve(Object model, ModelResolver resolver)
      throws ContributionResolveException {
    // TODO Auto-generated method stub

  }

}
TOP

Related Classes of org.apache.tuscany.sca.contribution.processor.xml.AnyElementProcessor

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.