diff options
author | Roberto E. Escobar | 2011-10-31 19:02:39 +0000 |
---|---|---|
committer | Roberto E. Escobar | 2011-10-31 19:02:39 +0000 |
commit | ea7a3940bd83d582f548250de8aa00a5d99fe5db (patch) | |
tree | 514daa3079172318b6fde2e96071d3c81afa6a68 | |
parent | c12efada41b4e1f60cefdd9d13a272580e65de57 (diff) | |
download | org.eclipse.osee-ea7a3940bd83d582f548250de8aa00a5d99fe5db.tar.gz org.eclipse.osee-ea7a3940bd83d582f548250de8aa00a5d99fe5db.tar.xz org.eclipse.osee-ea7a3940bd83d582f548250de8aa00a5d99fe5db.zip |
feature: Create UrlQuery utility class
9 files changed, 476 insertions, 144 deletions
diff --git a/plugins/org.eclipse.osee.ats.presenter.test/src/org/eclipse/osee/ats/presenter/internal/AtsSearchPresenterTest.java b/plugins/org.eclipse.osee.ats.presenter.test/src/org/eclipse/osee/ats/presenter/internal/AtsSearchPresenterTest.java index 03dfe6a7192..83d93998ee8 100644 --- a/plugins/org.eclipse.osee.ats.presenter.test/src/org/eclipse/osee/ats/presenter/internal/AtsSearchPresenterTest.java +++ b/plugins/org.eclipse.osee.ats.presenter.test/src/org/eclipse/osee/ats/presenter/internal/AtsSearchPresenterTest.java @@ -19,13 +19,13 @@ import org.eclipse.osee.ats.api.data.AtsSearchParameters; import org.eclipse.osee.ats.mocks.MockAtsArtifactProvider; import org.eclipse.osee.ats.mocks.MockAtsSearchHeaderComponent; import org.eclipse.osee.display.api.data.ViewId; -import org.eclipse.osee.display.presenter.Utility; import org.eclipse.osee.display.presenter.mocks.MockDisplayOptionsComponent; import org.eclipse.osee.display.presenter.mocks.MockLogger; import org.eclipse.osee.display.presenter.mocks.MockSearchNavigator; import org.eclipse.osee.display.presenter.mocks.MockSearchResultsListComponent; import org.eclipse.osee.framework.core.enums.CoreAttributeTypes; import org.eclipse.osee.framework.jdk.core.util.GUID; +import org.eclipse.osee.framework.jdk.core.util.UrlQuery; import org.eclipse.osee.orcs.data.ReadableArtifact; import org.eclipse.osee.orcs.data.ReadableAttribute; import org.eclipse.osee.orcs.mock.MockArtifact; @@ -62,8 +62,11 @@ public class AtsSearchPresenterTest { AtsSearchParameters params = new AtsSearchParameters("phrase", true, build, program); presenter.selectSearch("", params, navigator); String url = navigator.getResultsUrl(); + String expected = - "/search=phrase&program=" + Utility.encode(programGuid) + "&nameOnly=true&build=" + Utility.encode(buildGuid); + "/" + new UrlQuery().put("search", "phrase").put("program", "programGuid").put("nameOnly", "true").put( + "build", buildGuid).toString(); + Assert.assertEquals(expected, url); } @@ -88,7 +91,8 @@ public class AtsSearchPresenterTest { String programGuid = GUID.create(); String buildGuid = GUID.create(); String url = - "/program=" + Utility.encode(programGuid) + "&build=" + Utility.encode(buildGuid) + "&nameOnly=true&search=phrase&verbose=false"; + "/" + new UrlQuery().put("program", programGuid).put("build", buildGuid).put("nameOnly", "true").put("search", + "phrase").put("verbose", "false").toString(); presenter.initSearchResults(url, headerComp, resultsComponent, optionsComp); Assert.assertEquals(1, resultsComponent.getSearchResults().size()); } diff --git a/plugins/org.eclipse.osee.ats.presenter/src/org/eclipse/osee/ats/presenter/internal/AtsSearchPresenterImpl.java b/plugins/org.eclipse.osee.ats.presenter/src/org/eclipse/osee/ats/presenter/internal/AtsSearchPresenterImpl.java index 3d997b02039..7432fc5e988 100644 --- a/plugins/org.eclipse.osee.ats.presenter/src/org/eclipse/osee/ats/presenter/internal/AtsSearchPresenterImpl.java +++ b/plugins/org.eclipse.osee.ats.presenter/src/org/eclipse/osee/ats/presenter/internal/AtsSearchPresenterImpl.java @@ -14,7 +14,6 @@ import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; -import java.util.Map; import org.eclipse.osee.ats.api.components.AtsSearchHeaderComponent; import org.eclipse.osee.ats.api.data.AtsSearchParameters; import org.eclipse.osee.ats.api.search.AtsArtifactProvider; @@ -27,9 +26,9 @@ import org.eclipse.osee.display.api.components.SearchResultsListComponent; import org.eclipse.osee.display.api.data.ViewId; import org.eclipse.osee.display.api.search.SearchNavigator; import org.eclipse.osee.display.presenter.SearchPresenterImpl; -import org.eclipse.osee.display.presenter.Utility; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.jdk.core.util.Strings; +import org.eclipse.osee.framework.jdk.core.util.UrlQuery; import org.eclipse.osee.logger.Log; import org.eclipse.osee.orcs.data.ReadableArtifact; @@ -77,7 +76,7 @@ public class AtsSearchPresenterImpl<T extends AtsSearchHeaderComponent, K extend AtsSearchParameters params = decodeIt(url); - if (!params.isValid()) { + if (params == null || !params.isValid()) { return; } @@ -137,16 +136,20 @@ public class AtsSearchPresenterImpl<T extends AtsSearchHeaderComponent, K extend } protected String encode(String url, AtsSearchParameters searchParams, String branchId) { - Map<String, String> params = Utility.decode(url); - if (Strings.isValid(branchId)) { - params.put("branch", branchId); - } - params.put("program", searchParams.getProgram().getGuid()); - params.put("build", searchParams.getBuild().getGuid()); - params.put("nameOnly", String.valueOf(searchParams.isNameOnly())); - params.put("search", searchParams.getSearchString()); + UrlQuery query = new UrlQuery(); try { - return "/" + getParametersAsEncodedUrl(params); + query.parse(url); + + if (Strings.isValid(branchId)) { + query.putInPlace("branch", branchId); + } + + query.putInPlace("program", searchParams.getProgram().getGuid()); + query.putInPlace("build", searchParams.getBuild().getGuid()); + query.putInPlace("nameOnly", String.valueOf(searchParams.isNameOnly())); + query.putInPlace("search", searchParams.getSearchString()); + + return "/" + query.toString(); } catch (UnsupportedEncodingException ex) { logger.error(ex, "Error in encode"); return ""; @@ -154,23 +157,29 @@ public class AtsSearchPresenterImpl<T extends AtsSearchHeaderComponent, K extend } protected AtsSearchParameters decodeIt(String url) { - Map<String, String> data = Utility.decode(url); + UrlQuery query = new UrlQuery(); + try { + query.parse(url); + } catch (UnsupportedEncodingException ex) { + logger.error(ex, "Error in encode"); + return null; + } ViewId program = null, build = null; - if (data.containsKey("program")) { - program = new ViewId(data.get("program"), ""); + if (query.containsKey("program")) { + program = new ViewId(query.getParameter("program"), ""); } - if (data.containsKey("build")) { - build = new ViewId(data.get("build"), ""); + if (query.containsKey("build")) { + build = new ViewId(query.getParameter("build"), ""); } - String nValue = data.get("nameOnly"); + String nValue = query.getParameter("nameOnly"); boolean nameOnly = nValue == null ? false : nValue.equalsIgnoreCase("true"); String searchPhrase = ""; - if (data.containsKey("search")) { - searchPhrase = data.get("search"); + if (query.containsKey("search")) { + searchPhrase = query.getParameter("search"); } // String vValue = data.get("verbose"); diff --git a/plugins/org.eclipse.osee.display.presenter.test/src/org/eclipse/osee/display/presenter/internal/SearchPresenterTest.java b/plugins/org.eclipse.osee.display.presenter.test/src/org/eclipse/osee/display/presenter/internal/SearchPresenterTest.java index 8f3af3ad817..5748df61a62 100644 --- a/plugins/org.eclipse.osee.display.presenter.test/src/org/eclipse/osee/display/presenter/internal/SearchPresenterTest.java +++ b/plugins/org.eclipse.osee.display.presenter.test/src/org/eclipse/osee/display/presenter/internal/SearchPresenterTest.java @@ -22,7 +22,6 @@ import org.eclipse.osee.display.api.data.ViewSearchParameters; import org.eclipse.osee.display.api.search.ArtifactProvider; import org.eclipse.osee.display.api.search.AsyncSearchListener; import org.eclipse.osee.display.presenter.SearchPresenterImpl; -import org.eclipse.osee.display.presenter.Utility; import org.eclipse.osee.display.presenter.mocks.MockArtifactHeaderComponent; import org.eclipse.osee.display.presenter.mocks.MockArtifactProvider; import org.eclipse.osee.display.presenter.mocks.MockAttributeComponent; @@ -44,6 +43,7 @@ import org.eclipse.osee.framework.core.enums.RelationTypeMultiplicity; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.core.model.type.RelationType; import org.eclipse.osee.framework.jdk.core.util.GUID; +import org.eclipse.osee.framework.jdk.core.util.UrlQuery; import org.eclipse.osee.orcs.data.ReadableArtifact; import org.eclipse.osee.orcs.data.ReadableAttribute; import org.eclipse.osee.orcs.mock.MockArtifact; @@ -78,7 +78,9 @@ public class SearchPresenterTest { MockSearchHeaderComponent searchHeaderComp = new MockSearchHeaderComponent(); MockSearchResultsListComponent searchResultsComp = new MockSearchResultsListComponent(); String url = - "/branch=" + Utility.encode(GUID.create()) + "&nameOnly=true&search=" + Utility.encode("this is a test"); + "/" + new UrlQuery().put("branch", CoreBranches.COMMON.getGuid()).put("nameOnly", "true").put("search", + "this is a test").toString(); + presenter.initSearchResults(url, searchHeaderComp, searchResultsComp, optionsComp); List<MockSearchResultComponent> searchResults = searchResultsComp.getSearchResults(); Assert.assertEquals(1, searchResults.size()); @@ -96,8 +98,11 @@ public class SearchPresenterTest { presenter = new SearchPresenterImpl<SearchHeaderComponent, ViewSearchParameters>(provider, new MockLogger()); searchHeaderComp = new MockSearchHeaderComponent(); searchResultsComp = new MockSearchResultsListComponent(); + String url = - "/branch=" + Utility.encode(GUID.create()) + "&nameOnly=true&search=" + Utility.encode("this is a test"); + "/" + new UrlQuery().put("branch", CoreBranches.COMMON.getGuid()).put("nameOnly", "true").put("search", + "this is a test").toString(); + presenter.initSearchResults(url, searchHeaderComp, searchResultsComp, optionsComp); Assert.assertNotNull(searchResultsComp.getErrorMessage()); } @@ -111,7 +116,9 @@ public class SearchPresenterTest { String artGuid = GUID.create(); ViewArtifact artifact = new ViewArtifact(artGuid, "name", "type", null, new ViewId(branchGuid, "branchName")); presenter.selectArtifact("", artifact, navigator); - String expectedUrl = "/artifact=" + Utility.encode(artGuid) + "&branch=" + Utility.encode(branchGuid); + + String expectedUrl = "/" + new UrlQuery().put("artifact", artGuid).put("branch", "branchGuid").toString(); + Assert.assertEquals(expectedUrl, navigator.getArtifactUrl()); } @@ -133,7 +140,10 @@ public class SearchPresenterTest { CoreArtifactTypes.AbstractTestResult, RelationTypeMultiplicity.ONE_TO_ONE, ""); testArt.addRelationType(relType); provider.addArtifact(testArt); - String url = "/branch=" + Utility.encode(CoreBranches.COMMON.getGuid()) + "&artifact=" + artGuid; + + String url = + "/" + new UrlQuery().put("branch", CoreBranches.COMMON.getGuid()).put("artifact", "artGuid").toString(); + MockSearchHeaderComponent searchHeaderComp = new MockSearchHeaderComponent(); MockArtifactHeaderComponent artHeaderComp = new MockArtifactHeaderComponent(); MockRelationComponent relComp = new MockRelationComponent(); @@ -165,7 +175,8 @@ public class SearchPresenterTest { presenter.initArtifactPage(url, searchHeaderComp, artHeaderComp, relComp, attrComp, optionsComp); Assert.assertNotNull(artHeaderComp.getErrorMessage()); - url = "/branch=" + Utility.encode(GUID.create()) + "&artifact=" + Utility.encode(GUID.create()); + url = "/" + new UrlQuery().put("branch", CoreBranches.COMMON.getGuid()).put("artifact", GUID.create()).toString(); + ExceptionArtifactProvider provider = new ExceptionArtifactProvider(); presenter = new SearchPresenterImpl<SearchHeaderComponent, ViewSearchParameters>(provider, new MockLogger()); searchHeaderComp = new MockSearchHeaderComponent(); diff --git a/plugins/org.eclipse.osee.display.presenter/src/org/eclipse/osee/display/presenter/SearchPresenterImpl.java b/plugins/org.eclipse.osee.display.presenter/src/org/eclipse/osee/display/presenter/SearchPresenterImpl.java index ac13ed63cbe..3220afc3369 100644 --- a/plugins/org.eclipse.osee.display.presenter/src/org/eclipse/osee/display/presenter/SearchPresenterImpl.java +++ b/plugins/org.eclipse.osee.display.presenter/src/org/eclipse/osee/display/presenter/SearchPresenterImpl.java @@ -16,8 +16,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import java.util.Set; import org.eclipse.osee.display.api.components.ArtifactHeaderComponent; import org.eclipse.osee.display.api.components.AttributeComponent; @@ -50,6 +48,7 @@ import org.eclipse.osee.framework.core.model.type.RelationType; import org.eclipse.osee.framework.jdk.core.type.MatchLocation; import org.eclipse.osee.framework.jdk.core.util.Lib; import org.eclipse.osee.framework.jdk.core.util.Strings; +import org.eclipse.osee.framework.jdk.core.util.UrlQuery; import org.eclipse.osee.logger.Log; import org.eclipse.osee.orcs.data.ReadableArtifact; import org.eclipse.osee.orcs.data.ReadableAttribute; @@ -76,9 +75,14 @@ public class SearchPresenterImpl<T extends SearchHeaderComponent, K extends View @Override public void initSearchResults(String url, T searchHeaderComp, SearchResultsListComponent searchResultsComp, DisplayOptionsComponent options) { artifactProvider.cancelSearch(); - SearchParameters params = decodeSearchUrl(url); + SearchParameters params = null; + try { + params = decodeSearchUrl(url); + } catch (UnsupportedEncodingException ex) { + setErrorMessage(searchResultsComp, "Error parsing url", ex); + } - if (!Strings.isValid(url) || !params.isValid()) { + if (!Strings.isValid(url) || params == null || !params.isValid()) { sendSearchCompleted(); return; } @@ -124,12 +128,12 @@ public class SearchPresenterImpl<T extends SearchHeaderComponent, K extends View @Override public void selectArtifact(String url, ViewArtifact artifact, SearchNavigator oseeNavigator) { - Map<String, String> params = Utility.decode(url); - params.put("branch", artifact.getBranch().getGuid()); - params.put("artifact", artifact.getGuid()); String value; try { - value = getParametersAsEncodedUrl(params); + UrlQuery query = new UrlQuery(); + query.put("branch", artifact.getBranch().getGuid()); + query.put("artifact", artifact.getGuid()); + value = query.toUrl(); oseeNavigator.navigateArtifactPage("/" + value); } catch (UnsupportedEncodingException ex) { logger.error(ex, "Error in Encoding url in selectArtifact"); @@ -145,8 +149,13 @@ public class SearchPresenterImpl<T extends SearchHeaderComponent, K extends View return; } - ArtifactParameters params = decodeArtifactUrl(url); - if (!params.isValid()) { + ArtifactParameters params = null; + try { + params = decodeArtifactUrl(url); + } catch (UnsupportedEncodingException ex1) { + setErrorMessage(artHeaderComp, String.format("Invalid url received: %s", url), ex1); + } + if (params == null || !params.isValid()) { setErrorMessage(artHeaderComp, String.format("Invalid url received: %s", url), null); return; } @@ -297,46 +306,37 @@ public class SearchPresenterImpl<T extends SearchHeaderComponent, K extends View } } - private ArtifactParameters decodeArtifactUrl(String url) { - Map<String, String> data = Utility.decode(url); - String branch = data.get("branch"); - String artifact = data.get("artifact"); + private ArtifactParameters decodeArtifactUrl(String url) throws UnsupportedEncodingException { + UrlQuery query = new UrlQuery(); + query.parse(url); + String branch = query.getParameter("branch"); + String artifact = query.getParameter("artifact"); return new ArtifactParameters(branch, artifact); } - private SearchParameters decodeSearchUrl(String url) { - Map<String, String> data = Utility.decode(url); - - String branch = data.get("branch"); - String vValue = data.get("verbose"); + private SearchParameters decodeSearchUrl(String url) throws UnsupportedEncodingException { + UrlQuery query = new UrlQuery(); + query.parse(url); + String branch = query.getParameter("branch"); + String vValue = query.getParameter("verbose"); boolean verbose = vValue == null ? false : vValue.equalsIgnoreCase("true"); - String nValue = data.get("nameOnly"); + String nValue = query.getParameter("nameOnly"); boolean nameOnly = nValue == null ? false : nValue.equalsIgnoreCase("true"); - String searchPhrase = data.get("search"); + String searchPhrase = query.getParameter("search"); return new SearchParameters(branch, nameOnly, searchPhrase, verbose); } - protected String getParametersAsEncodedUrl(Map<String, String> keyValues) throws UnsupportedEncodingException { - StringBuilder sb = new StringBuilder(); - for (Entry<String, String> entry : keyValues.entrySet()) { - String key = entry.getKey(); - sb.append(Utility.encode(key)); - sb.append("="); - sb.append(Utility.encode(entry.getValue())); - sb.append("&"); - } - if (sb.length() - 1 >= 0) { - // Delete the last unnecessary '&' - sb.deleteCharAt(sb.length() - 1); - } - return sb.toString(); - } @Override public void selectDisplayOptions(String url, DisplayOptions options, SearchNavigator navigator) { - Map<String, String> map = Utility.decode(url); - map.put("verbose", String.valueOf(options.getVerboseResults().booleanValue())); - String newUrl = Utility.encode(map); - navigator.navigateSearchResults(newUrl); + UrlQuery query = new UrlQuery(); + try { + query.parse(url); + query.putInPlace("verbose", String.valueOf(options.getVerboseResults().booleanValue())); + String newUrl = query.toUrl(); + navigator.navigateSearchResults(newUrl); + } catch (UnsupportedEncodingException ex) { + logger.error(ex, "Error in Encoding url in selectArtifact"); + } } @Override diff --git a/plugins/org.eclipse.osee.display.presenter/src/org/eclipse/osee/display/presenter/Utility.java b/plugins/org.eclipse.osee.display.presenter/src/org/eclipse/osee/display/presenter/Utility.java index acc92eaa15d..fb2e66f4ad3 100644 --- a/plugins/org.eclipse.osee.display.presenter/src/org/eclipse/osee/display/presenter/Utility.java +++ b/plugins/org.eclipse.osee.display.presenter/src/org/eclipse/osee/display/presenter/Utility.java @@ -10,18 +10,11 @@ *******************************************************************************/ package org.eclipse.osee.display.presenter; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; import org.eclipse.osee.display.api.data.StyledText; import org.eclipse.osee.framework.jdk.core.type.MatchLocation; -import org.eclipse.osee.framework.jdk.core.util.Strings; import org.eclipse.osee.orcs.data.ReadableArtifact; import org.eclipse.osee.orcs.utility.ArtifactNameComparator; import org.eclipse.osee.orcs.utility.SortOrder; @@ -71,56 +64,4 @@ public final class Utility { } return text; } - - public static Map<String, String> decode(String url) { - Map<String, String> values = new HashMap<String, String>(); - - if (Strings.isValid(url)) { - String toParse = url; - if (toParse.startsWith("/")) { - toParse = toParse.substring(1, toParse.length()); - } - - String[] lines = toParse.split("&"); - for (String line : lines) { - String[] data = line.split("="); - if (data.length == 2) { - String key = data[0]; - String value = data[1]; - if (Strings.isValid(value) && Strings.isValid(key)) { - try { - value = URLDecoder.decode(value, "UTF-8"); - key = URLDecoder.decode(key, "UTF-8"); - values.put(key, value); - } catch (UnsupportedEncodingException ex) { - // - } - } - } - } - } - return values; - } - - public static String encode(Map<String, String> values) { - StringBuilder url = new StringBuilder(); - url.append("/"); - for (Entry<String, String> entry : values.entrySet()) { - try { - url.append(encode(entry.getKey())); - url.append("="); - url.append(encode(entry.getValue())); - url.append("&"); - } catch (UnsupportedEncodingException ex) { - // - } - } - url.deleteCharAt(url.length() - 1); - return url.toString(); - } - - public static String encode(String value) throws UnsupportedEncodingException { - return URLEncoder.encode(value, "UTF-8"); - } - } diff --git a/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/JdkCoreUtilTestSuite.java b/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/JdkCoreUtilTestSuite.java index 01023f3123b..70c65f6e9a3 100644 --- a/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/JdkCoreUtilTestSuite.java +++ b/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/JdkCoreUtilTestSuite.java @@ -29,7 +29,8 @@ import org.junit.runners.Suite; HashCollectionTest.class, HumanReadableIdTest.class, ReservedCharactersTest.class, - StringsTest.class,}) + StringsTest.class, + UrlQueryTest.class}) public class JdkCoreUtilTestSuite { @BeforeClass public static void setUp() throws Exception { diff --git a/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/UrlQueryTest.java b/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/UrlQueryTest.java new file mode 100644 index 00000000000..1d8c1cf309b --- /dev/null +++ b/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/UrlQueryTest.java @@ -0,0 +1,153 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +/******************************************************************************* + * Copyright (c) 2004, 2007 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.framework.jdk.core.util; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.TreeMap; +import junit.framework.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +/** + * Test Case for {@link UrlQuery} + * + * @author Roberto E. Escobar + */ +@RunWith(Parameterized.class) +public class UrlQueryTest { + + private final String queryString; + private final TestData expected; + + public UrlQueryTest(String queryString, TestData expected) { + this.queryString = queryString; + this.expected = expected; + } + + @Test + public void testParse() throws UnsupportedEncodingException { + UrlQuery query = new UrlQuery(); + query.parse(queryString); + + Set<String> expectedKeys = expected.keySet(); + for (String key : expectedKeys) { + Assert.assertTrue(query.containsKey(key)); + } + Assert.assertFalse(query.containsKey("dummy")); + + Enumeration<String> keys = query.getParameterNames(); + Set<String> data = new HashSet<String>(); + while (keys.hasMoreElements()) { + data.add(keys.nextElement()); + } + + assertEquals(expectedKeys, data); + + for (Entry<String, List<String>> entry : expected.entrySet()) { + String[] values = query.getParameterValues(entry.getKey()); + List<String> actual = new ArrayList<String>(); + actual.addAll(Arrays.asList(values)); + java.util.Collections.sort(actual); + + List<String> expected = entry.getValue(); + java.util.Collections.sort(expected); + + assertEquals(expected, actual); + } + + for (Entry<String, String[]> entry : query.getParameterMap().entrySet()) { + + List<String> actual = new ArrayList<String>(); + actual.addAll(Arrays.asList(entry.getValue())); + java.util.Collections.sort(actual); + + List<String> expData = expected.get(entry.getKey()); + java.util.Collections.sort(expData); + + assertEquals(expData, actual); + } + + Assert.assertEquals(queryString, query.toUrl()); + Assert.assertEquals(queryString, query.toString()); + } + + private static <T> void assertEquals(Collection<T> expected, Collection<T> actual) { + Collection<T> set1 = Collections.setComplement(expected, actual); + Collection<T> set2 = Collections.setComplement(actual, expected); + Assert.assertTrue(set1.toString(), set1.isEmpty()); + Assert.assertTrue(set2.toString(), set2.isEmpty()); + } + + @Parameters + public static List<Object[]> getData() { + List<Object[]> data = new LinkedList<Object[]>(); + add(data, "phrase=Hello+Dude&value1=%2212345%22&value2=4%3C6", + new TestData().put("phrase", "Hello Dude").put("value1", "\"12345\"").put("value2", "4<6")); + add(data, "query+name=Hello+dude&query+name=one+more+string", + new TestData().put("query name", "Hello dude", "one more string")); + return data; + } + + private static final void add(List<Object[]> data, Object... args) { + data.add(args); + } + + private static final class TestData { + private final Map<String, List<String>> data = new TreeMap<String, List<String>>(); + + public TestData put(String key, String... values) { + List<String> vals = get(key); + if (vals == null) { + vals = new ArrayList<String>(); + data.put(key, vals); + } + for (String value : values) { + vals.add(value); + } + return this; + } + + public List<String> get(String key) { + return data.get(key); + } + + public Set<Entry<String, List<String>>> entrySet() { + return data.entrySet(); + } + + public Set<String> keySet() { + return data.keySet(); + } + } + +} diff --git a/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HttpUrlBuilder.java b/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HttpUrlBuilder.java index bcfd3f10ffb..b8fef20387c 100644 --- a/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HttpUrlBuilder.java +++ b/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HttpUrlBuilder.java @@ -11,7 +11,7 @@ package org.eclipse.osee.framework.jdk.core.util; import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; +import java.net.URL; import java.util.Map; import java.util.Map.Entry; @@ -24,24 +24,26 @@ public final class HttpUrlBuilder { // Utility Class } - private static String encode(String value) throws UnsupportedEncodingException { - return URLEncoder.encode(value, "UTF-8"); + public static UrlQuery getParametersFromUrl(String url) throws UnsupportedEncodingException { + UrlQuery query = createUrlQuery(); + return query.parse(url); } - private static String getParametersAsEncodedUrl(Map<String, String> keyValues) throws UnsupportedEncodingException { - StringBuilder sb = new StringBuilder(); + public static UrlQuery getParametersFromUrl(URL url) throws UnsupportedEncodingException { + UrlQuery query = createUrlQuery(); + return query.parse(url); + } + + public static UrlQuery createUrlQuery() { + return new UrlQuery(); + } + + public static String getParametersAsEncodedUrl(Map<String, String> keyValues) throws UnsupportedEncodingException { + UrlQuery query = createUrlQuery(); for (Entry<String, String> entry : keyValues.entrySet()) { - String key = entry.getKey(); - sb.append(encode(key)); - sb.append("="); - sb.append(encode(entry.getValue())); - sb.append("&"); - } - if (sb.length() - 1 >= 0) { - // Delete the last unnecessary '&' - sb.deleteCharAt(sb.length() - 1); + query.put(entry.getKey(), entry.getValue()); } - return sb.toString(); + return query.toUrl(); } public static String createURL(String address, int port, String context, Map<String, String> parameters) throws UnsupportedEncodingException { @@ -69,4 +71,5 @@ public final class HttpUrlBuilder { } return sb.toString(); } + } diff --git a/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/UrlQuery.java b/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/UrlQuery.java new file mode 100644 index 00000000000..195196d1661 --- /dev/null +++ b/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/UrlQuery.java @@ -0,0 +1,210 @@ +/******************************************************************************* + * Copyright (c) 2004, 2007 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.framework.jdk.core.util; + +import java.io.UnsupportedEncodingException; +import java.net.URL; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.TreeMap; + +/** + * @author Roberto E. Escobar + */ +public class UrlQuery { + + private static final String URL_ENCODING = "UTF-8"; + private final Map<String, List<String>> parameters; + + public UrlQuery() { + this.parameters = new TreeMap<String, List<String>>(); + } + + public UrlQuery clear() { + parameters.clear(); + return this; + } + + public boolean containsKey(String key) { + return parameters.containsKey(key); + } + + public UrlQuery put(String name, String... values) { + put(name, false, values); + return this; + } + + public UrlQuery put(String name, Object... values) { + put(name, false, values); + return this; + } + + public UrlQuery putInPlace(String name, String... values) { + put(name, true, values); + return this; + } + + public UrlQuery putInPlace(String name, Object... values) { + put(name, true, values); + return this; + } + + private UrlQuery put(String name, boolean overrite, String... values) { + for (String value : values) { + if (Strings.isValid(value)) { + innerPut(name, value, overrite); + } + } + return this; + } + + private UrlQuery put(String name, boolean overrite, Object... values) { + for (Object value : values) { + if (value != null) { + innerPut(name, String.valueOf(value), overrite); + } + } + return this; + } + + private void innerPut(String name, String value, boolean overrite) { + List<String> list = parameters.get(name); + if (list == null) { + list = new ArrayList<String>(); + parameters.put(name, list); + } + if (overrite) { + list.clear(); + } + list.add(value); + } + + private void innerPut(String name, String value) { + innerPut(name, value, false); + } + + public UrlQuery parse(URL url) throws UnsupportedEncodingException { + if (url != null) { + parse(url.getQuery()); + } + return this; + } + + public UrlQuery parse(String qs) throws UnsupportedEncodingException { + clear(); + if (Strings.isValid(qs)) { + String toParse = qs; + + int pos = toParse.lastIndexOf('/'); + if (pos > -1) { + toParse = toParse.substring(pos + 1); + } + + pos = toParse.lastIndexOf('?'); + if (pos > -1) { + toParse = toParse.substring(pos + 1); + } + + String pairs[] = toParse.split("&"); + for (String pair : pairs) { + String name; + String value; + pos = pair.indexOf('='); + if (pos == -1) { + name = pair; + value = null; + } else { + name = decode(pair.substring(0, pos)); + value = decode(pair.substring(pos + 1, pair.length())); + } + innerPut(name, value); + } + } + return this; + } + + public String getParameter(String name) { + List<String> values = parameters.get(name); + String toReturn; + if (values == null) { + toReturn = null; + } else if (values.isEmpty()) { + toReturn = ""; + } else { + toReturn = values.iterator().next(); + } + return toReturn; + } + + public String[] getParameterValues(String name) { + List<String> values = parameters.get(name); + return values != null ? values.toArray(new String[values.size()]) : null; + } + + public Enumeration<String> getParameterNames() { + return java.util.Collections.enumeration(parameters.keySet()); + } + + public Map<String, String[]> getParameterMap() { + Map<String, String[]> map = new TreeMap<String, String[]>(); + for (Map.Entry<String, List<String>> entry : parameters.entrySet()) { + List<String> list = entry.getValue(); + String[] values = list != null ? list.toArray(new String[list.size()]) : null; + map.put(entry.getKey(), values); + } + return map; + } + + public String toUrl() throws UnsupportedEncodingException { + StringBuilder builder = new StringBuilder(); + boolean isFirst = true; + for (Entry<String, List<String>> entry : parameters.entrySet()) { + String key = entry.getKey(); + Collection<String> values = entry.getValue(); + if (values != null && !values.isEmpty()) { + + for (String value : values) { + if (!isFirst) { + builder.append('&'); + } + builder.append(encode(key)); + builder.append('='); + builder.append(encode(value)); + isFirst = false; + } + } + } + return builder.toString(); + } + + @Override + public String toString() { + try { + return toUrl(); + } catch (UnsupportedEncodingException ex) { + return Lib.exceptionToString(ex); + } + } + + private static String decode(String value) throws UnsupportedEncodingException { + return URLDecoder.decode(value, URL_ENCODING); + } + + private static String encode(String value) throws UnsupportedEncodingException { + return URLEncoder.encode(value, URL_ENCODING); + } +}
\ No newline at end of file |