/*********************************************************************
 * Copyright (c) 2004, 2007 Boeing
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Boeing - initial API and implementation
 **********************************************************************/

package org.eclipse.osee.ote.core.framework.saxparse;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.osee.framework.jdk.core.util.io.xml.AbstractSaxHandler;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Actual;
import org.eclipse.osee.ote.core.framework.saxparse.elements.AdditionalInfo;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Argument;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Attention;
import org.eclipse.osee.ote.core.framework.saxparse.elements.CheckGroup;
import org.eclipse.osee.ote.core.framework.saxparse.elements.CheckPoint;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Config;
import org.eclipse.osee.ote.core.framework.saxparse.elements.CurrentProcessor;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Debug;
import org.eclipse.osee.ote.core.framework.saxparse.elements.ElapsedTime;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Environment;
import org.eclipse.osee.ote.core.framework.saxparse.elements.ExecutedBy;
import org.eclipse.osee.ote.core.framework.saxparse.elements.ExecutionDate;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Expected;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Global;
import org.eclipse.osee.ote.core.framework.saxparse.elements.GroupName;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Info;
import org.eclipse.osee.ote.core.framework.saxparse.elements.InfoGroup;
import org.eclipse.osee.ote.core.framework.saxparse.elements.IsInteractive;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Location;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Message;
import org.eclipse.osee.ote.core.framework.saxparse.elements.MethodArguments;
import org.eclipse.osee.ote.core.framework.saxparse.elements.MethodName;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Name;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Notes;
import org.eclipse.osee.ote.core.framework.saxparse.elements.NumberOfTransmissions;
import org.eclipse.osee.ote.core.framework.saxparse.elements.ObjectName;
import org.eclipse.osee.ote.core.framework.saxparse.elements.OteLog;
import org.eclipse.osee.ote.core.framework.saxparse.elements.PropertyElementHandler;
import org.eclipse.osee.ote.core.framework.saxparse.elements.PropertyStoreElementHandler;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Qualification;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Requirement;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Result;
import org.eclipse.osee.ote.core.framework.saxparse.elements.RetryGroup;
import org.eclipse.osee.ote.core.framework.saxparse.elements.ReturnValue;
import org.eclipse.osee.ote.core.framework.saxparse.elements.RuntimeVersions;
import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptInit;
import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptName;
import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptResult;
import org.eclipse.osee.ote.core.framework.saxparse.elements.ScriptVersion;
import org.eclipse.osee.ote.core.framework.saxparse.elements.SoftKeyInfoGroup;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Stacktrace;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Summary;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Support;
import org.eclipse.osee.ote.core.framework.saxparse.elements.SystemInfo;
import org.eclipse.osee.ote.core.framework.saxparse.elements.TestCase;
import org.eclipse.osee.ote.core.framework.saxparse.elements.TestEventElement;
import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPoint;
import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPointName;
import org.eclipse.osee.ote.core.framework.saxparse.elements.TestPointResults;
import org.eclipse.osee.ote.core.framework.saxparse.elements.TestScript;
import org.eclipse.osee.ote.core.framework.saxparse.elements.ThrowableElement;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Time;
import org.eclipse.osee.ote.core.framework.saxparse.elements.TimeSummary;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Tracability;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Trace;
import org.eclipse.osee.ote.core.framework.saxparse.elements.TraceEnd;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Type;
import org.eclipse.osee.ote.core.framework.saxparse.elements.User;
import org.eclipse.osee.ote.core.framework.saxparse.elements.UutErrorEntry;
import org.eclipse.osee.ote.core.framework.saxparse.elements.UutLoggingInfo;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Value;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Version;
import org.eclipse.osee.ote.core.framework.saxparse.elements.VersionInformation;
import org.eclipse.osee.ote.core.framework.saxparse.elements.Witnesses;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

/**
 * XMLReader xmlReader = XMLReaderFactory.createXMLReader(); CollectionParser handler = new
 * CollectionParser(collectors); xmlReader.setContentHandler(handler); xmlReader.parse(new InputSource(inputStream));
 * 
 * @author Andrew M. Finkbeiner
 */
