sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1672510 - in /sis/branches/JDK8/core: sis-metadata/src/main/java/org/apache/sis/internal/metadata/ sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/ sis-referencing/src/main/java/org/apache/sis/parameter/ sis-referenc...
Date Thu, 09 Apr 2015 22:35:27 GMT
Author: desruisseaux
Date: Thu Apr  9 22:35:26 2015
New Revision: 1672510

URL: http://svn.apache.org/r1672510
Log:
Referencing: NamedIdentifier should not create automatically a NameSpace anymore.
https://issues.apache.org/jira/browse/SIS-197

Modified:
    sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/NameToIdentifier.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/Code.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterTableRow.java
    sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
    sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/MapProjectionTest.java
    sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java
    sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/NamedIdentifierTest.java

Modified: sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/NameToIdentifier.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/NameToIdentifier.java?rev=1672510&r1=1672509&r2=1672510&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/NameToIdentifier.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/NameToIdentifier.java
[UTF-8] Thu Apr  9 22:35:26 2015
@@ -18,7 +18,6 @@ package org.apache.sis.internal.metadata
 
 import java.util.Locale;
 import org.opengis.util.NameSpace;
-import org.opengis.util.ScopedName;
 import org.opengis.util.GenericName;
 import org.opengis.util.InternationalString;
 import org.opengis.metadata.Identifier;
@@ -35,9 +34,12 @@ import java.util.Objects;
 /**
  * Does the unobvious mapping between {@link Identifier} properties and {@link GenericName}
ones.
  *
+ * <p><b>Limitation:</b>
+ * Current version does not yet work with URN or HTTP syntax.</p>
+ *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.4
- * @version 0.5
+ * @version 0.6
  * @module
  */
 public final class NameToIdentifier implements Identifier {
@@ -57,56 +59,49 @@ public final class NameToIdentifier impl
     }
 
     /**
-     * Infers the authority from the scope.
+     * Returns the scope of the given name if it is not global.
+     * This method is null-safe, including paranoiac checks against null scope.
      *
-     * @return The authority, or {@code null} if none.
+     * @param  name The name from which to get the scope, or {@code null}.
+     * @return The scope of the given name, or {@code null} if the given name was null or
has a global scope.
      */
