Repository: olingo-odata2 Updated Branches: refs/heads/master 96c28146e -> 01fd19e7a
[OLINGO-689] Improved name validation pattern for EdmNamed, added more tests and fixed AnnoHelper Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/01fd19e7 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/01fd19e7 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/01fd19e7 Branch: refs/heads/master Commit: 01fd19e7a7677417efd954c92fb62704a1d63a61 Parents: 96c2814 Author: Michael Bolz <[email protected]> Authored: Wed Jun 10 14:52:57 2015 +0200 Committer: Michael Bolz <[email protected]> Committed: Wed Jun 10 14:52:57 2015 +0200 ---------------------------------------------------------------------- .../processor/core/util/AnnotationHelper.java | 4 +- .../core/edm/AnnotationEdmProviderTest.java | 12 ++--- .../annotation/processor/ref/MetadataTest.java | 42 ++++++++--------- .../core/edm/provider/EdmNamedImplProv.java | 30 ++++++++++-- .../core/edm/provider/EdmEntitySetProvTest.java | 49 ++++++++++++++------ 5 files changed, 90 insertions(+), 47 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/01fd19e7/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/AnnotationHelper.java ---------------------------------------------------------------------- diff --git a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/AnnotationHelper.java b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/AnnotationHelper.java index d0f072a..72d0cfa 100644 --- a/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/AnnotationHelper.java +++ b/odata2-annotation-processor/annotation-processor-core/src/main/java/org/apache/olingo/odata2/annotation/processor/core/util/AnnotationHelper.java @@ -298,9 +298,9 @@ public class AnnotationHelper { public String createCanonicalRelationshipName(String fromRole, String toRole) { if (fromRole.compareTo(toRole) > 0) { - return toRole + "-" + fromRole; + return toRole + "_2_" + fromRole; } else { - return fromRole + "-" + toRole; + return fromRole + "_2_" + toRole; } } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/01fd19e7/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/edm/AnnotationEdmProviderTest.java ---------------------------------------------------------------------- diff --git a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/edm/AnnotationEdmProviderTest.java b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/edm/AnnotationEdmProviderTest.java index 50a1520..5b8a30f 100644 --- a/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/edm/AnnotationEdmProviderTest.java +++ b/odata2-annotation-processor/annotation-processor-core/src/test/java/org/apache/olingo/odata2/annotation/processor/core/edm/AnnotationEdmProviderTest.java @@ -5,7 +5,7 @@ * 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 + * http://www.apache.org/licenses/LICENSE_2_2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -265,7 +265,7 @@ public class AnnotationEdmProviderTest { private void validateAssociation(final Association association) { String name = association.getName(); - if (name.equals("r_Employees-r_Room")) { + if (name.equals("r_Employees_2_r_Room")) { validateAssociation(association, "r_Room", EdmMultiplicity.ONE, defaultFqn("Room"), "r_Employees", EdmMultiplicity.MANY, defaultFqn("Employee")); @@ -281,7 +281,7 @@ public class AnnotationEdmProviderTest { validateAssociation(association, "r_Team", EdmMultiplicity.ONE, defaultFqn("Team"), "r_Employees", EdmMultiplicity.MANY, defaultFqn("Employee")); - } else if (name.equals("Team-r_SubTeam")) { + } else if (name.equals("Team_2_r_SubTeam")) { validateAssociation(association, "Team", EdmMultiplicity.ONE, defaultFqn("Team"), "r_SubTeam", EdmMultiplicity.ONE, defaultFqn("Team")); @@ -341,7 +341,7 @@ public class AnnotationEdmProviderTest { } else if (navigationProperty.getName().equals("ne_Team")) { validateNavProperty(navigationProperty, "TeamEmployees", "r_Employees", "r_Team"); } else if (navigationProperty.getName().equals("ne_Room")) { - validateNavProperty(navigationProperty, "r_Employees-r_Room", "r_Employees", "r_Room"); + validateNavProperty(navigationProperty, "r_Employees_2_r_Room", "r_Employees", "r_Room"); } else { fail("Got unexpected navigation property with name '" + navigationProperty.getName() + "'."); } @@ -384,7 +384,7 @@ public class AnnotationEdmProviderTest { NavigationProperty navPropTeamEmployess = team.getNavigationProperties().get(0); validateNavProperty(navPropTeamEmployess, "TeamEmployees", "r_Team", "r_Employees"); NavigationProperty navPropTeamTeam = team.getNavigationProperties().get(1); - validateNavProperty(navPropTeamTeam, "Team-r_SubTeam", "Team", "r_SubTeam"); + validateNavProperty(navPropTeamTeam, "Team_2_r_SubTeam", "Team", "r_SubTeam"); } @Test @@ -465,7 +465,7 @@ public class AnnotationEdmProviderTest { for (NavigationProperty navigationProperty : navigationProperties) { if (navigationProperty.getName().equals("nr_Employees")) { - validateNavProperty(navigationProperty, "r_Employees-r_Room", "r_Room", "r_Employees"); + validateNavProperty(navigationProperty, "r_Employees_2_r_Room", "r_Room", "r_Employees"); } else if (navigationProperty.getName().equals("nr_Building")) { validateNavProperty(navigationProperty, "BuildingRooms", "r_Rooms", "r_Building"); } else { http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/01fd19e7/odata2-annotation-processor/annotation-processor-ref/src/test/java/org/apache/olingo/odata2/annotation/processor/ref/MetadataTest.java ---------------------------------------------------------------------- diff --git a/odata2-annotation-processor/annotation-processor-ref/src/test/java/org/apache/olingo/odata2/annotation/processor/ref/MetadataTest.java b/odata2-annotation-processor/annotation-processor-ref/src/test/java/org/apache/olingo/odata2/annotation/processor/ref/MetadataTest.java index 4818327..ef74edf 100644 --- a/odata2-annotation-processor/annotation-processor-ref/src/test/java/org/apache/olingo/odata2/annotation/processor/ref/MetadataTest.java +++ b/odata2-annotation-processor/annotation-processor-ref/src/test/java/org/apache/olingo/odata2/annotation/processor/ref/MetadataTest.java @@ -7,7 +7,7 @@ * "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 + * http://www.apache.org/licenses/LICENSE_2_2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an @@ -111,7 +111,7 @@ public class MetadataTest extends AbstractRefXmlTest { assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:EntityType[@Name='Employee' and " + "@m:HasStream='true']/edm:NavigationProperty[@Name='ne_Room' and " + - "@Relationship='RefScenario.r_Employees-r_Room' and @FromRole='r_Employees' and @ToRole='r_Room']", + "@Relationship='RefScenario.r_Employees_2_r_Room' and @FromRole='r_Employees' and @ToRole='r_Room']", payload); // Team @@ -131,7 +131,7 @@ public class MetadataTest extends AbstractRefXmlTest { assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:EntityType[@Name='Team' and " + "@BaseType='RefScenario.Base']/edm:NavigationProperty[@Name='SubTeam' and " + - "@Relationship='RefScenario.Team-r_SubTeam' and @FromRole='Team' and @ToRole='r_SubTeam']", + "@Relationship='RefScenario.Team_2_r_SubTeam' and @FromRole='Team' and @ToRole='r_SubTeam']", payload); // Room @@ -149,7 +149,7 @@ public class MetadataTest extends AbstractRefXmlTest { assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:EntityType[@Name='Room' and" + " @BaseType='RefScenario.Base']/edm:NavigationProperty[@Name='nr_Employees' and " + - "@Relationship='RefScenario.r_Employees-r_Room' and @FromRole='r_Room' and @ToRole='r_Employees']", + "@Relationship='RefScenario.r_Employees_2_r_Room' and @FromRole='r_Room' and @ToRole='r_Employees']", payload); assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:EntityType[@Name='Room' and " + @@ -235,18 +235,18 @@ public class MetadataTest extends AbstractRefXmlTest { assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='TeamEmployees']" + "/edm:End[@Type='RefScenario.Team' and @Multiplicity='1' and @Role='r_Team']", payload); - // Team-r_SubTeam - assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='Team-r_SubTeam']", payload); - assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='Team-r_SubTeam']" + + // Team_2_r_SubTeam + assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='Team_2_r_SubTeam']", payload); + assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='Team_2_r_SubTeam']" + "/edm:End[@Type='RefScenario.Team' and @Multiplicity='1' and @Role='Team']", payload); - assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='Team-r_SubTeam']" + + assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='Team_2_r_SubTeam']" + "/edm:End[@Type='RefScenario.Team' and @Multiplicity='1' and @Role='r_SubTeam']", payload); // RoomEmployees - assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='r_Employees-r_Room']", payload); - assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='r_Employees-r_Room']" + + assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='r_Employees_2_r_Room']", payload); + assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='r_Employees_2_r_Room']" + "/edm:End[@Type='RefScenario.Employee' and @Multiplicity='*' and @Role='r_Employees']", payload); - assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='r_Employees-r_Room']" + + assertXpathExists("/edmx:Edmx/edmx:DataServices/edm:Schema/edm:Association[@Name='r_Employees_2_r_Room']" + "/edm:End[@Type='RefScenario.Room' and @Multiplicity='1' and @Role='r_Room']", payload); // BuildingRooms @@ -323,29 +323,29 @@ public class MetadataTest extends AbstractRefXmlTest { payload); assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:EntityContainer[@Name='DefaultContainer' and " + - "@m:IsDefaultEntityContainer='true']/edm:AssociationSet[@Name='Team-r_SubTeam' and " + - "@Association='RefScenario.Team-r_SubTeam']/edm:End[@EntitySet='Teams' and @Role='Team']", + "@m:IsDefaultEntityContainer='true']/edm:AssociationSet[@Name='Team_2_r_SubTeam' and " + + "@Association='RefScenario.Team_2_r_SubTeam']/edm:End[@EntitySet='Teams' and @Role='Team']", payload); assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:EntityContainer[@Name='DefaultContainer' and " + - "@m:IsDefaultEntityContainer='true']/edm:AssociationSet[@Name='Team-r_SubTeam' and " + - "@Association='RefScenario.Team-r_SubTeam']/edm:End[@EntitySet='Teams' and @Role='r_SubTeam']", + "@m:IsDefaultEntityContainer='true']/edm:AssociationSet[@Name='Team_2_r_SubTeam' and " + + "@Association='RefScenario.Team_2_r_SubTeam']/edm:End[@EntitySet='Teams' and @Role='r_SubTeam']", payload); assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:EntityContainer[@Name='DefaultContainer' and " + - "@m:IsDefaultEntityContainer='true']/edm:AssociationSet[@Name='r_Employees-r_Room' and " + - "@Association='RefScenario.r_Employees-r_Room']", + "@m:IsDefaultEntityContainer='true']/edm:AssociationSet[@Name='r_Employees_2_r_Room' and " + + "@Association='RefScenario.r_Employees_2_r_Room']", payload); assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:EntityContainer[@Name='DefaultContainer' and " + - "@m:IsDefaultEntityContainer='true']/edm:AssociationSet[@Name='r_Employees-r_Room' and " + - "@Association='RefScenario.r_Employees-r_Room']/edm:End[@EntitySet='Rooms' and @Role='r_Room']", + "@m:IsDefaultEntityContainer='true']/edm:AssociationSet[@Name='r_Employees_2_r_Room' and " + + "@Association='RefScenario.r_Employees_2_r_Room']/edm:End[@EntitySet='Rooms' and @Role='r_Room']", payload); assertXpathExists( "/edmx:Edmx/edmx:DataServices/edm:Schema/edm:EntityContainer[@Name='DefaultContainer' and " + - "@m:IsDefaultEntityContainer='true']/edm:AssociationSet[@Name='r_Employees-r_Room' and " + - "@Association='RefScenario.r_Employees-r_Room']/edm:End[@EntitySet='Employees' and @Role='r_Employees']", + "@m:IsDefaultEntityContainer='true']/edm:AssociationSet[@Name='r_Employees_2_r_Room' and " + + "@Association='RefScenario.r_Employees_2_r_Room']/edm:End[@EntitySet='Employees' and @Role='r_Employees']", payload); assertXpathExists( http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/01fd19e7/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/provider/EdmNamedImplProv.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/provider/EdmNamedImplProv.java b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/provider/EdmNamedImplProv.java index f8b231c..8f12183 100644 --- a/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/provider/EdmNamedImplProv.java +++ b/odata2-lib/odata-core/src/main/java/org/apache/olingo/odata2/core/edm/provider/EdmNamedImplProv.java @@ -24,14 +24,34 @@ import java.util.regex.Pattern; import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmNamed; +/** + * See in ABNF + * <p> + * <code> + * Note:this pattern is overly restrictive, the normative definition is type TSimpleIdentifier in OData EDM XML Schema + * <br/> + * odataIdentifier = identifierLeadingCharacter *127identifierCharacter + * <br/> + * identifierLeadingCharacter = ALPHA / "_" ; plus Unicode characters from the categories L or Nl + * <br/> + * identifierCharacter = ALPHA / "_" / DIGIT ; plus Unicode characters from the categories L, Nl, Nd, Mn, + * Mc, Pc, or Cf + * <br/> + * </code> + * </p> + * And in OData V2 MC-CSDL (Release v20110610) + * <p> + * Section 2.2.6 SimpleIdentifier<br/> + * SimpleIdentifier is a string-based representation. The maximum length of the identifier MUST be less than 480. + * The below pattern represents the allowed identifiers in ECMA specification: + * Pattern: <code>value="[\p{L}\p{Nl}][\p{L}\p{Nl}\p{Nd}\p{Mn}\p{Mc}\p{Pc}\p{Cf}]{0,}"</code> + * </p> + * + */ public abstract class EdmNamedImplProv implements EdmNamed { private static final Pattern PATTERN_VALID_NAME = Pattern.compile( - "\\A[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02ff\\u0370-\\u037d\\u200c\\u200d\\u2070-\\u218f" - + "\\u037f-\\u1fff\\u2c00-\\u2fef\\u3001-\\ud7ff\\uf900-\\ufdcf\\ufdf0-\\ufffd]" - + "[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02ff\\u0370-\\u037d\\u200c\\u200d\\u2070-\\u218f" - + "\\u037f-\\u1fff\\u2c00-\\u2fef\\u3001-\\udfff\\uf900-\\ufdcf\\ufdf0-\\ufffd\\-\\.0-9\\u00b7\\u0300-\\u036f]*" - + "\\Z"); + "\\A[_\\p{L}\\p{Nl}][_\\p{L}\\p{Nl}\\p{Nd}\\p{Mn}\\p{Mc}\\p{Pc}\\p{Cf}]{0,}\\Z"); protected EdmImplProv edm; private String name; http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/01fd19e7/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmEntitySetProvTest.java ---------------------------------------------------------------------- diff --git a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmEntitySetProvTest.java b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmEntitySetProvTest.java index 136df35..421f697 100644 --- a/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmEntitySetProvTest.java +++ b/odata2-lib/odata-core/src/test/java/org/apache/olingo/odata2/core/edm/provider/EdmEntitySetProvTest.java @@ -31,6 +31,7 @@ import java.util.List; import org.apache.olingo.odata2.api.edm.EdmAnnotatable; import org.apache.olingo.odata2.api.edm.EdmAnnotations; import org.apache.olingo.odata2.api.edm.EdmEntitySet; +import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmNavigationProperty; import org.apache.olingo.odata2.api.edm.EdmTyped; import org.apache.olingo.odata2.api.edm.FullQualifiedName; @@ -135,26 +136,48 @@ public class EdmEntitySetProvTest extends BaseTest { assertEquals(edmEntitySetFoo.getEntityType().getName(), edmProvider.getEntityType( new FullQualifiedName("namespace", "fooEntityType")).getName()); } - - @Test - public void checkValidColonName() throws Exception { - EntitySet provES = new EntitySet().setName("::Name"); - EdmEntitySet entitySet = new EdmEntitySetImplProv(null, provES , null); - assertEquals("::Name", entitySet.getName()); - - provES = new EntitySet().setName(":Name"); - entitySet = new EdmEntitySetImplProv(null, provES , null); - assertEquals(":Name", entitySet.getName()); + + @Test(expected=EdmException.class) + public void checkInvalidStartColonName() throws Exception { + EntitySet provES = new EntitySet().setName(":Name"); + new EdmEntitySetImplProv(null, provES, null); } - + + @Test(expected=EdmException.class) + public void checkInvalidColonName() throws Exception { + EntitySet provES = new EntitySet().setName("B:Name"); + new EdmEntitySetImplProv(null, provES , null); + } + + @Test(expected=EdmException.class) + public void checkInvalidMinusName() throws Exception { + EntitySet provES = new EntitySet().setName("My-Name"); + new EdmEntitySetImplProv(null, provES, null); + } + + @Test(expected=EdmException.class) + public void checkInvalidStartMinusName() throws Exception { + EntitySet provES = new EntitySet().setName("-Name"); + new EdmEntitySetImplProv(null, provES , null); + } + @Test public void checkValidName() throws Exception { EntitySet provES = new EntitySet().setName("СодеÑжание"); EdmEntitySet entitySet = new EdmEntitySetImplProv(null, provES , null); assertEquals("СодеÑжание", entitySet.getName()); } - - + + @Test + public void checkValidNameWithUnderscore() throws Exception { + EntitySet provES = new EntitySet().setName("_Name"); + EdmEntitySet entitySet = new EdmEntitySetImplProv(null, provES , null); + assertEquals("_Name", entitySet.getName()); + + provES = new EntitySet().setName("N_ame_"); + entitySet = new EdmEntitySetImplProv(null, provES , null); + assertEquals("N_ame_", entitySet.getName()); + } @Test public void getAnnotations() throws Exception {
