/***********************************************************************************************************************
 * Copyright (c) 2008 empolis GmbH and brox IT Solutions GmbH. All rights reserved. This program and the accompanying
 * materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors: August Georg Schmidt (brox IT Solutions GmbH) - initial API and implementation
 **********************************************************************************************************************/
package org.eclipse.smila.search;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.smila.search.datadictionary.DataDictionaryController;
import org.eclipse.smila.search.datadictionary.messages.datadictionary.DAnyFinderDataDictionaryCodec;
import org.eclipse.smila.search.datadictionary.messages.ddconfig.DConfigurationCodec;
import org.eclipse.smila.search.exceptions.AFException;
import org.eclipse.smila.search.search.tools.searchresult.DAnyFinderSearchResult;
import org.eclipse.smila.search.templates.NodeTransformerRegistryController;
import org.eclipse.smila.search.templates.TemplateRegistryController;
import org.eclipse.smila.search.templates.messages.fieldtemplates.DFieldTemplates;
import org.eclipse.smila.search.templates.messages.fieldtemplates.DFieldTemplatesCodec;
import org.eclipse.smila.search.templates.messages.nodetransformerregistry.DNodeTransformerRegistryCodec;
import org.eclipse.smila.search.templates.messages.searchtemplates.DSearchTemplates;
import org.eclipse.smila.search.templates.messages.searchtemplates.DSearchTemplatesCodec;
import org.eclipse.smila.search.tools.errormessage.DErrorMessage;
import org.eclipse.smila.search.tools.operationresult.DAnyFinderOperationResult;
import org.eclipse.smila.search.tools.operationresult.DAnyFinderOperationResultCodec;
import org.eclipse.smila.tools.XMLUtils;
import org.w3c.dom.Document;

/**
 * A Class class.
 * <P>
 * 
 * @author BROX IT-Solutions GmbH
 */
public class AFWebService extends Object {

  static {
    EIFActivator.registerSchemas();
  }

  /**
   * 
   */
  public AFWebService() {
  }

  /**
   * Recieves the query as an bytearray and retuns the Result as such.
   * 
   * @param anyFinderSearchStream
   *          Search query as byte[].
   * @return Search result as byte[].
   * 
   */
  public static byte[] search(final byte[] anyFinderSearchStream) {
    final Log log = LogFactory.getLog(AFWebService.class);
    byte[] result = new byte[0];
    try {
      // exceute search
      final DAnyFinderSearchResult searchResult = AFSearch.search(anyFinderSearchStream);
      result = AFSearch.toStream(searchResult);
    } catch (final AFException e) {
      log.error("", e);

      final DErrorMessage dErrorMessage = new DErrorMessage();

      dErrorMessage.setCode("AF-ERR");
      dErrorMessage.setMessage("AnyFinder Error");
      if (e.getMessage() != null) {
        dErrorMessage.setDetail(e.getMessage());
      } else {
        dErrorMessage.setDetail(e.getClass().getName());
      }
      dErrorMessage.setSource(AFWebService.class.getName());
      final DAnyFinderSearchResult dAnyFinderSearchResult = new DAnyFinderSearchResult();
      dAnyFinderSearchResult.setErrorMessage(dErrorMessage);
      log.error("", e);
      try {
        result = AFSearch.toStream(dAnyFinderSearchResult);
      } catch (final AFException e2) {
        log.error("", e);
      }
    }
    return result;
  }

  /**
   * Execute service functionality.
   * 
   * @param message
   *          Service XML message as byte[].
   * @return XML response.
   */
  public static byte[] service(byte[] message) {
    return AFService.process(message);
  }

