--- /dev/null
+package org.simantics.workbench.search;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.net.URL;\r
+import java.net.URLDecoder;\r
+import java.net.URLEncoder;\r
+import java.util.Collections;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import org.simantics.db.layer0.genericrelation.IndexQueries;\r
+\r
+public class SearchQuery {\r
+ \r
+ private String originalQuery;\r
+ private Map<String,String> searchFlags = new HashMap<String, String>();\r
+ private Set<String> searchParams = new HashSet<String>();\r
+ \r
+ public SearchQuery() {\r
+ }\r
+ \r
+ public SearchQuery(String originalQuery) {\r
+ this.originalQuery = originalQuery;\r
+ }\r
+\r
+ public void setOriginalQuery(String originalQuery) {\r
+ this.originalQuery = originalQuery;\r
+ }\r
+ \r
+ public String getOriginalQuery() {\r
+ return originalQuery;\r
+ }\r
+ \r
+ public String getQuery(Set<String> supportedParams) {\r
+ if (originalQuery.trim().isEmpty())\r
+ return "";\r
+ String query = "";\r
+ int count = 0;\r
+ for (String key : searchFlags.keySet()) {\r
+ if (!supportedParams.contains(key))\r
+ continue;\r
+ if (!"on".equals(searchFlags.get(key)))\r
+ continue;\r
+ if (count > 0)\r
+ query += " OR ";\r
+// String prefix = originalQuery.startsWith("*") ? "" : "*";\r
+// String suffix = originalQuery.endsWith("*") ? "" : "*";\r
+// query += key+":"+prefix+originalQuery+suffix;\r
+ query += key+":"+originalQuery;\r
+ count++;\r
+ }\r
+ return query;\r
+ }\r
+ \r
+ public String getQuery(String... supportedParams) {\r
+ Set<String> set = new HashSet<String>();\r
+ for (String s : supportedParams)\r
+ set.add(s);\r
+ return getQuery(set);\r
+ }\r
+ \r
+ \r
+ \r
+ public void setSearchFlag(String key, String value) {\r
+ searchFlags.put(key, value);\r
+ }\r
+ \r
+ public void setSearchParam(String key) {\r
+ searchParams.add(key);\r
+ }\r
+ \r
+ public Map<String, String> getSearchFlags() {\r
+ return Collections.unmodifiableMap(searchFlags);\r
+ }\r
+ \r
+ public Set<String> getSearchParams() {\r
+ return Collections.unmodifiableSet(searchParams);\r
+ }\r
+ \r
+ public boolean getBooleanFlag(String key) {\r
+ if ("on".equals(searchFlags.get(key)))\r
+ return true;\r
+ return false;\r
+ }\r
+ \r
+ public boolean getBooleanParam(String key) {\r
+ if (searchParams.contains(key))\r
+ return true;\r
+ return false;\r
+ }\r
+ \r
+ @Override\r
+ public String toString() {\r
+ return originalQuery;\r
+ }\r
+\r
+ public SearchQuery withOriginalQuery(String query) {\r
+ SearchQuery ret = new SearchQuery(query);\r
+ ret.searchFlags = new HashMap<String, String>(searchFlags);\r
+ ret.searchParams = new HashSet<String>(searchParams);\r
+ return ret;\r
+ }\r
+\r
+ public SearchQuery escaped(boolean escapeWildcards) {\r
+ return withOriginalQuery( IndexQueries.escape( originalQuery, escapeWildcards ) );\r
+ }\r
+\r
+ public static URL encode(File file, SearchQuery query) throws IOException {\r
+ URL url = file.toURI().toURL();\r
+ String s = url.toString() + "?search=" + URLEncoder.encode(query.getOriginalQuery(), "UTF-8");\r
+ Map<String, String> flags = query.getSearchFlags();\r
+ for (String key : flags.keySet()) {\r
+ s += "&"+key+"="+flags.get(key);\r
+ }\r
+ \r
+ for (String param : query.getSearchParams()) {\r
+ s += "&"+param;\r
+ }\r
+ \r
+ url = new URL(s);\r
+ return url;\r
+ }\r
+ \r
+ public static SearchQuery decode(URL url) throws IOException{\r
+ String query = url.getQuery();\r
+ SearchQuery searchQuery = new SearchQuery();\r
+ if (query != null) {\r
+ for (String arg : query.split("&")) {\r
+ String[] keyvalue = arg.split("=");\r
+ if ("search".equals(keyvalue[0])) {\r
+ if (keyvalue.length == 2)\r
+ searchQuery.setOriginalQuery(URLDecoder.decode(keyvalue[1], "UTF-8"));\r
+ } else if (keyvalue.length == 2){\r
+ searchQuery.setSearchFlag(URLDecoder.decode(keyvalue[0], "UTF-8"), URLDecoder.decode(keyvalue[1], "UTF-8"));\r
+ } else if (keyvalue.length == 1) {\r
+ searchQuery.setSearchParam(URLDecoder.decode(keyvalue[0], "UTF-8"));\r
+ }\r
+ }\r
+ }\r
+ return searchQuery;\r
+ }\r
+ \r
+ \r
+\r
+}\r