Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoberto E. Escobar2011-10-31 19:02:39 +0000
committerRoberto E. Escobar2011-10-31 19:02:39 +0000
commitea7a3940bd83d582f548250de8aa00a5d99fe5db (patch)
tree514daa3079172318b6fde2e96071d3c81afa6a68
parentc12efada41b4e1f60cefdd9d13a272580e65de57 (diff)
downloadorg.eclipse.osee-ea7a3940bd83d582f548250de8aa00a5d99fe5db.tar.gz
org.eclipse.osee-ea7a3940bd83d582f548250de8aa00a5d99fe5db.tar.xz
org.eclipse.osee-ea7a3940bd83d582f548250de8aa00a5d99fe5db.zip
feature: Create UrlQuery utility class
-rw-r--r--plugins/org.eclipse.osee.ats.presenter.test/src/org/eclipse/osee/ats/presenter/internal/AtsSearchPresenterTest.java10
-rw-r--r--plugins/org.eclipse.osee.ats.presenter/src/org/eclipse/osee/ats/presenter/internal/AtsSearchPresenterImpl.java49
-rw-r--r--plugins/org.eclipse.osee.display.presenter.test/src/org/eclipse/osee/display/presenter/internal/SearchPresenterTest.java23
-rw-r--r--plugins/org.eclipse.osee.display.presenter/src/org/eclipse/osee/display/presenter/SearchPresenterImpl.java80
-rw-r--r--plugins/org.eclipse.osee.display.presenter/src/org/eclipse/osee/display/presenter/Utility.java59
-rw-r--r--plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/JdkCoreUtilTestSuite.java3
-rw-r--r--plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/UrlQueryTest.java153
-rw-r--r--plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/HttpUrlBuilder.java33
-rw-r--r--plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/UrlQuery.java210
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

Back to the top