/*
* Copyright 2011 Instituto Superior Tecnico
*
* https://fenix-ashes.ist.utl.pt/
*
* This file is part of the vaadin-framework.
*
* The vaadin-framework Infrastructure is free software: you can
* redistribute it and/or modify it under the terms of the GNU Lesser General
* Public License as published by the Free Software Foundation, either version
* 3 of the License, or (at your option) any later version.*
*
* vaadin-framework is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with vaadin-framework. If not, see <http://www.gnu.org/licenses/>.
*
*/
package pt.ist.vaadinframework.fragment;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import pt.ist.vaadinframework.annotation.EmbeddedComponent;
import pt.ist.vaadinframework.annotation.EmbeddedComponentUtils;
import pt.ist.vaadinframework.ui.EmbeddedComponentContainer;
/**
* @author Sérgio Silva (sergio.silva@ist.utl.pt)
*
*/
public class FragmentQuery implements Serializable {
String path;
Map<String, String> params;
private void setParams(String query) {
final String[] args = query.split("&");
for (String param : args) {
final String[] split = param.split("=");
if (split.length == 2) {
String name = split[0];
String value = split[1];
put(name, value);
} else {
throw new InvalidFragmentException(query);
}
}
}
private void setPath(final String path) {
this.path = path;
}
public FragmentQuery() {
// params = new HashMap<String, String>();
}
public void put(String key, String value) {
if (params == null) {
params = new HashMap<>();
}
params.put(key, value);
}
public FragmentQuery(Class<? extends EmbeddedComponentContainer> clazz, String... values) {
this();
final EmbeddedComponent annotation = EmbeddedComponentUtils.getAnnotation(clazz);
final String[] path = annotation.path();
final String[] args = annotation.args();
if (args.length < values.length || path.length != 1) {
throw new InvalidFragmentException("args don't match");
}
this.path = path[0];
for (int i = 0; i < values.length; i++) {
if (values[i] != null) {
put(args[i], values[i]);
}
}
}
public FragmentQuery(String fragment) {
this();
if (fragment == null || fragment.isEmpty() || !fragment.startsWith("#")) {
path = null;
params = null;
throw new InvalidFragmentException();
}
if (!fragment.contains("?")) {
path = fragment.substring(1);
params = null;
return;
}
final Pattern compile = Pattern.compile("^\\#(.*)\\?(.*)?$");
final Matcher matcher = compile.matcher(fragment);
if (matcher.matches() && matcher.groupCount() == 2) {
setPath(matcher.group(1));
setParams(matcher.group(2));
}
}
public String getPath() {
return path;
}
public Map<String, String> getParams() {
return params != null ? params : Collections.EMPTY_MAP;
}
public String getQueryString() {
String queryString = String.format("%s", path);
final ArrayList<String> args = new ArrayList<String>();
if (params != null) {
for (Entry<String, String> entry : params.entrySet()) {
args.add(String.format("%s=%s", entry.getKey(), entry.getValue()));
}
}
return args.isEmpty() ? queryString : queryString + "?" + StringUtils.join(args, "&");
}
}