blob: b8ea6f0ad07b4207c223bb97dfae44cd3d37d10b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "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
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sis.metadata.iso;
import java.lang.reflect.Modifier;
import org.opengis.annotation.UML;
import org.opengis.util.ControlledVocabulary;
import org.apache.sis.internal.jaxb.Context;
import org.apache.sis.metadata.MetadataStandard;
import org.apache.sis.metadata.PropertyConsistencyCheck;
import org.apache.sis.test.LoggingWatcher;
import org.apache.sis.test.DependsOn;
import org.junit.Rule;
import org.junit.Test;
/**
* Tests all known {@link ISOMetadata} subclasses for JAXB annotations and getter/setter methods.
*
* @author Martin Desruisseaux (Geomatys)
* @version 1.0
* @since 0.3
* @module
*/
@DependsOn(org.apache.sis.metadata.PropertyAccessorTest.class)
public final strictfp class AllMetadataTest extends PropertyConsistencyCheck {
/**
* A JUnit {@link Rule} for listening to log events. This field is public because JUnit requires us to
* do so, but should be considered as an implementation details (it should have been a private field).
*/
@Rule
public final LoggingWatcher loggings = new LoggingWatcher(Context.LOGGER);
/**
* Creates a new test case with all GeoAPI interfaces and code lists to test.
*/
@SuppressWarnings("deprecation")
public AllMetadataTest() {
super(MetadataStandard.ISO_19115,
org.opengis.annotation.Obligation.class,
org.opengis.metadata.ApplicationSchemaInformation.class,
org.opengis.metadata.Datatype.class,
org.opengis.metadata.ExtendedElementInformation.class,
org.opengis.metadata.Identifier.class,
org.opengis.metadata.Metadata.class,
org.opengis.metadata.MetadataExtensionInformation.class,
org.opengis.metadata.MetadataScope.class,
org.opengis.metadata.PortrayalCatalogueReference.class,
org.opengis.metadata.acquisition.AcquisitionInformation.class,
org.opengis.metadata.acquisition.Context.class,
org.opengis.metadata.acquisition.EnvironmentalRecord.class,
org.opengis.metadata.acquisition.Event.class,
org.opengis.metadata.acquisition.GeometryType.class,
org.opengis.metadata.acquisition.Instrument.class,
org.opengis.metadata.acquisition.Objective.class,
org.opengis.metadata.acquisition.ObjectiveType.class,
org.opengis.metadata.acquisition.Operation.class,
org.opengis.metadata.acquisition.OperationType.class,
org.opengis.metadata.acquisition.Plan.class,
org.opengis.metadata.acquisition.Platform.class,
org.opengis.metadata.acquisition.PlatformPass.class,
org.opengis.metadata.acquisition.Priority.class,
org.opengis.metadata.acquisition.RequestedDate.class,
org.opengis.metadata.acquisition.Requirement.class,
org.opengis.metadata.acquisition.Sequence.class,
org.opengis.metadata.acquisition.Trigger.class,
org.opengis.metadata.citation.Address.class,
org.opengis.metadata.citation.Citation.class,
org.opengis.metadata.citation.CitationDate.class,
org.opengis.metadata.citation.Contact.class,
org.opengis.metadata.citation.DateType.class,
org.opengis.metadata.citation.OnLineFunction.class,
org.opengis.metadata.citation.OnlineResource.class,
org.opengis.metadata.citation.Party.class,
org.opengis.metadata.citation.PresentationForm.class,
org.opengis.metadata.citation.Responsibility.class,
org.opengis.metadata.citation.ResponsibleParty.class,
org.opengis.metadata.citation.Role.class,
org.opengis.metadata.citation.Series.class,
org.opengis.metadata.citation.Telephone.class,
org.opengis.metadata.constraint.Classification.class,
org.opengis.metadata.constraint.Constraints.class,
org.opengis.metadata.constraint.LegalConstraints.class,
org.opengis.metadata.constraint.Restriction.class,
org.opengis.metadata.constraint.SecurityConstraints.class,
org.opengis.metadata.content.AttributeGroup.class,
org.opengis.metadata.content.Band.class,
org.opengis.metadata.content.BandDefinition.class,
org.opengis.metadata.content.ContentInformation.class,
org.opengis.metadata.content.CoverageContentType.class,
org.opengis.metadata.content.CoverageDescription.class,
org.opengis.metadata.content.FeatureCatalogueDescription.class,
org.opengis.metadata.content.ImageDescription.class,
org.opengis.metadata.content.ImagingCondition.class,
org.opengis.metadata.content.PolarisationOrientation.class,
org.opengis.metadata.content.RangeDimension.class,
org.opengis.metadata.content.RangeElementDescription.class,
org.opengis.metadata.content.SampleDimension.class,
org.opengis.metadata.content.TransferFunctionType.class,
org.opengis.metadata.distribution.DataFile.class,
org.opengis.metadata.distribution.DigitalTransferOptions.class,
org.opengis.metadata.distribution.Distribution.class,
org.opengis.metadata.distribution.Distributor.class,
org.opengis.metadata.distribution.Format.class,
org.opengis.metadata.distribution.Medium.class,
org.opengis.metadata.distribution.MediumFormat.class,
org.apache.sis.internal.metadata.legacy.MediumName.class,
org.opengis.metadata.distribution.StandardOrderProcess.class,
org.opengis.metadata.extent.BoundingPolygon.class,
org.opengis.metadata.extent.Extent.class,
org.opengis.metadata.extent.GeographicBoundingBox.class,
org.opengis.metadata.extent.GeographicDescription.class,
org.opengis.metadata.extent.GeographicExtent.class,
org.opengis.metadata.extent.SpatialTemporalExtent.class,
org.opengis.metadata.extent.TemporalExtent.class,
org.opengis.metadata.extent.VerticalExtent.class,
org.opengis.metadata.identification.AggregateInformation.class,
org.opengis.metadata.identification.AssociatedResource.class,
org.opengis.metadata.identification.AssociationType.class,
org.opengis.metadata.identification.BrowseGraphic.class,
org.opengis.metadata.identification.CharacterSet.class,
org.opengis.metadata.identification.CoupledResource.class,
org.opengis.metadata.identification.DataIdentification.class,
org.opengis.metadata.identification.Identification.class,
org.opengis.metadata.identification.InitiativeType.class,
org.opengis.metadata.identification.Keywords.class,
org.opengis.metadata.identification.KeywordClass.class,
org.opengis.metadata.identification.KeywordType.class,
org.opengis.metadata.identification.Progress.class,
org.opengis.metadata.identification.OperationChainMetadata.class,
org.opengis.metadata.identification.OperationMetadata.class,
org.opengis.metadata.identification.RepresentativeFraction.class,
org.opengis.metadata.identification.Resolution.class,
org.opengis.metadata.identification.ServiceIdentification.class,
org.opengis.metadata.identification.TopicCategory.class,
org.opengis.metadata.identification.Usage.class,
org.opengis.metadata.lineage.Algorithm.class,
org.opengis.metadata.lineage.Lineage.class,
org.opengis.metadata.lineage.NominalResolution.class,
org.opengis.metadata.lineage.Processing.class,
org.opengis.metadata.lineage.ProcessStep.class,
org.opengis.metadata.lineage.ProcessStepReport.class,
org.opengis.metadata.lineage.Source.class,
org.opengis.metadata.maintenance.MaintenanceFrequency.class,
org.opengis.metadata.maintenance.MaintenanceInformation.class,
org.opengis.metadata.maintenance.Scope.class,
org.opengis.metadata.maintenance.ScopeCode.class,
org.opengis.metadata.maintenance.ScopeDescription.class,
org.opengis.metadata.quality.AbsoluteExternalPositionalAccuracy.class,
org.opengis.metadata.quality.AccuracyOfATimeMeasurement.class,
org.opengis.metadata.quality.Completeness.class,
org.opengis.metadata.quality.CompletenessCommission.class,
org.opengis.metadata.quality.CompletenessOmission.class,
org.opengis.metadata.quality.ConceptualConsistency.class,
org.opengis.metadata.quality.ConformanceResult.class,
org.opengis.metadata.quality.CoverageResult.class,
org.opengis.metadata.quality.DataQuality.class,
org.opengis.metadata.quality.DomainConsistency.class,
org.opengis.metadata.quality.Element.class,
org.opengis.metadata.quality.EvaluationMethodType.class,
org.opengis.metadata.quality.FormatConsistency.class,
org.opengis.metadata.quality.GriddedDataPositionalAccuracy.class,
org.opengis.metadata.quality.LogicalConsistency.class,
org.opengis.metadata.quality.NonQuantitativeAttributeAccuracy.class,
org.opengis.metadata.quality.PositionalAccuracy.class,
org.opengis.metadata.quality.QuantitativeAttributeAccuracy.class,
org.opengis.metadata.quality.QuantitativeResult.class,
org.opengis.metadata.quality.RelativeInternalPositionalAccuracy.class,
org.opengis.metadata.quality.Result.class,
org.opengis.metadata.quality.TemporalAccuracy.class,
org.opengis.metadata.quality.TemporalConsistency.class,
org.opengis.metadata.quality.TemporalValidity.class,
org.opengis.metadata.quality.ThematicAccuracy.class,
org.opengis.metadata.quality.ThematicClassificationCorrectness.class,
org.opengis.metadata.quality.TopologicalConsistency.class,
org.opengis.metadata.quality.Usability.class,
org.opengis.metadata.spatial.CellGeometry.class,
org.opengis.metadata.spatial.Dimension.class,
org.opengis.metadata.spatial.DimensionNameType.class,
org.opengis.metadata.spatial.GCP.class,
org.opengis.metadata.spatial.GCPCollection.class,
org.opengis.metadata.spatial.GeolocationInformation.class,
org.opengis.metadata.spatial.GeometricObjects.class,
org.opengis.metadata.spatial.GeometricObjectType.class,
org.opengis.metadata.spatial.Georectified.class,
org.opengis.metadata.spatial.Georeferenceable.class,
org.opengis.metadata.spatial.GridSpatialRepresentation.class,
org.opengis.metadata.spatial.PixelOrientation.class,
org.opengis.metadata.spatial.SpatialRepresentation.class,
org.opengis.metadata.spatial.SpatialRepresentationType.class,
org.opengis.metadata.spatial.TopologyLevel.class,
org.opengis.metadata.spatial.VectorSpatialRepresentation.class);
}
/**
* {@inheritDoc}
* Once the test is completed, this method verifies that the expected warnings have been logged,
* and no unexpected logging occurred.
*/
@Test
@Override
public void testPropertyValues() {
super.testPropertyValues();
loggings.assertNextLogContains("angularDistance", "distance");
loggings.assertNextLogContains("distance", "equivalentScale");
loggings.assertNextLogContains("equivalentScale", "levelOfDetail");
loggings.assertNextLogContains("levelOfDetail", "vertical");
loggings.assertNoUnexpectedLog();
}
/**
* Returns the ISO 19115-3 wrapper for the given GeoAPI type,
* or {@code null} if no adapter is expected for the given type.
*
* @return {@inheritDoc}
* @throws ClassNotFoundException {@inheritDoc}
*/
@Override
protected Class<?> getWrapperFor(final Class<?> type) throws ClassNotFoundException {
if (type.equals(org.opengis.metadata.Metadata.class)) {
/*
* We don't have adapter for Metadata, since it is the root element.
* We explicitly exclude it for avoiding confusion with PropertyType,
* which is the base class of all other adapters.
*/
return null;
}
final String classname = "org.apache.sis.internal.jaxb." +
(ControlledVocabulary.class.isAssignableFrom(type) ? "code" : "metadata") +
'.' + type.getAnnotation(UML.class).identifier();
final Class<?> wrapper = Class.forName(classname);
Class<?>[] expectedFinalClasses = wrapper.getClasses(); // "Since2014" internal class.
if (expectedFinalClasses.length == 0) {
expectedFinalClasses = new Class<?>[] {wrapper}; // If no "Since2014", then wrapper itself should be final.
}
for (final Class<?> c : expectedFinalClasses) {
if (!Modifier.isFinal(c.getModifiers())) {
fail("Expected a final class for " + c.getName());
}
}
return wrapper;
}
/**
* Return {@code false} for the Apache SIS properties which are known to have no setter methods.
*
* @return {@inheritDoc}
*/
@Override
protected boolean isWritable(final Class<?> impl, final String property) {
if (org.apache.sis.metadata.iso.identification.DefaultRepresentativeFraction.class.isAssignableFrom(impl)) {
if (property.equals("doubleValue")) {
return false;
}
}
return super.isWritable(impl, property);
}
}