[jira] [Resolved] (SIS-346) MetadataStandard.asValueMap(…) / asTreeTable(…) do not work if the argument implements more than one metadata interface
[ 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
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
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
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)