/******************************************************************************* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.wink.common.uri; import static org.junit.Assert.assertArrayEquals; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.ws.rs.core.MultivaluedMap; import junit.framework.TestCase; import org.apache.wink.common.internal.uritemplate.BitWorkingUriTemplateProcessor; import org.apache.wink.common.internal.uritemplate.UriTemplateMatcher; import org.apache.wink.common.internal.uritemplate.UriTemplateProcessor; /** * Unit test of UriTemplate. */ public class BitWorkingUriTemplateProcessorTest extends TestCase {// extends // SpringAwareTestCase // { @Override protected void setUp() throws Exception { super.setUp(); } public void testGetVariableNames() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor( "/prefix/{varA}/root/{variableB}/suffix/{Variable345}"); Set<String> expectedResult = new HashSet<String>(); expectedResult.add("varA"); expectedResult.add("variableB"); expectedResult.add("Variable345"); assertEquals("variable name", expectedResult, template.getVariableNames()); } public void testMatch() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("/prefix/{varA}/root/{variableB}/suffix"); UriTemplateMatcher matcher = template.matcher(); MultivaluedMap<String, String> result = matcher.match("/prefix/aaaaaa/root/BbBbB/suffix"); assertNotNull("match ok", result); assertEquals("match size", 2, result.size()); assertEquals("varA", "aaaaaa", result.getFirst("varA")); assertEquals("variableB", "BbBbB", result.getFirst("variableB")); } public void testMatchVariableDoubleUsage() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("/prefix/{varA}/root/{varA}/suffix"); UriTemplateMatcher matcher = template.matcher(); MultivaluedMap<String, String> result = matcher.match("/prefix/aaaaaa/root/aaaaaa/suffix"); assertNotNull("match ok", result); assertEquals("match size", 1, result.size()); assertEquals("varA", "aaaaaa", result.getFirst("varA")); } public void testMatchNegative() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("/prefix/{variable}/suffix"); UriTemplateMatcher matcher = template.matcher(); assertNull("not matching", matcher.match("aprefix/value/suffix")); } public void testInstantiate() { UriTemplateProcessor templateA = new BitWorkingUriTemplateProcessor("/part1/{variable}/part2"); HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("variable", "value"); assertEquals("instantiate template", "/part1/value/part2", templateA.expand(hashMap)); } public void testInstantiateDefaultValue() { UriTemplateProcessor templateA = new BitWorkingUriTemplateProcessor("/part1/{variable=default_value}/part2"); HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("variable", "my_value"); assertEquals("instantiate template with some value", "/part1/my_value/part2", templateA .expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("variable", (String)null); assertEquals("instantiate template with default value if null", "/part1/default_value/part2", templateA.expand(hashMap)); hashMap = new HashMap<String, Object>(); assertEquals("instantiate template with default value if not-defined", "/part1/default_value/part2", templateA.expand(hashMap)); } public void testInstantiateNegative() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("/part1/{variableA}/part2/{variableB}"); try { HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("variableA", "value"); template.expand(hashMap); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException expected) { } } public void testCreateNegative() { try { new BitWorkingUriTemplateProcessor(null); fail("NPE expected"); } catch (NullPointerException expected) { } try { new BitWorkingUriTemplateProcessor("{unclosedVariableStill/goes/on"); fail("IllegalArgumentException expected"); } catch (IllegalArgumentException expected) { } try { new BitWorkingUriTemplateProcessor("artifacts{}"); fail("no variable in expansion"); } catch (IllegalArgumentException e) { } // ok } public void testPathParameters() { UriTemplateProcessor feedTemplate1 = new BitWorkingUriTemplateProcessor( "artifacts{-prefix|;datetime=|datetime}{-prefix|;lc=|lc}{-prefix|;approved=|approved}"); UriTemplateProcessor feedTemplate2 = new BitWorkingUriTemplateProcessor( "artifacts{-opt|;|datetime,lc,approved}{-join|;|datetime,lc,approved}"); UriTemplateProcessor entryTemplate1 = new BitWorkingUriTemplateProcessor( feedTemplate1.getTemplate() + "/{artifact}{-prefix|;rev=|revision}"); UriTemplateProcessor entryTemplate2 = new BitWorkingUriTemplateProcessor( feedTemplate2.getTemplate() + "/{artifact}{-prefix|;rev=|revision}"); String[][] allNull = { {"datetime", null}, {"lc", null}, {"approved", null}}; String[][] dateEmpty = { {"datetime", ""}, {"lc", null}, {"approved", null}}; String[][] date = { {"datetime", "date"}, {"lc", null}, {"approved", null}}; String[][] all = { {"datetime", "date"}, {"lc", "lc"}, {"approved", "stage"}}; String[][] wrongOrder = { {"datetime", null}, {"lc", "lc"}, {"approved", "stage;datetime=date"}}; assertMatchTemplate(feedTemplate1, "artifacts/", allNull); assertMatchTemplate(feedTemplate2, "artifacts/", allNull); assertMatchTemplate(feedTemplate1, "artifacts;", null); assertMatchTemplate(feedTemplate2, "artifacts;", allNull); assertMatchTemplate(feedTemplate1, "artifacts;datetime", null); assertMatchTemplate(feedTemplate2, "artifacts;datetime", null); assertMatchTemplate(feedTemplate1, "artifacts;datetime;", null); assertMatchTemplate(feedTemplate2, "artifacts;datetime;", null); assertMatchTemplate(feedTemplate1, "artifacts", allNull); assertMatchTemplate(feedTemplate2, "artifacts", allNull); assertMatchTemplate(feedTemplate1, "artifacts;datetime=", dateEmpty); assertMatchTemplate(feedTemplate2, "artifacts;datetime=", dateEmpty); assertMatchTemplate(feedTemplate1, "artifacts;datetime=date", date); assertMatchTemplate(feedTemplate2, "artifacts;datetime=date", date); assertMatchTemplate(feedTemplate1, "artifacts;datetime=date;lc=lc;approved=stage", all); assertMatchTemplate(feedTemplate2, "artifacts;datetime=date;lc=lc;approved=stage", all); // the order of parameters matters with "prefix" operator assertMatchTemplate(feedTemplate1, "artifacts;lc=lc;approved=stage;datetime=date", wrongOrder); // but it does not matter with "join" operator assertMatchTemplate(feedTemplate2, "artifacts;lc=lc;approved=stage;datetime=date", all); // ----- entries ------ String[][] entry = { {"datetime", null}, {"lc", null}, {"approved", null}, {"artifact", "13"}, {"revision", null}}; String[][] emptyRevision = { {"datetime", null}, {"lc", null}, {"approved", null}, {"artifact", "13"}, {"revision", ""}}; String[][] revision = { {"datetime", null}, {"lc", null}, {"approved", null}, {"artifact", "13"}, {"revision", "7"}}; all = new String[][] { {"datetime", "date"}, {"lc", "lc"}, {"approved", "stage"}, {"artifact", "13"}, {"revision", "7"}}; assertMatchTemplate(entryTemplate1, "artifacts/", null); assertMatchTemplate(entryTemplate2, "artifacts/", null); assertMatchTemplate(entryTemplate1, "artifacts/13", entry); assertMatchTemplate(entryTemplate2, "artifacts/13", entry); assertMatchTemplate(entryTemplate1, "artifacts/13;rev=", emptyRevision); assertMatchTemplate(entryTemplate2, "artifacts/13;rev=", emptyRevision); assertMatchTemplate(entryTemplate1, "artifacts/13;rev=7", revision); assertMatchTemplate(entryTemplate2, "artifacts/13;rev=7", revision); assertMatchTemplate(entryTemplate1, "artifacts;datetime=date;lc=lc;approved=stage/13;rev=7", all); assertMatchTemplate(entryTemplate2, "artifacts;lc=lc;approved=stage;datetime=date/13;rev=7", all); } public void testListOperator() { UriTemplateProcessor template1 = new BitWorkingUriTemplateProcessor("locations/{-list|/|var}"); UriTemplateProcessor template2 = new BitWorkingUriTemplateProcessor("locations{-opt|/|var}{-list|/|var}"); UriTemplateProcessor template3 = new BitWorkingUriTemplateProcessor("telegram:{-list|stop|var}"); String[][] empty = {{"var", ""}}; String[][] a = {{"var", "a"}}; String[][] ab = {{"var", "a", "b"}}; String[][] ab_ = {{"var", "a", "b", ""}}; String[][] a_c = {{"var", "a", "", "c"}}; String[][] _bc = {{"var", "", "b", "c"}}; String[][] message = {{"var", "hello", "baby", "go", "home"}}; assertMatchTemplate(template1, "locations", null); assertMatchTemplate(template2, "locations", empty); assertMatchTemplate(template1, "locations/", empty); assertMatchTemplate(template2, "locations/", empty); assertMatchTemplate(template1, "locations/a", a); assertMatchTemplate(template2, "locations/a", a); assertMatchTemplate(template1, "locations/a/b", ab); assertMatchTemplate(template2, "locations/a/b", ab); assertMatchTemplate(template2, "locations/a/b/", ab_); assertMatchTemplate(template2, "locations/a//c", a_c); assertMatchTemplate(template2, "locations//b/c", _bc); assertMatchTemplate(template3, "telegram:hellostopbabystopgostophome", message); try { new BitWorkingUriTemplateProcessor("locations/{-list|/|var1,var2}"); fail("only one variable is allowed"); } catch (IllegalArgumentException expected) { } HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {}); assertEquals("instantiate template1", "locations/", template1.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {}); assertEquals("instantiate template2", "locations", template2.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"d"}); assertEquals("instantiate template1", "locations/d", template1.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"d"}); assertEquals("instantiate template2", "locations/d", template2.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"d", "e"}); assertEquals("instantiate template1", "locations/d/e", template1.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"d", "e"}); assertEquals("instantiate template2", "locations/d/e", template2.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"d", "", "e"}); assertEquals("instantiate template1", "locations/d//e", template1.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"d", "", "e"}); assertEquals("instantiate template2", "locations/d//e", template2.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"", "d", "e"}); assertEquals("instantiate template1", "locations//d/e", template1.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"", "d", "e"}); assertEquals("instantiate template2", "locations//d/e", template2.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"d", "e", ""}); assertEquals("instantiate template1", "locations/d/e/", template1.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"d", "e", ""}); assertEquals("instantiate template2", "locations/d/e/", template2.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"hello", "baby", "go", "home"}); assertEquals("instantiate template3", "telegram:hellostopbabystopgostophome", template3 .expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", "value"); assertEquals("instantiate template1", "locations/value", template1.expand(hashMap)); } public void testOptOperator() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("artifacts{-opt|;|var1,var2}"); String[][] empty = {}; assertMatchTemplate(template, "artifact/", null); assertMatchTemplate(template, "artifacts", empty); assertMatchTemplate(template, "artifacts;", empty); assertMatchTemplate(template, "artifacts;;", null); HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("var1", "somevalue"); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", "somevalue"); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var1", ""); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", ""); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var1", (String)null); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", (String)null); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var1", ""); hashMap.put("var2", ""); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var1", (String)null); hashMap.put("var2", (String)null); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", new String[] {}); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", new String[] {null}); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", new String[] {""}); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", new String[] {"a", "b"}); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); try { new BitWorkingUriTemplateProcessor("artifacts{-opt|;|}"); fail("no variable in operator"); } catch (IllegalArgumentException e) { } // ok } public void testSuffixOperator() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("/{-suffix|/|var}cat"); UriTemplateProcessor template3 = new BitWorkingUriTemplateProcessor("telegram:{-suffix|stop|var}"); String[][] animalsVar = {{"var", "animals"}}; String[][] noVar = {{"var", null}}; String[][] emptyVar = {{"var", ""}}; String[][] domesticAnimalsVar = {{"var", "animals", "domestic"}}; String[][] message = {{"var", "hello", "baby", "go", "home"}}; assertMatchTemplate(template, "/animals/cat", animalsVar); assertMatchTemplate(template, "/cat", noVar); assertMatchTemplate(template, "//cat", emptyVar); assertMatchTemplate(template, "/animals;cat", null); assertMatchTemplate(template, "animals/cat", null); try { new BitWorkingUriTemplateProcessor("/{-suffix|/|var1,var2}cat"); fail("-suffix accepts only one variable"); } catch (IllegalArgumentException e) { } // ok assertMatchTemplate(template, "/animals/domestic/cat", domesticAnimalsVar); assertMatchTemplate(template3, "telegram:hellostopbabystopgostophomestop", message); HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("var", "animals"); assertEquals("instantiate template", "/animals/cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", ""); assertEquals("instantiate template", "//cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); assertEquals("instantiate template", "/cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("", ""); assertEquals("instantiate template", "/cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("", "pets"); assertEquals("instantiate template", "/cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"animals", "domestic"}); assertEquals("instantiate template", "/animals/domestic/cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"hello", "baby", "go", "home"}); assertEquals("instantiate template3", "telegram:hellostopbabystopgostophomestop", template3 .expand(hashMap)); } public void testJoinOperator() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("people%3F{-join|&|var1,var2}"); String[][] allNull = { {"var1", null}, {"var2", null}}; String[][] firstEmpty = { {"var1", ""}, {"var2", null}}; String[][] john = { {"var1", "john"}, {"var2", null}}; String[][] allDefined = { {"var1", "mary"}, {"var2", "kate"}}; assertMatchTemplate(template, "people%3F/", allNull); assertMatchTemplate(template, "people%3F", allNull); assertMatchTemplate(template, "people%3Fvar1", null); assertMatchTemplate(template, "people%3Fvar1&", null); assertMatchTemplate(template, "people%3Fvar1=", firstEmpty); assertMatchTemplate(template, "people%3Fvar1=john", john); assertMatchTemplate(template, "people%3Fvar1=mary&var2=kate", allDefined); assertMatchTemplate(template, "people%3Fvar2=kate&var1=mary", allDefined); assertMatchTemplate(template, "people%3Fvar3=jin", null); HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("var1", ""); assertEquals("instantiate template", "people%3Fvar1=", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var1", "jay"); assertEquals("instantiate template", "people%3Fvar1=jay", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", "joe"); assertEquals("instantiate template", "people%3Fvar2=joe", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var1", "mary"); hashMap.put("var2", "kate"); assertEquals("instantiate template", "people%3Fvar1=mary&var2=kate", template .expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var3", "joe"); assertEquals("instantiate template", "people%3F", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); assertEquals("instantiate template", "people%3F", template.expand(hashMap)); try { hashMap = new HashMap<String, Object>(); hashMap.put("var1", new String[] {"joe", "max"}); template.expand(hashMap); fail("variable must not be a list"); } catch (IllegalArgumentException expected) { } } public void testNegOperator() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("artifacts{-neg|;|var1,var2}"); String[][] empty = {}; assertMatchTemplate(template, "artifact/", null); assertMatchTemplate(template, "artifacts", empty); assertMatchTemplate(template, "artifacts;", empty); assertMatchTemplate(template, "artifacts;;", null); HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("var1", (String)null); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", (String)null); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var1", (String)null); hashMap.put("var2", (String)null); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var1", ""); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", ""); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var1", ""); hashMap.put("var2", ""); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var1", "somevalue"); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", "somevalue"); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", new String[] {}); assertEquals("instantiate template", "artifacts;", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", new String[] {null}); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", new String[] {""}); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var2", new String[] {"a", "b"}); assertEquals("instantiate template", "artifacts", template.expand(hashMap)); } public void testPrefixOperator() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("{-prefix|/|var}/cat"); UriTemplateProcessor template3 = new BitWorkingUriTemplateProcessor("telegram:{-prefix|stop|var}"); String[][] animalsVar = {{"var", "animals"}}; String[][] noVar = {{"var", null}}; String[][] emptyVar = {{"var", ""}}; String[][] domesticAnimalsVar = {{"var", "animals", "domestic"}}; String[][] message = {{"var", "hello", "baby", "go", "home"}}; assertMatchTemplate(template, "/animals/cat", animalsVar); assertMatchTemplate(template, "/cat", noVar); assertMatchTemplate(template, "//cat", emptyVar); assertMatchTemplate(template, "/animals;cat", null); assertMatchTemplate(template, "animals/cat", null); try { new BitWorkingUriTemplateProcessor("/{-prefix|/|var1,var2}cat"); fail("-prefix accepts only one variable"); } catch (IllegalArgumentException e) { } // ok assertMatchTemplate(template, "/animals/domestic/cat", domesticAnimalsVar); assertMatchTemplate(template3, "telegram:stophellostopbabystopgostophome", message); HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("var", "animals"); assertEquals("instantiate template", "/animals/cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", ""); assertEquals("instantiate template", "//cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); assertEquals("instantiate template", "/cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("", ""); assertEquals("instantiate template", "/cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("", "pets"); assertEquals("instantiate template", "/cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"animals", "domestic"}); assertEquals("instantiate template", "/animals/domestic/cat", template.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("var", new String[] {"hello", "baby", "go", "home"}); assertEquals("instantiate template3", "telegram:stophellostopbabystopgostophome", template3 .expand(hashMap)); } public void testOperatorInvalidSyntax() { try { new BitWorkingUriTemplateProcessor("/{-prefix}cat"); fail("no pipe in operator"); } catch (IllegalArgumentException e) { } // ok try { new BitWorkingUriTemplateProcessor("/{-prefix|/}cat"); fail("only one pipe in operator"); } catch (IllegalArgumentException e) { } // ok try { new BitWorkingUriTemplateProcessor("/{}/cat"); fail("no variable name"); } catch (IllegalArgumentException e) { } // ok } public void testEncodedUri() { UriTemplateProcessor template1 = new BitWorkingUriTemplateProcessor("cars(old*new:good)my?{-join|&|car1,car2}"); String[][] carsDefined = { {"car1", "Ford"}, {"car2", "Opel"}}; assertMatchTemplate(template1, "cars(old*new:good)my?car1=Ford&car2=Opel", carsDefined); HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("car1", "Ford"); hashMap.put("car2", "Opel"); assertEquals("instantiate template1", "cars(old*new:good)my?car1=Ford&car2=Opel", template1 .expand(hashMap)); UriTemplateProcessor template2 = new BitWorkingUriTemplateProcessor("vegetables|{-list|?|vegs}"); String[][] vegsDefined = {{"vegs", "carrot", "leek"}}; assertMatchTemplate(template2, "vegetables|carrot?leek", vegsDefined); hashMap = new HashMap<String, Object>(); hashMap.put("vegs", new String[] {"carrot", "leek"}); assertEquals("instantiate template2", "vegetables|carrot?leek", template2.expand(hashMap)); UriTemplateProcessor template3 = new BitWorkingUriTemplateProcessor("vegetables{-prefix|?|vegs}"); assertMatchTemplate(template3, "vegetables?carrot?leek", vegsDefined); hashMap = new HashMap<String, Object>(); hashMap.put("vegs", new String[] {"carrot", "leek"}); assertEquals("instantiate template3", "vegetables?carrot?leek", template3.expand(hashMap)); UriTemplateProcessor template4 = new BitWorkingUriTemplateProcessor("vegetables|{-suffix|?|vegs}"); assertMatchTemplate(template4, "vegetables|carrot?leek?", vegsDefined); hashMap = new HashMap<String, Object>(); hashMap.put("vegs", new String[] {"carrot", "leek"}); assertEquals("instantiate template4", "vegetables|carrot?leek?", template4.expand(hashMap)); UriTemplateProcessor template5 = new BitWorkingUriTemplateProcessor("translator({-join|?|czech,english})"); String[][] translation = { {"czech", "pes"}, {"english", "dog"}}; assertMatchTemplate(template5, "translator(english=dog?czech=pes)", translation); hashMap = new HashMap<String, Object>(); hashMap.put("english", "dog"); hashMap.put("czech", "pes"); assertEquals("instantiate template5", "translator(czech=pes?english=dog)", template5 .expand(hashMap)); UriTemplateProcessor template6 = new BitWorkingUriTemplateProcessor("food{-opt|?|meat,milk}"); String[][] empty = {}; assertMatchTemplate(template6, "food?", empty); hashMap = new HashMap<String, Object>(); hashMap.put("meat", "poultry"); assertEquals("instantiate template6", "food?", template6.expand(hashMap)); UriTemplateProcessor template7 = new BitWorkingUriTemplateProcessor("food{-neg|()|meat,milk}"); assertMatchTemplate(template7, "food()", empty); hashMap = new HashMap<String, Object>(); assertEquals("instantiate template7", "food()", template7.expand(hashMap)); } public void testUnreservedMatch() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("/prefix/{varA}"); UriTemplateMatcher matcher = template.matcher(); MultivaluedMap<String, String> result = matcher.match("/prefix/a.b"); assertNotNull("match ok .", result); assertEquals("match size .", 1, result.size()); assertEquals("varA", "a.b", result.getFirst("varA")); result = matcher.match("/prefix/a_b"); assertNotNull("match ok _", result); assertEquals("match size _", 1, result.size()); assertEquals("varA", "a_b", result.getFirst("varA")); result = matcher.match("/prefix/a-b"); assertNotNull("match ok -", result); assertEquals("match size ,", 1, result.size()); assertEquals("varA", "a-b", result.getFirst("varA")); result = matcher.match("/prefix/a~b"); assertNotNull("match ok ~", result); assertEquals("match size ~", 1, result.size()); assertEquals("varA", "a~b", result.getFirst("varA")); } public void testReservedMatch() { UriTemplateProcessor template = new BitWorkingUriTemplateProcessor("/prefix/{varA}"); UriTemplateMatcher matcher = template.matcher(); MultivaluedMap<String, String> result = matcher.match("/prefix/a%3Ab"); assertNotNull("match ok :", result); assertEquals("match size :", 1, result.size()); assertEquals("varA", "a%3Ab", result.getFirst("varA")); // character ":" is reserved, however hp-soa requires to match it result = matcher.match("/prefix/a:b"); assertNotNull("match ok :", result); assertEquals("match size :", 1, result.size()); assertEquals("varA", "a:b", result.getFirst("varA")); result = matcher.match("/prefix/a%2Fb"); assertNotNull("match ok /", result); assertEquals("match size /", 1, result.size()); assertEquals("varA", "a%2Fb", result.getFirst("varA")); result = matcher.match("/prefix/%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D"); assertNotNull("match ok ?#[]@!$&'()*+,;=", result); assertEquals("match size ?#[]@!$&'()*+,;=", 1, result.size()); assertEquals("varA", "%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D", result .getFirst("varA")); } public void testDecodedMatchedValues() { UriTemplateProcessor templateVar = new BitWorkingUriTemplateProcessor("/var/{var}"); String[][] var = {{"var", "enc%3Aoded"}}; assertMatchTemplate(templateVar, "/var/enc%3Aoded", var); UriTemplateProcessor templateJoin = new BitWorkingUriTemplateProcessor("/join/{-join|;|join}"); String[][] join = {{"join", "enc%3Aoded"}}; assertMatchTemplate(templateJoin, "/join/join=enc%3Aoded", join); UriTemplateProcessor templateList = new BitWorkingUriTemplateProcessor("/list/{-list|/|list}"); String[][] list1 = {{"list", "enc%3Aoded"}}; assertMatchTemplate(templateList, "/list/enc%3Aoded", list1); String[][] list2 = {{"list", "enc%3Aoded", "enc%3Aoded"}}; assertMatchTemplate(templateList, "/list/enc%3Aoded/enc%3Aoded", list2); UriTemplateProcessor templatePrefix = new BitWorkingUriTemplateProcessor("/prefix{-prefix|/|prefix}"); String[][] prefix1 = {{"prefix", "enc%3Aoded"}}; assertMatchTemplate(templatePrefix, "/prefix/enc%3Aoded", prefix1); String[][] prefix2 = {{"prefix", "enc%3Aoded", "enc%3Aoded"}}; assertMatchTemplate(templatePrefix, "/prefix/enc%3Aoded/enc%3Aoded", prefix2); UriTemplateProcessor templateSuffix = new BitWorkingUriTemplateProcessor("/suffix/{-suffix|/|suffix}"); String[][] suffix1 = {{"suffix", "enc%3Aoded"}}; assertMatchTemplate(templateSuffix, "/suffix/enc%3Aoded/", suffix1); String[][] suffix2 = {{"suffix", "enc%3Aoded", "enc%3Aoded"}}; assertMatchTemplate(templateSuffix, "/suffix/enc%3Aoded/enc%3Aoded/", suffix2); } public void testEncodedSubstitutedValues() { UriTemplateProcessor templateVar = new BitWorkingUriTemplateProcessor("/var/{var}"); HashMap<String, Object> hashMap = new HashMap<String, Object>(); hashMap.put("var", "enc:oded"); assertEquals("values encoded", "/var/enc%3Aoded", templateVar.expand(hashMap)); UriTemplateProcessor templateJoin = new BitWorkingUriTemplateProcessor("/join/{-join|;|join}"); hashMap = new HashMap<String, Object>(); hashMap.put("join", "enc:oded"); assertEquals("values encoded", "/join/join=enc%3Aoded", templateJoin.expand(hashMap)); UriTemplateProcessor templateList = new BitWorkingUriTemplateProcessor("/list/{-list|/|list}"); hashMap = new HashMap<String, Object>(); hashMap.put("list", new String[] {"enc:oded"}); assertEquals("values encoded", "/list/enc%3Aoded", templateList.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("list", new String[] {"enc:oded", "enc:oded"}); assertEquals("values encoded", "/list/enc%3Aoded/enc%3Aoded", templateList.expand(hashMap)); UriTemplateProcessor templatePrefix = new BitWorkingUriTemplateProcessor("/prefix{-prefix|/|prefix}"); hashMap = new HashMap<String, Object>(); hashMap.put("prefix", "enc:oded"); assertEquals("values encoded", "/prefix/enc%3Aoded", templatePrefix.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("prefix", new String[] {"enc:oded", "enc:oded"}); assertEquals("values encoded", "/prefix/enc%3Aoded/enc%3Aoded", templatePrefix .expand(hashMap)); UriTemplateProcessor templateSuffix = new BitWorkingUriTemplateProcessor("/suffix/{-suffix|/|suffix}"); hashMap = new HashMap<String, Object>(); hashMap.put("suffix", "enc:oded"); assertEquals("values encoded", "/suffix/enc%3Aoded/", templateSuffix.expand(hashMap)); hashMap = new HashMap<String, Object>(); hashMap.put("suffix", new String[] {"enc:oded", "enc:oded"}); assertEquals("values encoded", "/suffix/enc%3Aoded/enc%3Aoded/", templateSuffix .expand(hashMap)); } /** * Test of registration and unregistration of operators. Since operators are * registered in a static map, this test must not be executed in the same * time as the UriTemplate tests above. */ // public void testRegistration() { // UriTemplateOperator[] registererOperators = registrar.getOperators(); // assertEquals("all operators are in registrar", 6, // registererOperators.length); // UriTemplateOperator[] templateOperators = UriTemplate.getOperators(); // assertEquals("all operators are registered", 6, // templateOperators.length); // // // use operators that were registered via Spring // new UriTemplate("{-list|/|var}"); // new UriTemplate("{-join|/|var}"); // new UriTemplate("{-neg|/|var}"); // new UriTemplate("{-opt|/|var}"); // new UriTemplate("{-prefix|/|var}"); // new UriTemplate("{-suffix|/|var}"); // // // unregister operators // registrar.unregister(); // // // all operators were unregistered // templateOperators = UriTemplate.getOperators(); // assertEquals("no operators are registered", 0, templateOperators.length); // try { // new UriTemplate("{-list|/|var}"); // fail("no operator is registered"); // } catch (IllegalArgumentException e) { // } // ok // // // register operators // registrar.register(); // templateOperators = UriTemplate.getOperators(); // assertEquals("all operators are registered again", 6, // templateOperators.length); // // use operators that were registered again // new UriTemplate("{-list|/|var}"); // new UriTemplate("{-join|/|var}"); // new UriTemplate("{-neg|/|var}"); // new UriTemplate("{-opt|/|var}"); // new UriTemplate("{-prefix|/|var}"); // new UriTemplate("{-suffix|/|var}"); // } private static void assertMatchTemplate(UriTemplateProcessor template, String uri, String[][] variables) { UriTemplateMatcher matcher = template.matcher(); MultivaluedMap<String, String> varMap = matcher.match(uri); if (variables == null) { // must not match assertNull(varMap); } else { // number of variables must match assertEquals(variables.length, varMap.size()); // all variable values must match for (String[] variable : variables) { if (variable.length > 1) { String[] values = new String[variable.length - 1]; System.arraycopy(variable, 1, values, 0, variable.length - 1); List<String> valuesList = varMap.get(variable[0]); Object[] matchArray = new String[valuesList.size()]; if (valuesList != null) { for (int i = 0; i < valuesList.size(); ++i) { matchArray[i] = valuesList.get(i); } } assertArrayEquals(values, matchArray); } else { fail(); } } } } }