package com.akjava.gwt.lib.client;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gwt.http.client.URL;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.Window;
public class URLUtils {
public static String getLocalChangedUrl(String locale){
return getLocalChangedUrl(locale,null);
}
public static String getLocalChangedUrl(String locale,String newtoken){
Map<String,List<String>> params=Window.Location.getParameterMap();//cant modify
Map<String,List<String>> changedParams=new HashMap<String,List<String>>();
for(String key:params.keySet()){
if(!key.equals("locale")){
changedParams.put(key, params.get(key));
//GWT.log("add:"+key);
}
}
if(!locale.isEmpty()){
changedParams.put("locale", Arrays.asList(locale));
}
String token=null;
if(newtoken==null){
token=History.getToken();
if(!token.isEmpty()){
token="#"+token;
}}else{
token="#"+newtoken;
}
return Window.Location.getPath()+createQuery(changedParams)+token;
}
public static String getCurrentUrl(boolean path,boolean query,boolean hash){
String url="";
if(path){
url+=Window.Location.getPath();
}
if(query){
url+=Window.Location.getQueryString();
}
if(hash){
url+=Window.Location.getHash();
}
return url;
}
public static String getFirstValue(Map<String,List<String>> map,String key){
if(map.get(key)!=null && map.get(key).size()>0){
return map.get(key).get(0);
}else{
return null;
}
}
public static String createUrl(String path,Map<String,List<String>> query,Map<String,List<String>> hash){
String url="";
url+=path;
if(query!=null){
String q=createQuery(query);
if(q.length()>1){
url+=q;
}
}
if(hash!=null){
String h=joinMaps(hash,"#",";","=");
if(h.length()>1){
url+=h;
}
}
return url;
}
//query ?,&,=
//favorite token #,;,=
public static String joinMaps(Map<String,List<String>> params,String head,String joiner,String equaler){
StringBuilder builder=new StringBuilder();
for(String key:params.keySet()){
List<String> values=params.get(key);
for(String value:values){
builder.append(key+equaler+URL.encodeQueryString(value)+joiner);
}
if(values.size()==0){//key only
builder.append(key+joiner);
}
}
if(builder.length()>0){
builder.delete(builder.length()-1,builder.length() );//chop last joiner;
}
return head+builder.toString();
}
public static String createQuery(Map<String,List<String>> params){
StringBuilder builder=new StringBuilder();
for(String key:params.keySet()){
List<String> values=params.get(key);
for(String value:values){
builder.append(key+"="+URL.encodeQueryString(value)+"&");
}
}
if(builder.length()>0){
builder.delete(builder.length()-1,builder.length() );//chop
}
return joinMaps(params,"?","&","=");
}
public static void redirectLocale(String locale){
redirectLocale(locale,null);
}
public static void redirectLocale(String locale,String newtoken){
String current=LocaleInfo.getCurrentLocale().getLocaleName();
if(current.equals("default")){
current="";
}
if(locale.equals("default")){
locale="";
}
if(!current.equals(locale)){
Window.open(getLocalChangedUrl(locale,newtoken), "_self", null);
}
}
public static void refresh(){
//GWT.log("refresh-href:"+Window.Location.getHref());
Window.open(Window.Location.getHref(), "_self", null);
}
public static String getFirstTokenValue(String key,String defaultValue){
Map<String,List<String>> token=parseToken(History.getToken(), true);
String value=getFirstValue(token,key);
if(value!=null){
return value;
}else{
return defaultValue;
}
}
public static Map<String,List<String>> parseToken(String token,boolean ignoreEmpty){
Map<String,List<String>> params=new HashMap<String,List<String>>();
String values[]=token.split("&");
for(String v:values){
String name_value[]=v.split("=");
if(name_value.length==2 && !name_value[0].isEmpty()){
List<String> vs=params.get(name_value[0]);
if(vs==null){
vs=new ArrayList<String>();
params.put(name_value[0], vs);
}
vs.add(name_value[1]);
}else if(name_value.length==1 && !ignoreEmpty){
params.put(name_value[0], new ArrayList<String>());
}
}
return params;
}
}