Author: gttersen
Date: 2007-04-17 19:32:17 +0200 (Tue, 17 Apr 2007)
New Revision: 4828
Modified:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/result/handler/AddCategoryNavigationResultHandler.java
trunk/query-transform-config-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformerConfig.java
trunk/query-transform-control-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformer.java
Log:
Changes for NewsAggregator
Modified:
trunk/core-api/src/main/java/no/schibstedsok/searchportal/result/handler/AddCategoryNavigationResultHandler.java
===================================================================
---
trunk/core-api/src/main/java/no/schibstedsok/searchportal/result/handler/AddCategoryNavigationResultHandler.java
2007-04-17 17:29:03 UTC (rev 4827)
+++
trunk/core-api/src/main/java/no/schibstedsok/searchportal/result/handler/AddCategoryNavigationResultHandler.java
2007-04-17 17:32:17 UTC (rev 4828)
@@ -3,20 +3,19 @@
import no.schibstedsok.searchportal.datamodel.DataModel;
import no.schibstedsok.searchportal.datamodel.generic.StringDataObject;
-import no.schibstedsok.searchportal.http.HTTPClient;
import no.schibstedsok.searchportal.result.FastSearchResult;
import no.schibstedsok.searchportal.result.Modifier;
+import no.schibstedsok.searchportal.site.config.DocumentLoader;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
-import org.jdom.Document;
-import org.jdom.Element;
-import org.jdom.JDOMException;
-import org.jdom.input.SAXBuilder;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
import java.util.ArrayList;
import java.util.List;
@@ -26,20 +25,23 @@
private static final String CMD_ATTR_ID = "id";
private static final Logger LOG =
Logger.getLogger(AddCategoryNavigationResultHandler.class);
- private String categoriesXml = "conf/categories.xml";
+ private static List<Category> categoryList;
+ private String categoriesXml = "categories.xml";
private String categoryFields;
public void handleResult(Context cxt, DataModel datamodel) {
try {
if (cxt.getSearchResult() instanceof FastSearchResult) {
- addCategoryNavigators(datamodel, (FastSearchResult)
cxt.getSearchResult(), parseCategories(datamodel));
+ if (categoryList == null) {
+ // This could happen more than once, but synchronize
overhead would be on every call, so it ok.
+ categoryList = parseCategories(cxt, datamodel);
+ }
+ addCategoryNavigators(datamodel, (FastSearchResult)
cxt.getSearchResult(), categoryList);
} else {
LOG.error("Can not use " +
AddCategoryNavigationResultHandler.class.getName() + " on a generic
searchResult. Must be a " + FastSearchResult.class.getName());
}
- } catch (IOException e) {
+ } catch (ParserConfigurationException e) {
LOG.error("Could not parse categories.", e);
- } catch (JDOMException e) {
- LOG.error("Could not parse categories.", e);
}
}
@@ -64,38 +66,23 @@
}
}
- private List<Category> parseCategories(DataModel datamodel) throws
IOException, JDOMException {
-
- final URL url = new URL("http://" +
datamodel.getSite().getSite().getName() +
datamodel.getSite().getSite().getConfigContext() + categoriesXml);
- LOG.debug("Loading categories xml from: " + url.toString());
- final HTTPClient client = HTTPClient.instance(url.getHost(),
url.getHost(), url.getPort());
- BufferedInputStream in = null;
- try {
- in = client.getBufferedStream(url.getHost(), url.getPath());
- Document doc = getDocument(in);
- final Element root = doc.getRootElement();
- return parseCategories(root);
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (Exception e) {
- // Ignoring
- }
- }
- }
+ private List<Category> parseCategories(Context cxt, DataModel datamodel)
throws ParserConfigurationException {
+ Document doc = getDocument(cxt, datamodel);
+ final Element root = doc.getDocumentElement();
+ return parseCategories(root);
}
- private Document getDocument(InputStream inputStream) throws
JDOMException, IOException {
- final SAXBuilder saxBuilder = new SAXBuilder();
- saxBuilder.setValidation(false);
- saxBuilder.setIgnoringElementContentWhitespace(true);
- return saxBuilder.build(inputStream);
+ private Document getDocument(Context cxt, DataModel dataModel) throws
ParserConfigurationException {
+ final DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
+ factory.setValidating(false);
+ final DocumentBuilder builder = factory.newDocumentBuilder();
+ DocumentLoader documentLoader =
cxt.newDocumentLoader(dataModel.getSite(), categoriesXml, builder);
+ documentLoader.abut();
+ return documentLoader.getDocument();
}
public List<Category> parseCategories(Element categoriesElement) {
- //noinspection unchecked
- List<Element> categoryElements =
categoriesElement.getChildren(CMD_ELEMENT_CATEGORY);
+ List<Element> categoryElements = getDirectChildren(categoriesElement,
CMD_ELEMENT_CATEGORY);
return parseCategories(categoryElements);
}
@@ -112,13 +99,24 @@
}
private Category parseCategory(Element categoryElement) {
- String id = categoryElement.getAttributeValue(CMD_ATTR_ID);
- String displayName =
categoryElement.getAttributeValue(CMD_ATTR_DISPLAY_NAME);
- //noinspection unchecked
- List<Category> subCategories =
parseCategories(categoryElement.getChildren(CMD_ELEMENT_CATEGORY));
+ String id = categoryElement.getAttribute(CMD_ATTR_ID);
+ String displayName =
categoryElement.getAttribute(CMD_ATTR_DISPLAY_NAME);
+ List<Category> subCategories =
parseCategories(getDirectChildren(categoryElement, CMD_ELEMENT_CATEGORY));
return new Category(id, displayName, subCategories);
}
+ private List<Element> getDirectChildren(Element element, String
elementName) {
+ ArrayList<Element> children = new ArrayList<Element>();
+ NodeList childNodes = element.getChildNodes();
+ for (int i = 0; i < childNodes.getLength(); i++) {
+ Node childNode = childNodes.item(i);
+ if (childNode instanceof Element &&
childNode.getNodeName().equals(elementName)) {
+ children.add((Element) childNode);
+ }
+ }
+ return children;
+ }
+
private String[] getCategoryFieldArray() {
return StringUtils.split(categoryFields, ',');
}
Modified:
trunk/query-transform-config-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformerConfig.java
===================================================================
---
trunk/query-transform-config-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformerConfig.java
2007-04-17 17:29:03 UTC (rev 4827)
+++
trunk/query-transform-config-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformerConfig.java
2007-04-17 17:32:17 UTC (rev 4828)
@@ -3,8 +3,14 @@
import
no.schibstedsok.searchportal.query.transform.AbstractQueryTransformerConfig.Controller;
+import org.apache.log4j.Logger;
import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* Checks if the query should be transformed from a ejb lookup on the
queryString. Transformation will replace
* the whole query.
@@ -16,19 +22,57 @@
public final class NewsCaseQueryTransformerConfig extends
AbstractQueryTransformerConfig {
private static final String QUERY_TYPE = "query-type";
+ private static final String QUERY_PARAMETER = "query-parameter";
+ private static final String TYPE_PARAMETER = "type-parameter";
+ private static final String PREFIX = "prefix";
+ private static final String POSTFIX = "postfix";
+ private static final String TYPE_NAME = "name";
+
+ private static final String DEFAULT_CONVERT_ELEMENT = "default-convert";
private String queryType;
+ private String queryParameter;
+ private String typeParameter;
+ private Map<String, String[]> typeConversions;
/**
- *
* @return
*/
- public String getQueryType(){
+ public String getQueryType() {
return queryType;
}
+ public String getQueryParameter() {
+ return queryParameter;
+ }
+
+ public String getTypeParameter() {
+ return typeParameter;
+ }
+
+ public Map<String, String[]> getTypeConversions() {
+ return typeConversions;
+ }
+
@Override
public NewsCaseQueryTransformerConfig readQueryTransformer(final Element
element) {
+ Logger log = Logger.getLogger(NewsCaseQueryTransformerConfig.class);
queryType = element.getAttribute(QUERY_TYPE);
+ queryParameter = element.getAttribute(QUERY_PARAMETER);
+ typeParameter = element.getAttribute(TYPE_PARAMETER);
+ NodeList convertNodeList =
element.getElementsByTagName(DEFAULT_CONVERT_ELEMENT);
+ if (convertNodeList.getLength() > 0) {
+ typeConversions = new HashMap<String, String[]>();
+ for (int i = 0; i < convertNodeList.getLength(); i++) {
+ final Node n = convertNodeList.item(i);
+ final Element convertElement = (Element) n;
+ final String name = convertElement.getAttribute(TYPE_NAME);
+ final String prefix = convertElement.getAttribute(PREFIX);
+ final String postfix = convertElement.getAttribute(POSTFIX);
+
+ log.debug("qwerty Adding conversion: " + name + "=" + prefix +
"$" + postfix);
+ typeConversions.put(name, new String[]{prefix, postfix});
+ }
+ }
return this;
}
Modified:
trunk/query-transform-control-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformer.java
===================================================================
---
trunk/query-transform-control-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformer.java
2007-04-17 17:29:03 UTC (rev 4827)
+++
trunk/query-transform-control-spi/src/main/java/no/schibstedsok/searchportal/query/transform/NewsCaseQueryTransformer.java
2007-04-17 17:32:17 UTC (rev 4828)
@@ -10,8 +10,11 @@
import java.util.Properties;
/**
- * Checks if the query should be transformed from a ejb lookup on the
queryString. Transformation will replace
+ * Checks if the query should be transformed from a ejb lookup on the
queryParameter. Transformation will replace
* the whole query.
+ * <p/>
+ * <b>Note:</b> This queryTransformer ignores all earlier transforms on the
query. All transforms to the resulting
+ * query should be done after this.
*/
public final class NewsCaseQueryTransformer extends AbstractQueryTransformer {
private final static Logger LOG =
Logger.getLogger(NewsCaseQueryTransformer.class);
@@ -33,11 +36,11 @@
*/
public void visitImpl(final Clause clause) {
dataAccess.setProperties(getContext().getDataModel().getSite().getSiteConfiguration().getProperties());
- String queryString = getTransformedQueryString();
+ String queryString = (String)
getContext().getDataModel().getJunkYard().getValue(config.getQueryParameter());
LOG.debug("Original query is: '" + queryString + "'");
String transformedQuery = dataAccess.getQuery(queryString,
config.getQueryType());
if (transformedQuery == null) {
- transformedQuery = '"' +
getContext().getQuery().getQueryString().trim() + '"';
+ transformedQuery = defaultTransform(queryString);
}
for (Clause keyClause : getContext().getTransformedTerms().keySet()) {
getContext().getTransformedTerms().put(keyClause, "");
@@ -50,12 +53,17 @@
}
- private String getTransformedQueryString() {
- StringBuilder sb = new StringBuilder();
- for (Clause keyClause : getContext().getTransformedTerms().keySet()) {
-
sb.append(getContext().getTransformedTerms().get(keyClause)).append(' ');
+ private String defaultTransform(String queryString) {
+ if (config.getTypeConversions() != null) {
+ String type = (String)
getContext().getDataModel().getJunkYard().getValue(config.getTypeParameter());
+ if (type != null) {
+ String[] conversion = config.getTypeConversions().get(type);
+ if (conversion != null) {
+ return conversion[0] + queryString + conversion[1];
+ }
+ }
}
- return sb.toString();
+ return '"' + queryString + '"';
}
/**
_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits