diff --git a/cnf/central.mvn b/cnf/central.mvn index 6dd01f4..0e4c57c 100644 --- a/cnf/central.mvn +++ b/cnf/central.mvn @@ -62,6 +62,10 @@ org.eclipse.platform:org.eclipse.equinox.preferences:3.10.100 org.eclipse.jdt:org.eclipse.jdt.core:3.32.0 org.eclipse.platform:org.eclipse.osgi:3.18.200 org.eclipse.platform:org.eclipse.text:3.12.300 +org.eclipse.emf:org.eclipse.emf.common:2.29.0 +org.eclipse.emf:org.eclipse.emf.ecore:2.35.0 +org.eclipse.emf:org.eclipse.emf.ecore.xcore.lib:1.7.0 +org.eclipse.emf:org.eclipse.emf.ecore.xmi:2.36.0 org.osgi:org.osgi.annotation.versioning:1.1.2 org.osgi:org.osgi.annotation.bundle:2.0.0 @@ -118,12 +122,22 @@ org.osgi:osgi.cmpn:7.0.0 org.slf4j:slf4j-simple:1.7.36 org.slf4j:slf4j-api:1.7.36 -org.geckoprojects.bnd:org.gecko.bnd.dimc.library:1.5.0 -org.geckoprojects.bnd:org.gecko.bnd.jacoco.library:1.5.0 -org.geckoprojects.bnd:org.gecko.bnd.osgitest.library:1.5.0 +org.geckoprojects.bnd:org.gecko.bnd.dimc.library:1.6.0 +org.geckoprojects.bnd:org.gecko.bnd.jacoco.library:1.6.0 +org.geckoprojects.bnd:org.gecko.bnd.osgitest.library:1.6.0 org.geckoprojects.emf:org.gecko.emf.osgi.bnd.library.workspace:6.0.1 org.geckoprojects.emf.utils:org.gecko.emf.util.jakartars.bnd.library.workspace:2.3.0 org.geckoprojects.persistence:org.gecko.emf.repository.bnd.library.workspace:6.1.0-SNAPSHOT org.eclipse.osgi-technology.rest:org.eclipse.osgitech.rest.bnd.library:1.2.2 +org.geckoprojects.emf:org.gecko.emf.osgi.example.model.basic:6.2.0 + org.bndtools:org.bndtools.templates.osgi:7.0.0 + +# Runtime Deps for fake PII generator +com.googlecode.libphonenumber:libphonenumber:8.13.50 +org.geckoprojects.libraries:net.datafaker:2.4.2-SNAPSHOT + +org.geckoprojects.emf.model:org.xmlsoap.model:1.0.0 +org.geckoprojects.emf.model:org.emau.icmvc.ganimed.ttp.cm2:1.0.0-SNAPSHOT + diff --git a/cnf/local/index.xml b/cnf/local/index.xml index c73ce6c..2640bee 100644 --- a/cnf/local/index.xml +++ b/cnf/local/index.xml @@ -1,2 +1,2 @@ - + diff --git a/cnf/local/index.xml.sha b/cnf/local/index.xml.sha new file mode 100644 index 0000000..3adabfe --- /dev/null +++ b/cnf/local/index.xml.sha @@ -0,0 +1 @@ +7d4feb1a8c44c30021d4161f8ab90517f8144c8a93730fd975b47eadc35163cb \ No newline at end of file diff --git a/org.avatar.gics.service/.classpath b/org.avatar.gics.service/.classpath new file mode 100644 index 0000000..a52eb82 --- /dev/null +++ b/org.avatar.gics.service/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/org.avatar.gics.service/.gitignore b/org.avatar.gics.service/.gitignore new file mode 100644 index 0000000..1c316c0 --- /dev/null +++ b/org.avatar.gics.service/.gitignore @@ -0,0 +1 @@ +/bin_test/ diff --git a/org.avatar.gics.service/.project b/org.avatar.gics.service/.project new file mode 100644 index 0000000..7f93e01 --- /dev/null +++ b/org.avatar.gics.service/.project @@ -0,0 +1,23 @@ + + + org.avatar.gics.service + + + + + + org.eclipse.jdt.core.javabuilder + + + + + bndtools.core.bndbuilder + + + + + + org.eclipse.jdt.core.javanature + bndtools.core.bndnature + + diff --git a/org.avatar.gics.service/.settings/org.eclipse.core.resources.prefs b/org.avatar.gics.service/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..570a54f --- /dev/null +++ b/org.avatar.gics.service/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +encoding//src/org/avatar/gics/service/api/GICSService.java=UTF-8 +encoding/=UTF-8 +encoding/bnd.bnd=UTF-8 +encoding/launch.bndrun=UTF-8 diff --git a/org.avatar.gics.service/.settings/org.eclipse.jdt.core.prefs b/org.avatar.gics.service/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..8c9943d --- /dev/null +++ b/org.avatar.gics.service/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,14 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/org.avatar.gics.service/bnd.bnd b/org.avatar.gics.service/bnd.bnd new file mode 100644 index 0000000..c7adbce --- /dev/null +++ b/org.avatar.gics.service/bnd.bnd @@ -0,0 +1,9 @@ +-library: enable-emf + +javac.source: 17 +javac.target: 17 + +Bundle-Version: ${project-version} +-buildpath: \ + org.xmlsoap.model,\ + org.emau.icmvc.ganimed.ttp.cm2 \ No newline at end of file diff --git a/org.avatar.gics.service/launch.bndrun b/org.avatar.gics.service/launch.bndrun new file mode 100644 index 0000000..bdd9c69 --- /dev/null +++ b/org.avatar.gics.service/launch.bndrun @@ -0,0 +1,33 @@ +#-runfw: org.apache.felix.framework;version=5 +#-runee: JavaSE-1.8 + +-runprovidedcapabilities: ${native_capability} + +-resolve.effective: active;skip:="osgi.service" + +-runbundles: \ + org.apache.felix.gogo.command;version='[1.1.2,1.1.3)',\ + org.apache.felix.gogo.runtime;version='[1.1.6,1.1.7)',\ + org.apache.felix.gogo.shell;version='[1.1.4,1.1.5)',\ + org.apache.felix.scr;version='[2.2.10,2.2.11)',\ + org.avatar.gics.service;version=snapshot,\ + org.osgi.service.component;version='[1.5.1,1.5.2)',\ + org.osgi.util.function;version='[1.2.0,1.2.1)',\ + org.osgi.util.promise;version='[1.3.0,1.3.1)',\ + org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ + org.apache.felix.metatype;version='[1.2.4,1.2.5)',\ + org.gecko.emf.osgi.component;version='[6.0.1,6.0.2)',\ + org.osgi.service.log;version='[1.5.0,1.5.1)',\ + org.osgi.util.converter;version='[1.0.9,1.0.10)',\ + org.eclipse.emf.common;version='[2.29.0,2.29.1)',\ + org.eclipse.emf.ecore;version='[2.35.0,2.35.1)',\ + org.eclipse.emf.ecore.xmi;version='[2.36.0,2.36.1)',\ + org.xmlsoap.model;version='[1.0.0,1.0.1)',\ + org.emau.icmvc.ganimed.ttp.cm2;version='[1.0.0,1.0.1)' + +-runrequires: \ + osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.shell)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)',\ + bnd.identity;id='org.avatar.gics.service' +-runfw: org.apache.felix.framework;version='[7.0.5,7.0.5]' +-runee: JavaSE-17 \ No newline at end of file diff --git a/org.avatar.gics.service/src/org/avatar/gics/service/api/GICSService.java b/org.avatar.gics.service/src/org/avatar/gics/service/api/GICSService.java new file mode 100644 index 0000000..8a1f702 --- /dev/null +++ b/org.avatar.gics.service/src/org/avatar/gics/service/api/GICSService.java @@ -0,0 +1,15 @@ +package org.avatar.gics.service.api; + +import org.emau.icmvc.ganimed.ttp.cm2.AddConsentResponse; +import org.emau.icmvc.ganimed.ttp.cm2.ConsentDTO; +import org.emau.icmvc.ganimed.ttp.cm2.GetAllConsentedIdsForResponse; +import org.osgi.annotation.versioning.ProviderType; + +@ProviderType +public interface GICSService { + + GetAllConsentedIdsForResponse getAllConsentedIdsFor(String domainName, String policyName, String policyVersion, String signerIdTypeName); + + AddConsentResponse addConsent(ConsentDTO consent); + +} diff --git a/org.avatar.gics.service/src/org/avatar/gics/service/api/GICSServiceConfig.java b/org.avatar.gics.service/src/org/avatar/gics/service/api/GICSServiceConfig.java new file mode 100644 index 0000000..c78a8f1 --- /dev/null +++ b/org.avatar.gics.service/src/org/avatar/gics/service/api/GICSServiceConfig.java @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2012 - 2024 Data In Motion and others. + * All rights reserved. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Data In Motion - initial API and implementation + */ +package org.avatar.gics.service.api; + +/** + * + * @author ilenia + * @since Nov 29, 2024 + */ +public @interface GICSServiceConfig { + + String url() default ""; + +} diff --git a/org.avatar.gics.service/src/org/avatar/gics/service/api/package-info.java b/org.avatar.gics.service/src/org/avatar/gics/service/api/package-info.java new file mode 100644 index 0000000..91e13e3 --- /dev/null +++ b/org.avatar.gics.service/src/org/avatar/gics/service/api/package-info.java @@ -0,0 +1,3 @@ +@org.osgi.annotation.versioning.Version("1.0.0") +@org.osgi.annotation.bundle.Export +package org.avatar.gics.service.api; \ No newline at end of file diff --git a/org.avatar.gics.service/src/org/avatar/gics/service/impl/GICSServiceHelper.java b/org.avatar.gics.service/src/org/avatar/gics/service/impl/GICSServiceHelper.java new file mode 100644 index 0000000..0095ead --- /dev/null +++ b/org.avatar.gics.service/src/org/avatar/gics/service/impl/GICSServiceHelper.java @@ -0,0 +1,50 @@ +/** + * Copyright (c) 2012 - 2024 Data In Motion and others. + * All rights reserved. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Data In Motion - initial API and implementation + */ +package org.avatar.gics.service.impl; + +import org.emau.icmvc.ganimed.ttp.cm2.Cm2Factory; +import org.emau.icmvc.ganimed.ttp.cm2.GetAllConsentedIdsFor; +import org.emau.icmvc.ganimed.ttp.cm2.PolicyKeyDTO; +import org.emau.icmvc.ganimed.ttp.cm2.config.CheckConsentConfig; +import org.emau.icmvc.ganimed.ttp.cm2.config.ConfigFactory; + +/** + * + * @author ilenia + * @since Nov 29, 2024 + */ +public class GICSServiceHelper { + + private GICSServiceHelper() { + + } + + public static GetAllConsentedIdsFor createGetAllConsentedIdsForRequest(String domainName, String policyName, + String policyVersion, String signerIdTypeName) { + + GetAllConsentedIdsFor request = Cm2Factory.eINSTANCE.createGetAllConsentedIdsFor(); + request.setSignerIdTypeName(signerIdTypeName); + PolicyKeyDTO policyKey = Cm2Factory.eINSTANCE.createPolicyKeyDTO(); + policyKey.setDomainName(domainName); + policyKey.setName(policyName); + policyKey.setVersion(policyVersion); + request.setPolicyKey(policyKey); + CheckConsentConfig consentConfig = ConfigFactory.eINSTANCE.createCheckConsentConfig(); + consentConfig.setIgnoreVersionNumber(false); + request.setConfig(consentConfig); + request.setConfig(consentConfig); + return request; + } + +} diff --git a/org.avatar.gics.service/src/org/avatar/gics/service/impl/GICSServiceImpl.java b/org.avatar.gics.service/src/org/avatar/gics/service/impl/GICSServiceImpl.java new file mode 100644 index 0000000..be15ba0 --- /dev/null +++ b/org.avatar.gics.service/src/org/avatar/gics/service/impl/GICSServiceImpl.java @@ -0,0 +1,182 @@ +/** + * Copyright (c) 2012 - 2024 Data In Motion and others. + * All rights reserved. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Data In Motion - initial API and implementation + */ +package org.avatar.gics.service.impl; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.UUID; +import java.util.logging.Logger; + +import org.avatar.gics.service.api.GICSService; +import org.avatar.gics.service.api.GICSServiceConfig; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.util.FeatureMap; +import org.emau.icmvc.ganimed.ttp.cm2.AddConsent; +import org.emau.icmvc.ganimed.ttp.cm2.AddConsentResponse; +import org.emau.icmvc.ganimed.ttp.cm2.Cm2Factory; +import org.emau.icmvc.ganimed.ttp.cm2.Cm2Package; +import org.emau.icmvc.ganimed.ttp.cm2.ConsentDTO; +import org.emau.icmvc.ganimed.ttp.cm2.GetAllConsentedIdsFor; +import org.emau.icmvc.ganimed.ttp.cm2.GetAllConsentedIdsForResponse; +import org.gecko.emf.osgi.annotation.require.RequireEMF; +import org.gecko.emf.osgi.constants.EMFNamespaces; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.ConfigurationPolicy; +import org.osgi.service.component.annotations.Reference; +import org.xmlsoap.schemas.envelope.Body; +import org.xmlsoap.schemas.envelope.DocumentRoot; +import org.xmlsoap.schemas.envelope.Envelope; +import org.xmlsoap.schemas.envelope.EnvelopeFactory; +import org.xmlsoap.schemas.envelope.EnvelopePackage; + +/** + * + * @author ilenia + * @since Nov 28, 2024 + */ +@RequireEMF +@Component(name = "GICSService", configurationPid = "GICSService", configurationPolicy = ConfigurationPolicy.REQUIRE) +public class GICSServiceImpl implements GICSService { + + @Reference(target = "(&("+EMFNamespaces. EMF_MODEL_CONTENT_TYPE+"=soap)("+EMFNamespaces.EMF_MODEL_NAME+"=cm2))") + ResourceSet rs; + + @Reference(target = "("+EMFNamespaces.EMF_MODEL_CONTENT_TYPE+"=soap)") + EnvelopePackage soapPackage; + + @Reference(target = "("+EMFNamespaces.EMF_MODEL_NAME+"=cm2)") + Cm2Package cm2Package; + + private static final Logger LOGGER = Logger.getLogger(GICSServiceImpl.class.getName()); + private GICSServiceConfig config; + + @Activate + public void activate(GICSServiceConfig config) { + this.config = config; + } + + /* + * (non-Javadoc) + * @see org.avatar.gics.service.api.GICSService#getAllConsentedIdsFor(java.lang.String, java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public GetAllConsentedIdsForResponse getAllConsentedIdsFor(String domainName, String policyName, + String policyVersion, String signerIdTypeName) { + + org.emau.icmvc.ganimed.ttp.cm2.DocumentRoot gICSRoot = Cm2Factory.eINSTANCE.createDocumentRoot(); + GetAllConsentedIdsFor request = GICSServiceHelper.createGetAllConsentedIdsForRequest(domainName, policyName, policyVersion, signerIdTypeName); + gICSRoot.setGetAllConsentedIdsFor(request); + + DocumentRoot soapRoot = EnvelopeFactory.eINSTANCE.createDocumentRoot(); + Envelope envelope = EnvelopeFactory.eINSTANCE.createEnvelope(); + Body body = EnvelopeFactory.eINSTANCE.createBody(); + envelope.setBody(body); + soapRoot.setEnvelope(envelope); + + body.getAny().add(cm2Package.getDocumentRoot_GetAllConsentedIdsFor(), request); + Resource resource = rs.createResource(URI.createURI(config.url()), "soap"); + resource.getContents().add(soapRoot); + + try { + HttpURLConnection connection = setupConnection("POST"); + resource.save(connection.getOutputStream(), null); + int responseCode = connection.getResponseCode(); + if (responseCode == 200 ) { + // InputStream result = dwdCon.getInputStream(); + Resource responseResource = rs.createResource(URI.createURI(UUID.randomUUID().toString()+".soap"), "soap"); + responseResource.load(connection.getInputStream(), null); + DocumentRoot response = (DocumentRoot) responseResource.getContents().get(0); + FeatureMap mixed = response.getMixed(); + Envelope responseEnvelope = (Envelope) mixed.get(soapPackage.getDocumentRoot_Envelope(), true); + GetAllConsentedIdsForResponse responseBody = (GetAllConsentedIdsForResponse) responseEnvelope.getBody().getAny().get(0).getValue(); + return responseBody; + } else { + LOGGER.warning(String.format("Unexpected response code %d for request GetAllConsentedIdsFor", responseCode)); + return null; + } + + } catch(IOException e) { + LOGGER.severe(String.format("IOException while sending request GetAllConsentedIdsFor")); + e.printStackTrace(); + return null; + } + } + + /* + * (non-Javadoc) + * @see org.avatar.gics.service.api.GICSService#addConsent(org.emau.icmvc.ganimed.ttp.cm2.ConsentDTO) + */ + @Override + public AddConsentResponse addConsent(ConsentDTO consent) { + org.emau.icmvc.ganimed.ttp.cm2.DocumentRoot gICSRoot = Cm2Factory.eINSTANCE.createDocumentRoot(); + AddConsent request = Cm2Factory.eINSTANCE.createAddConsent(); + request.setConsent(consent); + gICSRoot.setAddConsent(request); + + DocumentRoot soapRoot = EnvelopeFactory.eINSTANCE.createDocumentRoot(); + Envelope envelope = EnvelopeFactory.eINSTANCE.createEnvelope(); + Body body = EnvelopeFactory.eINSTANCE.createBody(); + envelope.setBody(body); + soapRoot.setEnvelope(envelope); + + body.getAny().add(cm2Package.getDocumentRoot_AddConsent(), request); + Resource resource = rs.createResource(URI.createURI(config.url()), "soap"); + resource.getContents().add(soapRoot); + + try { + HttpURLConnection connection = setupConnection("POST"); + resource.save(connection.getOutputStream(), null); + int responseCode = connection.getResponseCode(); + if (responseCode == 200 ) { + // InputStream result = dwdCon.getInputStream(); + Resource responseResource = rs.createResource(URI.createURI(UUID.randomUUID().toString()+".soap"), "soap"); + responseResource.load(connection.getInputStream(), null); + DocumentRoot response = (DocumentRoot) responseResource.getContents().get(0); + FeatureMap mixed = response.getMixed(); + Envelope responseEnvelope = (Envelope) mixed.get(soapPackage.getDocumentRoot_Envelope(), true); + AddConsentResponse responseBody = (AddConsentResponse) responseEnvelope.getBody().getAny().get(0).getValue(); + LOGGER.info(String.format("Got response request AddConsent")); + return responseBody; + } else { + LOGGER.warning(String.format("Unexpected response code %d for request AddConsent", responseCode)); + return null; + } + + } catch(IOException e) { + LOGGER.severe(String.format("IOException while sending request AddConsent")); + e.printStackTrace(); + return null; + } + } + + + private HttpURLConnection setupConnection(String methodType) throws IOException { + + URL url = new URL(config.url()); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.addRequestProperty("Accept", "*/*"); + connection.addRequestProperty("Content-Type", "text/plain"); + connection.addRequestProperty("SOAPAction", ""); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setRequestMethod(methodType); + return connection; + } + + +} diff --git a/org.avatar.gics.service/src/org/avatar/gics/service/impl/package-info.java b/org.avatar.gics.service/src/org/avatar/gics/service/impl/package-info.java new file mode 100644 index 0000000..23f6f40 --- /dev/null +++ b/org.avatar.gics.service/src/org/avatar/gics/service/impl/package-info.java @@ -0,0 +1,2 @@ +@org.osgi.annotation.versioning.Version("1.0.0") +package org.avatar.gics.service.impl; \ No newline at end of file diff --git a/org.avatar.himsa.dummy.data.component/.classpath b/org.avatar.himsa.dummy.data.component/.classpath new file mode 100644 index 0000000..a52eb82 --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/.classpath @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/org.avatar.himsa.dummy.data.component/.gitignore b/org.avatar.himsa.dummy.data.component/.gitignore new file mode 100644 index 0000000..1c316c0 --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/.gitignore @@ -0,0 +1 @@ +/bin_test/ diff --git a/org.avatar.himsa.dummy.data.component/.project b/org.avatar.himsa.dummy.data.component/.project new file mode 100644 index 0000000..107a6be --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/.project @@ -0,0 +1,23 @@ + + + org.avatar.himsa.dummy.data.component + + + + + + org.eclipse.jdt.core.javabuilder + + + + + bndtools.core.bndbuilder + + + + + + org.eclipse.jdt.core.javanature + bndtools.core.bndnature + + diff --git a/org.avatar.himsa.dummy.data.component/.settings/org.eclipse.core.resources.prefs b/org.avatar.himsa.dummy.data.component/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..b9aeb83 --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +encoding//src/org/avatar/himsa/dummy/data/component/DummyDataComponent.java=UTF-8 +encoding/=UTF-8 +encoding/bnd.bnd=UTF-8 +encoding/launch.bndrun=UTF-8 diff --git a/org.avatar.himsa.dummy.data.component/.settings/org.eclipse.jdt.core.prefs b/org.avatar.himsa.dummy.data.component/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..8c9943d --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,14 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=17 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=17 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.release=enabled +org.eclipse.jdt.core.compiler.source=17 diff --git a/org.avatar.himsa.dummy.data.component/bnd.bnd b/org.avatar.himsa.dummy.data.component/bnd.bnd new file mode 100644 index 0000000..78c24d6 --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/bnd.bnd @@ -0,0 +1,17 @@ +-library: enable-emf + +Bundle-Version: ${project-version} +-privatepackage: org.avatar.himsa.dummy.data.component +-buildpath: \ + org.gecko.emf.repository.api,\ + org.gecko.emf.repository.mongo,\ + osgi.cmpn,\ + org.avatar.himsa.model;version=latest,\ + org.gecko.emf.mongo.component,\ + net.datafaker;version=latest,\ + org.emau.icmvc.ganimed.ttp.cm2,\ + org.avatar.gics.service;version=latest + +-includeresource: OSGI-INF/configurator/=config/ +Require-Capability: \ + osgi.extender;filter:='(osgi.extender=osgi.configurator)' \ No newline at end of file diff --git a/org.avatar.himsa.dummy.data.component/config/config.json b/org.avatar.himsa.dummy.data.component/config/config.json new file mode 100644 index 0000000..403af08 --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/config/config.json @@ -0,0 +1,15 @@ +{ + ":configurator:resource-version": 1, + + "EMFMongoRepositoryConfigurator": + { + "mongo.instances": "test1", + "test1.baseUris": "mongodb://localhost:27017", + "test1.databases": "test", + "test1.test.repoType": "PROTOTYPE" + }, + "GICSService~test": + { + "url": "http://localhost:8080/gics/gicsService" + } +} \ No newline at end of file diff --git a/org.avatar.himsa.dummy.data.component/gics_data/2024-12-02 AVATAR COMPLETE.json b/org.avatar.himsa.dummy.data.component/gics_data/2024-12-02 AVATAR COMPLETE.json new file mode 100644 index 0000000..0869b2f --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/gics_data/2024-12-02 AVATAR COMPLETE.json @@ -0,0 +1 @@ +{"resourceType":"ExchangeFormatDefinition","meta":{"profile":["http://example.com/StructureDefinition/dontuse#ExchangeFormatDefinition"]},"supportedVersion":"2024.2.0","domain":{"name":"avatar","finalized":true,"label":"AVATAR","signerIdType":["Patient ID"],"policyVersionConverter":"org.emau.icmvc.ganimed.ttp.cm2.version.MajorMinorVersionConverter","moduleVersionConverter":"org.emau.icmvc.ganimed.ttp.cm2.version.MajorMinorVersionConverter","consentTemplateVersionConverter":"org.emau.icmvc.ganimed.ttp.cm2.version.MajorMinorVersionConverter","config":{"qualityControl":{"types":[{"id":"checked_major_faults","labels":[{"lang":"de","value":"Checked, major faults"},{"lang":"en","value":"Checked, major faults"}],"status":"INVALID"},{"id":"checked_minor_faults","status":"VALID"},{"id":"invalidated","labels":[{"lang":"de","value":"Invalidated"},{"lang":"en","value":"Invalidated"}],"status":"INVALID"},{"id":"checked_no_faults","status":"VALID"},{"id":"###_auto_generated_###","status":"VALID"},{"id":"not_checked","status":"VALID"}],"defaultType":"not_checked"},"statistic":{"calculateDocumentDetails":true,"calculatePolicyDetails":true},"policies":{"permanentRevoke":false,"takeHighestVersionInsteadOfNewest":false,"takeMostSpecificValidityInsteadOfShortest":false},"scans":{"mandatory":false,"sizeLimit":10485760},"notifications":{"sendFromWeb":false},"application":{"enableChromePdfExport":false,"templateTypes":["REVOCATION","REFUSAL","CONSENT"]}},"creationDate":"2024-11-28T13:35:26+01:00"},"policiesConsentPolicy":[{"domainName":"avatar","name":"medical_history_policy","label":"Medical History Policy","version":"1.0","finalized":false},{"domainName":"avatar","name":"hearing_policy","label":"Hearing Policy","version":"1.0","finalized":false}],"modulesConsentModule":[{"domainName":"avatar","name":"medical_history_module","label":"Medical History Module","version":"1.0","title":"
Medical History Module
","text":"
I give my consent to the collection, storage, processing and scientific use of my medical history data
","policiesAssignedConsentPolicy":[{"policyKey":"avatar;medical_history_policy;1.0"}],"finalized":true},{"domainName":"avatar","name":"hearing_module","label":"Hearing Module","version":"1.0","title":"
Hearing Module
","text":"
I give my consent to the collection, storage, processing and scientific use of my hearing data
","policiesAssignedConsentPolicy":[{"policyKey":"avatar;hearing_policy;1.0"}],"finalized":true}],"templatesConsentTemplate":[{"domainName":"avatar","Name":"test_avatar_consent","Label":"Test Avatar Consent","version":"1.0","type":"CONSENT","title":"
Test Avatar Consent Form
","header":"
Test Avatar Consent Form
","modulesAssignedConsentModule":[{"displayCheckBoxes":["ACCEPTED","DECLINED"],"mandatory":false,"moduleKey":"avatar;medical_history_module;1.0","orderNumber":1},{"displayCheckBoxes":["ACCEPTED","DECLINED"],"mandatory":false,"moduleKey":"avatar;hearing_module;1.0","orderNumber":0}],"finalized":true}]} \ No newline at end of file diff --git a/org.avatar.himsa.dummy.data.component/gics_data/ImportInstructions1.png b/org.avatar.himsa.dummy.data.component/gics_data/ImportInstructions1.png new file mode 100644 index 0000000..1b05457 Binary files /dev/null and b/org.avatar.himsa.dummy.data.component/gics_data/ImportInstructions1.png differ diff --git a/org.avatar.himsa.dummy.data.component/gics_data/ImportInstructions2.png b/org.avatar.himsa.dummy.data.component/gics_data/ImportInstructions2.png new file mode 100644 index 0000000..e649b94 Binary files /dev/null and b/org.avatar.himsa.dummy.data.component/gics_data/ImportInstructions2.png differ diff --git a/org.avatar.himsa.dummy.data.component/gics_data/README.md b/org.avatar.himsa.dummy.data.component/gics_data/README.md new file mode 100644 index 0000000..c8bba39 --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/gics_data/README.md @@ -0,0 +1,31 @@ +# gICS Data + +The file `2024-12-02 AVATAR COMPLETE.json` contains the gICS data that needs to be imported when launching the gICS container. + +In particular, it contains the definition of: + ++ The *AVATAR* domain (key `avatar`); ++ Two policy definitions associated which the AVATAR domain + + `hearing_policy` + + `medical_history_policy` ++ Two module definitions associated with the AVATAR domain + + `hearing_module` (to which the `hearing_policy` corresponds) + + `medical_history_module` (to which the `medical_history_policy` corresponds) ++ One consent template form, associated with the AVATAR domain and than contains the two modules (key `test_avatar_consent`) + +To import the file, simply launch the gICS application through `docker-compose` (it can be downloaded [here](https://www.ths-greifswald.de/en/researchers-general-public/gics/)). + +The UI is then available under `http://localhost:8080/gics-web` + +Once in the UI, click on the `Import/Export` button and then select the `json` file to import. + +![](./ImportInstructions1.png) + +After selecting the `json` file you should see something like this: + +![](./ImportInstructions2.png) + +Remember to check the `Finalised imported elements` checkbox and then click `Import` + +Now you have everything you need to start the avatar app and create some fake patients and some fake contents in the gICS system. + diff --git a/org.avatar.himsa.dummy.data.component/launch.bndrun b/org.avatar.himsa.dummy.data.component/launch.bndrun new file mode 100644 index 0000000..77a93ff --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/launch.bndrun @@ -0,0 +1,56 @@ +#-runfw: org.apache.felix.framework;version=5 +#-runee: JavaSE-1.8 + +-runprovidedcapabilities: ${native_capability} + +-resolve.effective: active;skip:="osgi.service" + +-runbundles: \ + org.apache.felix.cm.json;version='[2.0.4,2.0.5)',\ + org.apache.felix.configadmin;version='[1.9.26,1.9.27)',\ + org.apache.felix.configurator;version='[1.0.18,1.0.19)',\ + org.apache.felix.gogo.command;version='[1.1.2,1.1.3)',\ + org.apache.felix.gogo.runtime;version='[1.1.6,1.1.7)',\ + org.apache.felix.gogo.shell;version='[1.1.4,1.1.5)',\ + org.apache.felix.metatype;version='[1.2.4,1.2.5)',\ + org.apache.felix.scr;version='[2.2.10,2.2.11)',\ + org.avatar.himsa.dummy.data.component;version=snapshot,\ + org.avatar.himsa.model;version=snapshot,\ + org.eclipse.parsson.jakarta.json;version='[1.1.5,1.1.6)',\ + org.gecko.emf.collections;version='[2.2.2,2.2.3)',\ + org.gecko.emf.mongo.component;version='[6.1.0,6.1.1)',\ + org.gecko.emf.osgi.component;version='[6.0.1,6.0.2)',\ + org.gecko.emf.repository.api;version='[9.3.0,9.3.1)',\ + org.gecko.mongo.osgi.component;version='[6.1.0,6.1.1)',\ + org.mongodb.mongo-java-driver;version='[3.12.14,3.12.15)',\ + org.osgi.service.component;version='[1.5.1,1.5.2)',\ + org.osgi.service.log;version='[1.5.0,1.5.1)',\ + org.osgi.service.metatype;version='[1.4.1,1.4.2)',\ + org.osgi.util.converter;version='[1.0.9,1.0.10)',\ + org.osgi.util.function;version='[1.2.0,1.2.1)',\ + org.osgi.util.promise;version='[1.3.0,1.3.1)',\ + org.gecko.emf.mongo.pushstream;version='[6.1.0,6.1.1)',\ + org.gecko.emf.pushstreams;version='[1.2.2,1.2.3)',\ + org.gecko.emf.repository.mongo;version='[3.2.0,3.2.1)',\ + org.osgi.util.pushstream;version='[1.1.0,1.1.1)',\ + com.googlecode.libphonenumber;version='[8.13.50,8.13.51)',\ + net.datafaker;version='[2.4.2,2.4.3)',\ + org.eclipse.emf.common;version='[2.29.0,2.29.1)',\ + org.eclipse.emf.ecore;version='[2.35.0,2.35.1)',\ + org.eclipse.emf.ecore.xmi;version='[2.36.0,2.36.1)',\ + org.emau.icmvc.ganimed.ttp.cm2;version='[1.0.0,1.0.1)',\ + org.avatar.gics.service;version=snapshot,\ + org.xmlsoap.model;version='[1.0.0,1.0.1)' + +-runrequires: \ + osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.shell)',\ + osgi.identity;filter:='(osgi.identity=org.apache.felix.gogo.command)',\ + bnd.identity;id='org.avatar.himsa.dummy.data.component',\ + bnd.identity;id='org.mongodb.mongo-java-driver',\ + bnd.identity;id='org.gecko.emf.mongo.component',\ + bnd.identity;id='org.gecko.emf.mongo.pushstream',\ + bnd.identity;id='org.gecko.mongo.osgi.component',\ + bnd.identity;id='org.gecko.emf.repository.mongo',\ + bnd.identity;id='org.gecko.emf.osgi.component' +-runfw: org.apache.felix.framework;version='[7.0.5,7.0.5]' +-runee: JavaSE-17 \ No newline at end of file diff --git a/org.avatar.himsa.dummy.data.component/src/org/avatar/himsa/dummy/data/component/DummyDataComponent.java b/org.avatar.himsa.dummy.data.component/src/org/avatar/himsa/dummy/data/component/DummyDataComponent.java new file mode 100644 index 0000000..14e0f1d --- /dev/null +++ b/org.avatar.himsa.dummy.data.component/src/org/avatar/himsa/dummy/data/component/DummyDataComponent.java @@ -0,0 +1,250 @@ +package org.avatar.himsa.dummy.data.component; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Collection; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.Locale; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; + +import org.avatar.gics.service.api.GICSService; +import org.avatar.himsa.export.Patient; +import org.avatar.himsa.export.PatientExportFactory; +import org.avatar.himsa.export.PatientExportPackage; +import org.eclipse.emf.ecore.EObject; +import org.emau.icmvc.ganimed.ttp.cm2.Cm2Factory; +import org.emau.icmvc.ganimed.ttp.cm2.ConsentDTO; +import org.emau.icmvc.ganimed.ttp.cm2.ConsentKeyDTO; +import org.emau.icmvc.ganimed.ttp.cm2.ConsentStatus; +import org.emau.icmvc.ganimed.ttp.cm2.ConsentTemplateKeyDTO; +import org.emau.icmvc.ganimed.ttp.cm2.ConsentTemplateType; +import org.emau.icmvc.ganimed.ttp.cm2.EntryType1; +import org.emau.icmvc.ganimed.ttp.cm2.ModuleKeyDTO; +import org.emau.icmvc.ganimed.ttp.cm2.ModuleStateDTO; +import org.emau.icmvc.ganimed.ttp.cm2.ModuleStatesType; +import org.emau.icmvc.ganimed.ttp.cm2.Qcdto; +import org.emau.icmvc.ganimed.ttp.cm2.SignerIdDTO; +import org.gecko.emf.repository.EMFRepository; +import org.osgi.service.component.ComponentServiceObjects; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Reference; +import org.osgi.util.promise.PromiseFactory; + +import net.datafaker.Faker; + +@Component(immediate=true, name="DummyDataComponent") +public class DummyDataComponent { + + @Reference(target="(repo_id=test1.test)") + ComponentServiceObjects repoSO; + + @Reference + GICSService gicsService; + + private static final Logger LOGGER = Logger.getLogger(DummyDataComponent.class.getName()); + private static final List HEALTH_INSURANCE_COMPANIES_GERMANY = List.of("AOK", "BARMER", "HKK", "hkk health insurance", "KNIGHTSHAFT", + "DAK health", "KKH", "Techniker Krankenkasse", "TK", "HEK", "Hanseatic Health Insurance", "BKK", "IKK"); + + private Faker faker = new Faker(new Locale("de")); + private PromiseFactory factory = new PromiseFactory(Executors.newFixedThreadPool(4)); + + @Activate + public void activate() { + factory.submit(() -> { + doCreateDummyData(); + return true; + }).onSuccess(t -> LOGGER.info("Finished creating dummy data!")) + .onFailure(t -> LOGGER.log(Level.SEVERE, String.format("Something went wrong when creating dummy data!"), t)); + } + + + private void doCreateDummyData() { + EMFRepository repo = repoSO.getService(); + try { + List existingPatients = repo.getAllEObjects(PatientExportPackage.eINSTANCE.getPatient()); + boolean createPatients = existingPatients.isEmpty(); + + if(createPatients) { + Collection patients = createDummyPatients(10); + repo.save(patients.stream().map(mr -> (EObject) mr).toList()); + for(Patient patient : patients) { + ConsentDTO consent = doCreateDummyConsent(patient); + gicsService.addConsent(consent); + } + } + } finally { + repoSO.ungetService(repo); + } + + } + + + + private Collection createDummyPatients(int numberOfInstances) { + List patients = new ArrayList<>(numberOfInstances); + for(int i = 0; i < numberOfInstances; i++) { + patients.add(doCreateDummyPatient()); + } + return patients; + } + + + private Patient doCreateDummyPatient() { + Patient patient = PatientExportFactory.eINSTANCE.createPatient(); + patient.setFirstName(faker.name().firstName()); + patient.setLastName(faker.name().lastName()); + patient.setMiddleName(faker.name().firstName()); +// patient.setGender((GenderType) selectRandomElement(GenderType.values())); + patient.setTitle(faker.name().title()); + + patient.setCity(faker.address().city()); + patient.setZip(faker.address().zipCode()); + patient.setProvince(faker.address().state()); + patient.setCountry("Germany"); + StringBuilder sb = new StringBuilder(patient.getCity()); + sb.append(","+patient.getZip()); + sb.append(","+patient.getProvince()); + sb.append(","+patient.getCountry()); + patient.setAddress1(sb.toString()); + + patient.setEMail(faker.internet().emailAddress()); + patient.setHomeTelephone(faker.phoneNumber().phoneNumber()); + patient.setWorkTelephone(faker.phoneNumber().phoneNumber()); + + patient.setInsurance1((String) selectRandomElement(HEALTH_INSURANCE_COMPANIES_GERMANY.toArray(new String[] {}))); + patient.setSSNumber(faker.idNumber().ssnValid()); + + patient.setPhysician("Dr ".concat(faker.name().firstName().concat(" " + faker.name().lastName()))); + patient.setReferral(faker.name().fullName()); + + patient.setPatientNo(faker.number().digits(6)); + patient.setPatientGUID(UUID.randomUUID().toString()); + patient.setUserId(UUID.randomUUID().toString()); + patient.setActivePatient((Boolean) selectRandomElement(new Boolean[] {Boolean.TRUE, Boolean.FALSE})); + + try { + GregorianCalendar c = new GregorianCalendar(); + c.setTime(faker.date().birthday()); + XMLGregorianCalendar xmlCalendar; + xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); + patient.setBirthDate(xmlCalendar); + + c.setTime(faker.date().past(7, TimeUnit.DAYS)); + xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); + patient.setCreateDate(xmlCalendar); + } catch (DatatypeConfigurationException e) { + e.printStackTrace(); + } + + return patient; + } + + private ConsentDTO doCreateDummyConsent(Patient patient) { + ConsentDTO consent = Cm2Factory.eINSTANCE.createConsentDTO(); + consent.setTemplateType(ConsentTemplateType.CONSENT); + ConsentKeyDTO consentKey = Cm2Factory.eINSTANCE.createConsentKeyDTO(); + ConsentTemplateKeyDTO consentTemplateKey = Cm2Factory.eINSTANCE.createConsentTemplateKeyDTO(); + consentTemplateKey.setDomainName("avatar"); + consentTemplateKey.setName("test_avatar_consent"); + consentTemplateKey.setVersion("1.0"); + consentKey.setConsentTemplateKey(consentTemplateKey); + SignerIdDTO sid = Cm2Factory.eINSTANCE.createSignerIdDTO(); + sid.setIdType("Patient ID"); + sid.setId(patient.getPatientGUID()); + consentKey.getSignerIds().add(sid); + consent.setKey(consentKey); + ModuleStatesType mst1 = Cm2Factory.eINSTANCE.createModuleStatesType(); + EntryType1 et1 = Cm2Factory.eINSTANCE.createEntryType1(); + ModuleKeyDTO mk = Cm2Factory.eINSTANCE.createModuleKeyDTO(); + mk.setDomainName("avatar"); + mk.setName("hearing_module"); + mk.setVersion("1.0"); + et1.setKey(mk); + ModuleStateDTO ms = Cm2Factory.eINSTANCE.createModuleStateDTO(); + ms.setConsentState((ConsentStatus) selectRandomElement(new ConsentStatus[] {ConsentStatus.ACCEPTED, ConsentStatus.DECLINED})); + et1.setValue(ms); + + EntryType1 et2 = Cm2Factory.eINSTANCE.createEntryType1(); + ModuleKeyDTO mk2 = Cm2Factory.eINSTANCE.createModuleKeyDTO(); + mk2.setDomainName("avatar"); + mk2.setName("medical_history_module"); + mk2.setVersion("1.0"); + et2.setKey(mk2); + ModuleStateDTO ms2 = Cm2Factory.eINSTANCE.createModuleStateDTO(); + ms2.setConsentState((ConsentStatus) selectRandomElement(new ConsentStatus[] {ConsentStatus.ACCEPTED, ConsentStatus.DECLINED})); + et2.setValue(ms2); + + mst1.getEntry().add(et1); + mst1.getEntry().add(et2); + consent.setModuleStates(mst1); + + consent.setPatientSignatureIsFromGuardian(false); + consent.setPatientSigningPlace(faker.address().city()); + consent.setPatientSignatureBase64(Base64.getEncoder().encodeToString(faker.name().fullName().getBytes())); + + consent.setPhysicianId(patient.getPhysician()); + consent.setPhysicianSigningPlace(faker.address().city()); + consent.setPhysicianSignatureBase64(Base64.getEncoder().encodeToString(faker.name().fullName().getBytes())); + Qcdto qualityControl = Cm2Factory.eINSTANCE.createQcdto(); + try { + GregorianCalendar c = new GregorianCalendar(); + Timestamp d1 = faker.date().past(100, 7, TimeUnit.DAYS); + Timestamp d2 = faker.date().past(100, 7, TimeUnit.DAYS); + Timestamp d3 = faker.date().past(100, 7, TimeUnit.DAYS); + + Timestamp creation = d1.before(d2) ? d1 : d2; + creation = creation.before(d3) ? creation : d3; + Timestamp patientSig = creation.before(d3) ? d3 : creation; + Timestamp physicianSig = faker.date().between(patientSig, faker.date().past(6, TimeUnit.DAYS)); + + c.setTime(creation.equals(d1) ? d2 : d1); + XMLGregorianCalendar xmlCalendar; + xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); + consent.setCreationDate(xmlCalendar); + consentKey.setConsentDate(xmlCalendar); + + c = new GregorianCalendar(); + c.setTime(patientSig); + xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); + consent.setPatientSigningDate(xmlCalendar); + + c = new GregorianCalendar(); + c.setTime(physicianSig); + xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); + consent.setPhysicianSigningDate(xmlCalendar); + + Timestamp d4 = faker.date().past(7, TimeUnit.DAYS); + c = new GregorianCalendar(); + c.setTime(d4); + xmlCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); + qualityControl.setDate(xmlCalendar); + } catch (DatatypeConfigurationException e) { + e.printStackTrace(); + } + + qualityControl.setInspector(faker.name().fullName()); + qualityControl.setType((String) selectRandomElement(new String[] {"checked_minor_faults", "checked_no_faults"})); + consent.setQualityControl(qualityControl); + return consent; + } + + private Object selectRandomElement(T[] elements) { + Random rndm = new Random(); + int rndmIndx = rndm.nextInt(elements.length); + Object rndmElem = elements[rndmIndx]; + return rndmElem; + } + +} diff --git a/org.avatar.himsa.rest/bnd.bnd b/org.avatar.himsa.rest/bnd.bnd index f90fdfd..dc66fd9 100644 --- a/org.avatar.himsa.rest/bnd.bnd +++ b/org.avatar.himsa.rest/bnd.bnd @@ -4,7 +4,8 @@ org.gecko.emf.rest.jakartars;version=latest,\ org.gecko.emf.json;version=latest,\ org.avatar.himsa.model;version=project,\ - org.avatar.himsa.service.example + org.avatar.himsa.service.example,\ + org.gecko.emf.util.model -library: \ enableJakartaREST,\ diff --git a/org.avatar.himsa.rest/src/org/avatar/himsa/rest/DemoResource.java b/org.avatar.himsa.rest/src/org/avatar/himsa/rest/DemoResource.java index 3ac2fac..83d410f 100644 --- a/org.avatar.himsa.rest/src/org/avatar/himsa/rest/DemoResource.java +++ b/org.avatar.himsa.rest/src/org/avatar/himsa/rest/DemoResource.java @@ -13,10 +13,12 @@ */ package org.avatar.himsa.rest; +import java.util.List; import java.util.Objects; import org.avatar.himsa.export.Patient; import org.avatar.himsa.service.example.api.PatientService; +import org.gecko.emf.utilities.UtilitiesFactory; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ServiceScope; @@ -74,11 +76,28 @@ public Response patient(@PathParam("id") String id) { } Patient p = patientService.getPatient(id); if (Objects.isNull(p)) { - System.out.println("Na patient found with id " + id); + System.out.println("No patient found with id " + id); return Response.noContent().build(); } else { return Response.ok(p).build(); } } - + + @GET + @Path("/patient/with/consent/{domainId}/{policyId}/{policyVersion}") + @Produces(MediaType.APPLICATION_JSON) + public Response patientWithConsent(@PathParam("domainId") String domainId, @PathParam("policyId") String policyId, + @PathParam("policyVersion") String policyVersion) { + if (Objects.isNull(domainId) || Objects.isNull(policyId)) { + return Response.noContent().build(); + } + List patientsWithConsent = patientService.getPatientsWithConsent(domainId, policyId, policyVersion == null ? "1.0" : policyVersion); + if(patientsWithConsent.isEmpty()) { + System.out.println("No patients with consent found"); + return Response.noContent().build(); + } + org.gecko.emf.utilities.Response emfResponse = UtilitiesFactory.eINSTANCE.createResponse(); + emfResponse.getData().addAll(patientsWithConsent); + return Response.ok(emfResponse).build(); + } } diff --git a/org.avatar.himsa.runtime.config/configs/config.json b/org.avatar.himsa.runtime.config/configs/config.json index 6246b28..1c38b2a 100644 --- a/org.avatar.himsa.runtime.config/configs/config.json +++ b/org.avatar.himsa.runtime.config/configs/config.json @@ -21,5 +21,9 @@ "test1.baseUris": "mongodb://localhost:27017", "test1.databases": "test", "test1.test.repoType": "PROTOTYPE" + }, + "GICSService~test": + { + "url": "http://localhost:8080/gics/gicsService" } } \ No newline at end of file diff --git a/org.avatar.himsa.runtime/launch.bndrun b/org.avatar.himsa.runtime/launch.bndrun index ac8f8e9..f7d6b6a 100644 --- a/org.avatar.himsa.runtime/launch.bndrun +++ b/org.avatar.himsa.runtime/launch.bndrun @@ -31,9 +31,6 @@ org.avatar.himsa.rest;version=snapshot,\ org.avatar.himsa.runtime.config;version=snapshot,\ org.avatar.himsa.service.example;version=snapshot,\ - org.eclipse.emf.common;version='[2.28.0,2.28.1)',\ - org.eclipse.emf.ecore;version='[2.33.0,2.33.1)',\ - org.eclipse.emf.ecore.xmi;version='[2.18.0,2.18.1)',\ org.eclipse.osgitech.rest;version='[1.2.2,1.2.3)',\ org.eclipse.osgitech.rest.servlet.whiteboard;version='[1.2.2,1.2.3)',\ org.eclipse.osgitech.rest.sse;version='[1.2.2,1.2.3)',\ @@ -60,7 +57,6 @@ org.glassfish.jersey.media.jersey-media-sse;version='[3.1.3,3.1.4)',\ org.mongodb.mongo-java-driver;version='[3.12.14,3.12.15)',\ org.objectweb.asm;version='[9.6.0,9.6.1)',\ - org.osgi.service.cm;version='[1.6.1,1.6.2)',\ org.osgi.service.component;version='[1.5.1,1.5.2)',\ org.osgi.service.jakartars;version='[2.0.0,2.0.1)',\ org.osgi.service.log;version='[1.5.0,1.5.1)',\ @@ -81,5 +77,14 @@ org.gecko.emf.rest.jakartars;version='[2.3.0,2.3.1)',\ org.yaml.snakeyaml;version='[1.33.0,1.33.1)',\ org.apache.felix.http.jetty12;version='[1.0.4,1.0.5)',\ - org.apache.felix.http.servlet-api;version='[3.0.0,3.0.1)' + org.apache.felix.http.servlet-api;version='[3.0.0,3.0.1)',\ + org.avatar.gics.service;version=snapshot,\ + org.eclipse.emf.common;version='[2.29.0,2.29.1)',\ + org.eclipse.emf.ecore;version='[2.35.0,2.35.1)',\ + org.eclipse.emf.ecore.xmi;version='[2.36.0,2.36.1)',\ + org.emau.icmvc.ganimed.ttp.cm2;version='[1.0.0,1.0.1)',\ + org.gecko.emf.mongo.api;version='[6.1.0,6.1.1)',\ + org.osgi.service.metatype;version='[1.4.1,1.4.2)',\ + org.xmlsoap.model;version='[1.0.0,1.0.1)',\ + org.gecko.emf.util.model;version='[2.2.2,2.2.3)' -runblacklist: bnd.identity;id='org.apache.felix.http.jetty' \ No newline at end of file diff --git a/org.avatar.himsa.service.example/bnd.bnd b/org.avatar.himsa.service.example/bnd.bnd index f4d940e..ac0f261 100644 --- a/org.avatar.himsa.service.example/bnd.bnd +++ b/org.avatar.himsa.service.example/bnd.bnd @@ -3,4 +3,7 @@ -buildpath: \ org.gecko.emf.repository.mongo;version=latest,\ org.gecko.emf.repository.api;version=latest,\ - org.avatar.himsa.model;version=project \ No newline at end of file + org.avatar.himsa.model;version=project,\ + org.avatar.gics.service;version=latest,\ + org.emau.icmvc.ganimed.ttp.cm2,\ + osgi.cmpn \ No newline at end of file diff --git a/org.avatar.himsa.service.example/src/org/avatar/himsa/service/example/PatientServiceTest.java b/org.avatar.himsa.service.example/src/org/avatar/himsa/service/example/PatientServiceTest.java index 70c7581..7733cff 100644 --- a/org.avatar.himsa.service.example/src/org/avatar/himsa/service/example/PatientServiceTest.java +++ b/org.avatar.himsa.service.example/src/org/avatar/himsa/service/example/PatientServiceTest.java @@ -13,14 +13,19 @@ */ package org.avatar.himsa.service.example; +import java.util.List; import java.util.Objects; +import org.avatar.gics.service.api.GICSService; import org.avatar.himsa.export.Patient; import org.avatar.himsa.export.PatientExportFactory; import org.avatar.himsa.export.PatientExportPackage; import org.avatar.himsa.service.example.api.PatientService; +import org.emau.icmvc.ganimed.ttp.cm2.GetAllConsentedIdsForResponse; import org.gecko.emf.repository.EMFRepository; -import org.osgi.service.component.annotations.Activate; +import org.gecko.emf.repository.query.IQuery; +import org.gecko.emf.repository.query.QueryRepository; +import org.osgi.service.component.ComponentServiceObjects; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Reference; import org.osgi.service.component.annotations.ServiceScope; @@ -37,20 +42,22 @@ public class PatientServiceTest implements PatientService { private PatientExportFactory modelFactory; @Reference private PatientExportPackage modelPackage; + @Reference(target="(repo_id=test1.test)") + ComponentServiceObjects repoSO; @Reference - private EMFRepository repo; + GICSService gicsService; - @Activate - public void activate() { - Patient patient = modelFactory.createPatient(); -// patient.setPatientGUID(UUID.randomUUID().toString()); - patient.setPatientGUID("etester"); - patient.setFirstName("Emil"); - patient.setLastName("Tester"); - System.out.println("Ready to do something with " + patient); - // untested!!!! - repo.save(patient); - } +// @Activate +// public void activate() { +// Patient patient = modelFactory.createPatient(); +//// patient.setPatientGUID(UUID.randomUUID().toString()); +// patient.setPatientGUID("etester"); +// patient.setFirstName("Emil"); +// patient.setLastName("Tester"); +// System.out.println("Ready to do something with " + patient); +// // untested!!!! +// repo.save(patient); +// } /* * (non-Javadoc) @@ -61,10 +68,28 @@ public Patient getPatient(String id) { if (Objects.isNull(id)) { return null; } - return repo.getEObject(modelPackage.getPatient(), id); + EMFRepository repo = repoSO.getService(); + try { + return repo.getEObject(modelPackage.getPatient(), id); + } finally { + repoSO.ungetService(repo); + } } - - - + /* + * (non-Javadoc) + * @see org.avatar.himsa.service.example.api.PatientService#getPatientsWithConsent(java.lang.String, java.lang.String, java.lang.String) + */ + @Override + public List getPatientsWithConsent(String domainId, String policyId, String policyVersion) { + GetAllConsentedIdsForResponse allConsentedIdsFor = gicsService.getAllConsentedIdsFor(domainId, policyId, policyVersion, "Patient ID"); + List patientIdsWithConsent = allConsentedIdsFor.getReturn().getConsentIds(); + QueryRepository repo = (QueryRepository) repoSO.getService(); + try { + IQuery query = repo.createQueryBuilder().column(modelPackage.getPatient_PatientGUID()).in(patientIdsWithConsent.toArray()).build(); + return repo.getEObjectsByQuery(modelPackage.getPatient(), query); + } finally { + repoSO.ungetService(repo); + } + } } diff --git a/org.avatar.himsa.service.example/src/org/avatar/himsa/service/example/api/PatientService.java b/org.avatar.himsa.service.example/src/org/avatar/himsa/service/example/api/PatientService.java index 36a2fa5..f2c033a 100644 --- a/org.avatar.himsa.service.example/src/org/avatar/himsa/service/example/api/PatientService.java +++ b/org.avatar.himsa.service.example/src/org/avatar/himsa/service/example/api/PatientService.java @@ -13,6 +13,8 @@ */ package org.avatar.himsa.service.example.api; +import java.util.List; + import org.avatar.himsa.export.Patient; /** @@ -23,5 +25,7 @@ public interface PatientService { Patient getPatient(String id); + + List getPatientsWithConsent(String domainId, String policyId, String policyVersion); }