[jira] [Resolved] (SIS-346) MetadataStandard.asValueMap(…) / asTreeTable(…) do not work if the argument implements more than one metadata interface

2017-01-13 Thread Martin Desruisseaux (JIRA)

 [ 
https://issues.apache.org/jira/browse/SIS-346?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Martin Desruisseaux resolved SIS-346.
-
Resolution: Fixed

> MetadataStandard.asValueMap(…) / asTreeTable(…) do not work if the argument 
> implements more than one metadata interface
> ---
>
> Key: SIS-346
> URL: https://issues.apache.org/jira/browse/SIS-346
> Project: Spatial Information Systems
>  Issue Type: Bug
>  Components: Metadata
>Affects Versions: 0.3, 0.4, 0.5, 0.6, 0.7
>Reporter: Martin Desruisseaux
>Assignee: Martin Desruisseaux
> Fix For: 0.8
>
>
> It is some time convenient to implement more than one interface by the same 
> class. For example an implementation interested only in extents defined by 
> geographic bounding boxes could implement 
> {{org.opengis.metadata.extent.Extent}} and 
> {{org.opengis.metadata.extent.GeographicBoundingBox}} by the same class. 
> However in such cases, we get an ambiguity that prevent most 
> {{StandardMetadata}} methods to work. For resolving the ambiguity, we need to 
> tell which interface to reflect. This information is often known since the 
> metadata is often a return value of some getter methods, so we can use the 
> return type of the getter method for filtering the interface of interest 
> among the set of interfaces implemented by the value.
> Example: if {{getExtent()}} and {{getGeographicBoundingBox()}} both return 
> the same instance, but in the first case the method signature declare 
> {{Extent}} as the return value and in the second case declare 
> {{GeographicBoundingBox}} as the return value, we can use that information 
> for showing only the relevant nodes in a metadata tree.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)


svn commit: r1778656 [2/2] - in /sis/branches/JDK8: application/sis-console/src/main/java/org/apache/sis/console/ core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ core/sis-metadata/sr

2017-01-13 Thread desruisseaux
Modified: 
sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/MetadataStandardTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/MetadataStandardTest.java?rev=1778656=1778655=1778656=diff
==
--- 
sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/MetadataStandardTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/MetadataStandardTest.java
 [UTF-8] Fri Jan 13 18:58:25 2017
