/**
* Copyright (C) 2012-2017 52°North Initiative for Geospatial Open Source
* Software GmbH
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation.
*
* If the program is linked with libraries which are licensed under one of
* the following licenses, the combination of the program with the linked
* library is not considered a "derivative work" of the program:
*
* - Apache License, version 2.0
* - Apache Software License, version 1.0
* - GNU Lesser General Public License, version 3
* - Mozilla Public License, versions 1.0, 1.1 and 2.0
* - Common Development and Distribution License (CDDL), version 1.0
*
* Therefore the distribution of the program linked with libraries licensed
* under the aforementioned licenses, is permitted by the copyright holders
* if the distribution is compliant with both the GNU General Public
* License version 2 and the aforementioned licenses.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*/
package org.n52.sos.cache;
import java.util.Collection;
import java.util.Iterator;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import org.joda.time.DateTime;
import org.n52.sos.i18n.MultilingualString;
import org.n52.sos.ogc.gml.time.Time;
import org.n52.sos.ogc.gml.time.TimeInstant;
import org.n52.sos.ogc.gml.time.TimePeriod;
import org.n52.sos.ogc.sos.SosEnvelope;
import org.n52.sos.util.CollectionHelper;
import org.n52.sos.util.StringHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vividsolutions.jts.geom.Envelope;
public class WritableCache extends ReadableCache implements WritableContentCache, CacheConstants {
private static final Logger LOG = LoggerFactory.getLogger(WritableCache.class);
private static final long serialVersionUID = 6625851272234063808L;
/**
* Creates a {@code TimePeriod} for the specified {@code ITime}.
*
* @param time
* the abstract time
*
* @return the period describing the abstract time
*/
protected static TimePeriod toTimePeriod(final Time time) {
if (time instanceof TimeInstant) {
final DateTime instant = ((TimeInstant) time).getValue();
return new TimePeriod(instant, instant);
} else {
return (TimePeriod) time;
}
}
@Override
public void removeResultTemplates(final Collection<String> resultTemplates) {
for (final String resultTemplate : resultTemplates) {
removeResultTemplate(resultTemplate);
}
}
@Override
public void addEpsgCode(final Integer epsgCode) {
greaterZero(EPSG_CODE, epsgCode);
LOG.trace("Adding EpsgCode {}", epsgCode);
getEpsgCodesSet().add(epsgCode);
}
@Override
public void addFeatureOfInterest(final String featureOfInterest) {
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
LOG.trace("Adding FeatureOfInterest {}", featureOfInterest);
getFeaturesOfInterestSet().add(featureOfInterest);
}
@Override
public void addProcedure(final String procedure) {
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Adding procedure {}", procedure);
getProceduresSet().add(procedure);
}
@Override
public void addResultTemplate(final String resultTemplate) {
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
LOG.trace("Adding SosResultTemplate {}", resultTemplate);
getResultTemplatesSet().add(resultTemplate);
}
@Override
public void addResultTemplates(final Collection<String> resultTemplates) {
noNullValues(RESULT_TEMPLATES, resultTemplates);
for (final String resultTemplate : resultTemplates) {
addResultTemplate(resultTemplate);
}
}
@Override
public void addEpsgCodes(final Collection<Integer> epsgCodes) {
noNullValues(EPSG_CODES, epsgCodes);
for (final Integer epsgCode : epsgCodes) {
addEpsgCode(epsgCode);
}
}
@Override
public void addFeaturesOfInterest(final Collection<String> featuresOfInterest) {
noNullValues(FEATURES_OF_INTEREST, featuresOfInterest);
for (final String featureOfInterest : featuresOfInterest) {
addFeatureOfInterest(featureOfInterest);
}
}
@Override
public void addProcedures(final Collection<String> procedures) {
noNullValues(PROCEDURES, procedures);
for (final String procedure : procedures) {
addProcedure(procedure);
}
}
@Override
public void removeFeatureOfInterest(final String featureOfInterest) {
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
LOG.trace("Removing FeatureOfInterest {}", featureOfInterest);
getFeaturesOfInterestSet().remove(featureOfInterest);
}
@Override
public void removeFeaturesOfInterest(final Collection<String> featuresOfInterest) {
noNullValues(FEATURES_OF_INTEREST, featuresOfInterest);
for (final String featureOfInterest : featuresOfInterest) {
removeFeatureOfInterest(featureOfInterest);
}
}
@Override
public void removeProcedure(final String procedure) {
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Removing Procedure {}", procedure);
getProceduresSet().remove(procedure);
}
@Override
public void removeProcedures(final Collection<String> procedures) {
noNullValues(PROCEDURES, procedures);
for (final String procedure : procedures) {
removeProcedure(procedure);
}
}
@Override
public void removeResultTemplate(final String resultTemplate) {
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
LOG.trace("Removing SosResultTemplate {}", resultTemplate);
getResultTemplatesSet().remove(resultTemplate);
}
@Override
public void setObservablePropertiesForCompositePhenomenon(final String compositePhenomenon,
final Collection<String> observableProperties) {
final Set<String> newValue = newSynchronizedSet(observableProperties);
LOG.trace("Setting ObservableProperties for CompositePhenomenon {} to {}", compositePhenomenon, newValue);
getObservablePropertiesForCompositePhenomenonsMap().put(compositePhenomenon, newValue);
}
@Override
public void setObservablePropertiesForOffering(final String offering, final Collection<String> observableProperties) {
final Set<String> newValue = newSynchronizedSet(observableProperties);
LOG.trace("Setting ObservableProperties for Offering {} to {}", offering, observableProperties);
getObservablePropertiesForOfferingsMap().put(offering, newValue);
}
@Override
public void setObservablePropertiesForProcedure(final String procedure,
final Collection<String> observableProperties) {
final Set<String> newValue = newSynchronizedSet(observableProperties);
LOG.trace("Setting ObservableProperties for Procedure {} to {}", procedure, newValue);
getObservablePropertiesForProceduresMap().put(procedure, newValue);
}
@Override
public void setObservationTypesForOffering(final String offering, final Collection<String> observationTypes) {
final Set<String> newValue = newSynchronizedSet(observationTypes);
LOG.trace("Setting ObservationTypes for Offering {} to {}", offering, newValue);
getObservationTypesForOfferingsMap().put(offering, newValue);
}
@Override
public void setOfferingsForObservableProperty(final String observableProperty, final Collection<String> offerings) {
final Set<String> newValue = newSynchronizedSet(offerings);
LOG.trace("Setting Offerings for ObservableProperty {} to {}", observableProperty, newValue);
getOfferingsForObservablePropertiesMap().put(observableProperty, newValue);
}
@Override
public void setOfferingsForProcedure(final String procedure, final Collection<String> offerings) {
final Set<String> newValue = newSynchronizedSet(offerings);
LOG.trace("Setting Offerings for Procedure {} to {}", procedure, newValue);
getOfferingsForProceduresMap().put(procedure, newValue);
}
@Override
public void setProceduresForFeatureOfInterest(final String featureOfInterest,
final Collection<String> proceduresForFeatureOfInterest) {
final Set<String> newValue = newSynchronizedSet(proceduresForFeatureOfInterest);
LOG.trace("Setting Procedures for FeatureOfInterest {} to {}", featureOfInterest, newValue);
getProceduresForFeaturesOfInterestMap().put(featureOfInterest, newValue);
}
@Override
public void setProceduresForObservableProperty(final String observableProperty, final Collection<String> procedures) {
final Set<String> newValue = newSynchronizedSet(procedures);
LOG.trace("Setting Procedures for ObservableProperty {} to {}", observableProperty, procedures);
getProceduresForObservablePropertiesMap().put(observableProperty, newValue);
}
@Override
public void setProceduresForOffering(final String offering, final Collection<String> procedures) {
final Set<String> newValue = newSynchronizedSet(procedures);
LOG.trace("Setting Procedures for Offering {} to {}", offering, newValue);
getProceduresForOfferingsMap().put(offering, newValue);
}
@Override
public void setRelatedFeaturesForOffering(final String offering, final Collection<String> relatedFeatures) {
final Set<String> newValue = newSynchronizedSet(relatedFeatures);
LOG.trace("Setting Related Features for Offering {} to {}", offering, newValue);
getRelatedFeaturesForOfferingsMap().put(offering, newValue);
}
@Override
public void setResultTemplatesForOffering(final String offering, final Collection<String> resultTemplates) {
final Set<String> newValue = newSynchronizedSet(resultTemplates);
LOG.trace("Setting ResultTemplates for Offering {} to {}", offering, newValue);
getResultTemplatesForOfferingsMap().put(offering, newValue);
}
@Override
public void setRolesForRelatedFeature(final String relatedFeature, final Collection<String> roles) {
final Set<String> newValue = newSynchronizedSet(roles);
LOG.trace("Setting Roles for RelatedFeature {} to {}", relatedFeature, newValue);
getRolesForRelatedFeaturesMap().put(relatedFeature, newValue);
}
@Override
public void setFeaturesOfInterest(final Collection<String> featuresOfInterest) {
LOG.trace("Setting FeaturesOfInterest");
getFeaturesOfInterestSet().clear();
addFeaturesOfInterest(featuresOfInterest);
}
@Override
public void setPhenomenonTime(final DateTime minEventTime, final DateTime maxEventTime) {
setMinPhenomenonTime(minEventTime);
setMaxPhenomenonTime(maxEventTime);
}
@Override
public void setProcedures(final Collection<String> procedures) {
LOG.trace("Setting Procedures");
getProceduresSet().clear();
addProcedures(procedures);
}
@Override
public void setMaxPhenomenonTimeForOffering(final String offering, final DateTime maxTime) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Setting maximal EventTime for Offering {} to {}", offering, maxTime);
if (maxTime == null) {
getMaxPhenomenonTimeForOfferingsMap().remove(offering);
} else {
getMaxPhenomenonTimeForOfferingsMap().put(offering, maxTime);
}
}
@Override
public void setMinPhenomenonTimeForOffering(final String offering, final DateTime minTime) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Setting minimal EventTime for Offering {} to {}", offering, minTime);
if (minTime == null) {
getMinPhenomenonTimeForOfferingsMap().remove(offering);
} else {
getMinPhenomenonTimeForOfferingsMap().put(offering, minTime);
}
}
@Override
public void setMaxPhenomenonTimeForProcedure(final String procedure, final DateTime maxTime) {
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Setting maximal phenomenon time for procedure {} to {}", procedure, maxTime);
if (maxTime == null) {
getMaxPhenomenonTimeForProceduresMap().remove(procedure);
} else {
getMaxPhenomenonTimeForProceduresMap().put(procedure, maxTime);
}
}
@Override
public void setMinPhenomenonTimeForProcedure(final String procedure, final DateTime minTime) {
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Setting minimal phenomenon time for procedure {} to {}", procedure, minTime);
if (minTime == null) {
getMinPhenomenonTimeForProceduresMap().remove(procedure);
} else {
getMinPhenomenonTimeForProceduresMap().put(procedure, minTime);
}
}
@Override
public void setNameForOffering(final String offering, final String name) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(NAME, name);
LOG.trace("Setting Name of Offering {} to {}", offering, name);
getNameForOfferingsMap().put(offering, name);
}
@Override
public void setI18nNameForOffering(String offering, MultilingualString name) {
notNullOrEmpty(OFFERING, offering);
notNull(NAME, name);
LOG.trace("Setting I18N Name of Offering {} to {}", offering, name);
getI18nNameForOfferingsMap().put(offering, name);
}
@Override
public void setI18nDescriptionForOffering(String offering, MultilingualString description) {
notNullOrEmpty(OFFERING, offering);
notNull(DESCRIPTION, description);
LOG.trace("Setting I18N Description of Offering {} to {}", offering, description);
getI18nDescriptionForOfferingsMap().put(offering, description);
}
@Override
public void setEnvelopeForOffering(final String offering, final SosEnvelope envelope) {
LOG.trace("Setting Envelope for Offering {} to {}", offering, envelope);
getEnvelopeForOfferingsMap().put(offering, copyOf(envelope));
}
@Override
public Set<String> getFeaturesOfInterestWithOffering() {
return CollectionHelper.unionOfListOfLists(getFeaturesOfInterestForOfferingMap().values());
}
@Override
public void addAllowedObservationTypeForOffering(final String offering, final String allowedObservationType) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(ALLOWED_OBSERVATION_TYPE, allowedObservationType);
LOG.trace("Adding AllowedObservationType {} to Offering {}", allowedObservationType, offering);
getAllowedObservationTypesForOfferingsMap().add(offering, allowedObservationType);
}
@Override
public void addAllowedObservationTypesForOffering(final String offering,
final Collection<String> allowedObservationTypes) {
notNullOrEmpty(OFFERING, offering);
noNullValues(ALLOWED_OBSERVATION_TYPES, allowedObservationTypes);
LOG.trace("Adding AllowedObservationTypes {} to Offering {}", allowedObservationTypes, offering);
getAllowedObservationTypesForOfferingsMap().addAll(offering, allowedObservationTypes);
}
@Override
public void addCompositePhenomenonForOffering(final String offering, final String compositePhenomenon) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(COMPOSITE_PHENOMENON, compositePhenomenon);
LOG.trace("Adding compositePhenomenon {} to Offering {}", compositePhenomenon, offering);
getCompositePhenomenonsForOfferingsMap().add(offering, compositePhenomenon);
}
@Override
public void addFeatureOfInterestForOffering(final String offering, final String featureOfInterest) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
LOG.trace("Adding featureOfInterest {} to Offering {}", featureOfInterest, offering);
getFeaturesOfInterestForOfferingMap().add(offering, featureOfInterest);
}
@Override
public void addFeatureOfInterestForResultTemplate(final String resultTemplate, final String featureOfInterest) {
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
LOG.trace("Adding FeatureOfInterest {} to SosResultTemplate {}", featureOfInterest, resultTemplate);
getFeaturesOfInterestForResultTemplatesMap().add(resultTemplate, featureOfInterest);
}
@Override
public void addFeaturesOfInterestForResultTemplate(final String resultTemplate,
final Collection<String> featuresOfInterest) {
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
noNullValues(FEATURES_OF_INTEREST, featuresOfInterest);
LOG.trace("Adding FeatureOfInterest {} to SosResultTemplate {}", featuresOfInterest, resultTemplate);
getFeaturesOfInterestForResultTemplatesMap().addAll(resultTemplate, featuresOfInterest);
}
@Override
public void addObservablePropertyForCompositePhenomenon(final String compositePhenomenon,
final String observableProperty) {
notNullOrEmpty(COMPOSITE_PHENOMENON, compositePhenomenon);
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Adding ObservableProperty {} to CompositePhenomenon {}", observableProperty, compositePhenomenon);
getObservablePropertiesForCompositePhenomenonsMap().add(compositePhenomenon, observableProperty);
}
@Override
public void addObservablePropertyForOffering(final String offering, final String observableProperty) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Adding observableProperty {} to offering {}", observableProperty, offering);
getObservablePropertiesForOfferingsMap().add(offering, observableProperty);
}
@Override
public void addObservablePropertyForProcedure(final String procedure, final String observableProperty) {
notNullOrEmpty(PROCEDURE, procedure);
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Adding observableProperty {} to procedure {}", observableProperty, procedure);
getObservablePropertiesForProceduresMap().add(procedure, observableProperty);
}
@Override
public void addObservablePropertyForResultTemplate(final String resultTemplate, final String observableProperty) {
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Adding observableProperty {} to resultTemplate {}", observableProperty, resultTemplate);
getObservablePropertiesForResultTemplatesMap().add(resultTemplate, observableProperty);
}
@Override
public void addObservationTypesForOffering(final String offering, final String observationType) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(OBSERVATION_TYPE, observationType);
LOG.trace("Adding observationType {} to offering {}", observationType, offering);
getObservationTypesForOfferingsMap().add(offering, observationType);
}
@Override
public void addOfferingForObservableProperty(final String observableProperty, final String offering) {
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
notNullOrEmpty(OFFERING, offering);
LOG.trace("Adding offering {} to observableProperty {}", offering, observableProperty);
getOfferingsForObservablePropertiesMap().add(observableProperty, offering);
}
@Override
public void addOfferingForProcedure(final String procedure, final String offering) {
notNullOrEmpty(PROCEDURE, procedure);
notNullOrEmpty(OFFERING, offering);
LOG.trace("Adding offering {} to procedure {}", offering, procedure);
getOfferingsForProceduresMap().add(procedure, offering);
}
@Override
public void addProcedureForFeatureOfInterest(final String featureOfInterest, final String procedure) {
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Adding procedure {} to featureOfInterest {}", procedure, featureOfInterest);
getProceduresForFeaturesOfInterestMap().add(featureOfInterest, procedure);
}
@Override
public void addProcedureForObservableProperty(final String observableProperty, final String procedure) {
notNullOrEmpty(FEATURE_OF_INTEREST, observableProperty);
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Adding procedure {} to observableProperty {}", procedure, observableProperty);
getProceduresForObservablePropertiesMap().add(observableProperty, procedure);
}
@Override
public void addProcedureForOffering(final String offering, final String procedure) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Adding procedure {} to offering {}", procedure, offering);
getProceduresForOfferingsMap().add(offering, procedure);
}
@Override
public void addRelatedFeatureForOffering(final String offering, final String relatedFeature) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(RELATED_FEATURE, relatedFeature);
LOG.trace("Adding relatedFeature {} to offering {}", relatedFeature, offering);
getRelatedFeaturesForOfferingsMap().add(offering, relatedFeature);
}
@Override
public void addRelatedFeaturesForOffering(final String offering, final Collection<String> relatedFeature) {
notNullOrEmpty(OFFERING, offering);
noNullValues(RELATED_FEATURE, relatedFeature);
LOG.trace("Adding relatedFeatures {} to offering {}", relatedFeature, offering);
getRelatedFeaturesForOfferingsMap().addAll(offering, relatedFeature);
}
@Override
public void addResultTemplateForOffering(final String offering, final String resultTemplate) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
LOG.trace("Adding resultTemplate {} to offering {}", resultTemplate, offering);
getResultTemplatesForOfferingsMap().add(offering, resultTemplate);
}
@Override
public void addRoleForRelatedFeature(final String relatedFeature, final String role) {
notNullOrEmpty(RELATED_FEATURE, relatedFeature);
notNullOrEmpty("role", role);
LOG.trace("Adding role {} to relatedFeature {}", role, relatedFeature);
getRolesForRelatedFeaturesMap().add(relatedFeature, role);
}
@Override
public void removeAllowedObservationTypeForOffering(final String offering, final String allowedObservationType) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty("allowedObservationType", allowedObservationType);
LOG.trace("Removing allowedObservationType {} from offering {}", allowedObservationType, offering);
getAllowedObservationTypesForOfferingsMap().removeWithKey(offering, allowedObservationType);
}
@Override
public void removeAllowedObservationTypesForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing allowedObservationTypes for offering {}", offering);
getAllowedObservationTypesForOfferingsMap().remove(offering);
}
@Override
public void removeCompositePhenomenonForOffering(final String offering, final String compositePhenomenon) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(COMPOSITE_PHENOMENON, compositePhenomenon);
LOG.trace("Removing compositePhenomenon {} from offering {}", compositePhenomenon, offering);
getCompositePhenomenonsForOfferingsMap().removeWithKey(offering, compositePhenomenon);
}
@Override
public void removeCompositePhenomenonsForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing compositePhenomenons for offering {}", offering);
getCompositePhenomenonsForOfferingsMap().remove(offering);
}
@Override
public void removeEnvelopeForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing envelope for offering {}", offering);
getEnvelopeForOfferingsMap().remove(offering);
}
@Override
public void removeEpsgCode(final Integer epsgCode) {
notNull(EPSG_CODE, epsgCode);
LOG.trace("Removing epsgCode {}", epsgCode);
getEpsgCodesSet().remove(epsgCode);
}
@Override
public void removeEpsgCodes(final Collection<Integer> epsgCodes) {
noNullValues(EPSG_CODES, epsgCodes);
for (final Integer code : epsgCodes) {
removeEpsgCode(code);
}
}
@Override
public void removeFeatureOfInterestForOffering(final String offering, final String featureOfInterest) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
LOG.trace("Removing featureOfInterest {} from offering {}", featureOfInterest, offering);
getFeaturesOfInterestForOfferingMap().removeWithKey(offering, featureOfInterest);
}
@Override
public void removeFeatureOfInterestForResultTemplate(final String resultTemplate, final String featureOfInterest) {
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
LOG.trace("Removing featureOfInterest {} from resultTemplate {}", featureOfInterest, resultTemplate);
getFeaturesOfInterestForResultTemplatesMap().removeWithKey(resultTemplate, featureOfInterest);
}
@Override
public void removeFeaturesOfInterestForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing featuresOfInterest for offering {}", offering);
getFeaturesOfInterestForOfferingMap().remove(offering);
}
@Override
public void removeFeaturesOfInterestForResultTemplate(final String resultTemplate) {
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
LOG.trace("Removing featuresOfInterest for resultTemplate {}", resultTemplate);
getFeaturesOfInterestForResultTemplatesMap().remove(resultTemplate);
}
@Override
public void removeMaxPhenomenonTimeForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing maxEventTime for offering {}", offering);
getMaxPhenomenonTimeForOfferingsMap().remove(offering);
}
@Override
public void removeMinPhenomenonTimeForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing minEventTime for offering {}", offering);
getMinPhenomenonTimeForOfferingsMap().remove(offering);
}
@Override
public void removeMaxPhenomenonTimeForProcedure(final String procedure) {
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Removing maxEventTime for procedure {}", procedure);
getMaxPhenomenonTimeForProceduresMap().remove(procedure);
}
@Override
public void removeMinPhenomenonTimeForProcedure(final String procedure) {
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Removing minEventTime for procedure {}", procedure);
getMinPhenomenonTimeForProceduresMap().remove(procedure);
}
@Override
public void removeNameForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing name for offering {}", offering);
getNameForOfferingsMap().remove(offering);
}
@Override
public void removeObservablePropertiesForCompositePhenomenon(final String compositePhenomenon) {
notNullOrEmpty(OFFERING, compositePhenomenon);
LOG.trace("Removing name observableProperties compositePhenomenon {}", compositePhenomenon);
getObservablePropertiesForCompositePhenomenonsMap().remove(compositePhenomenon);
}
@Override
public void removeObservablePropertiesForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing observableProperties for offering {}", offering);
getObservablePropertiesForOfferingsMap().remove(offering);
}
@Override
public void removeObservablePropertiesForProcedure(final String procedure) {
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Removing observableProperties for procedure {}", procedure);
getObservablePropertiesForProceduresMap().remove(procedure);
}
@Override
public void removeObservablePropertiesForResultTemplate(final String resultTemplate) {
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
LOG.trace("Removing observableProperties for resultTemplate {}", resultTemplate);
getObservablePropertiesForResultTemplatesMap().remove(resultTemplate);
}
@Override
public void removeObservablePropertyForCompositePhenomenon(final String compositePhenomenon,
final String observableProperty) {
notNullOrEmpty(COMPOSITE_PHENOMENON, compositePhenomenon);
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Removing observableProperty {} from compositePhenomenon {}", observableProperty,
compositePhenomenon);
getObservablePropertiesForCompositePhenomenonsMap().removeWithKey(compositePhenomenon, observableProperty);
}
@Override
public void removeObservablePropertyForOffering(final String offering, final String observableProperty) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Removing observableProperty {} from offering {}", observableProperty, offering);
getObservablePropertiesForOfferingsMap().removeWithKey(offering, observableProperty);
}
@Override
public void removeObservablePropertyForProcedure(final String procedure, final String observableProperty) {
notNullOrEmpty(PROCEDURE, procedure);
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Removing observableProperty {} from procedure {}", observableProperty, procedure);
getObservablePropertiesForProceduresMap().removeWithKey(procedure, observableProperty);
}
@Override
public void removeObservablePropertyForResultTemplate(final String resultTemplate, final String observableProperty) {
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Removing observableProperty {} from resultTemplate {}", observableProperty, resultTemplate);
getObservablePropertiesForResultTemplatesMap().removeWithKey(resultTemplate, observableProperty);
}
@Override
public void removeObservationTypeForOffering(final String offering, final String observationType) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(OBSERVATION_TYPE, observationType);
LOG.trace("Removing observationType {} from offering {}", observationType, offering);
getObservationTypesForOfferingsMap().removeWithKey(offering, observationType);
}
@Override
public void removeObservationTypesForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing observationTypes for offering {}", offering);
getObservationTypesForOfferingsMap().remove(offering);
}
@Override
public void removeOfferingForObservableProperty(final String observableProperty, final String offering) {
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing offering {} from observableProperty {}", offering, observableProperty);
getOfferingsForObservablePropertiesMap().removeWithKey(observableProperty, offering);
}
@Override
public void removeOfferingForProcedure(final String procedure, final String offering) {
notNullOrEmpty(PROCEDURE, procedure);
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing offering {} from procedure {}", offering, procedure);
getOfferingsForProceduresMap().removeWithKey(procedure, offering);
}
@Override
public void removeOfferingsForObservableProperty(final String observableProperty) {
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Removing offerings for observableProperty {}", observableProperty);
getOfferingsForObservablePropertiesMap().remove(observableProperty);
}
@Override
public void removeOfferingsForProcedure(final String procedure) {
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Removing offering for procedure {}", procedure);
getOfferingsForProceduresMap().remove(procedure);
}
@Override
public void removeProcedureForFeatureOfInterest(final String featureOfInterest, final String procedure) {
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Removing procedure {} from featureOfInterest {}", procedure, featureOfInterest);
getProceduresForFeaturesOfInterestMap().removeWithKey(featureOfInterest, procedure);
}
@Override
public void removeProcedureForObservableProperty(final String observableProperty, final String procedure) {
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Removing procedure {} from observableProperty {}", procedure, observableProperty);
getProceduresForObservablePropertiesMap().removeWithKey(observableProperty, procedure);
}
@Override
public void removeProcedureForOffering(final String offering, final String procedure) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Removing procedure {} from offering {}", procedure, offering);
getProceduresForOfferingsMap().removeWithKey(offering, procedure);
}
@Override
public void removeProceduresForFeatureOfInterest(final String featureOfInterest) {
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
LOG.trace("Removing procedures for featureOfInterest {}", featureOfInterest);
getProceduresForFeaturesOfInterestMap().remove(featureOfInterest);
}
@Override
public void removeProceduresForObservableProperty(final String observableProperty) {
notNullOrEmpty(OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Removing procedures for observableProperty {}", observableProperty);
getProceduresForObservablePropertiesMap().remove(observableProperty);
}
@Override
public void removeProceduresForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing procedures for offering {}", offering);
getProceduresForOfferingsMap().remove(offering);
}
@Override
public void removeRelatedFeatureForOffering(final String offering, final String relatedFeature) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(RELATED_FEATURE, relatedFeature);
LOG.trace("Removing relatedFeature {} from offering {}", relatedFeature, offering);
getRelatedFeaturesForOfferingsMap().removeWithKey(offering, relatedFeature);
}
@Override
public void removeRelatedFeaturesForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing RelatedFeatures for offering {}", offering);
getRelatedFeaturesForOfferingsMap().remove(offering);
}
@Override
public void removeResultTemplateForOffering(final String offering, final String resultTemplate) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
LOG.trace("Removing resultTemplate {} from offering {}", resultTemplate, offering);
getResultTemplatesForOfferingsMap().removeWithKey(offering, resultTemplate);
}
@Override
public void removeResultTemplatesForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing ResultTemplates for offering {}", offering);
getResultTemplatesForOfferingsMap().remove(offering);
}
@Override
public void removeRoleForRelatedFeature(final String relatedFeature, final String role) {
notNullOrEmpty(RELATED_FEATURE, relatedFeature);
notNullOrEmpty(ROLE, role);
LOG.trace("Removing role {} from relatedFeature {}", role, relatedFeature);
getRolesForRelatedFeaturesMap().removeWithKey(relatedFeature, role);
}
@Override
public void removeRolesForRelatedFeature(final String relatedFeature) {
notNullOrEmpty(RELATED_FEATURE, relatedFeature);
LOG.trace("Removing roles for relatedFeature {}", relatedFeature);
getRolesForRelatedFeaturesMap().remove(relatedFeature);
}
@Override
public void removeRolesForRelatedFeatureNotIn(final Collection<String> relatedFeatures) {
notNull(RELATED_FEATURES, relatedFeatures);
final Iterator<String> iter = getRolesForRelatedFeaturesMap().keySet().iterator();
while (iter.hasNext()) {
if (!relatedFeatures.contains(iter.next())) {
iter.remove();
}
}
}
@Override
public void setAllowedObservationTypeForOffering(final String offering,
final Collection<String> allowedObservationType) {
notNullOrEmpty(OFFERING, offering);
final Set<String> newValue = newSynchronizedSet(allowedObservationType);
LOG.trace("Setting allowedObservationTypes for offering {} to {}", offering, newValue);
getAllowedObservationTypesForOfferingsMap().put(offering, newValue);
}
@Override
public void setAllowedFeatureOfInterestTypeForOffering(final String offering,
final Collection<String> allowedFeatureOfInterestType) {
notNullOrEmpty(OFFERING, offering);
final Set<String> newValue = newSynchronizedSet(allowedFeatureOfInterestType);
LOG.trace("Setting allowedFeatureOfInterestTypes for offering {} to {}", offering, newValue);
getAllowedFeatureOfInterestTypesForOfferingsMap().put(offering, newValue);
}
@Override
public void setCompositePhenomenonsForOffering(final String offering, final Collection<String> compositePhenomenons) {
notNullOrEmpty(OFFERING, offering);
final Set<String> newValue = newSynchronizedSet(compositePhenomenons);
LOG.trace("Setting compositePhenomenons for offering {} to {}", offering, newValue);
getCompositePhenomenonsForOfferingsMap().put(offering, newValue);
}
@Override
public void setFeaturesOfInterestForOffering(final String offering, final Collection<String> featureOfInterest) {
notNullOrEmpty(OFFERING, offering);
final Set<String> newValue = newSynchronizedSet(featureOfInterest);
LOG.trace("Setting featureOfInterest for offering {} to {}", offering, newValue);
getFeaturesOfInterestForOfferingMap().put(offering, newValue);
}
@Override
public void setGlobalEnvelope(final SosEnvelope globalEnvelope) {
LOG.trace("Global envelope now: '{}'", getGlobalSpatialEnvelope());
if (globalEnvelope == null) {
setGlobalSpatialEnvelope(new SosEnvelope(null, getDefaultEPSGCode()));
} else {
setGlobalSpatialEnvelope(globalEnvelope);
}
LOG.trace("Global envelope updated to '{}' with '{}'", getGlobalSpatialEnvelope(), globalEnvelope);
}
@Override
public void setMaxPhenomenonTime(final DateTime maxEventTime) {
LOG.trace("Setting Maximal EventTime to {}", maxEventTime);
getGlobalPhenomenonTimeEnvelope().setEnd(maxEventTime);
}
@Override
public void setMinPhenomenonTime(final DateTime minEventTime) {
LOG.trace("Setting Minimal EventTime to {}", minEventTime);
getGlobalPhenomenonTimeEnvelope().setStart(minEventTime);
}
@Override
public void setObservablePropertiesForResultTemplate(final String resultTemplate,
final Collection<String> observableProperties) {
notNullOrEmpty(RESULT_TEMPLATE, resultTemplate);
final Set<String> newValue = newSynchronizedSet(observableProperties);
LOG.trace("Setting observableProperties for resultTemplate {} to {}", resultTemplate, newValue);
getObservablePropertiesForResultTemplatesMap().put(resultTemplate, newValue);
}
@Override
public void addParentFeature(final String featureOfInterest, final String parentFeature) {
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
notNullOrEmpty(PARENT_FEATURE, parentFeature);
LOG.trace("Adding parentFeature {} to featureOfInterest {}", parentFeature, featureOfInterest);
getParentFeaturesForFeaturesOfInterestMap().add(featureOfInterest, parentFeature);
getChildFeaturesForFeaturesOfInterestMap().add(parentFeature, featureOfInterest);
}
@Override
public void addParentFeatures(final String featureOfInterest, final Collection<String> parentFeatures) {
notNullOrEmpty(FEATURE_OF_INTEREST, featureOfInterest);
noNullOrEmptyValues(PARENT_FEATURES, parentFeatures);
LOG.trace("Adding parentFeature {} to featureOfInterest {}", parentFeatures, featureOfInterest);
getParentFeaturesForFeaturesOfInterestMap().addAll(featureOfInterest, parentFeatures);
for (final String parentFeature : parentFeatures) {
getChildFeaturesForFeaturesOfInterestMap().add(parentFeature, featureOfInterest);
}
}
@Override
public void addParentProcedure(final String procedure, final String parentProcedure) {
notNullOrEmpty(PROCEDURE, procedure);
notNullOrEmpty(PARENT_PROCEDURE, parentProcedure);
LOG.trace("Adding parentProcedure {} to procedure {}", parentProcedure, procedure);
getParentProceduresForProceduresMap().add(procedure, parentProcedure);
getChildProceduresForProceduresMap().add(parentProcedure, procedure);
}
@Override
public void addParentProcedures(final String procedure, final Collection<String> parentProcedures) {
notNullOrEmpty(PROCEDURE, procedure);
noNullOrEmptyValues(PARENT_PROCEDURES, parentProcedures);
LOG.trace("Adding parentProcedures {} to procedure {}", parentProcedures, procedure);
getParentProceduresForProceduresMap().addAll(procedure, parentProcedures);
for (final String parentProcedure : parentProcedures) {
getChildProceduresForProceduresMap().add(parentProcedure, procedure);
}
}
@Override
public void updateEnvelopeForOffering(final String offering, final Envelope envelope) {
notNullOrEmpty(OFFERING, offering);
notNull(ENVELOPE, envelope);
if (hasEnvelopeForOffering(offering)) {
final SosEnvelope offeringEnvelope = getEnvelopeForOfferingsMap().get(offering);
LOG.trace("Expanding envelope {} for offering {} to include {}", offeringEnvelope, offering, envelope);
offeringEnvelope.expandToInclude(envelope);
} else {
setEnvelopeForOffering(offering, new SosEnvelope(envelope, getDefaultEPSGCode()));
}
}
@Override
public void updatePhenomenonTime(final Time eventTime) {
notNull(EVENT_TIME, eventTime);
final TimePeriod tp = toTimePeriod(eventTime);
LOG.trace("Expanding global EventTime to include {}", tp);
if (!hasMinPhenomenonTime() || getMinPhenomenonTime().isAfter(tp.getStart())) {
setMinPhenomenonTime(tp.getStart());
}
if (!hasMaxPhenomenonTime() || getMaxPhenomenonTime().isBefore(tp.getEnd())) {
setMaxPhenomenonTime(tp.getEnd());
}
}
@Override
public void updateGlobalEnvelope(final Envelope envelope) {
notNull(ENVELOPE, envelope);
if (hasGlobalEnvelope()) {
LOG.trace("Expanding envelope {} to include {}", getGlobalSpatialEnvelope(), envelope);
getGlobalSpatialEnvelope().expandToInclude(envelope);
} else {
setGlobalEnvelope(new SosEnvelope(new Envelope(envelope), getDefaultEPSGCode()));
}
}
@Override
public void updatePhenomenonTimeForOffering(final String offering, final Time eventTime) {
notNullOrEmpty(OFFERING, offering);
notNull(EVENT_TIME, eventTime);
final TimePeriod tp = toTimePeriod(eventTime);
LOG.trace("Expanding EventTime of offering {} to include {}", offering, tp);
if (!hasMaxPhenomenonTimeForOffering(offering)
|| getMaxPhenomenonTimeForOffering(offering).isBefore(tp.getEnd())) {
setMaxPhenomenonTimeForOffering(offering, tp.getEnd());
}
if (!hasMinPhenomenonTimeForOffering(offering)
|| getMinPhenomenonTimeForOffering(offering).isAfter(tp.getStart())) {
setMinPhenomenonTimeForOffering(offering, tp.getStart());
}
}
@Override
public void updatePhenomenonTimeForProcedure(final String procedure, final Time eventTime) {
notNullOrEmpty(PROCEDURE, procedure);
notNull(EVENT_TIME, eventTime);
final TimePeriod tp = toTimePeriod(eventTime);
LOG.trace("Expanding phenomenon time of procedure {} to include {}", procedure, tp);
if (!hasMaxPhenomenonTimeForProcedure(procedure)
|| getMaxPhenomenonTimeForProcedure(procedure).isBefore(tp.getEnd())) {
setMaxPhenomenonTimeForProcedure(procedure, tp.getEnd());
}
if (!hasMinPhenomenonTimeForProcedure(procedure)
|| getMinPhenomenonTimeForProcedure(procedure).isAfter(tp.getStart())) {
setMinPhenomenonTimeForProcedure(procedure, tp.getStart());
}
}
@Override
public void recalculateGlobalEnvelope() {
LOG.trace("Recalculating global spatial envelope based on offerings");
SosEnvelope globalEnvelope = null;
if (!getOfferings().isEmpty()) {
for (final String offering : getOfferings()) {
final SosEnvelope e = getEnvelopeForOffering(offering);
if (e != null) {
if (globalEnvelope == null) {
if (e.isSetEnvelope()) {
globalEnvelope = new SosEnvelope(new Envelope(e.getEnvelope()), e.getSrid());
LOG.trace("First envelope '{}' used as starting point", globalEnvelope);
}
} else {
globalEnvelope.getEnvelope().expandToInclude(e.getEnvelope());
LOG.trace("Envelope expanded to include '{}' resulting in '{}'", e, globalEnvelope);
}
}
}
if (globalEnvelope == null) {
LOG.error("Global envelope could not be resetted");
}
} else {
globalEnvelope = new SosEnvelope(null, getDefaultEPSGCode());
}
setGlobalEnvelope(globalEnvelope);
LOG.trace("Spatial envelope finally set to '{}'", getGlobalEnvelope());
}
@Override
public void recalculatePhenomenonTime() {
LOG.trace("Recalculating global phenomenon time based on offerings");
DateTime globalMax = null, globalMin = null;
if (!getOfferings().isEmpty()) {
for (final String offering : getOfferings()) {
if (hasMaxPhenomenonTimeForOffering(offering)) {
final DateTime offeringMax = getMaxPhenomenonTimeForOffering(offering);
if (globalMax == null || offeringMax.isAfter(globalMax)) {
globalMax = offeringMax;
}
}
if (hasMinPhenomenonTimeForOffering(offering)) {
final DateTime offeringMin = getMinPhenomenonTimeForOffering(offering);
if (globalMin == null || offeringMin.isBefore(globalMin)) {
globalMin = offeringMin;
}
}
}
if (globalMin == null || globalMax == null) {
LOG.error("Error in cache! Reset of global temporal bounding box failed. Max: '{}'; Min: '{}'",
globalMax, globalMin);
}
}
setPhenomenonTime(globalMin, globalMax);
LOG.trace("Global temporal bounding box reset done. Min: '{}'; Max: '{}'", getMinPhenomenonTime(),
getMaxPhenomenonTime());
}
@Override
public void removeMaxResultTimeForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing maxResultTime for offering {}", offering);
getMaxResultTimeForOfferingsMap().remove(offering);
}
@Override
public void removeMinResultTimeForOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing minResultTime for offering {}", offering);
getMinResultTimeForOfferingsMap().remove(offering);
}
@Override
public void setResultTime(final DateTime min, final DateTime max) {
setMinResultTime(min);
setMaxResultTime(max);
}
@Override
public void updateResultTime(final Time resultTime) {
if (resultTime == null) {
return;
}
final TimePeriod tp = toTimePeriod(resultTime);
LOG.trace("Expanding global ResultTime to include {}", tp);
if (!hasMinResultTime() || getMinResultTime().isAfter(tp.getStart())) {
setMinResultTime(tp.getStart());
}
if (!hasMaxResultTime() || getMaxResultTime().isBefore(tp.getEnd())) {
setMaxResultTime(tp.getEnd());
}
}
@Override
public void recalculateResultTime() {
LOG.trace("Recalculating global result time based on offerings");
DateTime globalMax = null, globalMin = null;
if (!getOfferings().isEmpty()) {
for (final String offering : getOfferings()) {
if (hasMaxResultTimeForOffering(offering)) {
final DateTime offeringMax = getMaxResultTimeForOffering(offering);
if (globalMax == null || offeringMax.isAfter(globalMax)) {
globalMax = offeringMax;
}
}
if (hasMinResultTimeForOffering(offering)) {
final DateTime offeringMin = getMinResultTimeForOffering(offering);
if (globalMin == null || offeringMin.isBefore(globalMin)) {
globalMin = offeringMin;
}
}
}
}
setResultTime(globalMin, globalMax);
LOG.trace("Global result time bounding box reset done. Min: '{}'); Max: '{}'", getMinResultTime(),
getMaxResultTime());
}
@Override
public void setMaxResultTime(final DateTime maxResultTime) {
LOG.trace("Setting Maximal ResultTime to {}", maxResultTime);
getGlobalResultTimeEnvelope().setEnd(maxResultTime);
}
@Override
public void setMaxResultTimeForOffering(final String offering, final DateTime maxTime) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Setting maximal ResultTime for Offering {} to {}", offering, maxTime);
if (maxTime == null) {
getMaxResultTimeForOfferingsMap().remove(offering);
} else {
getMaxResultTimeForOfferingsMap().put(offering, maxTime);
}
}
@Override
public void setMinResultTime(final DateTime minResultTime) {
LOG.trace("Setting Minimal ResultTime to {}", minResultTime);
getGlobalResultTimeEnvelope().setStart(minResultTime);
}
@Override
public void setMinResultTimeForOffering(final String offering, final DateTime minTime) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Setting minimal ResultTime for Offering {} to {}", offering, minTime);
if (minTime == null) {
getMinResultTimeForOfferingsMap().remove(offering);
} else {
getMinResultTimeForOfferingsMap().put(offering, minTime);
}
}
@Override
public void updateResultTimeForOffering(final String offering, final Time resultTime) {
notNullOrEmpty(OFFERING, offering);
if (resultTime == null) {
return;
}
final TimePeriod tp = toTimePeriod(resultTime);
LOG.trace("Expanding EventTime of offering {} to include {}", offering, tp);
if (!hasMaxResultTimeForOffering(offering) || getMaxResultTimeForOffering(offering).isBefore(tp.getEnd())) {
setMaxResultTimeForOffering(offering, tp.getEnd());
}
if (!hasMinResultTimeForOffering(offering) || getMinResultTimeForOffering(offering).isAfter(tp.getStart())) {
setMinResultTimeForOffering(offering, tp.getStart());
}
}
@Override
public void clearFeaturesOfInterest() {
LOG.trace("Clearing features of interest");
getFeaturesOfInterestSet().clear();
}
@Override
public void clearProceduresForFeatureOfInterest() {
LOG.trace("Clearing procedures for feature of interest");
getProceduresForFeaturesOfInterestMap().clear();
}
@Override
public void clearFeatureHierarchy() {
LOG.trace("Clearing feature hierarchy");
getChildFeaturesForFeaturesOfInterestMap().clear();
getParentFeaturesForFeaturesOfInterestMap().clear();
}
@Override
public void clearProceduresForOfferings() {
LOG.trace("Clearing procedures for offerings");
getProceduresForOfferingsMap().clear();
}
@Override
public void clearNameForOfferings() {
LOG.trace("Clearing names for offerings");
getNameForOfferingsMap().clear();
}
@Override
public void clearI18nNamesForOfferings() {
LOG.trace("Clearing i18n names for offerings");
getI18nNameForOfferingsMap().clear();
}
@Override
public void clearI18nDescriptionsNameForOfferings() {
LOG.trace("Clearing i18n descriptions for offerings");
getI18nDescriptionForOfferingsMap().clear();
}
@Override
public void clearObservablePropertiesForOfferings() {
LOG.trace("Clearing observable properties for offerings");
getObservablePropertiesForOfferingsMap().clear();
}
@Override
public void clearRelatedFeaturesForOfferings() {
LOG.trace("Clearing related features for offerings");
getRelatedFeaturesForOfferingsMap().clear();
}
@Override
public void clearObservationTypesForOfferings() {
LOG.trace("Clearing observation types for offerings");
getObservationTypesForOfferingsMap().clear();
}
@Override
public void clearAllowedObservationTypeForOfferings() {
LOG.trace("Clearing allowed observation types for offerings");
getAllowedObservationTypesForOfferingsMap().clear();
}
@Override
public void clearEnvelopeForOfferings() {
LOG.trace("Clearing envelope for offerings");
getEnvelopeForOfferingsMap().clear();
}
@Override
public void clearFeaturesOfInterestForOfferings() {
LOG.trace("Clearing features of interest for offerings");
getFeaturesOfInterestForOfferingMap().clear();
}
@Override
public void clearMinPhenomenonTimeForOfferings() {
LOG.trace("Clearing min phenomenon time for offerings");
getMinPhenomenonTimeForOfferingsMap().clear();
}
@Override
public void clearMaxPhenomenonTimeForOfferings() {
LOG.trace("Clearing max phenomenon time for offerings");
getMaxPhenomenonTimeForOfferingsMap().clear();
}
@Override
public void clearMinPhenomenonTimeForProcedures() {
LOG.trace("Clearing min phenomenon time for procedures");
getMinPhenomenonTimeForProceduresMap().clear();
}
@Override
public void clearMaxPhenomenonTimeForProcedures() {
LOG.trace("Clearing max phenomenon time for procedures");
getMaxPhenomenonTimeForProceduresMap().clear();
}
@Override
public void clearMinResultTimeForOfferings() {
LOG.trace("Clearing min result time for offerings");
getMinResultTimeForOfferingsMap().clear();
}
@Override
public void clearMaxResultTimeForOfferings() {
LOG.trace("Clearing max result time for offerings");
getMaxResultTimeForOfferingsMap().clear();
}
@Override
public void clearOfferings() {
LOG.trace("Clearing offerings");
getOfferingsSet().clear();
}
@Override
public void addOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Adding offering {}", offering);
getOfferingsSet().add(offering);
}
@Override
public void setOfferings(final Collection<String> offerings) {
clearOfferings();
addOfferings(offerings);
}
@Override
public void addOfferings(final Collection<String> offerings) {
noNullValues(OFFERINGS, offerings);
for (final String offering : offerings) {
addOffering(offering);
}
}
@Override
public void removeOffering(final String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing Offering {}", offering);
getOfferingsSet().remove(offering);
}
@Override
public void removeOfferings(final Collection<String> offerings) {
noNullValues(OFFERINGS, offerings);
for (final String offering : offerings) {
removeOffering(offering);
}
}
@Override
public void addHiddenChildProcedureForOffering(final String offering, final String procedure) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Adding hidden child procedure {} to offering {}", procedure, offering);
getHiddenChildProceduresForOfferingsMap().add(offering, procedure);
}
@Override
public void removeHiddenChildProcedureForOffering(final String offering, final String procedure) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(PROCEDURE, procedure);
LOG.trace("Removing hidden chil procedure {} from offering {}", procedure, offering);
getHiddenChildProceduresForOfferingsMap().removeWithKey(offering, procedure);
}
@Override
public void setHiddenChildProceduresForOffering(final String offering, final Collection<String> procedures) {
final Set<String> newValue = newSynchronizedSet(procedures);
LOG.trace("Setting hidden child Procedures for Offering {} to {}", offering, newValue);
getHiddenChildProceduresForOfferingsMap().put(offering, newValue);
}
@Override
public void clearHiddenChildProceduresForOfferings() {
LOG.trace("Clearing hidden child procedures for offerings");
getHiddenChildProceduresForOfferingsMap().clear();
}
@Override
public void removeSpatialFilteringProfileEnvelopeForOffering(String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing Spatial Filtering Profile envelope for offering {}", offering);
getSpatialFilteringProfileEnvelopeForOfferingsMap().remove(offering);
}
@Override
public void setSpatialFilteringProfileEnvelopeForOffering(String offering, SosEnvelope envelope) {
LOG.trace("Setting Spatial Filtering Profile Envelope for Offering {} to {}", offering, envelope);
getSpatialFilteringProfileEnvelopeForOfferingsMap().put(offering, copyOf(envelope));
}
@Override
public void updateSpatialFilteringProfileEnvelopeForOffering(String offering, Envelope envelope) {
notNullOrEmpty(OFFERING, offering);
notNull(ENVELOPE, envelope);
if (hasSpatialFilteringProfileEnvelopeForOffering(offering)) {
final SosEnvelope offeringEnvelope = getSpatialFilteringProfileEnvelopeForOfferingsMap().get(offering);
LOG.trace("Expanding Spatial Filtering Profile envelope {} for offering {} to include {}",
offeringEnvelope, offering, envelope);
offeringEnvelope.expandToInclude(envelope);
} else {
setSpatialFilteringProfileEnvelopeForOffering(offering, new SosEnvelope(envelope, getDefaultEPSGCode()));
}
}
@Override
public void clearSpatialFilteringProfileEnvelopeForOfferings() {
LOG.trace("Clearing Spatial Filtering Profile envelope for offerings");
getSpatialFilteringProfileEnvelopeForOfferingsMap().clear();
}
@Override
public void addFeatureOfInterestTypesForOffering(String offering, String featureOfInterestType) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(FEATURE_OF_INTEREST_TYPE, featureOfInterestType);
LOG.trace("Adding observationType {} to offering {}", featureOfInterestType, offering);
getFeatureOfInterestTypesForOfferingsMap().add(offering, featureOfInterestType);
}
@Override
public void removeFeatureOfInterestTypeForOffering(String offering, String featureOfInterestType) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(FEATURE_OF_INTEREST_TYPE, featureOfInterestType);
LOG.trace("Removing observationType {} from offering {}", featureOfInterestType, offering);
getFeatureOfInterestTypesForOfferingsMap().removeWithKey(offering, featureOfInterestType);
}
@Override
public void removeFeatureOfInterestTypesForOffering(String offering) {
notNullOrEmpty(OFFERING, offering);
LOG.trace("Removing featureOfInterestTypes for offering {}", offering);
getFeatureOfInterestTypesForOfferingsMap().remove(offering);
}
@Override
public void setFeatureOfInterestTypesForOffering(String offering, Collection<String> featureOfInterestTypes) {
final Set<String> newValue = newSynchronizedSet(featureOfInterestTypes);
LOG.trace("Setting FeatureOfInterestTypes for Offering {} to {}", offering, newValue);
getFeatureOfInterestTypesForOfferingsMap().put(offering, newValue);
}
@Override
public void addAllowedFeatureOfInterestTypeForOffering(String offering, String allowedFeatureOfInterestType) {
notNullOrEmpty(OFFERING, offering);
notNullOrEmpty(ALLOWED_FEATURE_OF_INTEREST_TYPE, allowedFeatureOfInterestType);
LOG.trace("Adding AllowedFeatureOfInterestType {} to Offering {}", allowedFeatureOfInterestType, offering);
getAllowedFeatureOfInterestTypesForOfferingsMap().add(offering, allowedFeatureOfInterestType);
}
@Override
public void addAllowedFeatureOfInterestTypesForOffering(String offering,
Collection<String> allowedFeatureOfInterestTypes) {
notNullOrEmpty(OFFERING, offering);
noNullValues(ALLOWED_FEATURE_OF_INTEREST_TYPES, allowedFeatureOfInterestTypes);
LOG.trace("Adding AllowedFeatureOfInterestTypes {} to Offering {}", allowedFeatureOfInterestTypes, offering);
getAllowedFeatureOfInterestTypesForOfferingsMap().addAll(offering, allowedFeatureOfInterestTypes);
}
@Override
public void addSupportedLanguage(Locale language) {
notNull(SUPPORTED_LANGUAGE, language);
LOG.trace("Adding Language {}", language);
getSupportedLanguageSet().add(language);
}
@Override
public void addSupportedLanguage(Collection<Locale> languages) {
noNullValues(SUPPORTED_LANGUAGES, languages);
for (final Locale language : languages) {
addSupportedLanguage(language);
}
}
@Override
public void clearSupportedLanguage() {
LOG.trace("Clearing supported languages");
getSupportedLanguageSet().clear();
}
@Override
public void removeSupportedLanguage(Locale language) {
LOG.trace("Removing Language {}", language);
getSupportedLanguageSet().remove(language);
}
@Override
public void setRequestableProcedureDescriptionFormat(Collection<String> formats) {
LOG.trace("Adding requestable procedureDescriptionFormat");
getRequestableProcedureDescriptionFormats().addAll(formats);
}
/**
* Check if identifier and humanReadableName already contained in the map,
* if not, add the mapping.
*
* @param identifier
* Identifier to check
* @param humanReadableName
* Human readable name to check
* @param map
* Map of type
* @param type
* Text type to check, e.g. procedure
*/
protected void checkAndAddIdentifierHumanReadableName(String identifier, String humanReadableName,
Map<String, String> map, String type) {
if (StringHelper.isNotEmpty(identifier) && StringHelper.isNotEmpty(humanReadableName)) {
if (!map.containsKey(humanReadableName) && !map.containsValue(identifier)) {
map.put(humanReadableName, identifier);
} else if (map.containsKey(humanReadableName) && !map.containsValue(identifier)) {
LOG.error("Duplicity of the {} humanReadableName '{}'", type, humanReadableName);
} else if (!map.containsKey(humanReadableName) && map.containsValue(identifier)) {
LOG.error("Duplicity of the {} identifier '{}'", type, identifier);
} else if (!identifier.equals(map.get(humanReadableName))) {
LOG.error("Duplicity of the {} humanReadableName '{}' and identifier '{}'", type, humanReadableName,
identifier);
}
}
}
@Override
public void addFeatureOfInterestIdentifierHumanReadableName(String identifier, String humanReadableName) {
checkAndAddIdentifierHumanReadableName(identifier, humanReadableName,
getFeatureOfInterestIdentifierForHumanReadableName(), "featureOfInterest");
}
@Override
public void addObservablePropertyIdentifierHumanReadableName(String identifier, String humanReadableName) {
checkAndAddIdentifierHumanReadableName(identifier, humanReadableName,
getObservablePropertyIdentifierForHumanReadableName(), "observableProperty");
}
@Override
public void addProcedureIdentifierHumanReadableName(String identifier, String humanReadableName) {
checkAndAddIdentifierHumanReadableName(identifier, humanReadableName,
getProcedureIdentifierForHumanReadableName(), "procedure");
}
@Override
public void addOfferingIdentifierHumanReadableName(String identifier, String humanReadableName) {
checkAndAddIdentifierHumanReadableName(identifier, humanReadableName,
getOfferingIdentifierForHumanReadableName(), "offering");
}
@Override
public void removeFeatureOfInterestIdentifierForHumanReadableName(String humanReadableName) {
notNullOrEmpty(FEATURE_OF_INTEREST_NAME, humanReadableName);
LOG.trace("Removing featuresOfInterest identifier for humanReadableName {}", humanReadableName);
getFeatureOfInterestIdentifierForHumanReadableName().remove(humanReadableName);
if (getFeatureOfInterestIdentifierForHumanReadableName().containsKey(humanReadableName)) {
removeFeatureOfInterestHumanReadableNameForIdentifier(getFeatureOfInterestIdentifierForHumanReadableName()
.get(humanReadableName));
}
}
@Override
public void removeFeatureOfInterestHumanReadableNameForIdentifier(String identifier) {
notNullOrEmpty(FEATURE_OF_INTEREST, identifier);
LOG.trace("Removing featuresOfInterest human readable name for identifier {}", identifier);
getFeatureOfInterestHumanReadableNameForIdentifier().remove(identifier);
}
@Override
public void removeObservablePropertyIdentifierForHumanReadableName(String humanReadableName) {
notNullOrEmpty(OBSERVABLE_PROPERTY_NAME, humanReadableName);
LOG.trace("Removing featuresOfInterest identifier for humanReadableName {}", humanReadableName);
getObservablePropertyIdentifierForHumanReadableName().remove(humanReadableName);
if (getObservablePropertyIdentifierForHumanReadableName().containsKey(humanReadableName)) {
removeObservablePropertyHumanReadableNameForIdentifier(getObservablePropertyIdentifierForHumanReadableName()
.get(humanReadableName));
}
}
@Override
public void removeObservablePropertyHumanReadableNameForIdentifier(String identifier) {
notNullOrEmpty(OBSERVABLE_PROPERTY, identifier);
LOG.trace("Removing observableProperty human readable name for identifier {}", identifier);
getObservablePropertyHumanReadableNameForIdentifier().remove(identifier);
}
@Override
public void removeProcedureIdentifierForHumanReadableName(String humanReadableName) {
notNullOrEmpty(PROCEDURE_NAME, humanReadableName);
LOG.trace("Removing procedure identifier for humanReadableName {}", humanReadableName);
getProcedureIdentifierForHumanReadableName().remove(humanReadableName);
if (getProcedureIdentifierForHumanReadableName().containsKey(humanReadableName)) {
removeProcedureHumanReadableNameForIdentifier(getProcedureIdentifierForHumanReadableName().get(
humanReadableName));
}
}
@Override
public void removeProcedureHumanReadableNameForIdentifier(String identifier) {
notNullOrEmpty(PROCEDURE, identifier);
LOG.trace("Removing procedure human readable name for identifier {}", identifier);
getProcedureHumanReadableNameForIdentifier().remove(identifier);
}
@Override
public void removeOfferingIdentifierForHumanReadableName(String humanReadableName) {
notNullOrEmpty(OFFERING_NAME, humanReadableName);
LOG.trace("Removing offering identifier for humanReadableName {}", humanReadableName);
getOfferingIdentifierForHumanReadableName().remove(humanReadableName);
if (getOfferingIdentifierForHumanReadableName().containsKey(humanReadableName)) {
removeOfferingHumanReadableNameForIdentifier(getOfferingIdentifierForHumanReadableName().get(
humanReadableName));
}
}
@Override
public void removeOfferingHumanReadableNameForIdentifier(String identifier) {
notNullOrEmpty(OFFERING, identifier);
LOG.trace("Removing offering human readable name for identifier {}", identifier);
getOfferingHumanReadableNameForIdentifier().remove(identifier);
}
@Override
public void clearFeatureOfInterestIdentifierHumanReadableNameMaps() {
getFeatureOfInterestIdentifierForHumanReadableName().clear();
}
@Override
public void clearObservablePropertyIdentifierHumanReadableNameMaps() {
getObservablePropertyIdentifierForHumanReadableName().clear();
}
@Override
public void clearProcedureIdentifierHumanReadableNameMaps() {
getProcedureIdentifierForHumanReadableName().clear();
}
@Override
public void clearOfferingIdentifierHumanReadableNameMaps() {
getOfferingIdentifierForHumanReadableName().clear();
}
@Override
public void setLastUpdateTime(DateTime time) {
setUpdateTime(time);
}
/* published definitions */
@Override
public void addPublishedFeatureOfInterest(String featureOfInterest) {
notNullOrEmpty(PUBLISHED_FEATURE_OF_INTEREST, featureOfInterest);
LOG.trace("Adding published FeatureOfInterest {}", featureOfInterest);
getPublishedFeatureOfInterestSet().add(featureOfInterest);
}
@Override
public void addPublishedFeaturesOfInterest(Collection<String> featuresOfInterest) {
noNullValues(PUBLISHED_FEATURES_OF_INTEREST, featuresOfInterest);
for (final String featureOfInterest : featuresOfInterest) {
addPublishedFeatureOfInterest(featureOfInterest);
}
}
@Override
public void setPublishedFeaturesOfInterest(final Collection<String> featuresOfInterest) {
LOG.trace("Setting published FeaturesOfInterest");
clearPublishedFeaturesOfInterest();
addPublishedFeaturesOfInterest(featuresOfInterest);
}
@Override
public void clearPublishedFeaturesOfInterest() {
LOG.trace("Clearing published features of interest");
getPublishedFeatureOfInterestSet().clear();
}
@Override
public void removePublishedFeatureOfInterest(final String featureOfInterest) {
notNullOrEmpty(PUBLISHED_FEATURE_OF_INTEREST, featureOfInterest);
LOG.trace("Removing published FeatureOfInterest {}", featureOfInterest);
getPublishedFeatureOfInterestSet().remove(featureOfInterest);
}
@Override
public void removePublishedFeaturesOfInterest(final Collection<String> featuresOfInterest) {
noNullValues(PUBLISHED_FEATURES_OF_INTEREST, featuresOfInterest);
for (final String featureOfInterest : featuresOfInterest) {
removePublishedFeatureOfInterest(featureOfInterest);
}
}
@Override
public void addPublishedProcedure(String procedure) {
notNullOrEmpty(PUBLISHED_PROCEDURE, procedure);
LOG.trace("Adding published procedure {}", procedure);
getPublishedProcedureSet().add(procedure);
}
@Override
public void addPublishedProcedures(Collection<String> procedures) {
noNullValues(PUBLISHED_PROCEDURES, procedures);
for (final String procedure : procedures) {
addPublishedProcedure(procedure);
}
}
@Override
public void setPublishedProcedures(final Collection<String> procedures) {
LOG.trace("Setting published procedure");
clearPublishedProcedure();
addPublishedProcedures(procedures);
}
@Override
public void clearPublishedProcedure() {
LOG.trace("Clearing published procedure");
getPublishedProcedureSet().clear();
}
@Override
public void removePublishedProcedure(final String procedure) {
notNullOrEmpty(PUBLISHED_PROCEDURE, procedure);
LOG.trace("Removing published procedure {}", procedure);
getPublishedProcedureSet().remove(procedure);
}
@Override
public void removePublishedProcedures(final Collection<String> procedures) {
noNullValues(PUBLISHED_PROCEDURES, procedures);
for (final String procedure : procedures) {
removePublishedProcedure(procedure);
}
}
@Override
public void addPublishedOffering(String offering) {
notNullOrEmpty(PUBLISHED_OFFERING, offering);
LOG.trace("Adding published offering {}", offering);
getPublishedOfferingSet().add(offering);
}
@Override
public void addPublishedOfferings(Collection<String> offerings) {
noNullValues(PUBLISHED_OFFERINGS, offerings);
for (final String offering : offerings) {
addPublishedOffering(offering);
}
}
@Override
public void setPublishedOfferings(final Collection<String> offerings) {
LOG.trace("Setting published offering");
clearPublishedOffering();
addPublishedOfferings(offerings);
}
@Override
public void clearPublishedOffering() {
LOG.trace("Clearing published offering");
getPublishedOfferingSet().clear();
}
@Override
public void removePublishedOffering(final String offering) {
notNullOrEmpty(PUBLISHED_OFFERING, offering);
LOG.trace("Removing published offering {}", offering);
getPublishedOfferingSet().remove(offering);
}
@Override
public void removePublishedOfferings(final Collection<String> offerings) {
noNullValues(PUBLISHED_OFFERINGS, offerings);
for (final String offering : offerings) {
removePublishedOffering(offering);
}
}
@Override
public void addPublishedObservableProperty(String observableProperty) {
notNullOrEmpty(PUBLISHED_OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Adding published observableProperty {}", observableProperty);
getPublishedObservablePropertySet().add(observableProperty);
}
@Override
public void addPublishedObservableProperties(Collection<String> observableProperties) {
noNullValues(PUBLISHED_OBSERVABLE_PROPERTIES, observableProperties);
for (final String observableProperty : observableProperties) {
addPublishedObservableProperty(observableProperty);
}
}
@Override
public void setPublishedObservableProperties(final Collection<String> observableProperties) {
LOG.trace("Setting published observableProperties");
clearPublishedFeaturesOfInterest();
addPublishedObservableProperties(observableProperties);
}
@Override
public void clearPublishedObservableProperty() {
LOG.trace("Clearing published observableProperties");
getPublishedObservablePropertySet().clear();
}
@Override
public void removePublishedObservableProperty(final String observableProperty) {
notNullOrEmpty(PUBLISHED_OBSERVABLE_PROPERTY, observableProperty);
LOG.trace("Removing published observableProperty {}", observableProperty);
getPublishedObservablePropertySet().remove(observableProperty);
}
@Override
public void removePublishedObservableProperties(final Collection<String> observableProperties) {
noNullValues(PUBLISHED_OBSERVABLE_PROPERTIES, observableProperties);
for (final String observableProperty : observableProperties) {
removePublishedObservableProperty(observableProperty);
}
}
}