public class OteSaxHandler extends AbstractSaxHandler {

   Map<String, ElementHandlers> handlers;

   public OteSaxHandler() throws Exception {
      handlers = new HashMap<>();
      addHandlers(new Global());
      addHandlers(new AdditionalInfo());
      addHandlers(new Actual());
      addHandlers(new Argument());
      addHandlers(new Attention());
      addHandlers(new CheckGroup());
      addHandlers(new CheckPoint());
      addHandlers(new Config());
      addHandlers(new CurrentProcessor());
      addHandlers(new Debug());
      addHandlers(new ElapsedTime());
      addHandlers(new Environment());
      addHandlers(new ExecutedBy());
      addHandlers(new ExecutionDate());
      addHandlers(new Expected());
      addHandlers(new GroupName());
      addHandlers(new Info());
      addHandlers(new InfoGroup());
      addHandlers(new IsInteractive());
      addHandlers(new Location());
      addHandlers(new Message());
      addHandlers(new MethodArguments());
      addHandlers(new MethodName());
      addHandlers(new Name());
      addHandlers(new Notes());
      addHandlers(new org.eclipse.osee.ote.core.framework.saxparse.elements.Number());
      addHandlers(new NumberOfTransmissions());
      addHandlers(new ObjectName());
      addHandlers(new UutErrorEntry());
      addHandlers(new UutLoggingInfo());
      addHandlers(new OteLog());
      addHandlers(new PropertyStoreElementHandler());
      addHandlers(new PropertyElementHandler());
      addHandlers(new Qualification());
      addHandlers(new Requirement());
      addHandlers(new Result());
      addHandlers(new RetryGroup());
      addHandlers(new ReturnValue());
      addHandlers(new RuntimeVersions());
      addHandlers(new ScriptInit());
      addHandlers(new ScriptName());
      addHandlers(new ScriptResult());
      addHandlers(new ScriptVersion());
      addHandlers(new SoftKeyInfoGroup());
      addHandlers(new Stacktrace());
      addHandlers(new Summary());
      addHandlers(new Support());
      addHandlers(new SystemInfo());
      addHandlers(new TestCase());
      addHandlers(new TestPoint());
      addHandlers(new ThrowableElement());
      addHandlers(new TestEventElement());
      addHandlers(new TestPointName());
      addHandlers(new TestPointResults());
      addHandlers(new TestScript());
      addHandlers(new Time());
      addHandlers(new TimeSummary());
      addHandlers(new Tracability());
      addHandlers(new Trace());
      addHandlers(new TraceEnd());
      addHandlers(new Type());
      addHandlers(new User());
      addHandlers(new Value());
      addHandlers(new Version());
      addHandlers(new VersionInformation());
      addHandlers(new Witnesses());
   }

   @Override
   public void endElementFound(String uri, String localName, String name) throws SAXException {
      ElementHandlers handler;

      handler = handlers.get("*");
      if (handler != null) {
         handler.endElementFound(uri, localName, name, stripCData(getContents().trim()));
      }

      handler = handlers.get(name);
      if (handler != null) {
         handler.endElementFound(uri, localName, name, stripCData(getContents().trim()));
      }
   }

   private String stripCData(String content) {
      if (content.startsWith("<![CDATA[")) {
         return content.subSequence(9, content.length() - 3).toString();
      } else {
         return content;
      }

   }

   @Override
   public void startElementFound(String uri, String localName, String name, Attributes attributes) throws SAXException {
      ElementHandlers handler;

      handler = handlers.get("*");
      if (handler != null) {
         handler.startElementFound(uri, localName, name, attributes);
      }

      handler = handlers.get(name);
      if (handler != null) {
         handler.startElementFound(uri, localName, name, attributes);
      } else {
         System.out.println("No Handler for ELEMENT type " + name);
      }
   }

   public void addHandlers(ElementHandlers handler) throws Exception {
      Object obj = handlers.put(handler.getElementName(), handler);
      if (obj != null) {
         throw new Exception("Duplicate handler.");
      }
   }

   public ElementHandlers getHandler(String elementName) {
      return handlers.get(elementName);
   }
}