-    @Override
-    public Citation getAuthority() {
-        final NameSpace scope = name.scope();
-        if (scope != null && !scope.isGlobal()) {
-            return Citations.fromName(scope.name().tip().toString());
+    private static GenericName scope(final GenericName name) {
+        if (name != null) {
+            final NameSpace scope = name.scope();
+            if (scope != null && !scope.isGlobal()) {
+                return scope.name();
+            }
         }
         return null;
     }
 
     /**
-     * Returns the code space of the given name, or its authority if there is no code space.
+     * Infers the authority from the scope if any, or from the code space otherwise.
      *
-     * @param  name The name from which to get the code space or authority, or {@code null}.
-     * @param  locale The locale, or {@code null} for a call to {@code name.toString()}.
-     * @return The code space or authority, or {@code null} if none.
+     * @return The authority, or {@code null} if none.
      */
-    public static String getCodespaceOrAuthority(final GenericName name, final Locale locale)
{
-        String codespace = getCodeSpace(name, locale);
-        if (codespace == null) {
-            final NameSpace scope = name.scope();
-            if (scope != null && !scope.isGlobal()) {
-                codespace = toString(scope.name().tip(), locale);
+    @Override
+    public Citation getAuthority() {
+        GenericName scope = scope(name);
+        if (scope == null) {
+            scope = scope(name.tip());
+            if (scope == null) {
+                return null;
             }
         }
-        return codespace;
+        return Citations.fromName(scope.head().toString());
     }
 
     /**
-     * Takes everything except the tip as the code space.
+     * Takes the element before the tip as the code space.
      *
      * @param  name The name from which to get the code space, or {@code null}.
      * @param  locale The locale, or {@code null} for a call to {@code name.toString()}.
      * @return The code space, or {@code null} if none.
      */
     public static String getCodeSpace(final GenericName name, final Locale locale) {
-        if (name != null) {
-            if (name instanceof ScopedName) {
-                return toString(((ScopedName) name).path(), locale);
-            }
-            if (name.depth() == 2) {
-                // May happen on GenericName implementation that do not implement the ScopedName
interface.
-                // The most importance case is org.apache.sis.referencing.NamedIdentifier.
-                return toString(name.head(), locale);
-            }
-        }
-        return null;
+        final GenericName scope = scope(name.tip());
+        return (scope != null) ? toString(scope.tip(), locale) : null;
     }
 
     /**
@@ -188,9 +183,9 @@ public final class NameToIdentifier impl
      * Such null values should never happen since the properties used here are mandatory,
but we try to make this class
      * robust to broken implementations.
      *
-     * @param  name   The name from which to get the localized string.
+     * @param  name   The name from which to get the localized string, or {@code null}.
      * @param  locale The locale, or {@code null} for a call to {@code name.toString()}.
-     * @return The localized string representation.
+     * @return The localized string representation, or {@code null} if the given name was
null.
      */
     public static String toString(final GenericName name, final Locale locale) {
         if (name != null) {

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/Code.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/Code.java?rev=1672510&r1=1672509&r2=1672510&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/Code.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/internal/jaxb/referencing/Code.java
[UTF-8] Thu Apr  9 22:35:26 2015
@@ -164,6 +164,8 @@ public final class Code {
                          * is to use the "codeSpace" attribute for the authority ("OGP" or
"IOGP" for objects
                          * from the EPSG database). Consequently in the common case where
the authority is our
                          * Citations.EPSG constant, we really want the "IOGP" string rather
than "EPSG".
+                         *
+                         * See https://issues.apache.org/jira/browse/SIS-196
                          */
                         code.codeSpace = getUnicodeIdentifier(fallback.getAuthority());
                         code.code = urn;

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java?rev=1672510&r1=1672509&r2=1672510&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterFormat.java
[UTF-8] Thu Apr  9 22:35:26 2015
@@ -828,7 +828,7 @@ public class ParameterFormat extends Tab
             if (aliases != null) { // Paranoiac check.
                 for (final GenericName alias : aliases) {
                     if (alias != null) { // Paranoiac check.
-                        final String codespace = NameToIdentifier.getCodespaceOrAuthority(alias,
displayLocale);
+                        final String codespace = NameToIdentifier.getCodeSpace(alias, displayLocale);
                         if (isPreferredCodespace(codespace)) {
                             row = putIfAbsent(resources, row, columnIndices, codespace,
                                     alias.tip().toInternationalString().toString(displayLocale));

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterTableRow.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterTableRow.java?rev=1672510&r1=1672509&r2=1672510&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterTableRow.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterTableRow.java
[UTF-8] Thu Apr  9 22:35:26 2015
@@ -30,7 +30,6 @@ import java.io.IOException;
 import java.text.Format;
 import java.text.FieldPosition;
 import javax.measure.unit.Unit;
-import org.opengis.util.NameSpace;
 import org.opengis.util.GenericName;
 import org.opengis.util.InternationalString;
 import org.opengis.metadata.Identifier;
@@ -147,14 +146,9 @@ final class ParameterTableRow {
             if (aliases != null) { // Paranoiac check.
                 for (GenericName alias : aliases) {
                     if (!isDeprecated(alias)) {
-                        String codespace = NameToIdentifier.getCodeSpace(alias, locale);
+                        final String codespace = NameToIdentifier.getCodeSpace(alias, locale);
                         if (codespace != null) {
                             alias = alias.tip();
-                        } else {
-                            final NameSpace scope = alias.scope();
-                            if (scope != null && !scope.isGlobal()) {
-                                codespace = NameToIdentifier.toString(scope.name().tip(),
locale);
-                            }
                         }
                         if (preferredCodespaces == null || preferredCodespaces.contains(codespace))
{
                             addIdentifier(codespace, NameToIdentifier.toString(alias, locale));

Modified: sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java?rev=1672510&r1=1672509&r2=1672510&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/NamedIdentifier.java
[UTF-8] Thu Apr  9 22:35:26 2015
@@ -35,7 +35,6 @@ import org.apache.sis.internal.metadata.
 import org.apache.sis.internal.system.DefaultFactories;
 import org.apache.sis.internal.util.Citations;
 import org.apache.sis.metadata.iso.ImmutableIdentifier;
-import org.apache.sis.util.collection.WeakValueHashMap;
 import org.apache.sis.util.ArgumentChecks;
 
 // Branch-dependent imports
@@ -64,8 +63,8 @@ import java.util.Objects;
  *
  * <ul>
  *   <li><b>{@linkplain #tip() Tip}:</b> derived from the identifier {@linkplain
#getCode() code}.</li>
- *   <li><b>{@linkplain #head() Head}:</b> derived from the identifier
{@linkplain #getCodeSpace() code space}.</li>
- *   <li><b>{@linkplain #scope() Scope}:</b> derived from the shortest
{@linkplain #getAuthority() authority}'s
+ *   <li><b>{@linkplain #head() Head}:</b> derived from the identifier
{@linkplain #getCodeSpace() code space} if non-null.
+ *     If there is no code space, then the scope is derived from the shortest {@linkplain
#getAuthority() authority}'s
  *     {@linkplain Citation#getAlternateTitles() alternate titles}, or the {@linkplain Citation#getTitle()
main title}
  *     if there is no alternate titles. This policy exploits the ISO 19115 comment saying
that citation alternate titles
  *     often contain abbreviation (for example "DCW" as an alternative title for <cite>"Digital
Chart of the World"</cite>).</li>
@@ -74,8 +73,7 @@ import java.util.Objects;
  * <div class="note"><b>Example:</b>
  * If the identifier attributes are {@code authority} = {@code new DefaultCitation("IOGP")},
  * {@code codeSpace} = {@code "EPSG"} and {@code code} = {@code "4326"}, then the name attributes
will be
- * {@code scope} = {@code "IOGP"}, {@code head} = {@code "EPSG"}, {@code tip} = {@code "4326"}
and
- * {@link #toString()} = {@code "EPSG:4326"}.
+ * {@code head} = {@code "EPSG"}, {@code tip} = {@code "4326"} and {@link #toString()} =
{@code "EPSG:4326"}.
  * Note that the scope does not appear in the string representation of names.</div>
  *
  *
@@ -99,11 +97,6 @@ public class NamedIdentifier extends Imm
     private static final long serialVersionUID = -3982456534858346939L;
 
     /**
-     * A pool of {@link NameSpace} values for given {@link InternationalString}.
-     */
-    private static final Map<CharSequence,NameSpace> SCOPES = new WeakValueHashMap<>(CharSequence.class);
-
-    /**
      * The name of this identifier as a generic name.
      * If {@code null}, will be constructed only when first needed.
      */
@@ -177,7 +170,7 @@ public class NamedIdentifier extends Imm
     public NamedIdentifier(final Citation authority, final CharSequence code) {
         super(authority, Citations.getCodeSpace(authority), toString(code));
         if (code instanceof InternationalString) {
-            name = createName(authority, code);
+            name = createName(authority, super.getCodeSpace(), code);
             isNameSupplied = true; // Because 'code' is an international string.
         }
     }
@@ -210,7 +203,7 @@ public class NamedIdentifier extends Imm
     {
         super(authority, codeSpace, toString(code), version, remarks);
         if (code instanceof InternationalString) {
-            name = createName(authority, code);
+            name = createName(authority, codeSpace, code);
             isNameSupplied = true; // Because 'code' is an international string.
         }
     }
@@ -240,7 +233,7 @@ public class NamedIdentifier extends Imm
      */
     private synchronized GenericName getName() {
         if (name == null) {
-            name = createName(super.getAuthority(), super.getCode());
+            name = createName(super.getAuthority(), super.getCodeSpace(), super.getCode());
         }
         return name;
     }
@@ -249,28 +242,22 @@ public class NamedIdentifier extends Imm
      * Constructs a generic name from the specified authority and code.
      *
      * @param  authority The authority, or {@code null} if none.
-     * @param  code The code.
+     * @param  codeSpace The code space, or {@code null} if none.
+     * @param  code      The code.
      * @return A new generic name for the given authority and code.
      * @category Generic name
+     *
+     * @see <a href="https://issues.apache.org/jira/browse/SIS-197">SIS-197</a>
      */
-    private GenericName createName(final Citation authority, final CharSequence code) {
-        final NameFactory factory = DefaultFactories.forBuildin(NameFactory.class);
-        final String identifier = Citations.getCodeSpace(authority);      // Whitespaces
trimed by Citations.
-        NameSpace scope = null;
-        if (identifier != null) {
-            synchronized (SCOPES) {
-                scope = SCOPES.get(identifier);
-                if (scope == null) {
-                    scope = factory.createNameSpace(factory.createLocalName(null, identifier),
null);
-                    SCOPES.put(identifier, scope);
-                }
-            }
+    private static GenericName createName(final Citation authority, String codeSpace, final
CharSequence code) {
+        if (codeSpace == null) {
+            codeSpace = Citations.getCodeSpace(authority);   // Whitespaces trimed by Citations.
         }
-        final String codeSpace = super.getCodeSpace();
+        final NameFactory factory = DefaultFactories.forBuildin(NameFactory.class);
         if (codeSpace != null) {
-            return factory.createGenericName(scope, codeSpace, code);
+            return factory.createGenericName(null, codeSpace, code);
         } else {
-            return factory.createLocalName(scope, code);
+            return factory.createLocalName(null, code);
         }
     }
 

Modified: sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/MapProjectionTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/MapProjectionTest.java?rev=1672510&r1=1672509&r2=1672510&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/MapProjectionTest.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/provider/MapProjectionTest.java
[UTF-8] Thu Apr  9 22:35:26 2015
@@ -22,12 +22,12 @@ import org.opengis.metadata.Identifier;
 import org.opengis.parameter.ParameterDescriptor;
 import org.opengis.parameter.GeneralParameterDescriptor;
 import org.apache.sis.metadata.iso.citation.Citations;
-import org.apache.sis.test.ReferencingAssert;
+import org.apache.sis.internal.util.Constants;
 import org.apache.sis.test.DependsOnMethod;
 import org.apache.sis.test.TestCase;
 import org.junit.Test;
 
-import static org.junit.Assert.*;
+import static org.apache.sis.test.ReferencingAssert.*;
 import static org.apache.sis.internal.util.Constants.*;
 
 
@@ -121,15 +121,15 @@ public final strictfp class MapProjectio
             final GeneralParameterDescriptor actual)
     {
         if (epsgName != null) {
-            ReferencingAssert.assertEpsgIdentifierEquals(epsgName, actual.getName());
+            assertEpsgIdentifierEquals(epsgName, actual.getName());
         } else {
-            ReferencingAssert.assertOgcIdentifierEquals(ogcName, actual.getName());
+            assertOgcIdentifierEquals(ogcName, actual.getName());
         }
         assertEquals("minimumOccurs", isMandatory ? 1 : 0, actual.getMinimumOccurs());
         if (epsgName != null) {
             for (final GenericName alias : actual.getAlias()) {
                 if (alias instanceof Identifier && ((Identifier) alias).getAuthority()
!= Citations.EPSG) {
-                    ReferencingAssert.assertOgcIdentifierEquals(ogcName, (Identifier) alias);
+                    assertOgcIdentifierEquals(ogcName, (Identifier) alias);
                     return;
                 }
             }

Modified: sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java?rev=1672510&r1=1672509&r2=1672510&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/BuilderTest.java
[UTF-8] Thu Apr  9 22:35:26 2015
@@ -109,6 +109,9 @@ public final strictfp class BuilderTest
         final LocalName alias1 = factory.createLocalName(null, "Mercator (1SP)");
         final LocalName alias2 = factory.createLocalName(null, "Mercator_1SP");
         final LocalName alias3 = factory.createLocalName(null, "CT_Mercator");
+        assertTrue("That name should not have a scope.", alias1.scope().isGlobal());
+        assertTrue("That name should not have a scope.", alias2.scope().isGlobal());
+        assertTrue("That name should not have a scope.", alias3.scope().isGlobal());
         assertEquals("Mercator (1SP)", alias1.toString());
         assertEquals("Mercator_1SP",   alias2.toString());
         assertEquals("CT_Mercator",    alias3.toString());
@@ -162,10 +165,13 @@ public final strictfp class BuilderTest
         final GenericName alias1 = factory.createLocalName(scope(factory, "EPSG"), "Mercator
(1SP)");
         final GenericName alias2 = new NamedIdentifier(OGC,     "Mercator_1SP");
         final GenericName alias3 = new NamedIdentifier(GEOTIFF, "CT_Mercator");
+        assertTrue ("That name should not have a scope.", alias3.scope().isGlobal());
+        assertTrue ("That name should not have a scope.", alias2.scope().isGlobal());
+        assertFalse("That name should be in EPSG scope.", alias1.scope().isGlobal());
+        assertEquals("EPSG",                 alias1.scope().name().toString());
         assertEquals("Mercator (1SP)",       alias1.toString());
         assertEquals("OGC:Mercator_1SP",     alias2.toString());
         assertEquals("GeoTIFF:CT_Mercator",  alias3.toString());
-        assertEquals("EPSG",                 alias1.scope().name().toString());
 
         // The test.
         final BuilderMock builder = createMercator(true, false);

Modified: sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/NamedIdentifierTest.java
URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/NamedIdentifierTest.java?rev=1672510&r1=1672509&r2=1672510&view=diff
==============================================================================
--- sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/NamedIdentifierTest.java
[UTF-8] (original)
+++ sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/NamedIdentifierTest.java
[UTF-8] Thu Apr  9 22:35:26 2015
@@ -39,12 +39,12 @@ import static org.apache.sis.metadata.is
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.4
- * @version 0.4
+ * @version 0.6
  * @module
  */
 public final strictfp class NamedIdentifierTest extends TestCase {
     /**
-     * Tests the {@link NamedIdentifier#NamedIdentifier(Citation, String, String, String,
InternationalString)}
+     * Tests the {@link NamedIdentifier#NamedIdentifier(Citation, String, CharSequence, String,
InternationalString)}
      * constructor.
      */
     @Test
@@ -66,11 +66,7 @@ public final strictfp class NamedIdentif
         assertEquals("tip",   "4326",      identifier.tip().toString());
         assertEquals("head",  "EPSG",      identifier.head().toString());
         assertEquals("name",  "EPSG:4326", identifier.toString());
-
-        // Scope (derived from the autority)
-        final NameSpace scope = identifier.scope();
-        assertFalse ("scope",         scope.isGlobal());
-        assertEquals("scope", "IOGP", scope.name().toString());
+        assertTrue  ("scope.isGlobal",     identifier.scope().isGlobal());
     }
 
     /**
@@ -98,6 +94,8 @@ public final strictfp class NamedIdentif
         assertEquals("head",  "EPSG",      identifier.head().toString());
         assertEquals("name",  "EPSG:4326", identifier.toString());
         assertSame  ("scope", scope,       identifier.scope());
+        assertFalse ("scope.isGlobal",     scope.isGlobal());
+        assertEquals("scope", "IOGP",      scope.name().toString());
     }
 
     /**
@@ -138,11 +136,7 @@ public final strictfp class NamedIdentif
         assertEquals("name",  "EPSG:name", identifier.toInternationalString().toString(Locale.ENGLISH));
         assertEquals("name",  "EPSG:nom",  identifier.toInternationalString().toString(Locale.FRENCH));
         assertEquals("name",  "EPSG:名前",  identifier.toInternationalString().toString(Locale.JAPANESE));
-
-        // Scope (derived from the autority)
-        final NameSpace scope = identifier.scope();
-        assertFalse ("scope",         scope.isGlobal());
-        assertEquals("scope", "EPSG", scope.name().toString());
+        assertTrue  ("scope.isGlobal",     identifier.scope().isGlobal());
     }
 
     /**



Mime
View raw message