All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.n52.sos.config.json.JsonCapabilitiesExtensionService Maven / Gradle / Ivy
/*
* Copyright (C) 2012-2019 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.config.json;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Function;
import java.util.stream.Collector;
import java.util.stream.Stream;
import javax.inject.Inject;
import org.n52.janmayen.function.Consumers;
import org.n52.janmayen.function.Functions;
import org.n52.faroe.json.AbstractJsonDao;
import org.n52.iceland.cache.ContentCacheController;
import org.n52.iceland.config.json.JsonConstants;
import org.n52.iceland.ogc.ows.extension.StaticCapabilities;
import org.n52.shetland.ogc.ows.extension.AbstractExtension;
import org.n52.shetland.ogc.ows.extension.DisableableExtension;
import org.n52.shetland.ogc.ows.extension.Extension;
import org.n52.shetland.ogc.ows.extension.StringBasedCapabilitiesExtension;
import org.n52.shetland.ogc.ows.extension.StringBasedExtension;
import org.n52.shetland.ogc.sos.extension.SosObservationOfferingExtension;
import org.n52.sos.cache.SosContentCache;
import org.n52.sos.config.CapabilitiesExtensionService;
import org.n52.sos.exception.NoSuchExtensionException;
import org.n52.sos.exception.NoSuchOfferingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
/**
* TODO JavaDoc
*
* @author Christian Autermann
*/
public class JsonCapabilitiesExtensionService extends AbstractJsonDao implements CapabilitiesExtensionService {
private static final String IDENTIFIER = "identifier";
private ContentCacheController contentCacheController;
@Inject
public void setContentCacheController(ContentCacheController ctrl) {
this.contentCacheController = ctrl;
}
@Override
public Map> getOfferingExtensions() {
readLock().lock();
try {
return offeringExtensionStream()
.collect(groupingBy(SosObservationOfferingExtension::getOfferingName, toList()));
} finally {
readLock().unlock();
}
}
@Override
public Map> getActiveOfferingExtensions() {
readLock().lock();
try {
return offeringExtensionStream()
.filter(ce -> !ce.isDisabled())
.collect(groupingBy(SosObservationOfferingExtension::getOfferingName, toList()));
} finally {
readLock().unlock();
}
}
@Override
public void saveOfferingExtension(String offering, String identifier, String value)
throws NoSuchOfferingException {
writeLock().lock();
try {
checkOfferingName(offering);
getConfiguration()
.with(JsonConstants.OFFERING_EXTENSIONS)
.with(offering)
.with(identifier)
.put(JsonConstants.EXTENSION, value);
} finally {
writeLock().unlock();
}
configuration().scheduleWrite();
}
protected void checkOfferingName(String offering)
throws NoSuchOfferingException {
if (!getCache().hasOffering(offering)) {
throw new NoSuchOfferingException(offering);
}
}
private SosContentCache getCache() {
return (SosContentCache) this.contentCacheController.getCache();
}
@Override
public void disableOfferingExtension(String offering, String identifier, boolean disabled)
throws NoSuchExtensionException, NoSuchOfferingException {
writeLock().lock();
try {
checkOfferingName(offering);
ObjectNode extensions = getConfiguration()
.with(JsonConstants.OFFERING_EXTENSIONS)
.with(offering);
if (!extensions.has(identifier)) {
throw new NoSuchExtensionException(identifier);
}
extensions.with(identifier).put(JsonConstants.DISABLED, disabled);
} finally {
writeLock().unlock();
}
configuration().scheduleWrite();
}
@Override
public void deleteOfferingExtension(String offering, String identifier)
throws NoSuchOfferingException, NoSuchExtensionException {
writeLock().lock();
try {
checkOfferingName(offering);
ObjectNode extensions = getConfiguration()
.with(JsonConstants.OFFERING_EXTENSIONS)
.with(offering);
JsonNode remove = extensions.remove(identifier);
if (remove == null) {
throw new NoSuchExtensionException(identifier);
}
} finally {
writeLock().unlock();
}
configuration().scheduleWrite();
}
@Override
public Map getActiveCapabilitiesExtensions() {
readLock().lock();
try {
return capabilitiesExtensionStream().filter(ce -> !ce.isDisabled())
.collect(swesExtensionCollector());
} finally {
readLock().unlock();
}
}
@Override
public Map getAllCapabilitiesExtensions() {
readLock().lock();
try {
return capabilitiesExtensionStream().collect(swesExtensionCollector());
} finally {
readLock().unlock();
}
}
private Stream offeringExtensionStream() {
return createEntryStream(getConfiguration().with(JsonConstants.OFFERING_EXTENSIONS))
.flatMap(entry -> createEntryStream(entry.getValue())
.map(this::decodeOfferingExtension)
.map(Functions.mutate(Consumers
.currySecond(SosObservationOfferingExtensionImpl::setOfferingName, entry.getKey()))));
}
private SosObservationOfferingExtensionImpl decodeOfferingExtension(Entry entry) {
String identifier = entry.getKey();
JsonNode n = entry.getValue();
SosObservationOfferingExtensionImpl oe = new SosObservationOfferingExtensionImpl();
oe.setIdentifier(identifier);
oe.setDefinition(n.path(JsonConstants.DEFINITION).textValue());
oe.setDisabled(n.path(JsonConstants.DISABLED).booleanValue());
oe.setExtension(n.path(JsonConstants.EXTENSION).textValue());
oe.setNamespace(n.path(JsonConstants.NAMESPACE).textValue());
return oe;
}
private Stream capabilitiesExtensionStream() {
return createEntryStream(getConfiguration().with(JsonConstants.CAPABILITIES_EXTENSIONS))
.map(this::decodeCapabilitiesExtension);
}
private CapabilitiesExtensionImpl decodeCapabilitiesExtension(Entry e) {
CapabilitiesExtensionImpl ce = new CapabilitiesExtensionImpl();
JsonNode n = e.getValue();
ce.setIdentifier(e.getKey());
ce.setDefinition(n.path(JsonConstants.DEFINITION).textValue());
ce.setDisabled(n.path(JsonConstants.DISABLED).booleanValue());
ce.setExtension(n.path(JsonConstants.EXTENSION).textValue());
ce.setNamespace(n.path(JsonConstants.NAMESPACE).textValue());
return ce;
}
@Override
public void saveCapabilitiesExtension(String identifier, String value) {
writeLock().lock();
try {
getConfiguration()
.with(JsonConstants.CAPABILITIES_EXTENSIONS)
.with(identifier)
.put(JsonConstants.EXTENSION, value);
} finally {
writeLock().unlock();
}
configuration().scheduleWrite();
}
@Override
public void disableCapabilitiesExtension(String identifier, boolean disabled) throws NoSuchExtensionException {
writeLock().lock();
try {
ObjectNode node = getConfiguration().with(JsonConstants.CAPABILITIES_EXTENSIONS);
if (!node.has(identifier)) {
throw new NoSuchExtensionException(identifier);
} else {
node.with(identifier).put(JsonConstants.DISABLED, true);
}
} finally {
writeLock().unlock();
}
configuration().scheduleWrite();
}
@Override
public void deleteCapabiltiesExtension(String identfier) throws NoSuchExtensionException {
writeLock().lock();
try {
JsonNode removed = getConfiguration()
.with(JsonConstants.CAPABILITIES_EXTENSIONS)
.remove(identfier);
if (removed == null) {
throw new NoSuchExtensionException(identfier);
}
} finally {
writeLock().unlock();
}
configuration().scheduleWrite();
}
@Override
public void setActiveStaticCapabilities(String identifier)
throws NoSuchExtensionException {
writeLock().lock();
try {
JsonNode node
= getConfiguration()
.path(JsonConstants.STATIC_CAPABILITIES)
.path(JsonConstants.CAPABILITIES)
.path(identifier);
if (node.isMissingNode() || node.isNull()) {
throw new NoSuchExtensionException(identifier);
}
getConfiguration().with(JsonConstants.STATIC_CAPABILITIES)
.put(JsonConstants.ACTIVE, identifier);
} finally {
writeLock().unlock();
}
configuration().scheduleWrite();
}
@Override
public String getActiveStaticCapabilities() {
readLock().lock();
try {
return getConfiguration().path(JsonConstants.STATIC_CAPABILITIES)
.path(JsonConstants.ACTIVE).textValue();
} finally {
readLock().unlock();
}
}
@Override
public String getActiveStaticCapabilitiesDocument() {
readLock().lock();
try {
String id = getActiveStaticCapabilities();
return id == null ? null : getConfiguration()
.path(JsonConstants.STATIC_CAPABILITIES)
.path(JsonConstants.CAPABILITIES)
.path(id)
.textValue();
} finally {
readLock().unlock();
}
}
@Override
public boolean isStaticCapabilitiesActive() {
readLock().lock();
try {
return getConfiguration().path(JsonConstants.STATIC_CAPABILITIES)
.path(JsonConstants.ACTIVE).isTextual();
} finally {
readLock().unlock();
}
}
@Override
public Map getStaticCapabilities() {
readLock().lock();
try {
JsonNode node =
getConfiguration().path(JsonConstants.STATIC_CAPABILITIES).path(JsonConstants.CAPABILITIES);
return createEntryStream(node).collect(
toMap(Entry::getKey, e -> new StaticCapabilitiesImpl(e.getKey(), e.getValue().textValue())));
} finally {
readLock().unlock();
}
}
@Override
public StaticCapabilities getStaticCapabilities(String id) {
readLock().lock();
try {
String value = getConfiguration()
.path(JsonConstants.STATIC_CAPABILITIES)
.path(JsonConstants.CAPABILITIES)
.path(id)
.textValue();
return value == null ? null : new StaticCapabilitiesImpl(id, value);
} finally {
readLock().unlock();
}
}
@Override
public void saveStaticCapabilities(String identifier, String document) {
writeLock().lock();
try {
getConfiguration()
.with(JsonConstants.STATIC_CAPABILITIES)
.with(JsonConstants.CAPABILITIES)
.put(identifier, document);
} finally {
writeLock().unlock();
}
configuration().scheduleWrite();
}
@Override
public void deleteStaticCapabilities(String identifier) throws NoSuchExtensionException {
writeLock().lock();
try {
JsonNode removed = getConfiguration()
.with(JsonConstants.STATIC_CAPABILITIES)
.remove(identifier);
if (removed == null) {
throw new NoSuchExtensionException(identifier);
}
} finally {
writeLock().unlock();
}
configuration().scheduleWrite();
}
private static > Collector> swesExtensionCollector() {
return toMap(Extension::getIdentifier, Function.identity());
}
private static class StaticCapabilitiesImpl implements StaticCapabilities {
private String document;
private String identifier;
StaticCapabilitiesImpl(String identifier, String document) {
setIdentifier(identifier);
setDocument(document);
}
@Override
public String getDocument() {
return document;
}
public void setDocument(String document) {
this.document = document;
}
@Override
public String getIdentifier() {
return identifier;
}
public void setIdentifier(String identifier) {
this.identifier = identifier;
}
@Override
public String toString() {
return toStringHelper().toString();
}
protected ToStringHelper toStringHelper() {
return MoreObjects.toStringHelper(this)
.add(IDENTIFIER, getIdentifier())
.add("document", getDocument());
}
}
private abstract static class AbstractDisableableExtension extends AbstractExtension
implements DisableableExtension, StringBasedExtension {
private boolean disabled;
private String value;
public void setDisabled(boolean disabled) {
this.disabled = disabled;
}
@Override
public boolean isDisabled() {
return this.disabled;
}
public AbstractDisableableExtension setExtension(String extension) {
setValue(extension);
return this;
}
@Override
public String getExtension() {
return getValue();
}
@Override
public AbstractDisableableExtension setValue(String value) {
this.value = value;
return this;
}
@Override
public String getValue() {
return value;
}
@Override
public String toString() {
return toStringHelper().toString();
}
protected ToStringHelper toStringHelper() {
return MoreObjects.toStringHelper(this)
.add(IDENTIFIER, getIdentifier())
.add("namespace", getNamespace())
.add("definition", getDefinition())
.add("extension", getExtension())
.add("disabled", isDisabled());
}
}
private static class SosObservationOfferingExtensionImpl extends AbstractDisableableExtension
implements SosObservationOfferingExtension {
private String offeringName;
public void setOfferingName(String offeringName) {
this.offeringName = offeringName;
}
@Override
public String getOfferingName() {
return this.offeringName;
}
@Override
protected ToStringHelper toStringHelper() {
return super.toStringHelper()
.add("offeringName", getOfferingName());
}
}
private static class CapabilitiesExtensionImpl
extends AbstractDisableableExtension
implements StringBasedCapabilitiesExtension {
@Override
public String getSectionName() {
return getIdentifier();
}
}
}