@@ -58,7 +58,7 @@ import static org.apache.sis.test.TestUt
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3
- * @version 0.3
+ * @version 0.8
  * @module
  */
 @DependsOn({
@@ -69,36 +69,55 @@ import static org.apache.sis.test.TestUt
 ValueMapTest.class})
 public final strictfp class MetadataStandardTest extends TestCase {
 /**
+ * The standard being tested.
+ */
+private MetadataStandard standard;
+
+/**
+ * Returns {@code true} if the given type is a metadata.
+ */
+private boolean isMetadata(final Class type) {
+return standard.isMetadata(type);
+}
+
+/**
  * Tests {@link MetadataStandard#isMetadata(Class)}.
  */
 @Test
 public void testIsMetadata() {
-MetadataStandard std = MetadataStandard.ISO_19115;
-assertFalse("isMetadata(String)", 
std.isMetadata(String.class));
-assertTrue ("isMetadata(Citation)",   
std.isMetadata(Citation.class));
-assertTrue ("isMetadata(DefaultCitation)",
std.isMetadata(DefaultCitation.class));
-assertFalse("isMetadata(IdentifiedObject)",   
std.isMetadata(IdentifiedObject.class));
-assertFalse("isMetadata(SimpleIdentifiedObject)", 
std.isMetadata(SimpleIdentifiedObject.class));
-assertFalse("isMetadata(GeographicCRS)",  
std.isMetadata(GeographicCRS.class));
-assertFalse("isMetadata(RectifiedGrid)",  
std.isMetadata(RectifiedGrid.class));
-
-std = MetadataStandard.ISO_19111;
-assertFalse("isMetadata(String)", 
std.isMetadata(String.class));
-assertTrue ("isMetadata(Citation)",   
std.isMetadata(Citation.class));  // Dependency
-assertTrue ("isMetadata(DefaultCitation)",
std.isMetadata(DefaultCitation.class));   // Dependency
-assertTrue ("isMetadata(IdentifiedObject)",   
std.isMetadata(IdentifiedObject.class));
-assertTrue ("isMetadata(SimpleIdentifiedObject)", 
std.isMetadata(SimpleIdentifiedObject.class));
-assertTrue ("isMetadata(GeographicCRS)",  
std.isMetadata(GeographicCRS.class));
-assertFalse("isMetadata(RectifiedGrid)",  
std.isMetadata(RectifiedGrid.class));
-
-std = MetadataStandard.ISO_19123;
-assertFalse("isMetadata(String)", 
std.isMetadata(String.class));
-assertTrue ("isMetadata(Citation)",   
std.isMetadata(Citation.class));   // Transitive dependency
-assertTrue ("isMetadata(DefaultCitation)",
std.isMetadata(DefaultCitation.class));// Transivive dependency
-assertTrue ("isMetadata(IdentifiedObject)",   
std.isMetadata(IdentifiedObject.class));   // Dependency
-assertTrue ("isMetadata(SimpleIdentifiedObject)", 
std.isMetadata(SimpleIdentifiedObject.class)); // Dependency
-assertTrue ("isMetadata(GeographicCRS)",  
std.isMetadata(GeographicCRS.class));  // Dependency
-assertTrue ("isMetadata(RectifiedGrid)",  
std.isMetadata(RectifiedGrid.class));
+standard = MetadataStandard.ISO_19115;
+assertFalse("isMetadata(String)", 
isMetadata(String.class));
+assertTrue ("isMetadata(Citation)",   
isMetadata(Citation.class));
+assertTrue ("isMetadata(DefaultCitation)",
isMetadata(DefaultCitation.class));
+assertFalse("isMetadata(IdentifiedObject)",   
isMetadata(IdentifiedObject.class));
+assertFalse("isMetadata(SimpleIdentifiedObject)", 
isMetadata(SimpleIdentifiedObject.class));
+assertFalse("isMetadata(GeographicCRS)",  
isMetadata(GeographicCRS.class));
+assertFalse("isMetadata(RectifiedGrid)",  
isMetadata(RectifiedGrid.class));
+
+standard = MetadataStandard.ISO_19111;
+assertFalse("isMetadata(String)", 
isMetadata(String.class));
+assertTrue ("isMetadata(Citation)",   
isMetadata(Citation.class));   // Dependency
+assertTrue ("isMetadata(DefaultCitation)",
isMetadata(DefaultCitation.class));// Dependency
+assertTrue ("isMetadata(IdentifiedObject)",   
isMetadata(IdentifiedObject.class));
+assertTrue ("isMetadata(SimpleIdentifiedObject)", 

svn commit: r1778656 [1/2] - in /sis/branches/JDK8: application/sis-console/src/main/java/org/apache/sis/console/ core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ core/sis-metadata/sr

2017-01-13 Thread desruisseaux
Author: desruisseaux
Date: Fri Jan 13 18:58:25 2017
New Revision: 1778656

URL: http://svn.apache.org/viewvc?rev=1778656=rev
Log:
MetadataStandard.asValueMap(…) / asTreeTable(…) should work even if the 
argument implements more than one metadata interface (SIS-346).

Added:

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/CacheKey.java
   (with props)
Modified:

sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/MetadataCommand.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/AbstractMetadata.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/KeyNamePolicy.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/MetadataStandard.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/Pruner.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/TreeNode.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/TreeNodeChildren.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/TreeTableView.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/ValueExistencePolicy.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/ValueMap.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/package-info.java

sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/metadata/sql/MetadataSource.java

sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/MetadataStandardTest.java

sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/MetadataTestCase.java

sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/PropertyAccessorTest.java

sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/PropertyInformationTest.java

sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeNodeChildrenTest.java

sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeNodeTest.java

sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/TreeTableViewTest.java

sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/metadata/ValueMapTest.java

sis/branches/JDK8/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/Capability.java

Modified: 
sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/MetadataCommand.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/MetadataCommand.java?rev=1778656=1778655=1778656=diff
==
--- 
sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/MetadataCommand.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/MetadataCommand.java
 [UTF-8] Fri Jan 13 18:58:25 2017
@@ -51,7 +51,7 @@ import org.apache.sis.xml.XML;
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.3
- * @version 0.7
+ * @version 0.8
  * @module
  */
 class MetadataCommand extends CommandRunner {
@@ -195,7 +195,9 @@ class MetadataCommand extends CommandRun
 final void format(final Object object) throws IOException, JAXBException {
 switch (outputFormat) {
 case TEXT: {
-final TreeTable tree = 
MetadataStandard.ISO_19115.asTreeTable(object, ValueExistencePolicy.NON_EMPTY);
+final TreeTable tree = 
MetadataStandard.ISO_19115.asTreeTable(object,
+(object instanceof Metadata) ? Metadata.class : null,
+ValueExistencePolicy.NON_EMPTY);
 final TreeTableFormat tf = new TreeTableFormat(locale, 
timezone);
 tf.setColumns(TableColumn.NAME, TableColumn.VALUE);
 tf.format(tree, out);

Modified: 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java?rev=1778656=1778655=1778656=diff
==
--- 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/Merger.java
 [UTF-8] Fri Jan 13 18:58:25 2017
@@ -177,7 +177,7 @@ public class Merger {
 if (source instanceof AbstractMetadata) {
 sourceMap = ((AbstractMetadata) source).asMap();  // Gives 
to subclasses a chance to override.

[jira] [Created] (SIS-346) MetadataStandard.asValueMap(…) / asTreeTable(…) do not work if the argument implements more than one metadata interface

2017-01-13 Thread Martin Desruisseaux (JIRA)
Martin Desruisseaux created SIS-346:
---

 Summary: MetadataStandard.asValueMap(…) / asTreeTable(…) do not 
work if the argument implements more than one metadata interface
 Key: SIS-346
 URL: https://issues.apache.org/jira/browse/SIS-346
 Project: Spatial Information Systems
  Issue Type: Bug
  Components: Metadata
Affects Versions: 0.7, 0.6, 0.5, 0.4, 0.3
Reporter: Martin Desruisseaux
Assignee: Martin Desruisseaux
 Fix For: 0.8


It is some time convenient to implement more than one interface by the same 
class. For example an implementation interested only in extents defined by 
geographic bounding boxes could implement 
{{org.opengis.metadata.extent.Extent}} and 
{{org.opengis.metadata.extent.GeographicBoundingBox}} by the same class. 
However in such cases, we get an ambiguity that prevent most 
{{StandardMetadata}} methods to work. For resolving the ambiguity, we need to 
tell which interface to reflect. This information is often known since the 
metadata is often a return value of some getter methods, so we can use the 
return type of the getter method for filtering the interface of interest among 
the set of interfaces implemented by the value.

Example: if {{getExtent()}} and {{getGeographicBoundingBox()}} both return the 
same instance, but in the first case the method signature declare {{Extent}} as 
the return value and in the second case declare {{GeographicBoundingBox}} as 
the return value, we can use that information for showing only the relevant 
nodes in a metadata tree.




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)