diff options
author | 2019-08-05 16:53:44 +0300 | |
---|---|---|
committer | 2019-08-05 16:53:44 +0300 | |
commit | 2c78e55c6918b090d0ca47f931ac7f24a7c64abc (patch) | |
tree | be9518d695a44f1d45e07f15c568bfa393199e2d /zusammen-lib/src/main/java | |
parent | 3a818f7755e4d958b8d9cc593553e2353b56a227 (diff) |
Add versioning, session and zusammen libs
Issue-ID: SDC-2486
Signed-off-by: talig <talig@amdocs.com>
Change-Id: I848edbcb84f424f949b646df04f04fa66d0f3bd2
Diffstat (limited to 'zusammen-lib/src/main/java')
10 files changed, 956 insertions, 0 deletions
diff --git a/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/config/ZusammenConfig.java b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/config/ZusammenConfig.java new file mode 100644 index 0000000..920b07a --- /dev/null +++ b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/config/ZusammenConfig.java @@ -0,0 +1,88 @@ +/* + * Copyright © 2018 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.sdc.common.zusammen.config; + +import com.datastax.driver.core.RemoteEndpointAwareJdkSSLOptions; +import com.datastax.driver.core.SSLOptions; +import java.io.FileInputStream; +import java.security.KeyStore; +import java.security.SecureRandom; +import javax.annotation.PostConstruct; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManagerFactory; +import org.springframework.beans.factory.BeanCreationException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.cassandra.ClusterBuilderCustomizer; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ZusammenConfig { + + private static final String[] CIPHER_SUITES = {"TLS_RSA_WITH_AES_128_CBC_SHA"}; + private static final String KEYSTORE_TYPE = "JKS"; + private static final String SECURE_SOCKET_PROTOCOL = "SSL"; + private static final String KEYSPACE = "zusammen"; + + private final ZusammenConfigProvider provider; + + + @Autowired + public ZusammenConfig(ZusammenConfigProvider provider) { + this.provider = provider; + } + + @PostConstruct + public void init() { + System.setProperty("cassandra.nodes", provider.getCassandraAddresses()); + System.setProperty("cassandra.ssl.port", provider.getCassandraPort()); + System.setProperty("cassandra.keyspace", KEYSPACE); + + System.setProperty("cassandra.authenticate", Boolean.toString(Boolean.valueOf(provider.getCassandraAuth()))); + System.setProperty("cassandra.user", provider.getCassandraUser()); + System.setProperty("cassandra.password", provider.getCassandraPassword()); + + System.setProperty("cassandra.ssl", Boolean.toString(Boolean.valueOf(provider.getCassandraSSL()))); + System.setProperty("cassandra.truststore", provider.getCassandraTrustStorePath()); + System.setProperty("cassandra.truststore.password", provider.getCassandraTrustStorePassword()); + } + + @Bean + @ConditionalOnProperty("cassandra.ssl") + ClusterBuilderCustomizer clusterBuilderCustomizer() { + SSLOptions sslOptions = RemoteEndpointAwareJdkSSLOptions + .builder() + .withSSLContext(getSslContext()) + .withCipherSuites(CIPHER_SUITES).build(); + return builder -> builder.withSSL(sslOptions); + } + + private SSLContext getSslContext() { + try (FileInputStream tsf = new FileInputStream(provider.getCassandraTrustStorePath())) { + SSLContext ctx = SSLContext.getInstance(SECURE_SOCKET_PROTOCOL); + KeyStore ts = KeyStore.getInstance(KEYSTORE_TYPE); + ts.load(tsf, provider.getCassandraTrustStorePassword().toCharArray()); + TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + tmf.init(ts); + ctx.init(null, tmf.getTrustManagers(), new SecureRandom()); + return ctx; + } catch (Exception ex) { + throw new BeanCreationException(ex.getMessage(), ex); + } + } +}
\ No newline at end of file diff --git a/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/config/ZusammenConfigProvider.java b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/config/ZusammenConfigProvider.java new file mode 100644 index 0000000..4cbe1f2 --- /dev/null +++ b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/config/ZusammenConfigProvider.java @@ -0,0 +1,20 @@ +package org.onap.sdc.common.zusammen.config; + +public interface ZusammenConfigProvider { + + String getCassandraAddresses(); + + String getCassandraPort(); + + String getCassandraAuth(); + + String getCassandraUser(); + + String getCassandraPassword(); + + String getCassandraSSL(); + + String getCassandraTrustStorePath(); + + String getCassandraTrustStorePassword(); +} diff --git a/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/persistence/ZusammenConnector.java b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/persistence/ZusammenConnector.java new file mode 100644 index 0000000..98640e2 --- /dev/null +++ b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/persistence/ZusammenConnector.java @@ -0,0 +1,98 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.sdc.common.zusammen.persistence; + +import com.amdocs.zusammen.adaptor.inbound.api.types.item.Element; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementConflict; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ItemVersionConflict; +import com.amdocs.zusammen.commons.health.data.HealthInfo; +import com.amdocs.zusammen.datatypes.Id; +import com.amdocs.zusammen.datatypes.SessionContext; +import com.amdocs.zusammen.datatypes.item.ElementContext; +import com.amdocs.zusammen.datatypes.item.Info; +import com.amdocs.zusammen.datatypes.item.Item; +import com.amdocs.zusammen.datatypes.item.ItemVersion; +import com.amdocs.zusammen.datatypes.item.ItemVersionData; +import com.amdocs.zusammen.datatypes.item.ItemVersionStatus; +import com.amdocs.zusammen.datatypes.item.Resolution; +import com.amdocs.zusammen.datatypes.itemversion.ItemVersionRevisions; +import com.amdocs.zusammen.datatypes.itemversion.Tag; +import java.util.Collection; + +public interface ZusammenConnector { + + Collection<HealthInfo> checkHealth(SessionContext sessionContext); + + String getReleaseVersion(SessionContext sessionContext); + + Collection<Item> listItems(SessionContext context); + + Item getItem(SessionContext context, Id itemId); + + Id createItem(SessionContext context, Info info); + + void deleteItem(SessionContext context, Id itemId); + + void updateItem(SessionContext context, Id itemId, Info info); + + + Collection<ItemVersion> listPublicVersions(SessionContext context, Id itemId); + + ItemVersion getPublicVersion(SessionContext context, Id itemId, Id versionId); + + Id createVersion(SessionContext context, Id itemId, Id baseVersionId, ItemVersionData itemVersionData); + + void updateVersion(SessionContext context, Id itemId, Id versionId, ItemVersionData itemVersionData); + + ItemVersion getVersion(SessionContext context, Id itemId, Id versionId); + + ItemVersionStatus getVersionStatus(SessionContext context, Id itemId, Id versionId); + + void tagVersion(SessionContext context, Id itemId, Id versionId, Tag tag); + + void resetVersionRevision(SessionContext context, Id itemId, Id versionId, Id revisionId); + + void revertVersionRevision(SessionContext context, Id itemId, Id versionId, Id revisionId); + + ItemVersionRevisions listVersionRevisions(SessionContext context, Id itemId, Id versionId); + + void publishVersion(SessionContext context, Id itemId, Id versionId, String message); + + void syncVersion(SessionContext context, Id itemId, Id versionId); + + void forceSyncVersion(SessionContext context, Id itemId, Id versionId); + + void cleanVersion(SessionContext context, Id itemId, Id versionId); + + ItemVersionConflict getVersionConflict(SessionContext context, Id itemId, Id versionId); + + + Collection<ElementInfo> listElements(SessionContext context, ElementContext elementContext, Id parentElementId); + + ElementInfo getElementInfo(SessionContext context, ElementContext elementContext, Id elementId); + + Element getElement(SessionContext context, ElementContext elementContext, Id elementId); + + ElementConflict getElementConflict(SessionContext context, ElementContext elementContext, Id elementId); + + Element saveElement(SessionContext context, ElementContext elementContext, Element element, String message); + + void resolveElementConflict(SessionContext context, ElementContext elementContext, Element element, + Resolution resolution); + +} diff --git a/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/persistence/impl/ZusammenAdaptorsConfig.java b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/persistence/impl/ZusammenAdaptorsConfig.java new file mode 100644 index 0000000..18d34bc --- /dev/null +++ b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/persistence/impl/ZusammenAdaptorsConfig.java @@ -0,0 +1,32 @@ +package org.onap.sdc.common.zusammen.persistence.impl; + +import com.amdocs.zusammen.adaptor.inbound.api.health.HealthAdaptorFactory; +import com.amdocs.zusammen.adaptor.inbound.api.item.ElementAdaptorFactory; +import com.amdocs.zusammen.adaptor.inbound.api.item.ItemAdaptorFactory; +import com.amdocs.zusammen.adaptor.inbound.api.item.ItemVersionAdaptorFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ZusammenAdaptorsConfig { + + @Bean + public ItemAdaptorFactory itemAdaptorFactory() { + return ItemAdaptorFactory.getInstance(); + } + + @Bean + public ItemVersionAdaptorFactory itemVersionAdaptorFactory() { + return ItemVersionAdaptorFactory.getInstance(); + } + + @Bean + public ElementAdaptorFactory elementAdaptorFactory() { + return ElementAdaptorFactory.getInstance(); + } + + @Bean + public HealthAdaptorFactory healthAdaptorFactory() { + return HealthAdaptorFactory.getInstance(); + } +} diff --git a/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/persistence/impl/ZusammenConnectorImpl.java b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/persistence/impl/ZusammenConnectorImpl.java new file mode 100644 index 0000000..5d9c749 --- /dev/null +++ b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/persistence/impl/ZusammenConnectorImpl.java @@ -0,0 +1,281 @@ +/* + * Copyright © 2016-2017 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.sdc.common.zusammen.persistence.impl; + +import com.amdocs.zusammen.adaptor.inbound.api.health.HealthAdaptorFactory; +import com.amdocs.zusammen.adaptor.inbound.api.item.ElementAdaptorFactory; +import com.amdocs.zusammen.adaptor.inbound.api.item.ItemAdaptorFactory; +import com.amdocs.zusammen.adaptor.inbound.api.item.ItemVersionAdaptorFactory; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.Element; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementConflict; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ItemVersionConflict; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.MergeResult; +import com.amdocs.zusammen.commons.health.data.HealthInfo; +import com.amdocs.zusammen.datatypes.Id; +import com.amdocs.zusammen.datatypes.SessionContext; +import com.amdocs.zusammen.datatypes.Space; +import com.amdocs.zusammen.datatypes.item.ElementContext; +import com.amdocs.zusammen.datatypes.item.Info; +import com.amdocs.zusammen.datatypes.item.Item; +import com.amdocs.zusammen.datatypes.item.ItemVersion; +import com.amdocs.zusammen.datatypes.item.ItemVersionData; +import com.amdocs.zusammen.datatypes.item.ItemVersionStatus; +import com.amdocs.zusammen.datatypes.item.Resolution; +import com.amdocs.zusammen.datatypes.itemversion.ItemVersionRevisions; +import com.amdocs.zusammen.datatypes.itemversion.Tag; +import com.amdocs.zusammen.datatypes.response.Response; +import java.util.Collection; +import org.onap.sdc.common.zusammen.persistence.ZusammenConnector; +import org.onap.sdc.common.zusammen.services.exceptions.ZusammenException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +@Repository +public class ZusammenConnectorImpl implements ZusammenConnector { + + private static final String GET_ELEMENT_ERR_MSG = + "Failed to get element. Item Id: %s, version Id: %s, element Id: %s message: %s"; + private static final String GET_ELEMENT_IN_REV_ERR_MSG = + "Failed to get element. Item Id: %s, version Id: %s, revision Id: %s, element Id: %s message: %s"; + private final ItemAdaptorFactory itemAdaptorFactory; + private final ItemVersionAdaptorFactory versionAdaptorFactory; + private final ElementAdaptorFactory elementAdaptorFactory; + private final HealthAdaptorFactory healthAdaptorFactory; + + @Autowired + public ZusammenConnectorImpl(ItemAdaptorFactory itemAdaptorFactory, ItemVersionAdaptorFactory versionAdaptorFactory, + ElementAdaptorFactory elementAdaptorFactory, HealthAdaptorFactory healthAdaptorFactory) { + this.itemAdaptorFactory = itemAdaptorFactory; + this.versionAdaptorFactory = versionAdaptorFactory; + this.elementAdaptorFactory = elementAdaptorFactory; + this.healthAdaptorFactory = healthAdaptorFactory; + } + + @Override + public Collection<HealthInfo> checkHealth(SessionContext sessionContext) { + return healthAdaptorFactory.createInterface(sessionContext).getHealthStatus(sessionContext); + } + + @Override + public String getReleaseVersion(SessionContext sessionContext) { + return healthAdaptorFactory.createInterface(sessionContext).getVersion(); + } + + @Override + public Collection<Item> listItems(SessionContext context) { + Response<Collection<Item>> response = itemAdaptorFactory.createInterface(context).list(context); + return getResponseValue(response, "list items"); + } + + @Override + public Item getItem(SessionContext context, Id itemId) { + Response<Item> response = itemAdaptorFactory.createInterface(context).get(context, itemId); + return getResponseValue(response, String.format("get item %s", itemId)); + } + + + @Override + public Id createItem(SessionContext context, Info info) { + Response<Id> response = itemAdaptorFactory.createInterface(context).create(context, info); + return getResponseValue(response, "create item"); + } + + @Override + public void deleteItem(SessionContext context, Id itemId) { + Response<Void> response = itemAdaptorFactory.createInterface(context).delete(context, itemId); + getResponseValue(response, String.format("get item %s", itemId)); + } + + @Override + public void updateItem(SessionContext context, Id itemId, Info info) { + Response<Void> response = itemAdaptorFactory.createInterface(context).update(context, itemId, info); + getResponseValue(response, String.format("update item %s", itemId)); + } + + @Override + public Collection<ItemVersion> listPublicVersions(SessionContext context, Id itemId) { + Response<Collection<ItemVersion>> response = + versionAdaptorFactory.createInterface(context).list(context, Space.PUBLIC, itemId); + return getResponseValue(response, String.format("list public versions of item %s", itemId)); + } + + @Override + public ItemVersion getPublicVersion(SessionContext context, Id itemId, Id versionId) { + Response<ItemVersion> response = + versionAdaptorFactory.createInterface(context).get(context, Space.PUBLIC, itemId, versionId); + return getResponseValue(response, String.format("get public version %s of item %s", versionId, itemId)); + } + + @Override + public Id createVersion(SessionContext context, Id itemId, Id baseVersionId, ItemVersionData itemVersionData) { + Response<Id> response = + versionAdaptorFactory.createInterface(context).create(context, itemId, baseVersionId, itemVersionData); + return getResponseValue(response, + String.format("create version for item %s based on version %s", itemId, baseVersionId)); + } + + @Override + public void updateVersion(SessionContext context, Id itemId, Id versionId, ItemVersionData itemVersionData) { + Response<Void> response = + versionAdaptorFactory.createInterface(context).update(context, itemId, versionId, itemVersionData); + getResponseValue(response, String.format("update version %s of item %s", versionId, itemId)); + } + + @Override + public ItemVersion getVersion(SessionContext context, Id itemId, Id versionId) { + Response<ItemVersion> response = + versionAdaptorFactory.createInterface(context).get(context, Space.PRIVATE, itemId, versionId); + return getResponseValue(response, String.format("get version %s of item %s", versionId, itemId)); + } + + @Override + public ItemVersionStatus getVersionStatus(SessionContext context, Id itemId, Id versionId) { + Response<ItemVersionStatus> response = + versionAdaptorFactory.createInterface(context).getStatus(context, itemId, versionId); + return getResponseValue(response, String.format("get status of version %s of item %s", versionId, itemId)); + } + + @Override + public void tagVersion(SessionContext context, Id itemId, Id versionId, Tag tag) { + Response<Void> response = + versionAdaptorFactory.createInterface(context).tag(context, itemId, versionId, null, tag); + getResponseValue(response, + String.format("tag version %s of item %s with tag %s", versionId, itemId, tag.getName())); + } + + @Override + public void resetVersionRevision(SessionContext context, Id itemId, Id versionId, Id revisionId) { + Response<Void> response = + versionAdaptorFactory.createInterface(context).resetRevision(context, itemId, versionId, revisionId); + getResponseValue(response, + String.format("reset version %s of item %s to revision %s", versionId, itemId, revisionId)); + } + + @Override + public void revertVersionRevision(SessionContext context, Id itemId, Id versionId, Id revisionId) { + Response<Void> response = + versionAdaptorFactory.createInterface(context).revertRevision(context, itemId, versionId, revisionId); + getResponseValue(response, + String.format("revert version %s of item %s to revision %s", versionId, itemId, revisionId)); + } + + @Override + public ItemVersionRevisions listVersionRevisions(SessionContext context, Id itemId, Id versionId) { + Response<ItemVersionRevisions> response = + versionAdaptorFactory.createInterface(context).listRevisions(context, itemId, versionId); + return getResponseValue(response, String.format("list revisions of version %s of item %s", versionId, itemId)); + } + + + @Override + public void publishVersion(SessionContext context, Id itemId, Id versionId, String message) { + Response<Void> response = + versionAdaptorFactory.createInterface(context).publish(context, itemId, versionId, message); + getResponseValue(response, String.format("publish version %s of item %s", versionId, itemId)); + } + + @Override + public void syncVersion(SessionContext context, Id itemId, Id versionId) { + Response<MergeResult> response = + versionAdaptorFactory.createInterface(context).sync(context, itemId, versionId); + getResponseValue(response, String.format("sync version %s of item %s", versionId, itemId)); + } + + @Override + public void forceSyncVersion(SessionContext context, Id itemId, Id versionId) { + Response<MergeResult> response = + versionAdaptorFactory.createInterface(context).forceSync(context, itemId, versionId); + getResponseValue(response, String.format("force sync version %s of item %s", versionId, itemId)); + } + + @Override + public void cleanVersion(SessionContext context, Id itemId, Id versionId) { + Response<Void> response = versionAdaptorFactory.createInterface(context).delete(context, itemId, versionId); + getResponseValue(response, String.format("clean version %s of item %s", versionId, itemId)); + } + + @Override + public ItemVersionConflict getVersionConflict(SessionContext context, Id itemId, Id versionId) { + Response<ItemVersionConflict> response = + versionAdaptorFactory.createInterface(context).getConflict(context, itemId, versionId); + return getResponseValue(response, String.format("get conflict of version %s of item %s", versionId, itemId)); + } + + @Override + public Collection<ElementInfo> listElements(SessionContext context, ElementContext elementContext, + Id parentElementId) { + Response<Collection<ElementInfo>> response = + elementAdaptorFactory.createInterface(context).list(context, elementContext, parentElementId); + return getResponseValue(response, + String.format("list elements of version %s of item %s", elementContext.getVersionId(), + elementContext.getItemId())); + } + + + @Override + public ElementInfo getElementInfo(SessionContext context, ElementContext elementContext, Id elementId) { + Response<ElementInfo> response = + elementAdaptorFactory.createInterface(context).getInfo(context, elementContext, elementId); + return getResponseValue(response, String.format("get info of element %s of version %s of item %s", elementId, + elementContext.getVersionId(), elementContext.getItemId())); + } + + @Override + public Element getElement(SessionContext context, ElementContext elementContext, Id elementId) { + Response<Element> response = + elementAdaptorFactory.createInterface(context).get(context, elementContext, elementId); + return getResponseValue(response, + String.format("get element %s of version %s of item %s", elementId, elementContext.getVersionId(), + elementContext.getItemId())); + } + + @Override + public ElementConflict getElementConflict(SessionContext context, ElementContext elementContext, Id elementId) { + Response<ElementConflict> response = + elementAdaptorFactory.createInterface(context).getConflict(context, elementContext, elementId); + return getResponseValue(response, + String.format("get conflict of element %s of version %s of item %s", elementId, + elementContext.getVersionId(), elementContext.getItemId())); + } + + @Override + public Element saveElement(SessionContext context, ElementContext elementContext, Element element, String message) { + Response<Element> response = + elementAdaptorFactory.createInterface(context).save(context, elementContext, element, message); + return getResponseValue(response, + String.format("save element %s of version %s of item %s", element.getElementId(), + elementContext.getVersionId(), elementContext.getItemId())); + } + + @Override + public void resolveElementConflict(SessionContext context, ElementContext elementContext, Element element, + Resolution resolution) { + Response<Void> response = elementAdaptorFactory.createInterface(context) + .resolveConflict(context, elementContext, element, resolution); + getResponseValue(response, + String.format("resolve conflict of element %s of version %s of item %s", element.getElementId(), + elementContext.getVersionId(), elementContext.getItemId())); + } + + private <T> T getResponseValue(Response<T> response, String action) { + if (!response.isSuccessful()) { + throw new ZusammenException(String.format("Failed to %s: %s", action, response.getReturnCode().toString())); + } + return response.getValue(); + } +} diff --git a/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/ElementConvertor.java b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/ElementConvertor.java new file mode 100644 index 0000000..5a678ce --- /dev/null +++ b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/ElementConvertor.java @@ -0,0 +1,15 @@ +package org.onap.sdc.common.zusammen.services; + + +import com.amdocs.zusammen.adaptor.inbound.api.types.item.Element; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement; + +public interface ElementConvertor<T> { + + void toElement(T source, ZusammenElement target); + + T fromElement(Element element); + + T fromElementInfo(ElementInfo element); +} diff --git a/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/ZusammenAdaptor.java b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/ZusammenAdaptor.java new file mode 100644 index 0000000..6397726 --- /dev/null +++ b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/ZusammenAdaptor.java @@ -0,0 +1,110 @@ +/* + * Copyright © 2016-2018 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.sdc.common.zusammen.services; + +import com.amdocs.zusammen.adaptor.inbound.api.types.item.Element; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementConflict; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ItemVersionConflict; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement; +import com.amdocs.zusammen.commons.health.data.HealthInfo; +import com.amdocs.zusammen.datatypes.Id; +import com.amdocs.zusammen.datatypes.SessionContext; +import com.amdocs.zusammen.datatypes.item.ElementContext; +import com.amdocs.zusammen.datatypes.item.Info; +import com.amdocs.zusammen.datatypes.item.Item; +import com.amdocs.zusammen.datatypes.item.ItemVersion; +import com.amdocs.zusammen.datatypes.item.ItemVersionData; +import com.amdocs.zusammen.datatypes.item.ItemVersionStatus; +import com.amdocs.zusammen.datatypes.item.Resolution; +import com.amdocs.zusammen.datatypes.itemversion.ItemVersionRevisions; +import com.amdocs.zusammen.datatypes.itemversion.Tag; +import java.util.Collection; +import java.util.Optional; + +public interface ZusammenAdaptor { + + Collection<Item> listItems(SessionContext context); + + Item getItem(SessionContext context, Id itemId); + + void deleteItem(SessionContext context, Id itemId); + + Id createItem(SessionContext context, Info info); + + void updateItem(SessionContext context, Id itemId, Info info); + + Collection<ItemVersion> listPublicVersions(SessionContext context, Id itemId); + + ItemVersion getPublicVersion(SessionContext context, Id itemId, Id versionId); + + Id createVersion(SessionContext context, Id itemId, Id baseVersionId, ItemVersionData itemVersionData); + + void updateVersion(SessionContext context, Id itemId, Id versionId, ItemVersionData itemVersionData); + + ItemVersion getVersion(SessionContext context, Id itemId, Id versionId); + + ItemVersionStatus getVersionStatus(SessionContext context, Id itemId, Id versionId); + + ItemVersionConflict getVersionConflict(SessionContext context, Id itemId, Id versionId); + + void tagVersion(SessionContext context, Id itemId, Id versionId, Tag tag); + + void publishVersion(SessionContext context, Id itemId, Id versionId, String message); + + void syncVersion(SessionContext context, Id itemId, Id versionId); + + void forceSyncVersion(SessionContext context, Id itemId, Id versionId); + + void cleanVersion(SessionContext context, Id itemId, Id versionId); + + Optional<ElementInfo> getElementInfo(SessionContext context, ElementContext elementContext, Id elementId); + + Optional<Element> getElement(SessionContext context, ElementContext elementContext, Id elementId); + + Optional<Element> getElementByName(SessionContext context, ElementContext elementContext, Id parentElementId, + String elementName); + + Collection<ElementInfo> listElements(SessionContext context, ElementContext elementContext, Id parentElementId); + + Collection<Element> listElementData(SessionContext context, ElementContext elementContext, Id parentElementId); + + /** + * Lists the sub elements of the element named elementName which is a sub element of + * parentElementId + */ + Collection<ElementInfo> listElementsByName(SessionContext context, ElementContext elementContext, + Id parentElementId, String elementName); + + Optional<ElementInfo> getElementInfoByName(SessionContext context, ElementContext elementContext, + Id parentElementId, String elementName); + + Optional<ElementConflict> getElementConflict(SessionContext context, ElementContext elementContext, Id elementId); + + Element saveElement(SessionContext context, ElementContext elementContext, ZusammenElement element, String message); + + void resolveElementConflict(SessionContext context, ElementContext elementContext, ZusammenElement element, + Resolution resolution); + + void revert(SessionContext context, Id itemId, Id versionId, Id revisionId); + + ItemVersionRevisions listRevisions(SessionContext context, Id itemId, Id versionId); + + Collection<HealthInfo> checkHealth(SessionContext context); + + String getReleaseVersion(SessionContext context); +} diff --git a/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/ZusammenElementUtil.java b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/ZusammenElementUtil.java new file mode 100644 index 0000000..c083ea4 --- /dev/null +++ b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/ZusammenElementUtil.java @@ -0,0 +1,27 @@ +package org.onap.sdc.common.zusammen.services; + +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement; +import com.amdocs.zusammen.datatypes.Id; +import com.amdocs.zusammen.datatypes.item.Action; +import com.amdocs.zusammen.datatypes.item.Info; + +public class ZusammenElementUtil { + + public static final String ELEMENT_TYPE_PROPERTY = "elementType"; + + public static ZusammenElement buildStructuralElement(String elementType, Action action) { + ZusammenElement element = buildElement(null, action); + Info info = new Info(); + info.setName(elementType); + info.addProperty(ELEMENT_TYPE_PROPERTY, elementType); + element.setInfo(info); + return element; + } + + public static ZusammenElement buildElement(Id elementId, Action action) { + ZusammenElement element = new ZusammenElement(); + element.setElementId(elementId); + element.setAction(action); + return element; + } +} diff --git a/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/exceptions/ZusammenException.java b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/exceptions/ZusammenException.java new file mode 100644 index 0000000..4e7f06f --- /dev/null +++ b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/exceptions/ZusammenException.java @@ -0,0 +1,8 @@ +package org.onap.sdc.common.zusammen.services.exceptions; + +public class ZusammenException extends RuntimeException { + + public ZusammenException(String message) { + super(message); + } +} diff --git a/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/impl/ZusammenAdaptorImpl.java b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/impl/ZusammenAdaptorImpl.java new file mode 100644 index 0000000..1624e49 --- /dev/null +++ b/zusammen-lib/src/main/java/org/onap/sdc/common/zusammen/services/impl/ZusammenAdaptorImpl.java @@ -0,0 +1,277 @@ +/* + * Copyright © 2016-2017 European Support Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onap.sdc.common.zusammen.services.impl; + +import com.amdocs.zusammen.adaptor.inbound.api.types.item.Element; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementConflict; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ElementInfo; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ItemVersionConflict; +import com.amdocs.zusammen.adaptor.inbound.api.types.item.ZusammenElement; +import com.amdocs.zusammen.commons.health.data.HealthInfo; +import com.amdocs.zusammen.datatypes.Id; +import com.amdocs.zusammen.datatypes.SessionContext; +import com.amdocs.zusammen.datatypes.item.Action; +import com.amdocs.zusammen.datatypes.item.ElementContext; +import com.amdocs.zusammen.datatypes.item.Info; +import com.amdocs.zusammen.datatypes.item.Item; +import com.amdocs.zusammen.datatypes.item.ItemVersion; +import com.amdocs.zusammen.datatypes.item.ItemVersionData; +import com.amdocs.zusammen.datatypes.item.ItemVersionStatus; +import com.amdocs.zusammen.datatypes.item.Resolution; +import com.amdocs.zusammen.datatypes.itemversion.ItemVersionRevisions; +import com.amdocs.zusammen.datatypes.itemversion.Tag; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Optional; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import org.onap.sdc.common.zusammen.persistence.ZusammenConnector; +import org.onap.sdc.common.zusammen.services.ZusammenAdaptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class ZusammenAdaptorImpl implements ZusammenAdaptor { + + private final ZusammenConnector connector; + + @Autowired + public ZusammenAdaptorImpl(ZusammenConnector connector) { + this.connector = connector; + } + + @Override + public Optional<ElementInfo> getElementInfo(SessionContext context, ElementContext elementContext, Id elementId) { + return Optional.ofNullable(connector.getElementInfo(context, elementContext, elementId)); + } + + @Override + public Optional<Element> getElement(SessionContext context, ElementContext elementContext, Id elementId) { + return Optional.ofNullable(connector.getElement(context, elementContext, elementId)); + } + + @Override + public Optional<Element> getElementByName(SessionContext context, ElementContext elementContext, Id parentElementId, + String elementName) { + Collection<ElementInfo> elementInfos = connector.listElements(context, elementContext, parentElementId); + Predicate<ElementInfo> elementInfoPredicate = + elementInfo -> elementInfo.getInfo() != null && elementName.equals(elementInfo.getInfo().getName()); + return getFirstElementInfo(elementInfos, elementInfoPredicate) + .flatMap(elementInfo -> getElement(context, elementContext, elementInfo.getId())); + } + + @Override + public Collection<ElementInfo> listElements(SessionContext context, ElementContext elementContext, + Id parentElementId) { + return connector.listElements(context, elementContext, parentElementId); + } + + @Override + public Collection<Element> listElementData(SessionContext context, ElementContext elementContext, + Id parentElementId) { + Collection<ElementInfo> elementInfoList = connector.listElements(context, elementContext, parentElementId); + + return elementInfoList == null ? new ArrayList<>() : elementInfoList.stream().map(elementInfo -> connector + .getElement( + context, + elementContext, + elementInfo + .getId())) + .collect(Collectors.toList()); + } + + + @Override + public Collection<ElementInfo> listElementsByName(SessionContext context, ElementContext elementContext, + Id parentElementId, String elementName) { + Optional<ElementInfo> elementInfoByName = + getElementInfoByName(context, elementContext, parentElementId, elementName); + + return elementInfoByName.isPresent() ? + connector.listElements(context, elementContext, elementInfoByName.get().getId()) : + new ArrayList<>(); + } + + @Override + public Optional<ElementInfo> getElementInfoByName(SessionContext context, ElementContext elementContext, + Id parentElementId, String elementName) { + Collection<ElementInfo> elementInfos = connector.listElements(context, elementContext, parentElementId); + return getFirstElementInfo(elementInfos, + elementInfo -> elementInfo.getInfo() != null && elementName.equals(elementInfo.getInfo().getName())); + } + + @Override + public Optional<ElementConflict> getElementConflict(SessionContext context, ElementContext elementContext, + Id elementId) { + return Optional.ofNullable(connector.getElementConflict(context, elementContext, elementId)); + } + + @Override + public Element saveElement(SessionContext context, ElementContext elementContext, ZusammenElement element, + String message) { + enrichElementHierarchyRec(context, elementContext, null, element); + return connector.saveElement(context, elementContext, element, message); + } + + @Override + public void resolveElementConflict(SessionContext context, ElementContext elementContext, ZusammenElement element, + Resolution resolution) { + connector.resolveElementConflict(context, elementContext, element, resolution); + } + + private void enrichElementHierarchyRec(SessionContext context, ElementContext elementContext, Id parentElementId, + ZusammenElement element) { + if (element.getAction() == Action.CREATE) { + return; + } + locateElementAndUpdateAction(context, elementContext, parentElementId, element); + element.getSubElements().forEach( + subElement -> enrichElementHierarchyRec(context, elementContext, element.getElementId(), + (ZusammenElement) subElement)); + } + + // should be applied only for structural elements + private void locateElementAndUpdateAction(SessionContext context, ElementContext elementContext, Id parentElementId, + ZusammenElement element) { + if (element.getElementId() != null) { + return; + } + if (element.getInfo() == null || element.getInfo().getName() == null) { + throw new IllegalArgumentException("When saving element to zusammen - its Id or name must be supplied"); + } + Optional<ElementInfo> elementInfo = + getElementInfoByName(context, elementContext, parentElementId, element.getInfo().getName()); + if (elementInfo.isPresent()) { + element.setElementId(elementInfo.get().getId()); + if (element.getAction() == null) { + element.setAction(Action.IGNORE); + } + } else { + element.setAction(Action.CREATE); + } + } + + private Optional<ElementInfo> getFirstElementInfo(Collection<ElementInfo> elementInfos, + Predicate<ElementInfo> elementInfoPredicate) { + return elementInfos.stream().filter(elementInfoPredicate).findFirst(); + } + + @Override + public Collection<Item> listItems(SessionContext context) { + return connector.listItems(context); + } + + @Override + public Item getItem(SessionContext context, Id itemId) { + return connector.getItem(context, itemId); + } + + @Override + public Id createItem(SessionContext context, Info info) { + return connector.createItem(context, info); + } + + @Override + public void deleteItem(SessionContext context, Id itemId) { + connector.deleteItem(context, itemId); + } + + @Override + public void updateItem(SessionContext context, Id itemId, Info info) { + connector.updateItem(context, itemId, info); + } + + @Override + public Collection<ItemVersion> listPublicVersions(SessionContext context, Id itemId) { + return connector.listPublicVersions(context, itemId); + } + + @Override + public ItemVersion getPublicVersion(SessionContext context, Id itemId, Id versionId) { + return connector.getPublicVersion(context, itemId, versionId); + } + + @Override + public ItemVersion getVersion(SessionContext context, Id itemId, Id versionId) { + return connector.getVersion(context, itemId, versionId); + } + + @Override + public ItemVersionStatus getVersionStatus(SessionContext context, Id itemId, Id versionId) { + return connector.getVersionStatus(context, itemId, versionId); + } + + @Override + public ItemVersionConflict getVersionConflict(SessionContext context, Id itemId, Id versionId) { + return connector.getVersionConflict(context, itemId, versionId); + } + + @Override + public Id createVersion(SessionContext context, Id itemId, Id baseVersionId, ItemVersionData itemVersionData) { + return connector.createVersion(context, itemId, baseVersionId, itemVersionData); + } + + @Override + public void updateVersion(SessionContext context, Id itemId, Id versionId, ItemVersionData itemVersionData) { + connector.updateVersion(context, itemId, versionId, itemVersionData); + } + + @Override + public void tagVersion(SessionContext context, Id itemId, Id versionId, Tag tag) { + connector.tagVersion(context, itemId, versionId, tag); + } + + @Override + public void publishVersion(SessionContext context, Id itemId, Id versionId, String message) { + connector.publishVersion(context, itemId, versionId, message); + } + + @Override + public void syncVersion(SessionContext context, Id itemId, Id versionId) { + connector.syncVersion(context, itemId, versionId); + } + + @Override + public void forceSyncVersion(SessionContext context, Id itemId, Id versionId) { + connector.forceSyncVersion(context, itemId, versionId); + } + + @Override + public void cleanVersion(SessionContext context, Id itemId, Id versionId) { + connector.cleanVersion(context, itemId, versionId); + } + + @Override + public void revert(SessionContext context, Id itemId, Id versionId, Id revisionId) { + connector.revertVersionRevision(context, itemId, versionId, revisionId); + } + + @Override + public ItemVersionRevisions listRevisions(SessionContext context, Id itemId, Id versionId) { + return connector.listVersionRevisions(context, itemId, versionId); + } + + @Override + public Collection<HealthInfo> checkHealth(SessionContext context) { + return connector.checkHealth(context); + } + + @Override + public String getReleaseVersion(SessionContext context) { + return connector.getReleaseVersion(context); + } +} |