Skip to content

Commit

Permalink
Add ability to publish data belonging to all DB schemas
Browse files Browse the repository at this point in the history
  • Loading branch information
groldan committed Sep 3, 2024
1 parent 554391b commit 507b82c
Show file tree
Hide file tree
Showing 33 changed files with 2,206 additions and 526 deletions.
14 changes: 14 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,20 @@
<artifactId>maven-source-plugin</artifactId>
<version>3.3.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
<inherited>true</inherited>
</plugin>
</plugins>
</pluginManagement>
<plugins>
Expand Down
9 changes: 9 additions & 0 deletions src/services/ogc-features/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,11 @@
<artifactId>lombok</artifactId>
<version>1.18.30</version>
</path>
<path>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>3.3.1</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
Expand Down Expand Up @@ -173,6 +178,10 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
</plugins>
</build>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.camptocamp.geotools.data.decorate;

import org.geotools.api.data.DataStore;

import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Delegate;

/**
* Abstract {@link DataStore} decorator forwarding all method calls to the
* decorated object
*/
@RequiredArgsConstructor
public abstract class DecoratingDataStore implements DataStore {

@Delegate
protected final @NonNull DataStore delegate;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.camptocamp.geotools.data.decorate;

import org.geotools.api.data.SimpleFeatureSource;

import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Delegate;

@RequiredArgsConstructor
public class DecoratingFeatureSource implements SimpleFeatureSource {

@Delegate
protected final @NonNull SimpleFeatureSource delegate;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.camptocamp.geotools.data.decorate;

import static com.camptocamp.geotools.data.decorate.ReadOnlyDataStore.readOnlyException;

import org.geotools.api.data.DataStore;
import org.geotools.api.data.FeatureWriter;
import org.geotools.api.data.Transaction;
import org.geotools.api.feature.simple.SimpleFeature;
import org.geotools.api.feature.simple.SimpleFeatureType;
import org.geotools.api.feature.type.Name;
import org.geotools.api.filter.Filter;

import lombok.NonNull;

/**
* A read-only {@link DecoratingDataStore}, where all mutating methods throw an
* {@link UnsupportedOperationException}
*/
public abstract class DecoratingReadOnlyDataStore extends DecoratingDataStore implements ReadOnlyDataStore {

protected DecoratingReadOnlyDataStore(@NonNull DataStore delegate) {
super(delegate);
}

@Override
public FeatureWriter<SimpleFeatureType, SimpleFeature> getFeatureWriter(String typeName, Filter filter,
Transaction transaction) {
throw readOnlyException();
}

@Override
public FeatureWriter<SimpleFeatureType, SimpleFeature> getFeatureWriter(String typeName, Transaction transaction) {
throw readOnlyException();
}

@Override
public FeatureWriter<SimpleFeatureType, SimpleFeature> getFeatureWriterAppend(String typeName,
Transaction transaction) {
throw readOnlyException();
}

@Override
public void createSchema(SimpleFeatureType featureType) {
throw readOnlyException();
}

@Override
public void updateSchema(Name typeName, SimpleFeatureType featureType) {
throw readOnlyException();
}

@Override
public void removeSchema(Name typeName) {
throw readOnlyException();
}

@Override
public void updateSchema(String typeName, SimpleFeatureType featureType) {
throw readOnlyException();
}

@Override
public void removeSchema(String typeName) {
throw readOnlyException();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.camptocamp.geotools.data.decorate;

import static org.springframework.util.ObjectUtils.isEmpty;

import java.util.function.Supplier;
import java.util.function.UnaryOperator;

import org.geotools.api.data.DataStore;

import lombok.NonNull;

/**
* {@link RenamingDataStore} whose rename/undo functions apply or remove a given
* prefix to all FeatureType names
*/
public class PrefixingDataStore extends RenamingDataStore {

public PrefixingDataStore(@NonNull DataStore delegate, @NonNull Supplier</* Nullable */String> typeNamePrefix) {
super(delegate, rename(typeNamePrefix), undo(typeNamePrefix));
}

/**
* Function to apply the FeatureType name prefix as the renaming function of
* RenamingDataStore
*/
private static @NonNull UnaryOperator<String> rename(Supplier<String> typeNamePrefix) {
return name -> isEmpty(typeNamePrefix.get()) ? name : "%s%s".formatted(typeNamePrefix.get(), name);
}

/**
* Function remote the FeatureType name prefix as the undo renaming function of
* RenamingDataStore
*/
private static @NonNull UnaryOperator<String> undo(Supplier<String> typeNamePrefix) {
return prefixedName -> isEmpty(typeNamePrefix.get()) ? prefixedName
: prefixedName.substring(typeNamePrefix.get().length());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package com.camptocamp.geotools.data.decorate;

import org.geotools.api.data.DataStore;
import org.geotools.api.data.FeatureWriter;
import org.geotools.api.data.LockingManager;
import org.geotools.api.data.Transaction;
import org.geotools.api.feature.simple.SimpleFeature;
import org.geotools.api.feature.simple.SimpleFeatureType;
import org.geotools.api.feature.type.Name;
import org.geotools.api.filter.Filter;
import org.geotools.data.InProcessLockingManager;

/**
* Read-only {@link DataStore} interface extension where all mutating methods
* throw an {@link UnsupportedOperationException}
*/
public interface ReadOnlyDataStore extends DataStore {

LockingManager IN_PROCESS_LOCKING = new InProcessLockingManager();

@Override
default LockingManager getLockingManager() {
return IN_PROCESS_LOCKING;
}

@Override
default FeatureWriter<SimpleFeatureType, SimpleFeature> getFeatureWriter(String typeName, Filter filter,
Transaction transaction) {
throw readOnlyException();
}

@Override
default FeatureWriter<SimpleFeatureType, SimpleFeature> getFeatureWriter(String typeName, Transaction transaction) {
throw readOnlyException();
}

@Override
default FeatureWriter<SimpleFeatureType, SimpleFeature> getFeatureWriterAppend(String typeName,
Transaction transaction) {
throw readOnlyException();
}

@Override
default void createSchema(SimpleFeatureType featureType) {
throw readOnlyException();
}

@Override
default void updateSchema(Name typeName, SimpleFeatureType featureType) {
throw readOnlyException();
}

@Override
default void removeSchema(Name typeName) {
throw readOnlyException();
}

@Override
default void updateSchema(String typeName, SimpleFeatureType featureType) {
throw readOnlyException();
}

@Override
default void removeSchema(String typeName) {
throw readOnlyException();
}

static UnsupportedOperationException readOnlyException() {
return new UnsupportedOperationException("read only");
}
}
Loading

0 comments on commit 507b82c

Please sign in to comment.