  /**
   * Return resource as byte[].
   * 
   * @param resource
   *          Name of resource.
   * @param parameters
   *          Parameters for resource request.
   * @return Requested resource.
   */
  public static byte[] getResource(String resource, String parameters) {
    final Log log = LogFactory.getLog(AFWebService.class);
    byte[] result = new byte[0];

    try {
      if ("DataDictionary".equals(resource)) {
        final Document doc = DAnyFinderDataDictionaryCodec.encode(DataDictionaryController.getDataDictionary());
        result = XMLUtils.stream(doc.getDocumentElement(), true);
      } else if ("NodeTransformerRegistry".equals(resource)) {
        final Document doc =
          DNodeTransformerRegistryCodec.encode(NodeTransformerRegistryController.getNodeTransformer());
        result = XMLUtils.stream(doc.getDocumentElement(), true);     
      } else if ("SearchTemplates".equals(resource)) {
        final String indexName = parameters;
        if (indexName == null) {
          throw new AFException("paramerter missing for request [IndexName]");
        }

        final Document doc = DSearchTemplatesCodec.encode(TemplateRegistryController.getSearchTemplates(indexName));
        result = XMLUtils.stream(doc.getDocumentElement(), true);
      } else if ("DataDictionaryConfiguration".equals(resource)) {
        final String indexName = parameters;
        if (indexName == null) {
          throw new AFException("paramerter missing for request [IndexName]");
        }

        final Document doc =
          DConfigurationCodec.encode(DataDictionaryController.getIndex(indexName).getConfiguration());
        result = XMLUtils.stream(doc.getDocumentElement(), true);
      } else if ("FieldTemplates".equals(resource)) {
        final String indexName = parameters;
        if (indexName == null) {
          throw new AFException("paramerter missing for request [IndexName]");
        }

        final Document doc = DFieldTemplatesCodec.encode(TemplateRegistryController.getFieldTemplates(indexName));
        result = XMLUtils.stream(doc.getDocumentElement(), true);
      } else if ("EngineData".equals(resource)) {
        return AFConfiguration.getEngineData();
      } else {
        final DErrorMessage dErrorMessage = new DErrorMessage();
        dErrorMessage.setCode("AF-ERR");
        dErrorMessage.setMessage("AnyFinder Error");
        dErrorMessage.setDetail("unknown resource [" + resource + "]");
        dErrorMessage.setSource(AFWebService.class.getName());
        final DAnyFinderOperationResult or = new DAnyFinderOperationResult();
        or.setErrorMessage(dErrorMessage);
        or.setStatus(DAnyFinderOperationResult.ST_FAILURE);

        try {
          final Document doc = DAnyFinderOperationResultCodec.encode(or);
          result = XMLUtils.stream(doc.getDocumentElement(), true, true);
        } catch (final Throwable ex) {
          log.error(ex.getMessage(), ex);
        }
      }
    } catch (final Throwable e) {
      final DErrorMessage dErrorMessage = new DErrorMessage();
      dErrorMessage.setCode("AF-ERR");
      dErrorMessage.setMessage("AnyFinder Error");
      if (e.getMessage() != null) {
        dErrorMessage.setDetail(e.getMessage());
      } else {
        dErrorMessage.setDetail(e.getClass().getName());
      }
      dErrorMessage.setSource(AFWebService.class.getName());
      final DAnyFinderOperationResult or = new DAnyFinderOperationResult();
      or.setErrorMessage(dErrorMessage);
      or.setStatus(DAnyFinderOperationResult.ST_FAILURE);

      try {
        final Document doc = DAnyFinderOperationResultCodec.encode(or);
        result = XMLUtils.stream(doc.getDocumentElement(), true, true);
      } catch (final Throwable ex) {
        log.error(ex.getMessage(), ex);
      }
    }

    return result;
  }

  public static byte[] setResource(String resource, String parameters, byte[] value) {
    final Log log = LogFactory.getLog(AFWebService.class);
    byte[] result = new byte[0];

    try {
      if ("SearchTemplates".equals(resource)) {
        final Document doc = XMLUtils.parse(value, true);
        final DSearchTemplates templates = DSearchTemplatesCodec.decode(doc.getDocumentElement());
        TemplateRegistryController.setSearchTemplates(templates);
      } else if ("FieldTemplates".equals(resource)) {
        final Document doc = XMLUtils.parse(value, true);
        final DFieldTemplates templates = DFieldTemplatesCodec.decode(doc.getDocumentElement());
        TemplateRegistryController.setFieldTemplates(templates);
      } else if ("DataDictionaryConfiguration".equals(resource)) {
        final String indexName = parameters;
        if (indexName == null) {
          throw new AFException("paramerter missing for request [IndexName]");
        }

        final Document doc = XMLUtils.parse(value, true);

        DataDictionaryController.setIndexConfiguration(indexName, DConfigurationCodec.decode(doc
          .getDocumentElement()));
      } else {
        final DErrorMessage dErrorMessage = new DErrorMessage();
        dErrorMessage.setCode("AF-ERR");
        dErrorMessage.setMessage("AnyFinder Error");
        dErrorMessage.setDetail("unknown resource [" + resource + "]");
        dErrorMessage.setSource(AFWebService.class.getName());
        final DAnyFinderOperationResult or = new DAnyFinderOperationResult();
        or.setErrorMessage(dErrorMessage);
        or.setStatus(DAnyFinderOperationResult.ST_FAILURE);

        try {
          final Document doc = DAnyFinderOperationResultCodec.encode(or);
          result = XMLUtils.stream(doc.getDocumentElement(), true, true);
        } catch (final Throwable ex) {
          log.error(ex.getMessage(), ex);
        }
      }

      final DAnyFinderOperationResult or = new DAnyFinderOperationResult();
      or.setStatus(DAnyFinderOperationResult.ST_OK);
      final Document doc = DAnyFinderOperationResultCodec.encode(or);
      result = XMLUtils.stream(doc.getDocumentElement(), true, true);

    } catch (final Throwable e) {
      final DErrorMessage dErrorMessage = new DErrorMessage();
      dErrorMessage.setCode("AF-ERR");
      dErrorMessage.setMessage("AnyFinder Error");
      if (e.getMessage() != null) {
        dErrorMessage.setDetail(e.getMessage());
      } else {
        dErrorMessage.setDetail(e.getClass().getName());
      }
      dErrorMessage.setSource(AFWebService.class.getName());
      final DAnyFinderOperationResult or = new DAnyFinderOperationResult();
      or.setErrorMessage(dErrorMessage);
      or.setStatus(DAnyFinderOperationResult.ST_FAILURE);

      try {
        final Document doc = DAnyFinderOperationResultCodec.encode(or);
        result = XMLUtils.stream(doc.getDocumentElement(), true, true);
      } catch (final Throwable ex) {
        log.error(ex.getMessage(), ex);
      }
    }

    return result;
  }

} // end class def.
