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 {

Reply via email to