FeatureTypeEventHandler.java
/*
* Copyright (C) 2025 B3Partners B.V.
*
* SPDX-License-Identifier: MIT
*/
package org.tailormap.api.repository.events;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.sql.SQLException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.rest.core.annotation.HandleBeforeSave;
import org.springframework.data.rest.core.annotation.RepositoryEventHandler;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ResponseStatusException;
import org.tailormap.api.geotools.featuresources.AttachmentsHelper;
import org.tailormap.api.persistence.TMFeatureType;
@Component
@RepositoryEventHandler
public class FeatureTypeEventHandler {
private static final Logger logger =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
@HandleBeforeSave
void handleBeforeSaveTMFeatureType(TMFeatureType featureType) {
try {
if (featureType.getSettings() != null
&& featureType.getSettings().getAttachmentAttributes() != null
&& !featureType.getSettings().getAttachmentAttributes().isEmpty()) {
AttachmentsHelper.createAttachmentTableForFeatureType(featureType);
}
} catch (IllegalArgumentException | SQLException | IOException e) {
logger.error(
"Error opening GeoTools datastore or creating attachments table or index for FeatureType: {}",
featureType.getName(),
e);
// TODO check if this is the correct exception to throw,
// we may want to throw eg a BadRequest or illegal state/illegal argument exception instead
throw new ResponseStatusException(
HttpStatus.INTERNAL_SERVER_ERROR,
"Error creating attachments table or index for FeatureType: " + featureType.getName(),
e);
}
}
}