/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * 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 org.uberfire.client.mvp; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import com.google.gwt.http.client.URL; import org.uberfire.backend.vfs.PathFactory; import org.uberfire.mvp.PlaceRequest; import org.uberfire.mvp.impl.DefaultPlaceRequest; import org.uberfire.mvp.impl.PathPlaceRequest; public class PlaceRequestHistoryMapperImpl implements PlaceRequestHistoryMapper { @Override public PlaceRequest getPlaceRequest(String fullIdentifier) { final String encodedIdentifier = fullIdentifier.contains("?") ? fullIdentifier.substring(0, fullIdentifier.indexOf("?")) : fullIdentifier; final String identifier = urlDecode(encodedIdentifier); final String query = fullIdentifier.contains("?") ? fullIdentifier.substring(fullIdentifier.indexOf("?") + 1) : ""; final Map<String, String> parameters = getParameters(query); final PlaceRequest placeRequest; if (parameters.containsKey("path_uri")) { if (parameters.containsKey("has_version_support")) { placeRequest = new PathPlaceRequest(PathFactory.newPath(parameters.remove("file_name"), parameters.remove("path_uri"), new HashMap<String, Object>() {{ put(PathFactory.VERSION_PROPERTY, Boolean.valueOf(parameters.remove("has_version_support"))); }}), identifier); } else { placeRequest = new PathPlaceRequest(PathFactory.newPath(parameters.remove("file_name"), parameters.remove("path_uri")), identifier); } } else { placeRequest = new DefaultPlaceRequest(identifier); } for (String parameterName : parameters.keySet()) { placeRequest.addParameter(parameterName, parameters.get(parameterName)); } return placeRequest; } private Map<String, String> getParameters(String query) { final Map<String, String> parameters = new HashMap<String, String>(); if (query != null && !"".equalsIgnoreCase(query)) { final List<String> parts = Arrays.asList(query.split("&")); for (String part : parts) { int index = part.indexOf('='); String name = null; String value = null; if (index == -1) { name = part; value = ""; } else { name = part.substring(0, index); value = index < part.length() ? part.substring(index + 1) : ""; value = urlDecode(value); } parameters.put(urlDecode(name), value); } } return parameters; } String urlDecode(String value) { return URL.decode(value); } }