package com.google.gwt.gwtpages.client.page.parameters;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import com.google.gwt.gwtpages.client.Pages;
import com.google.gwt.http.client.URL;
import com.google.gwt.i18n.client.DateTimeFormat;
/**
* Default implementation of the {@link Tokenizer}. Standard history
* token formats are: 1) ordinal parameters: {page token}/param1/param2... 2)
* mapped parameters: {page token}/¶m1Key=param1Value¶m2Key=param2Value
*
* @author Joe Hudson
*/
public class SimpleTokenizer implements Tokenizer {
private String separator = "/";
private String namedParameterToken = "&";
private DateTimeFormat dateFormat;
private DateTimeFormat dateTimeFormat;
private DateTimeFormat timeOnlyFormat;
public SimpleTokenizer() {
this(DateTimeFormat.getShortDateFormat(), DateTimeFormat
.getShortDateTimeFormat());
}
public void init(Pages settings) {
}
public SimpleTokenizer(DateTimeFormat dateFormat,
DateTimeFormat dateTimeFormat) {
this.dateFormat = dateFormat;
this.dateTimeFormat = dateTimeFormat;
}
public Iterator<String> getPossiblePageTokens(String token) {
if (null == token)
return new ArrayList<String>().iterator();
else {
String[] tokens = token.split(separator);
ArrayList<String> rtn = new ArrayList<String>();
String _token = null;
for (String s : tokens) {
if (null != _token)
_token = _token + "/" + s;
else
_token = s;
rtn.add(_token);
}
return rtn.iterator();
}
}
public PageParameters getPageParameters(String historyToken,
String pageToken) {
Serializable[] parameters = null;
HashMap<String, Serializable> parametersMap = null;
String parametersPart = (null == historyToken || historyToken
.equals(pageToken)) ? "" : historyToken.substring(
pageToken.length()).trim();
while (parametersPart.startsWith(separator))
parametersPart = parametersPart.substring(1);
while (parametersPart.endsWith(separator))
parametersPart = parametersPart.substring(0,
parametersPart.length() - 1);
if (parametersPart.length() == 0) {
parameters = new Serializable[0];
} else {
String[] _parameters = parametersPart.split(separator);
if (_parameters.length == 1
&& _parameters[0].startsWith(namedParameterToken)) {
parametersMap = new HashMap<String, Serializable>();
// parameters are stored as a map
_parameters = _parameters[0].split(namedParameterToken);
for (String s : _parameters) {
int index = s.indexOf('=');
if (index > 0) {
String key = s.substring(0, index);
String value = s.substring(index + 1);
parametersMap.put(decode(key), decode(value));
}
}
} else {
for (int i = 0; i < _parameters.length; i++) {
// decode
_parameters[i] = decode(_parameters[i]);
}
parameters = new Serializable[_parameters.length];
System.arraycopy(_parameters, 0, parameters, 0,
_parameters.length);
}
}
return new SimplePageParameters(pageToken, historyToken, parameters,
parametersMap);
}
public String createHistoryToken(String pageToken,
HashMap<String, Serializable> parameters) {
StringBuilder sb = new StringBuilder();
sb.append(pageToken);
if (null != parameters && parameters.size() > 0) {
sb.append(separator);
for (String key : parameters.keySet()) {
Serializable value = parameters.get(key);
if (null != value) {
sb.append(namedParameterToken)
.append(encode(key))
.append('=')
.append(encode(toString(value, false)));
}
}
}
return sb.toString();
}
public String createHistoryToken(String pageToken,
Serializable... parameters) {
StringBuilder sb = new StringBuilder();
sb.append(pageToken);
if (null != parameters && parameters.length > 0) {
for (Serializable parameter : parameters) {
if (null != parameter) {
sb.append(separator).append(
encode(toString(parameter, false)));
}
}
}
return sb.toString();
}
public Long toLong(Serializable entry) {
if (null == entry)
return null;
else if (entry instanceof Long)
return (Long) entry;
else if (entry instanceof Number)
return ((Number) entry).longValue();
else
return new Long(entry.toString());
}
public Integer toInteger(Serializable entry) {
if (null == entry)
return null;
else if (entry instanceof Integer)
return (Integer) entry;
else if (entry instanceof Number)
return ((Number) entry).intValue();
else
return new Integer(entry.toString());
}
public Float toFloat(Serializable entry) {
if (null == entry)
return null;
else if (entry instanceof Float)
return (Float) entry;
else if (entry instanceof Number)
return ((Number) entry).floatValue();
else
return new Float(entry.toString());
}
public Double toDouble(Serializable entry) {
if (null == entry)
return null;
else if (entry instanceof Double)
return (Double) entry;
else if (entry instanceof Number)
return ((Number) entry).doubleValue();
else
return new Double(entry.toString());
}
public Boolean toBoolean(Serializable entry) {
if (null == entry)
return null;
else if (entry instanceof Boolean)
return (Boolean) entry;
else
return new Boolean(entry.toString());
}
public Date toDate(Serializable entry) {
if (null == entry)
return null;
else if (entry instanceof Date)
return (Date) entry;
else if (entry instanceof Long)
return new Date((Long) entry);
else
return dateFormat.parse(entry.toString());
}
public Date toDateTime(Serializable entry) {
if (null == entry)
return null;
else if (entry instanceof Date)
return (Date) entry;
else if (entry instanceof Long)
return new Date((Long) entry);
else
return dateTimeFormat.parse(entry.toString());
}
public String toString(Serializable entry, boolean allowNull) {
if (null == entry)
return allowNull ? null : "";
else if (entry instanceof Long)
return toString((Long) entry, allowNull);
else if (entry instanceof Integer)
return toString((Integer) entry, allowNull);
else if (entry instanceof Float)
return toString((Float) entry, allowNull);
else if (entry instanceof Double)
return toString((Double) entry, allowNull);
else if (entry instanceof Date)
return toString((Date) entry, allowNull);
else
return entry.toString();
}
public String toString(Long entry, boolean allowNull) {
if (null == entry)
return allowNull ? null : "";
else
return entry.toString();
}
public String toString(Integer entry, boolean allowNull) {
if (null == entry)
return allowNull ? null : "";
else
return entry.toString();
}
public String toString(Float entry, boolean allowNull) {
if (null == entry)
return allowNull ? null : "";
else
return entry.toString();
}
public String toString(Double entry, boolean allowNull) {
if (null == entry)
return allowNull ? null : "";
else
return entry.toString();
}
public String toString(Date entry, boolean allowNull) {
if (null == timeOnlyFormat)
timeOnlyFormat = DateTimeFormat.getFormat("HmsS");
if (null == entry)
return allowNull ? null : "";
else {
Date date = (Date) entry;
Integer timeInt = new Integer(timeOnlyFormat.format(date));
if (timeInt == 0)
return dateFormat.format(entry);
else
return dateTimeFormat.format(entry);
}
}
public String encode(String s) {
return URL.encode(s);
}
public String decode(String s) {
return URL.decode(s);
}
}