// Copyright 2012 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.collide.clientlibs.navigation;
import com.google.collide.json.shared.JsonArray;
import com.google.collide.shared.util.JsonCollections;
import com.google.collide.shared.util.StringUtils;
import elemental.client.Browser;
/**
* A controller which can serialize and deserialize pieces of history to a url.
*/
public class UrlSerializationController {
/**
* A {@link UrlComponentEncoder} which uses the browser's decode and encode component
* methods.
*/
private static final UrlComponentEncoder urlEncoder = new UrlComponentEncoder() {
@Override
public String decode(String text) {
return Browser.decodeURIComponent(text);
}
@Override
public String encode(String text) {
return Browser.encodeURIComponent(text);
}
};
/** The default serializer to use */
private final UrlSerializer defaultSerializer = new DefaultUrlSerializer(urlEncoder);
/**
* Deserializes a URL into a list of NavigationTokens.
*
* @param serializedUrl should not be null and must start with a
* {@link UrlSerializer#PATH_SEPARATOR} to distinguish it from other
* hash values.
*/
public JsonArray<NavigationToken> deserializeFromUrl(String serializedUrl) {
// We attempted to parse an invalid url
if (StringUtils.isNullOrEmpty(serializedUrl)
|| serializedUrl.indexOf(UrlSerializer.PATH_SEPARATOR) != 0) {
return JsonCollections.createArray();
}
return defaultSerializer.deserialize(serializedUrl);
}
/**
* Serializes a list of history tokens identifying a unique application state
* to a url.
*
* @return a url identifying this list of history tokens. It will always start
* with {@link UrlSerializer#PATH_SEPARATOR}.
*/
public String serializeToUrl(JsonArray<? extends NavigationToken> historyTokens) {
String url = defaultSerializer.serialize(historyTokens);
return StringUtils.ensureStartsWith(url, "/");
}
}