]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.workbench.search/src/org/simantics/workbench/search/SearchQuery.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.workbench.search / src / org / simantics / workbench / search / SearchQuery.java
1 package org.simantics.workbench.search;\r
2 \r
3 import java.io.File;\r
4 import java.io.IOException;\r
5 import java.net.URL;\r
6 import java.net.URLDecoder;\r
7 import java.net.URLEncoder;\r
8 import java.util.Collections;\r
9 import java.util.HashMap;\r
10 import java.util.HashSet;\r
11 import java.util.Map;\r
12 import java.util.Set;\r
13 \r
14 import org.simantics.db.layer0.genericrelation.IndexQueries;\r
15 \r
16 public class SearchQuery {\r
17         \r
18         private String originalQuery;\r
19         private Map<String,String> searchFlags = new HashMap<String, String>();\r
20         private Set<String> searchParams = new HashSet<String>();\r
21         \r
22         public SearchQuery() {\r
23         }\r
24         \r
25         public SearchQuery(String originalQuery) {\r
26                 this.originalQuery = originalQuery;\r
27         }\r
28 \r
29         public void setOriginalQuery(String originalQuery) {\r
30                 this.originalQuery = originalQuery;\r
31         }\r
32         \r
33         public String getOriginalQuery() {\r
34                 return originalQuery;\r
35         }\r
36         \r
37         public String getQuery(Set<String> supportedParams) {\r
38                 if (originalQuery.trim().isEmpty())\r
39                         return "";\r
40                 String query = "";\r
41                 int count = 0;\r
42                 for (String key : searchFlags.keySet()) {\r
43                         if (!supportedParams.contains(key))\r
44                                 continue;\r
45                         if (!"on".equals(searchFlags.get(key)))\r
46                                 continue;\r
47                         if (count > 0)\r
48                                 query += " OR ";\r
49 //                      String prefix = originalQuery.startsWith("*") ? "" : "*";\r
50 //                      String suffix = originalQuery.endsWith("*") ? "" : "*";\r
51 //                      query += key+":"+prefix+originalQuery+suffix;\r
52                         query += key+":"+originalQuery;\r
53                         count++;\r
54                 }\r
55                 return query;\r
56         }\r
57         \r
58         public String getQuery(String... supportedParams) {\r
59                 Set<String> set = new HashSet<String>();\r
60                 for (String s : supportedParams)\r
61                         set.add(s);\r
62                 return getQuery(set);\r
63         }\r
64         \r
65         \r
66         \r
67         public void setSearchFlag(String key, String value) {\r
68                 searchFlags.put(key, value);\r
69         }\r
70         \r
71         public void setSearchParam(String key) {\r
72                 searchParams.add(key);\r
73         }\r
74         \r
75         public Map<String, String> getSearchFlags() {\r
76                 return Collections.unmodifiableMap(searchFlags);\r
77         }\r
78         \r
79         public Set<String> getSearchParams() {\r
80                 return Collections.unmodifiableSet(searchParams);\r
81         }\r
82         \r
83         public boolean getBooleanFlag(String key) {\r
84                 if ("on".equals(searchFlags.get(key)))\r
85                         return true;\r
86                 return false;\r
87         }\r
88         \r
89         public boolean getBooleanParam(String key) {\r
90                 if (searchParams.contains(key))\r
91                         return true;\r
92                 return false;\r
93         }\r
94         \r
95         @Override\r
96         public String toString() {\r
97                 return originalQuery;\r
98         }\r
99 \r
100         public SearchQuery withOriginalQuery(String query) {\r
101                 SearchQuery ret = new SearchQuery(query);\r
102                 ret.searchFlags = new HashMap<String, String>(searchFlags);\r
103                 ret.searchParams = new HashSet<String>(searchParams);\r
104                 return ret;\r
105         }\r
106 \r
107         public SearchQuery escaped(boolean escapeWildcards) {\r
108                 return withOriginalQuery( IndexQueries.escape( originalQuery, escapeWildcards ) );\r
109         }\r
110 \r
111         public static URL encode(File file, SearchQuery query) throws IOException {\r
112                 URL url = file.toURI().toURL();\r
113                 String s = url.toString() + "?search=" + URLEncoder.encode(query.getOriginalQuery(), "UTF-8");\r
114                 Map<String, String> flags = query.getSearchFlags();\r
115                 for (String key : flags.keySet()) {\r
116                         s += "&"+key+"="+flags.get(key);\r
117                 }\r
118                 \r
119                 for (String param : query.getSearchParams()) {\r
120                         s += "&"+param;\r
121                 }\r
122                         \r
123                 url = new URL(s);\r
124                 return url;\r
125         }\r
126             \r
127     public static SearchQuery decode(URL url) throws IOException{\r
128          String query = url.getQuery();\r
129          SearchQuery searchQuery = new SearchQuery();\r
130          if (query != null) {\r
131              for (String arg : query.split("&")) {\r
132                  String[] keyvalue = arg.split("=");\r
133                  if ("search".equals(keyvalue[0])) {\r
134                     if (keyvalue.length == 2)\r
135                          searchQuery.setOriginalQuery(URLDecoder.decode(keyvalue[1], "UTF-8"));\r
136                  } else if (keyvalue.length == 2){\r
137                          searchQuery.setSearchFlag(URLDecoder.decode(keyvalue[0], "UTF-8"), URLDecoder.decode(keyvalue[1], "UTF-8"));\r
138                  } else if (keyvalue.length == 1) {\r
139                          searchQuery.setSearchParam(URLDecoder.decode(keyvalue[0], "UTF-8"));\r
140                  }\r
141              }\r
142          }\r
143          return searchQuery;\r
144     }\r
145     \r
146    \r
147 \r
148 }\r