blob: 07ba704e4ad817aa0e685e8c12daefffeba3eda4 [file] [log] [blame]
/***********************************************************************************************************************
* 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.