From 07c4572f2e19583d7af271f88807226e293ad344 Mon Sep 17 00:00:00 2001 From: Simon Spinner <simon.spinner@uni-wuerzburg.de> Date: Sun, 5 Jun 2016 13:18:53 +0200 Subject: [PATCH] Distinguish SQL queries by the source component that issues a query. --- .../JDBCStatementInterceptor.java | 8 +++-- .../service/ModelExtractionService.java | 30 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/interceptors/JDBCStatementInterceptor.java b/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/interceptors/JDBCStatementInterceptor.java index e575409..6a16e81 100644 --- a/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/interceptors/JDBCStatementInterceptor.java +++ b/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/interceptors/JDBCStatementInterceptor.java @@ -94,13 +94,17 @@ public class JDBCStatementInterceptor implements StatementInterceptorV2 { InvocationRecord currentInvocation = threadCallStack.peek(); if (currentInvocation != null) { String interf = "javax.sql.DataSource"; - String operation = "query"; + StringBuilder operation = new StringBuilder(); + operation.append("query("); + operation.append(currentInvocation.toString()); + operation.append(")"); + ComponentRecord crec = MonitoringService.INSTANCE.requireComponent(con.getHost(), "mysql", "", "database"); crec.setComponentClass("javax.sql.DataSource"); OperationRecord orec = currentInvocation.requireEndpoint(crec, interf, "jdbc", - operation); + operation.toString()); threadCallStack.push(orec.startInvocation()); diff --git a/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/service/ModelExtractionService.java b/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/service/ModelExtractionService.java index 5a8f64a..5c0527b 100644 --- a/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/service/ModelExtractionService.java +++ b/tools.descartes.prisma.agent.wildfly/src/main/java/tools/descartes/prisma/agent/wildfly/service/ModelExtractionService.java @@ -449,6 +449,8 @@ public class ModelExtractionService extends AgentController implements Service<M // required ProvidingDelegationConnector. addLocalCallToModule((CompositeComponent) calledComponent, calledProvidingRole, outgoingCrec, outgoingIrec); + } else if (outgoingIrec.getOperation().getProtocol().equals("jdbc")) { + addDataSource((CompositeComponent) calledComponent, calledProvidingRole, outgoingSignature); } } @@ -684,6 +686,34 @@ public class ModelExtractionService extends AgentController implements Service<M ModelSkeletonUtil.insert(module.getProvidingDelegationConnectors(), providingConnector); } + // This creates a basic component that represents the component service for + // a database access + private void addDataSource(CompositeComponent dataSourceComponent, InterfaceProvidingRole role, + Signature signature) { + BasicComponent dataBaseComponent = RepositoryFactory.eINSTANCE.createBasicComponent(); + dataBaseComponent.setName("database"); + dataBaseComponent = ModelSkeletonUtil.insert(skeleton.getRepository().getComponents(), dataBaseComponent); + + InterfaceProvidingRole innerProvidingRole = RepositoryFactory.eINSTANCE.createInterfaceProvidingRole(); + innerProvidingRole.setInterface(role.getInterface()); + innerProvidingRole.setName(toName("jdbc://javax.sql.DataSource")); + innerProvidingRole = ModelSkeletonUtil.insert(dataBaseComponent.getInterfaceProvidingRoles(), + innerProvidingRole); + + AssemblyContext databaseContext = RepositoryFactory.eINSTANCE.createAssemblyContext(); + databaseContext.setName("database"); + databaseContext.setEncapsulatedComponent(dataBaseComponent); + databaseContext = ModelSkeletonUtil.insert(dataSourceComponent.getAssemblyContexts(), databaseContext); + + ProvidingDelegationConnector delegation = RepositoryFactory.eINSTANCE.createProvidingDelegationConnector(); + delegation.setAssemblyContext(databaseContext); + delegation.setInnerInterfaceProvidingRole(innerProvidingRole); + delegation.setOuterInterfaceProvidingRole(role); + ModelSkeletonUtil.insert(dataSourceComponent.getProvidingDelegationConnectors(), delegation); + + createComponentInternalBehavior(dataBaseComponent, innerProvidingRole, signature); + } + private FineGrainedBehavior createComponentInternalBehavior(BasicComponent implementationComponent, InterfaceProvidingRole implementationProvidingRole, Signature signature) { FineGrainedBehavior behavior = ServicebehaviorFactory.eINSTANCE.createFineGrainedBehavior(); -- GitLab