package org.constellation.admin; import java.io.File; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.bind.JAXBException; import org.apache.sis.metadata.iso.DefaultMetadata; import org.apache.sis.util.logging.Logging; import org.constellation.admin.util.MetadataUtilities; import org.constellation.business.IConfigurationBusiness; import org.constellation.configuration.AppProperty; import org.constellation.configuration.ConfigDirectory; import org.constellation.database.api.MetadataComplete; import org.constellation.database.api.MetadataIOUtils; import org.constellation.database.api.jooq.tables.pojos.Metadata; import org.constellation.database.api.jooq.tables.pojos.MetadataBbox; import org.constellation.database.api.jooq.tables.pojos.Property; import org.constellation.database.api.jooq.tables.pojos.Service; import org.constellation.database.api.repository.MetadataRepository; import org.constellation.database.api.repository.PropertyRepository; import org.constellation.database.api.repository.ServiceRepository; import org.constellation.utils.CstlMetadatas; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @Component @Primary public class ConfigurationBusiness implements IConfigurationBusiness { private static final Logger LOGGER = Logging.getLogger("org.constellation.admin"); @Autowired private PropertyRepository propertyRepository; @Autowired private ServiceRepository serviceRepository; @Autowired private MetadataRepository metadataRepository; @Override public File getConfigurationDirectory() { return ConfigDirectory.getConfigDirectory(); } @Override public File getDataDirectory() { return ConfigDirectory.getDataDirectory(); } @Override public String getProperty(final String key) { return propertyRepository.getValue(key, null); } @Override @Transactional public void setProperty(final String key, final String value) { System.setProperty(key, value); // FIXME continue to save in database ? // create/update external configuration file to save preferences ? propertyRepository.save(new Property(key, value)); // update metadata when service URL key is updated if (AppProperty.CSTL_SERVICE_URL.getKey().equals(key)) { updateServiceUrlForMetadata(value); } } private void updateServiceUrlForMetadata(final String url) { try { final List<Service> records = serviceRepository.findAll(); for (Service record : records) { final Metadata metadata = serviceRepository.getMetadata(record.getId()); if (metadata != null) { final DefaultMetadata servMeta = MetadataIOUtils.unmarshallMetadata(metadata.getMetadataIso()); CstlMetadatas.updateServiceMetadataURL(record.getIdentifier(), record.getType(), url, servMeta); final String xml = MetadataIOUtils.marshallMetadataToString(servMeta); final List<MetadataBbox> bboxes = MetadataUtilities.extractBbox(servMeta); metadata.setMetadataId(servMeta.getFileIdentifier()); metadata.setMetadataIso(xml); metadataRepository.update(new MetadataComplete(metadata, bboxes)); } } } catch (JAXBException ex) { LOGGER.log(Level.WARNING, "An error occurred updating service URL", ex); } } }