package org.korsakow.services.finder;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.xml.xpath.XPathExpressionException;
import org.korsakow.ide.DataRegistry;
import org.korsakow.ide.NodeListResultSet;
import org.korsakow.ide.XPathHelper;
import org.korsakow.ide.util.DomUtil;
import org.korsakow.services.tdg.SnuTDG;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class SnuFinder
{
public static ResultSet find(long id) throws XPathExpressionException{
Element element = DataRegistry.getHelper().findElementByIdTag(id);
ListNodeList nodeList = new ListNodeList();
if (element != null) {
if (!element.getTagName().equals(SnuTDG.NODE_NAME))
throw new XPathExpressionException("Expected '" + SnuTDG.NODE_NAME + "', found '" + element.getTagName() + "'");
nodeList.add(element);
}
return new NodeListResultSet(nodeList);
}
public static ResultSet findByInterfaceId(long id) throws XPathExpressionException{
return DataRegistry.getHelper().xpathAsResultSet(XPathHelper.formatQuery("/korsakow/snus/Snu[interfaceId=?]", id));
}
public static ResultSet findByMainMediaId(long id) throws XPathExpressionException{
NodeList allSnuList = DataRegistry.getDocument().getElementsByTagName("Snu");
int allSnuListLength = allSnuList.getLength();
List<Node> results = new ArrayList<Node>();
for (int i = 0; i < allSnuListLength; ++i)
{
Element item = (Element)allSnuList.item(i);
Long mainMediaId = DomUtil.getLong(item, "mainMediaId");
if (mainMediaId != null && mainMediaId == id)
results.add(item);
}
return new NodeListResultSet(new ListNodeList(results));
}
// public static ResultSet findBySoundId(long id) throws XPathExpressionException{
// return DataRegistry.getHelper().xpathAsResultSet(XPathHelper.formatQuery("/korsakow/snus/Snu[backgroundSoundId=?]", id));
// }
public static ResultSet findByPreviewMediaId(long id) throws XPathExpressionException {
return DataRegistry.getHelper().xpathAsResultSet(XPathHelper.formatQuery("/korsakow/snus/Snu[previewMediaId=?]", id));
}
public static ResultSet findByName(String keyword) throws XPathExpressionException {
List<Node> results = new ArrayList<Node>();
Set<Node> resultSet = new HashSet<Node>();
Element top = DomUtil.findElementByPath(DataRegistry.getDocument(), "/korsakow/snus");
Collection<Element> snus = DomUtil.findChildrenByTagName(top, "Snu");
for (Element snu : snus)
{
String name = DataRegistry.getHelper().getString(snu, "name");
if (name == null)
continue;
if (resultSet.contains(snu))
continue;
if (keyword.equals(name)) {
results.add(snu);
resultSet.add(snu);
}
}
return new NodeListResultSet(new ListNodeList(results));
}
public static ResultSet findByKeyword(String keyword) throws XPathExpressionException {
List<Node> results = new ArrayList<Node>();
Element top = DomUtil.findElementByPath(DataRegistry.getDocument(), "/korsakow/snus");
Collection<Element> snus = DomUtil.findChildrenByTagName(top, "Snu");
SNUS:
for (Element snu : snus)
{
Element keywords = DomUtil.findChildByTagName(snu, "keywords");
if (keywords == null)
continue;
NodeList valueList = keywords.getElementsByTagName("value");
int length = valueList.getLength();
for (int i = 0; i < length; ++i)
{
Element valueElement = (Element)valueList.item(i);
if (keyword.equals(valueElement.getTextContent())) {
results.add(snu);
continue SNUS;
}
}
}
return new NodeListResultSet(new ListNodeList(results));
// return DataRegistry.getHelper().xpathAsResultSet(XPathHelper.formatQuery("/korsakow/snus/Snu[keywords/Keyword/value=?]", keyword));
}
public static ResultSet findByOutKeyword(String keyword) throws XPathExpressionException {
List<Node> results = new ArrayList<Node>();
Element top = DomUtil.findElementByPath(DataRegistry.getDocument(), "/korsakow/snus");
Collection<Element> snus = DomUtil.findChildrenByTagName(top, "Snu");
SNUS:
for (Element snu : snus)
{
Element rules = DomUtil.findChildByTagName(snu, "rules");
if (rules == null)
continue;
NodeList valueList = rules.getElementsByTagName("Keyword");
int length = valueList.getLength();
for (int i = 0; i < length; ++i)
{
Element keywordElement = (Element)valueList.item(i);
String value = DomUtil.getString(keywordElement, "value");
if (keyword.equals(value)) {
results.add(snu);
continue SNUS;
}
}
}
return new NodeListResultSet(new ListNodeList(results));
// return DataRegistry.getHelper().xpathAsResultSet(XPathHelper.formatQuery("/korsakow/snus/Snu[rules/rule/keywords/Keyword/value=?]", keyword));
}
public static ResultSet findAnyOtherOne(long id) throws XPathExpressionException{
return DataRegistry.getHelper().xpathAsResultSet(XPathHelper.formatQuery("/korsakow/snus/Snu[id!=?]", id));
}
public static ResultSet findAll() throws XPathExpressionException{
return DataRegistry.getHelper().xpathAsResultSet(XPathHelper.formatQuery("/korsakow/snus/Snu"));
}
}