diff --git a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/BoundingBox.java b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/BoundingBox.java index 9fc9a2922..d483266a1 100644 --- a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/BoundingBox.java +++ b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/BoundingBox.java @@ -74,15 +74,21 @@ static BoundingBox merge(BoundingBox first, BoundingBox second) { return first; } - return new ImmutableBoundingBox.Builder() - .xmin(Math.min(first.getXmin(), second.getXmin())) - .ymin(Math.min(first.getYmin(), second.getYmin())) - .zmin(first.is3d() && second.is3d() ? Math.min(first.getZmin(), second.getZmin()) : null) - .xmax(Math.max(first.getXmax(), second.getXmax())) - .ymax(Math.max(first.getYmax(), second.getYmax())) - .zmax(first.is3d() && second.is3d() ? Math.max(first.getZmax(), second.getZmax()) : null) - .epsgCrs(first.getEpsgCrs()) - .build(); + Builder builder = + new ImmutableBoundingBox.Builder() + .xmin(Math.min(first.getXmin(), second.getXmin())) + .ymin(Math.min(first.getYmin(), second.getYmin())) + .xmax(Math.max(first.getXmax(), second.getXmax())) + .ymax(Math.max(first.getYmax(), second.getYmax())) + .epsgCrs(first.getEpsgCrs()); + + if (first.is3d() && second.is3d()) { + builder + .zmin(Math.min(first.getZmin(), second.getZmin())) + .zmax(Math.max(first.getZmax(), second.getZmax())); + } + + return builder.build(); } static Optional intersect2d(BoundingBox first, BoundingBox second, double buffer) { diff --git a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/BoundingBoxTransformer.java b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/BoundingBoxTransformer.java index d90935245..1e768c0e0 100644 --- a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/BoundingBoxTransformer.java +++ b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/BoundingBoxTransformer.java @@ -41,9 +41,10 @@ private BoundingBox transformBoundingBox2D(BoundingBox boundingBox) return BoundingBox.of(xmin, ymin, xmax, ymax, getTargetCrs()); } + @SuppressWarnings("PMD.CyclomaticComplexity") private BoundingBox transformBoundingBox3D(BoundingBox boundingBox) throws CrsTransformationException { - assert (boundingBox.is3d()); + assert boundingBox.is3d(); double[] llb = this.transform( diff --git a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CoordinateTuple.java b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CoordinateTuple.java index 07bc48c86..2c679f875 100644 --- a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CoordinateTuple.java +++ b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CoordinateTuple.java @@ -10,6 +10,12 @@ /** * @author fischer */ +@SuppressWarnings({ + "PMD.UseVarargs", + "PMD.ConstructorCallsOverridableMethod", + "PMD.ArrayIsStoredDirectly", + "PMD.MethodReturnsInternalArray" +}) public class CoordinateTuple { protected double[] c; diff --git a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CoordinateTupleWithPrecision.java b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CoordinateTupleWithPrecision.java index 02f400887..e5ce20bc4 100644 --- a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CoordinateTupleWithPrecision.java +++ b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CoordinateTupleWithPrecision.java @@ -14,6 +14,7 @@ /** * @author zahnen */ +@SuppressWarnings("PMD.FieldNamingConventions") public class CoordinateTupleWithPrecision extends CoordinateTuple { private static DecimalFormat DEFAULT_FORMAT = diff --git a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CrsTransformationException.java b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CrsTransformationException.java index 3effc4427..a04013457 100644 --- a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CrsTransformationException.java +++ b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/CrsTransformationException.java @@ -12,6 +12,8 @@ */ public class CrsTransformationException extends Exception { + private static final long serialVersionUID = 1L; + public CrsTransformationException(String message) { super(message); } diff --git a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/EpsgCrs.java b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/EpsgCrs.java index 6102d1191..f5ca7e87d 100644 --- a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/EpsgCrs.java +++ b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/EpsgCrs.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import java.math.BigInteger; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -21,6 +22,7 @@ @JsonDeserialize(builder = ImmutableEpsgCrs.Builder.class) // TODO: test @JsonInclude(JsonInclude.Include.NON_DEFAULT) +@SuppressWarnings("PMD.TooManyMethods") public interface EpsgCrs { enum Force { @@ -55,21 +57,19 @@ static EpsgCrs fromString(String prefixedCode) { return ogcCrs.get(); } - int code; - try { - code = Integer.parseInt(prefixedCode.substring(prefixedCode.lastIndexOf(":") + 1)); - } catch (NumberFormatException e) { - try { - code = Integer.parseInt(prefixedCode.substring(prefixedCode.lastIndexOf("/") + 1)); - } catch (NumberFormatException e2) { - try { - code = Integer.parseInt(prefixedCode); - } catch (NumberFormatException e3) { - throw new IllegalArgumentException("Could not parse CRS: " + prefixedCode); - } - } + int separator = Math.max(prefixedCode.lastIndexOf(':'), prefixedCode.lastIndexOf('/')); + String codeString = separator >= 0 ? prefixedCode.substring(separator + 1) : prefixedCode; + + if (codeString.isEmpty() || !codeString.chars().allMatch(Character::isDigit)) { + throw new IllegalArgumentException("Could not parse CRS: " + prefixedCode); } - return ImmutableEpsgCrs.of(code); + + BigInteger code = new BigInteger(codeString); + if (code.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) > 0) { + throw new IllegalArgumentException("Could not parse CRS: " + prefixedCode); + } + + return ImmutableEpsgCrs.of(code.intValue()); } static EpsgCrs fromString(String prefixedCode, String prefixedCodeVertical) { diff --git a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/OgcCrs.java b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/OgcCrs.java index 8fb8ab3da..a7c3ba117 100644 --- a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/OgcCrs.java +++ b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/domain/OgcCrs.java @@ -11,6 +11,7 @@ import java.util.Objects; import java.util.Optional; +@SuppressWarnings("PMD.FieldNamingConventions") public interface OgcCrs { EpsgCrs CRS84 = EpsgCrs.of(4326, Force.LON_LAT); diff --git a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/infra/CrsTransformerFactoryProj.java b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/infra/CrsTransformerFactoryProj.java index fe6aabf49..aaaf672b3 100644 --- a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/infra/CrsTransformerFactoryProj.java +++ b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/infra/CrsTransformerFactoryProj.java @@ -68,9 +68,11 @@ */ @Singleton @AutoBind +@SuppressWarnings({"PMD.GodClass", "PMD.TooManyMethods"}) public class CrsTransformerFactoryProj extends AbstractVolatile implements CrsTransformerFactory, CrsInfo, AppLifeCycle { + private static final String PROJ = "PROJ"; private static final Logger LOGGER = LoggerFactory.getLogger(CrsTransformerFactoryProj.class); private final ProjLoader projLoader; @@ -223,23 +225,32 @@ public OptionalInt getAxisWithWraparound(EpsgCrs crs) { // first check, if the range meaning is provided (typically this is not the case) CoordinateSystem cs = projCrs.getCoordinateSystem(); - for (int i = 0; i < cs.getDimension(); i++) - if (RangeMeaning.WRAPAROUND.equals(cs.getAxis(i).getRangeMeaning())) return OptionalInt.of(i); + for (int i = 0; i < cs.getDimension(); i++) { + if (RangeMeaning.WRAPAROUND.equals(cs.getAxis(i).getRangeMeaning())) { + return OptionalInt.of(i); + } + } // otherwise we analyse the CRS definition // if we have a compound CRS, we analyse the coordinate system of the first CRS, which includes // the horizontal axes - if (projCrs instanceof CompoundCRS) + if (projCrs instanceof CompoundCRS) { cs = ((CompoundCRS) projCrs).getComponents().get(0).getCoordinateSystem(); + } // wraparound only occurs in ellipsoidal coordinate systems - if (!(cs instanceof EllipsoidalCS)) return OptionalInt.empty(); + if (!(cs instanceof EllipsoidalCS)) { + return OptionalInt.empty(); + } // find the longitude axis - for (int i = 0; i < cs.getDimension(); i++) + for (int i = 0; i < cs.getDimension(); i++) { if (AxisDirection.EAST.equals(cs.getAxis(i).getDirection()) - || AxisDirection.WEST.equals(cs.getAxis(i).getDirection())) return OptionalInt.of(i); + || AxisDirection.WEST.equals(cs.getAxis(i).getDirection())) { + return OptionalInt.of(i); + } + } return OptionalInt.empty(); } @@ -258,10 +269,14 @@ public Optional getDomainOfValidity(EpsgCrs crs) { CoordinateReferenceSystem projCrs = getCrsOrThrow(crs); Extent extent = projCrs.getDomainOfValidity(); - if (Objects.isNull(extent)) return Optional.empty(); + if (Objects.isNull(extent)) { + return Optional.empty(); + } Collection geographicElements = extent.getGeographicElements(); - if (Objects.isNull(geographicElements) || geographicElements.isEmpty()) return Optional.empty(); + if (Objects.isNull(geographicElements) || geographicElements.isEmpty()) { + return Optional.empty(); + } List bboxs = geographicElements.stream() @@ -281,8 +296,11 @@ public Optional getDomainOfValidity(EpsgCrs crs) { }) .filter(Objects::nonNull) .collect(Collectors.toUnmodifiableList()); - if (bboxs.isEmpty()) return Optional.empty(); - else if (bboxs.size() == 1) return Optional.of(bboxs.get(0)); + if (bboxs.isEmpty()) { + return Optional.empty(); + } else if (bboxs.size() == 1) { + return Optional.of(bboxs.get(0)); + } // we have multiple bboxes, construct the bbox that includes them all; // also take care of bounding boxes that cross the antimeridian and normalize @@ -396,41 +414,45 @@ private CoordinateReferenceSystem getCrsOrThrow(EpsgCrs crs) { Objects.nonNull(crs) ? crs.toSimpleString() : "null"))); } - private synchronized Optional createCrs(EpsgCrs crs) { - return createCrs(crs, EPSG.provider(), Proj.getFactory(CRSFactory.class), false); + private Optional createCrs(EpsgCrs crs) { + synchronized (this) { + return createCrs(crs, EPSG.provider(), Proj.getFactory(CRSFactory.class), false); + } } - private synchronized Optional createCrs( + private Optional createCrs( EpsgCrs crs, CRSAuthorityFactory authorityFactory, CRSFactory crsFactory, boolean logError) { - try { - String code = String.valueOf(applyWorkarounds(crs).getCode()); - CoordinateReferenceSystem coordinateReferenceSystem = - authorityFactory.createCoordinateReferenceSystem(code); - coordinateReferenceSystem = - applyAxisOrder(coordinateReferenceSystem, crs.getForceAxisOrder()); - - if (crs.getVerticalCode().isPresent()) { - String verticalCode = String.valueOf(crs.getVerticalCode().getAsInt()); - CoordinateReferenceSystem verticalCrs = authorityFactory.createVerticalCRS(verticalCode); - CoordinateReferenceSystem compoundCrs = - crsFactory.createCompoundCRS( - ImmutableMap.of( - "name", - String.format( - "%s + %s", coordinateReferenceSystem.getName(), verticalCrs.getName())), - coordinateReferenceSystem, - verticalCrs); - - return Optional.of(compoundCrs); - } - return Optional.of(coordinateReferenceSystem); - } catch (Throwable e) { - if (logError) { - LogContext.error(LOGGER, e, "PROJ"); - } else { - LogContext.errorAsDebug(LOGGER, e, "PROJ"); + synchronized (this) { + try { + String code = String.valueOf(applyWorkarounds(crs).getCode()); + CoordinateReferenceSystem coordinateReferenceSystem = + authorityFactory.createCoordinateReferenceSystem(code); + coordinateReferenceSystem = + applyAxisOrder(coordinateReferenceSystem, crs.getForceAxisOrder()); + + if (crs.getVerticalCode().isPresent()) { + String verticalCode = String.valueOf(crs.getVerticalCode().getAsInt()); + CoordinateReferenceSystem verticalCrs = authorityFactory.createVerticalCRS(verticalCode); + CoordinateReferenceSystem compoundCrs = + crsFactory.createCompoundCRS( + ImmutableMap.of( + "name", + String.format( + "%s + %s", coordinateReferenceSystem.getName(), verticalCrs.getName())), + coordinateReferenceSystem, + verticalCrs); + + return Optional.of(compoundCrs); + } + return Optional.of(coordinateReferenceSystem); + } catch (Throwable e) { + if (logError) { + LogContext.error(LOGGER, e, PROJ); + } else { + LogContext.errorAsDebug(LOGGER, e, PROJ); + } + return Optional.empty(); } - return Optional.empty(); } } @@ -440,11 +462,11 @@ private boolean isCrs3d(CoordinateReferenceSystem crs) { private EpsgCrs applyWorkarounds(EpsgCrs crs) { // ArcGIS still uses code 102100 instead of 3857, but proj does not support it anymore - if (crs.getCode() == 102100) { + if (crs.getCode() == 102_100) { return EpsgCrs.of(3857); } // FME uses code 900914 instead of 4979/CRS84h, but proj does not support this - if (crs.getCode() == 900914) { + if (crs.getCode() == 900_914) { return OgcCrs.CRS84h; } return crs; @@ -509,70 +531,78 @@ private Map getCacheForSource(EpsgCrs crs, boolean forc : transformerCache.computeIfAbsent(crs, ignore -> new ConcurrentHashMap<>()); } - private synchronized CrsTransformer createCrsTransformer( + @SuppressWarnings("PMD.CyclomaticComplexity") + private CrsTransformer createCrsTransformer( EpsgCrs sourceCrs, EpsgCrs targetCrs, CoordinateReferenceSystem sourceProjCrs, CoordinateReferenceSystem targetProjCrs) { - boolean is3dTo3d = isCrs3d(sourceProjCrs) && isCrs3d(targetProjCrs); - int sourceDimension = isCrs3d(sourceProjCrs) ? 3 : 2; - int targetDimension = is3dTo3d ? 3 : 2; - - try { - CoordinateOperationContext coordinateOperationContext = new CoordinateOperationContext(); - coordinateOperationContext.setAuthority("EPSG"); - coordinateOperationContext.setSpatialCriterion(SpatialCriterion.PARTIAL_INTERSECTION); - coordinateOperationContext.setGridAvailabilityUse( - GridAvailabilityUse.DISCARD_OPERATION_IF_MISSING_GRID); - CoordinateOperation coordinateOperation = - Proj.createCoordinateOperation(sourceProjCrs, targetProjCrs, coordinateOperationContext); - - checkForMissingGridFiles(coordinateOperation); - - LOGGER.debug( - "Chosen operation for {} -> {}: {}{}", - sourceCrs.toHumanReadableString(), - targetCrs.toHumanReadableString(), - coordinateOperation.getName().getCode(), - getGridFile(coordinateOperation).orElse("")); - - CoordinateOperation horizontalCoordinateOperation = null; - if (sourceDimension == 3) { - horizontalCoordinateOperation = + synchronized (this) { + boolean is3dTo3d = isCrs3d(sourceProjCrs) && isCrs3d(targetProjCrs); + int sourceDimension = isCrs3d(sourceProjCrs) ? 3 : 2; + int targetDimension = is3dTo3d ? 3 : 2; + + try { + CoordinateOperationContext coordinateOperationContext = new CoordinateOperationContext(); + coordinateOperationContext.setAuthority("EPSG"); + coordinateOperationContext.setSpatialCriterion(SpatialCriterion.PARTIAL_INTERSECTION); + coordinateOperationContext.setGridAvailabilityUse( + GridAvailabilityUse.DISCARD_OPERATION_IF_MISSING_GRID); + CoordinateOperation coordinateOperation = Proj.createCoordinateOperation( - getHorizontalCrs(sourceProjCrs), - getHorizontalCrs(targetProjCrs), - coordinateOperationContext); - LOGGER.debug( - "Chosen operation for '{}' -> '{}': {}{}", - getHorizontalCrs(sourceProjCrs).getName().getCode(), - getHorizontalCrs(targetProjCrs).getName().getCode(), - coordinateOperation.getName().getCode(), - getGridFile(horizontalCoordinateOperation).orElse("")); - } + sourceProjCrs, targetProjCrs, coordinateOperationContext); + + checkForMissingGridFiles(coordinateOperation); + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug( + "Chosen operation for {} -> {}: {}{}", + sourceCrs.toHumanReadableString(), + targetCrs.toHumanReadableString(), + coordinateOperation.getName().getCode(), + getGridFile(coordinateOperation).orElse("")); + } - return new CrsTransformerProj( - sourceProjCrs, - targetProjCrs, - sourceCrs, - targetCrs, - sourceDimension, - targetDimension, - coordinateOperation, - Optional.ofNullable(horizontalCoordinateOperation)); - } catch (IllegalStateException ex) { - // LogContext.error(LOGGER, ex, "PROJ"); - throw ex; - } catch (Throwable ex) { - LogContext.errorAsDebug(LOGGER, ex, "PROJ"); - throw new IllegalArgumentException(ex.getMessage(), ex); + CoordinateOperation horizontalCoordinateOperation = null; + if (sourceDimension == 3) { + horizontalCoordinateOperation = + Proj.createCoordinateOperation( + getHorizontalCrs(sourceProjCrs), + getHorizontalCrs(targetProjCrs), + coordinateOperationContext); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug( + "Chosen operation for '{}' -> '{}': {}{}", + getHorizontalCrs(sourceProjCrs).getName().getCode(), + getHorizontalCrs(targetProjCrs).getName().getCode(), + coordinateOperation.getName().getCode(), + getGridFile(horizontalCoordinateOperation).orElse("")); + } + } + + return new CrsTransformerProj( + sourceProjCrs, + targetProjCrs, + sourceCrs, + targetCrs, + sourceDimension, + targetDimension, + coordinateOperation, + Optional.ofNullable(horizontalCoordinateOperation)); + } catch (IllegalStateException ex) { + LogContext.errorAsDebug(LOGGER, ex, PROJ); + throw ex; + } catch (Throwable ex) { + LogContext.errorAsDebug(LOGGER, ex, PROJ); + throw new IllegalArgumentException(ex.getMessage(), ex); + } } } private void checkForMissingGridFiles(CoordinateOperation coordinateOperation) { try { - double[] coordinates = new double[] {0, 0}; + double[] coordinates = {0, 0}; coordinateOperation.getMathTransform().transform(coordinates, 0, coordinates, 0, 1); } catch (OutOfMemoryError e) { Pattern pattern = Pattern.compile("PARAMETERFILE\\[\"(.*?)\",\"(.*?)\"\\]"); @@ -580,9 +610,10 @@ private void checkForMissingGridFiles(CoordinateOperation coordinateOperation) { if (matcher.find()) { throw new IllegalStateException( String.format( - "Missing PROJ parameter file: %s (%s)", matcher.group(2), matcher.group(1))); + "Missing PROJ parameter file: %s (%s)", matcher.group(2), matcher.group(1)), + e); } - throw new IllegalStateException(e.getMessage()); + throw new IllegalStateException(e.getMessage(), e); } catch (Throwable e) { // ignore } diff --git a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/infra/CrsTransformerProj.java b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/infra/CrsTransformerProj.java index 6a5578028..9db3a6792 100644 --- a/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/infra/CrsTransformerProj.java +++ b/xtraplatform-crs/src/main/java/de/ii/xtraplatform/crs/infra/CrsTransformerProj.java @@ -52,14 +52,15 @@ public class CrsTransformerProj extends BoundingBoxTransformer implements CrsTra int targetDimension, CoordinateOperation coordinateOperation, Optional horizontalCoordinateOperation) { + super(); this.sourceCrs = origSourceCrs; this.targetCrs = origTargetCrs; Unit sourceUnit = sourceCrs.getCoordinateSystem().getAxis(0).getUnit(); Unit targetUnit = targetCrs.getCoordinateSystem().getAxis(0).getUnit(); - this.isSourceMetric = sourceUnit == Units.METRE; - this.isTargetMetric = targetUnit == Units.METRE; + this.isSourceMetric = Units.METRE.equals(sourceUnit); + this.isTargetMetric = Units.METRE.equals(targetUnit); SingleCRS horizontalSourceCrs = getHorizontalCrs(sourceCrs); SingleCRS horizontalTargetCrs = getHorizontalCrs(targetCrs); @@ -96,6 +97,7 @@ public CoordinateTuple transform(CoordinateTuple coordinateTuple) { } @Override + @SuppressWarnings("PMD.ReturnEmptyCollectionRatherThanNull") public double[] transform(double[] coordinates, int numberOfPoints, int dimension) { if (dimension > sourceDimension) { throw new IllegalStateException( diff --git a/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/transform/WithTransformationsApplied.java b/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/transform/WithTransformationsApplied.java index 970f81901..d6945168f 100644 --- a/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/transform/WithTransformationsApplied.java +++ b/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/transform/WithTransformationsApplied.java @@ -81,7 +81,7 @@ public FeatureSchema visit( private Optional getFeatureTransformations(FeatureSchema schema) { PropertyTransformations schemaTransformations = - () -> ImmutableMap.of(PropertyTransformations.WILDCARD, schema.getTransformations()); + () -> ImmutableMap.of(WILDCARD, schema.getTransformations()); PropertyTransformations mergedTransformations = preferSchemaTransformations @@ -113,7 +113,6 @@ private PropertyTransformations getPropertyTransformations(FeatureSchema schema) visitedProperties.stream().flatMap(m -> m.entrySet().stream())) .collect( ImmutableMap.toImmutableMap(Map.Entry::getKey, Map.Entry::getValue))); - ; PropertyTransformations mergedTransformations = preferSchemaTransformations diff --git a/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/transform/WithoutRoles.java b/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/transform/WithoutRoles.java index abd50afaf..1426e4d61 100644 --- a/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/transform/WithoutRoles.java +++ b/xtraplatform-features/src/main/java/de/ii/xtraplatform/features/domain/transform/WithoutRoles.java @@ -17,8 +17,6 @@ public class WithoutRoles implements SchemaVisitorTopDown { - public WithoutRoles() {} - @Override public FeatureSchema visit( FeatureSchema schema, List parents, List visitedProperties) {