package org.limewire.core.impl.search; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.limewire.core.api.Category; import org.limewire.core.api.FilePropertyKey; import org.limewire.core.impl.util.FilePropertyKeyPopulator; import org.limewire.util.NameValue; import com.google.inject.Inject; import com.limegroup.gnutella.util.QueryUtils; import com.limegroup.gnutella.xml.LimeXMLDocumentFactory; /** * A utility class to manage generation of query strings (XML and plain text) for advanced searches. */ public class AdvancedQueryStringBuilder { private final LimeXMLDocumentFactory xmlDocumentFactory; @Inject AdvancedQueryStringBuilder(LimeXMLDocumentFactory xmlDocumentFactory) { this.xmlDocumentFactory = xmlDocumentFactory; } /** * @return a simple composite query String that only includes the values for the properties * being searched on without their association. */ public String createSimpleCompositeQuery(Map<FilePropertyKey, String> advancedSearch) { StringBuilder sb = new StringBuilder(); for(String value : advancedSearch.values()) { if (value != null && value.trim().length() > 0) { sb.append(value); sb.append(' '); } } int len = sb.length(); if (len > 0) { sb.deleteCharAt(len-1); } return QueryUtils.createQueryString(sb.toString()); } /** * @return the full XML query String to be used in a search based on a category and a map of properties * to search terms. */ public String createXMLQueryString(Map<FilePropertyKey, String> advancedSearch, Category category) { List<NameValue<String>> nvs = new ArrayList<NameValue<String>>(); for(Map.Entry<FilePropertyKey, String> entry : advancedSearch.entrySet()) { String xmlName = FilePropertyKeyPopulator.getLimeXmlName(category, entry.getKey()); if(xmlName != null) { nvs.add(new NameValue<String>(xmlName, entry.getValue())); } } if(nvs.isEmpty()) { return ""; } else { return xmlDocumentFactory.createLimeXMLDocument(nvs, FilePropertyKeyPopulator.getLimeXmlSchemaUri(category)).getXMLString(); } } }