/* Copyright (2007-2012) Schibsted ASA
* This file is part of Possom.
*
* Possom is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Possom is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Possom. If not, see <http://www.gnu.org/licenses/>.
*/
package no.sesat.search.mode.command;
import no.sesat.search.mode.config.NewsMyNewsCommandConfig;
import no.sesat.search.result.BasicResultList;
import no.sesat.search.result.ResultItem;
import no.sesat.search.result.ResultList;
import org.apache.log4j.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
*
* @version $Id$
*/
public final class NewsMyNewsSearchCommand extends AbstractSearchCommand {
private static final Logger LOG = Logger.getLogger(NewsMyNewsSearchCommand.class);
private static final Pattern cookiePattern = Pattern.compile("(?:\\A|\\|)([^\\|]+)\\:{2}([^\\|]+)\\|?");
/**
* @param cxt The context to execute in.
*/
public NewsMyNewsSearchCommand(Context cxt) {
super(cxt);
}
public ResultList<ResultItem> execute() {
LOG.debug("entering execute()");
final NewsMyNewsCommandConfig config = getSearchConfiguration();
String myNews = (String) context.getDataModel().getJunkYard().getValue("myNews");
LOG.debug("Cookie is: " + myNews);
if (myNews != null && myNews.length() > 0) {
final ResultList<ResultItem> mergedResult = new BasicResultList<ResultItem>();
Matcher matcher = cookiePattern.matcher(myNews);
int hitCount = 0;
while (matcher.find()) {
// count all cookies
hitCount++;
}
matcher.reset();
int position = 0;
int offset = getOffset();
for (int i = 0; i < offset; i++) {
// Forward matcher to correct place in cookie.
if (!matcher.find()) {
break;
}
}
while (matcher.find() && position < config.getResultsToReturn()) {
ResultList<ResultItem> collectedResult;
String commandName = null;
final String type = matcher.group(2);
if (type.equals("knippe")) {
commandName = "clusterMyNews" + position;
} else if (type.equals("sak")) {
commandName = "newsCase" + position;
} else if (type.equals("person")) {
commandName = "newsPerson" + position;
} else if (type.equals("art")) {
commandName = "article" + position;
}
if (commandName != null) {
try {
LOG.debug("Waiting for " + commandName);
collectedResult = getSearchResult(commandName, datamodel);
if (collectedResult != null
&& collectedResult.getResults().size() > 0) {
// Article
if(!(collectedResult.getResults().get(0) instanceof ResultList<?>)) {
ResultItem searchResultItem = collectedResult.getResults().get(0);
searchResultItem = searchResultItem.addField("type", type);
mergedResult.addResult(searchResultItem);
} else {
ResultList<ResultItem> searchResultItem
= (ResultList<ResultItem>) collectedResult.getResults().get(0);
final int lastSubPos = Math.min(collectedResult.getResults().size(), 4);
if (lastSubPos > 1) {
final ResultList<ResultItem> subSearchResults = new BasicResultList<ResultItem>();
subSearchResults.setHitCount(collectedResult.getHitCount());
searchResultItem.addResult(subSearchResults);
for (int i = 1; i < lastSubPos; i++) {
subSearchResults.addResult(collectedResult.getResults().get(i));
}
}
searchResultItem = searchResultItem.addField("type", type);
if (type.equals("sak") || type.equals("person")) {
searchResultItem = searchResultItem.addField("newsCase", matcher.group(1));
}
mergedResult.addResult(searchResultItem);
LOG.debug("Collected " + searchResultItem.getField("type") + ":" + searchResultItem.getField("title"));
}
} else {
LOG.debug("Command " + commandName + " is empty or wrong type: " + collectedResult);
}
} catch (InterruptedException e) {
LOG.error("Command was interrupted", e);
}
}
position++;
}
mergedResult.setHitCount(hitCount);
setNextOffset(mergedResult, config.getResultsToReturn());
return mergedResult;
} else {
LOG.info("Could not find cookie");
ResultList<ResultItem> searchResult = new BasicResultList<ResultItem>();
searchResult.setHitCount(0);
return searchResult;
}
}
private void setNextOffset(ResultList<ResultItem> searchResult, int returnedResults) {
int offset = getOffset();
if (offset + returnedResults < searchResult.getHitCount()) {
LOG.debug("Setting next offset to: " + (offset + returnedResults));
NewsEspSearchCommand.addNextOffsetField(offset + returnedResults, searchResult);
}
}
@Override
public NewsMyNewsCommandConfig getSearchConfiguration() {
return (NewsMyNewsCommandConfig) super.getSearchConfiguration();
}
}