/*********************************************************************************************************************** | |
* 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. |