/*******************************************************************************
* Copyright (c) 2015 Frank Becker and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Frank Becker - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.provisional.tasks.ui.wizards;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.commons.core.StatusHandler;
import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
@SuppressWarnings("nls")
public class QueryPageSearch {
/** Stores search criteria in the order entered by the user. */
private final Map<String, QueryPageFilter> filterByFieldName = new LinkedHashMap<String, QueryPageFilter>();
public QueryPageSearch() {
}
public QueryPageSearch(String queryParameter) {
fromUrl(queryParameter);
}
public void addFilter(String key, String value) {
QueryPageFilter filter = filterByFieldName.get(key);
if (filter == null) {
filter = new QueryPageFilter(key, value);
filterByFieldName.put(key, filter);
}
}
public void addFilter(QueryPageFilter filter) {
filterByFieldName.put(filter.getKey(), filter);
}
public List<QueryPageFilter> getFilters() {
return new ArrayList<QueryPageFilter>(filterByFieldName.values());
}
public QueryPageFilter getFilter(String key) {
return filterByFieldName.get(key);
}
public void fromUrl(String url) {
int idx = url.indexOf('?');
StringTokenizer t = new StringTokenizer(idx != -1 ? url.substring(idx + 1) : url, "&"); //$NON-NLS-1$
while (t.hasMoreTokens()) {
String token = t.nextToken();
int i = token.indexOf("="); //$NON-NLS-1$
if (i != -1) {
try {
String key = URLDecoder.decode(token.substring(0, i), "UTF-8");
String value = URLDecoder.decode(token.substring(i + 1), "UTF-8");
QueryPageFilter filter = filterByFieldName.get(key);
if (filter == null) {
addFilter(key, value);
} else {
filter.addValue(value);
}
} catch (UnsupportedEncodingException e) {
StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
"Unexpected exception while decoding URL", e)); //$NON-NLS-1$
}
}
}
}
public String toQuery() {
StringBuilder sb = new StringBuilder();
int count = 0;
for (QueryPageFilter filter : filterByFieldName.values()) {
for (String actualValue : filter.getValues()) {
String encodedValue = null;
try {
encodedValue = URLEncoder.encode(actualValue, "UTF-8");
if (count++ > 0) {
sb.append("&");
}
sb.append(filter.getKey());
sb.append("=");
sb.append(encodedValue);
} catch (UnsupportedEncodingException e) {
StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
"Unexpected exception while encoding URL", e)); //$NON-NLS-1$
}
}
}
return sb.toString();
}
}