From do-not-reply at jboss.org Tue Nov 30 03:46:14 2010
Content-Type: multipart/mixed; boundary="===============3326108439728632243=="
MIME-Version: 1.0
From: do-not-reply at jboss.org
To: gatein-commits at lists.jboss.org
Subject: [gatein-commits] gatein SVN: r5377 - in
portal/branches/navcontroller/component/web/controller/src:
main/java/org/exoplatform/web/controller/router and 1 other directories.
Date: Tue, 30 Nov 2010 03:46:13 -0500
Message-ID: <201011300846.oAU8kDxC013927@svn01.web.mwc.hst.phx2.redhat.com>
--===============3326108439728632243==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Author: julien_viet
Date: 2010-11-30 03:46:11 -0500 (Tue, 30 Nov 2010)
New Revision: 5377
Added:
portal/branches/navcontroller/component/web/controller/src/main/java/org=
/exoplatform/web/controller/regexp/RegExpRenderer.java
Removed:
portal/branches/navcontroller/component/web/controller/src/main/java/org=
/exoplatform/web/controller/router/RegExpAnalyser.java
Modified:
portal/branches/navcontroller/component/web/controller/src/main/java/org=
/exoplatform/web/controller/router/PatternBuilder.java
portal/branches/navcontroller/component/web/controller/src/main/java/org=
/exoplatform/web/controller/router/Route.java
portal/branches/navcontroller/component/web/controller/src/test/java/org=
/exoplatform/web/controller/router/TestRegExpAnalyser.java
portal/branches/navcontroller/component/web/controller/src/test/java/org=
/exoplatform/web/controller/router/TestRouteEscaper.java
Log:
improve
Copied: portal/branches/navcontroller/component/web/controller/src/main/jav=
a/org/exoplatform/web/controller/regexp/RegExpRenderer.java (from rev 5351,=
portal/branches/navcontroller/component/web/controller/src/main/java/org/e=
xoplatform/web/controller/router/RegExpAnalyser.java)
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- portal/branches/navcontroller/component/web/controller/src/main/java/or=
g/exoplatform/web/controller/regexp/RegExpRenderer.java =
(rev 0)
+++ portal/branches/navcontroller/component/web/controller/src/main/java/or=
g/exoplatform/web/controller/regexp/RegExpRenderer.java 2010-11-30 08:46:11=
UTC (rev 5377)
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.exoplatform.web.controller.regexp;
+
+import java.io.IOException;
+
+/**
+ * Renders a {@link RENode} to its pattern representation.
+ *
+ * @author Julien Viet
+ * @version $Revision$
+ */
+public class RegExpRenderer
+{
+
+ public A render(RENode re, A appendable) throws =
IOException, NullPointerException
+ {
+ if (re =3D=3D null)
+ {
+ throw new NullPointerException("No null disjunction accepted");
+ }
+ if (appendable =3D=3D null)
+ {
+ throw new NullPointerException("No null appendable accepted");
+ }
+
+ //
+ if (re instanceof RENode.Disjunction)
+ {
+ render((RENode.Disjunction)re, appendable);
+ }
+ else if (re instanceof RENode.Alternative)
+ {
+ render((RENode.Alternative)re, appendable);
+ }
+ else if (re instanceof RENode.Expr)
+ {
+ render((RENode.Expr)re, appendable);
+ }
+ else if (re instanceof RENode.CharacterClassExpr)
+ {
+ render((RENode.CharacterClassExpr)re, appendable);
+ }
+ else
+ {
+ throw new AssertionError();
+ }
+
+ //
+ return appendable;
+ }
+
+ private void render(RENode.Disjunction disjunction, Appendable appendab=
le) throws IOException, NullPointerException
+ {
+ render(disjunction.getAlternative(), appendable);
+ RENode.Disjunction next =3D disjunction.getNext();
+ if (next !=3D null)
+ {
+ appendable.append('|');
+ render(next, appendable);
+ }
+ }
+
+ private void render(RENode.Alternative alternative, Appendable appendab=
le) throws IOException, NullPointerException
+ {
+ render(alternative.getExp(), appendable);
+ RENode.Alternative next =3D alternative.getNext();
+ if (next !=3D null)
+ {
+ render(next, appendable);
+ }
+ }
+
+ private void render(RENode.Expr expression, Appendable appendable) thro=
ws IOException, NullPointerException
+ {
+ Quantifier quantifier =3D null;
+ if (expression instanceof RENode.Any)
+ {
+ appendable.append('.');
+ quantifier =3D expression.getQuantifier();
+ }
+ else if (expression instanceof RENode.Group)
+ {
+ RENode.Group group =3D (RENode.Group)expression;
+ appendable.append("(?:");
+ this.render(group.getDisjunction(), appendable);
+ appendable.append(")");
+ quantifier =3D expression.getQuantifier();
+ }
+ else if (expression instanceof RENode.Char)
+ {
+ RENode.Char character =3D (RENode.Char)expression;
+ appendable.append(character.getValue());
+ quantifier =3D expression.getQuantifier();
+ }
+ else if (expression instanceof RENode.CharacterClass)
+ {
+ RENode.CharacterClass characterClass =3D (RENode.CharacterClass)e=
xpression;
+ render(characterClass.getExpr(), appendable);
+ quantifier =3D expression.getQuantifier();
+ }
+
+ //
+ if (quantifier !=3D null)
+ {
+ appendable.append(quantifier.toString());
+ }
+ }
+
+ private void render(RENode.CharacterClassExpr expr, Appendable appendab=
le) throws IOException, NullPointerException
+ {
+ appendable.append("[");
+ render(expr, true, appendable);
+ appendable.append("]");
+ }
+
+ private void render(RENode.CharacterClassExpr expr, boolean braced, App=
endable appendable) throws IOException, NullPointerException
+ {
+ if (expr instanceof RENode.CharacterClassExpr.Char)
+ {
+ RENode.CharacterClassExpr.Char simple =3D (RENode.CharacterClassE=
xpr.Char)expr;
+ appendable.append(simple.getValue());
+ }
+ else if (expr instanceof RENode.CharacterClass.CharacterClassExpr.Ra=
nge)
+ {
+ RENode.CharacterClass.CharacterClassExpr.Range range =3D (RENode.=
CharacterClass.CharacterClassExpr.Range)expr;
+ appendable.append(range.getFrom());
+ appendable.append('-');
+ appendable.append(range.getTo());
+ }
+ else if (expr instanceof RENode.CharacterClass.CharacterClassExpr.An=
d)
+ {
+ RENode.CharacterClass.CharacterClassExpr.And and =3D (RENode.Char=
acterClass.CharacterClassExpr.And)expr;
+ render(and.getLeft(), false, appendable);
+ appendable.append("&&");
+ render(and.getRight(), false, appendable);
+ }
+ else if (expr instanceof RENode.CharacterClass.CharacterClassExpr.Or)
+ {
+ RENode.CharacterClass.CharacterClassExpr.Or or =3D (RENode.Charac=
terClass.CharacterClassExpr.Or)expr;
+ render(or.getLeft(), false, appendable);
+ render(or.getRight(), false, appendable);
+ }
+ else if (expr instanceof RENode.CharacterClass.CharacterClassExpr.No=
t)
+ {
+ RENode.CharacterClass.CharacterClassExpr.Not not =3D (RENode.Char=
acterClass.CharacterClassExpr.Not)expr;
+ if (!braced)
+ {
+ appendable.append("[");
+ }
+ appendable.append("^");
+ render(not.getNegated(), false, appendable);
+ if (!braced)
+ {
+ appendable.append(']');
+ }
+ }
+ }
+}
Modified: portal/branches/navcontroller/component/web/controller/src/main/j=
ava/org/exoplatform/web/controller/router/PatternBuilder.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- portal/branches/navcontroller/component/web/controller/src/main/java/or=
g/exoplatform/web/controller/router/PatternBuilder.java 2010-11-30 08:34:43=
UTC (rev 5376)
+++ portal/branches/navcontroller/component/web/controller/src/main/java/or=
g/exoplatform/web/controller/router/PatternBuilder.java 2010-11-30 08:46:11=
UTC (rev 5377)
@@ -33,7 +33,7 @@
/** . */
private final StringBuilder buffer =3D new StringBuilder();
=
- public PatternBuilder expr(String s)
+ public PatternBuilder expr(CharSequence s)
{
if (s =3D=3D null)
{
Deleted: portal/branches/navcontroller/component/web/controller/src/main/ja=
va/org/exoplatform/web/controller/router/RegExpAnalyser.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- portal/branches/navcontroller/component/web/controller/src/main/java/or=
g/exoplatform/web/controller/router/RegExpAnalyser.java 2010-11-30 08:34:43=
UTC (rev 5376)
+++ portal/branches/navcontroller/component/web/controller/src/main/java/or=
g/exoplatform/web/controller/router/RegExpAnalyser.java 2010-11-30 08:46:11=
UTC (rev 5377)
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2010 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.exoplatform.web.controller.router;
-
-import org.exoplatform.web.controller.regexp.Quantifier;
-import org.exoplatform.web.controller.regexp.RENode;
-import org.exoplatform.web.controller.regexp.RegExpParser;
-import org.exoplatform.web.controller.regexp.SyntaxException;
-
-/**
- * @author Julien Viet
- * @version $Revision$
- */
-public class RegExpAnalyser
-{
-
- /** . */
- private StringBuilder pattern;
-
- /** . */
- private boolean needReset;
-
- public RegExpAnalyser()
- {
- this.pattern =3D new StringBuilder();
- this.needReset =3D false;
- }
-
- public String getPattern()
- {
- return pattern.toString();
- }
-
- public RegExpAnalyser reset()
- {
- pattern.setLength(0);
- needReset =3D false;
- return this;
- }
-
- public void process(CharSequence pattern) throws MalformedRegExpExcepti=
on
- {
- try
- {
- RegExpParser parser =3D new RegExpParser(pattern);
- RENode.Disjunction disjunction =3D parser.parseDisjunction();
- process(disjunction);
- }
- catch (SyntaxException e)
- {
- throw new MalformedRegExpException(e);
- }
- }
-
- public void process(RENode.Disjunction disjunction) throws MalformedReg=
ExpException
- {
- if (needReset)
- {
- throw new IllegalStateException();
- }
-
- //
- needReset =3D true;
- visit(disjunction);
- }
-
- private void visit(RENode.Disjunction disjunction) throws MalformedRegE=
xpException
- {
- visit(disjunction.getAlternative());
- RENode.Disjunction next =3D disjunction.getNext();
- if (next !=3D null)
- {
- pattern.append('|');
- visit(next);
- }
- }
-
- private void visit(RENode.Alternative alternative) throws MalformedRegE=
xpException
- {
- visit(alternative.getExp());
- RENode.Alternative next =3D alternative.getNext();
- if (next !=3D null)
- {
- visit(next);
- }
- }
-
- private void visit(RENode.Expr expression) throws MalformedRegExpExcept=
ion
- {
- Quantifier quantifier =3D null;
- if (expression instanceof RENode.Any)
- {
- pattern.append('.');
- quantifier =3D expression.getQuantifier();
- }
- else if (expression instanceof RENode.Group)
- {
- RENode.Group group =3D (RENode.Group)expression;
- pattern.append("(?:");
- visit(group.getDisjunction());
- pattern.append(")");
- quantifier =3D expression.getQuantifier();
- }
- else if (expression instanceof RENode.Char)
- {
- RENode.Char character =3D (RENode.Char)expression;
- pattern.append(character.getValue());
- quantifier =3D expression.getQuantifier();
- }
- else if (expression instanceof RENode.CharacterClass)
- {
- RENode.CharacterClass characterClass =3D (RENode.CharacterClass)e=
xpression;
- pattern.append("[");
- visit(characterClass.getExpr(), true);
- pattern.append("]");
- quantifier =3D expression.getQuantifier();
- }
-
- //
- if (quantifier !=3D null)
- {
- pattern.append(quantifier);
- }
- }
-
- private void visit(RENode.CharacterClassExpr expr, boolean braced)
- {
- if (expr instanceof RENode.CharacterClassExpr.Char)
- {
- RENode.CharacterClassExpr.Char simple =3D (RENode.CharacterClassE=
xpr.Char)expr;
- pattern.append(simple.getValue());
- }
- else if (expr instanceof RENode.CharacterClass.CharacterClassExpr.Ra=
nge)
- {
- RENode.CharacterClass.CharacterClassExpr.Range range =3D (RENode.=
CharacterClass.CharacterClassExpr.Range)expr;
- pattern.append(range.getFrom());
- pattern.append('-');
- pattern.append(range.getTo());
- }
- else if (expr instanceof RENode.CharacterClass.CharacterClassExpr.An=
d)
- {
- RENode.CharacterClass.CharacterClassExpr.And and =3D (RENode.Char=
acterClass.CharacterClassExpr.And)expr;
- visit(and.getLeft(), false);
- pattern.append("&&");
- visit(and.getRight(), false);
- }
- else if (expr instanceof RENode.CharacterClass.CharacterClassExpr.Or)
- {
- RENode.CharacterClass.CharacterClassExpr.Or or =3D (RENode.Charac=
terClass.CharacterClassExpr.Or)expr;
- visit(or.getLeft(), false);
- visit(or.getRight(), false);
- }
- else if (expr instanceof RENode.CharacterClass.CharacterClassExpr.No=
t)
- {
- RENode.CharacterClass.CharacterClassExpr.Not not =3D (RENode.Char=
acterClass.CharacterClassExpr.Not)expr;
- if (!braced)
- {
- pattern.append("[");
- }
- pattern.append("^");
- visit(not.getNegated(), false);
- if (!braced)
- {
- pattern.append(']');
- }
- }
- }
-}
Modified: portal/branches/navcontroller/component/web/controller/src/main/j=
ava/org/exoplatform/web/controller/router/Route.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- portal/branches/navcontroller/component/web/controller/src/main/java/or=
g/exoplatform/web/controller/router/Route.java 2010-11-30 08:34:43 UTC (rev=
5376)
+++ portal/branches/navcontroller/component/web/controller/src/main/java/or=
g/exoplatform/web/controller/router/Route.java 2010-11-30 08:46:11 UTC (rev=
5377)
@@ -24,10 +24,12 @@
import org.exoplatform.web.controller.metadata.RequestParamDescriptor;
import org.exoplatform.web.controller.metadata.RouteDescriptor;
import org.exoplatform.web.controller.metadata.RouteParamDescriptor;
+import org.exoplatform.web.controller.regexp.RegExpRenderer;
import org.exoplatform.web.controller.regexp.RENode;
import org.exoplatform.web.controller.regexp.RegExpParser;
import org.exoplatform.web.controller.regexp.SyntaxException;
=
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -653,8 +655,8 @@
}
=
// Now work on the regex
- String renderingRegex;
- String routingRegex;
+ StringBuilder renderingRegex =3D new StringBuilder();
+ StringBuilder routingRegex =3D new StringBuilder();
try
{
RegExpParser parser =3D new RegExpParser(regex);
@@ -666,17 +668,17 @@
RouteEscaper escaper =3D new RouteEscaper('/', '_');
escaper.visit(routingDisjunction);
}
- RegExpAnalyser routingAnalyser =3D new RegExpAnalyser();
- routingAnalyser.process(routingDisjunction);
- routingRegex =3D routingAnalyser.getPattern();
+ new RegExpRenderer().render(routingDisjunction, routingR=
egex);
=
//
parser.reset();
RENode.Disjunction renderingDisjunction =3D parser.parse=
Disjunction();
- RegExpAnalyser renderingAnalyser =3D new RegExpAnalyser(=
);
- renderingAnalyser.process(renderingDisjunction);
- renderingRegex =3D renderingAnalyser.getPattern();
+ new RegExpRenderer().render(renderingDisjunction, render=
ingRegex);
}
+ catch (IOException e)
+ {
+ throw new RuntimeException(e);
+ }
catch (SyntaxException e)
{
throw new RuntimeException(e);
@@ -686,10 +688,10 @@
throw new RuntimeException(e);
}
=
- //
+ // Append routing regex to the route regex
builder.expr("(").expr(routingRegex).expr(")");
=
- //
+ // Add the path param with the rendering regex
parameterPatterns.add(new PathParam(
parameterQName,
encodingMode,
@@ -700,10 +702,7 @@
//
builder.litteral(path, previous, pos);
chunks.add(path.substring(previous, pos));
- // Julien : should the pattern end with a $ ?????? I don't see=
that for now
- // we need to figure out clearly
- Pattern pattern =3D builder.build();
- PatternRoute route =3D new PatternRoute(pattern, parameterPatt=
erns, chunks);
+ PatternRoute route =3D new PatternRoute(builder.build(), param=
eterPatterns, chunks);
=
// Wire
add(route);
Modified: portal/branches/navcontroller/component/web/controller/src/test/j=
ava/org/exoplatform/web/controller/router/TestRegExpAnalyser.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- portal/branches/navcontroller/component/web/controller/src/test/java/or=
g/exoplatform/web/controller/router/TestRegExpAnalyser.java 2010-11-30 08:3=
4:43 UTC (rev 5376)
+++ portal/branches/navcontroller/component/web/controller/src/test/java/or=
g/exoplatform/web/controller/router/TestRegExpAnalyser.java 2010-11-30 08:4=
6:11 UTC (rev 5377)
@@ -20,6 +20,9 @@
package org.exoplatform.web.controller.router;
=
import org.exoplatform.component.test.BaseGateInTest;
+import org.exoplatform.web.controller.regexp.RegExpRenderer;
+import org.exoplatform.web.controller.regexp.RENode;
+import org.exoplatform.web.controller.regexp.RegExpParser;
=
/**
* @author Julien Viet
@@ -29,35 +32,21 @@
{
=
/** . */
- private RegExpAnalyser analyser =3D new RegExpAnalyser();
+ private RegExpRenderer analyser =3D new RegExpRenderer();
=
private void assertAnalyse(String expectedPattern, String pattern)
{
try
{
- analyser.reset();
- analyser.process(pattern);
- assertEquals(expectedPattern, analyser.getPattern());
+ RENode.Disjunction disjunction =3D new RegExpParser(pattern).pars=
eDisjunction();
+ assertEquals(expectedPattern, analyser.render(disjunction, new St=
ringBuilder()).toString());
}
- catch (MalformedRegExpException e)
+ catch (Exception e)
{
fail(e);
}
}
=
- private void assertAnalyseFails(String pattern)
- {
- analyser.reset();
- try
- {
- analyser.process(pattern);
- fail();
- }
- catch (MalformedRegExpException e)
- {
- }
- }
-
public void testCharacterClass()
{
assertAnalyse("[a]", "[a]");
Modified: portal/branches/navcontroller/component/web/controller/src/test/j=
ava/org/exoplatform/web/controller/router/TestRouteEscaper.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- portal/branches/navcontroller/component/web/controller/src/test/java/or=
g/exoplatform/web/controller/router/TestRouteEscaper.java 2010-11-30 08:34:=
43 UTC (rev 5376)
+++ portal/branches/navcontroller/component/web/controller/src/test/java/or=
g/exoplatform/web/controller/router/TestRouteEscaper.java 2010-11-30 08:46:=
11 UTC (rev 5377)
@@ -20,6 +20,7 @@
package org.exoplatform.web.controller.router;
=
import org.exoplatform.component.test.BaseGateInTest;
+import org.exoplatform.web.controller.regexp.RegExpRenderer;
import org.exoplatform.web.controller.regexp.RENode;
import org.exoplatform.web.controller.regexp.RegExpParser;
=
@@ -39,9 +40,7 @@
RouteEscaper escaper =3D new RouteEscaper('/', '_');
RENode.Disjunction re =3D parser.parseDisjunction();
escaper.visit(re);
- RegExpAnalyser analyser =3D new RegExpAnalyser();
- analyser.process(re);
- Pattern p =3D Pattern.compile(analyser.getPattern());
+ Pattern p =3D Pattern.compile(new RegExpRenderer().render(re, new St=
ringBuilder()).toString());
Matcher matcher =3D p.matcher(test);
assertTrue(matcher.find());
assertEquals(expectedValue, matcher.group());
--===============3326108439728632243==--