Handled super client id in plugin installation

Change-Id: Ice83e06c0dd8c8742f2fc60eeb765b12777833ed
diff --git a/full/src/main/java/de/ids_mannheim/korap/dto/InstalledPluginDto.java b/full/src/main/java/de/ids_mannheim/korap/dto/InstalledPluginDto.java
index 3cef4c6..1c9943f 100644
--- a/full/src/main/java/de/ids_mannheim/korap/dto/InstalledPluginDto.java
+++ b/full/src/main/java/de/ids_mannheim/korap/dto/InstalledPluginDto.java
@@ -13,7 +13,10 @@
 @Getter
 @JsonInclude(Include.NON_EMPTY)
 public class InstalledPluginDto {
-    private String client_id; // oauth2 client id
+    @JsonProperty("client_id")
+    private String clientId; // oauth2 client id
+    @JsonProperty("super_client_id")
+    private String superClientId;
     private String name;
     private String description;
     private String url;
@@ -22,7 +25,8 @@
     
     public InstalledPluginDto (InstalledPlugin plugin) {
         OAuth2Client client = plugin.getClient();
-        setClient_id(client.getId());
+        setClientId(client.getId());
+        setSuperClientId(plugin.getSuperClient().getId());
         setInstalledDate(plugin.getInstalledDate().toString());
         setName(client.getName());
         setDescription(client.getDescription());
diff --git a/full/src/main/java/de/ids_mannheim/korap/entity/InstalledPlugin.java b/full/src/main/java/de/ids_mannheim/korap/entity/InstalledPlugin.java
index 1aef8b6..b49b1b4 100644
--- a/full/src/main/java/de/ids_mannheim/korap/entity/InstalledPlugin.java
+++ b/full/src/main/java/de/ids_mannheim/korap/entity/InstalledPlugin.java
@@ -33,4 +33,9 @@
     @ManyToOne(fetch = FetchType.EAGER)
     @JoinColumn(name = "client_id")
     private OAuth2Client client;
+    
+    // where a plugin is installed
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "super_client_id")
+    private OAuth2Client superClient;
 }
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/InstalledPluginDao.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/InstalledPluginDao.java
index 284c0fd..46ac078 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/InstalledPluginDao.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/dao/InstalledPluginDao.java
@@ -31,8 +31,8 @@
     @PersistenceContext
     private EntityManager entityManager;
 
-    public InstalledPlugin storeUserPlugin (OAuth2Client client,
-            String installedBy) throws KustvaktException {
+    public InstalledPlugin storeUserPlugin (OAuth2Client superClient,
+            OAuth2Client client, String installedBy) throws KustvaktException {
         ParameterChecker.checkStringValue(installedBy, "installed_by");
 
         InstalledPlugin p = new InstalledPlugin();
@@ -40,12 +40,14 @@
         p.setInstalledDate(
                 ZonedDateTime.now(ZoneId.of(Attributes.DEFAULT_TIME_ZONE)));
         p.setClient(client);
+        p.setSuperClient(superClient);
         entityManager.persist(p);
         return p;
     }
 
-    public InstalledPlugin retrieveInstalledPlugin (String clientId,
-            String installedBy) throws KustvaktException {
+    public InstalledPlugin retrieveInstalledPlugin (String superClientId,
+            String clientId, String installedBy) throws KustvaktException {
+        ParameterChecker.checkStringValue(superClientId, "super_client_id");
         ParameterChecker.checkStringValue(clientId, "client_id");
         ParameterChecker.checkStringValue(installedBy, "installedBy");
 
@@ -56,11 +58,15 @@
         Root<InstalledPlugin> root = query.from(InstalledPlugin.class);
         Join<InstalledPlugin, OAuth2Client> client =
                 root.join(InstalledPlugin_.client);
+        Join<InstalledPlugin, OAuth2Client> superClient =
+                root.join(InstalledPlugin_.superClient);
         query.select(root);
         query.where(builder.and(
                 builder.equal(root.get(InstalledPlugin_.INSTALLED_BY),
                         installedBy),
-                builder.equal(client.get(OAuth2Client_.id), clientId)));
+                builder.equal(client.get(OAuth2Client_.id), clientId),
+                builder.equal(superClient.get(OAuth2Client_.id),
+                        superClientId)));
 
         Query q = entityManager.createQuery(query);
         try {
diff --git a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ClientService.java b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ClientService.java
index 9e319f8..078219a 100644
--- a/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ClientService.java
+++ b/full/src/main/java/de/ids_mannheim/korap/oauth2/service/OAuth2ClientService.java
@@ -391,8 +391,8 @@
         return createClientDtos(plugins);
     }
     
-    public InstalledPluginDto installPlugin (String clientId,
-            String installedBy) throws KustvaktException {
+    public InstalledPluginDto installPlugin (String superClientId,
+            String clientId, String installedBy) throws KustvaktException {
         if (clientId == null || clientId.isEmpty()) {
             throw new KustvaktException(StatusCodes.MISSING_PARAMETER,
                     "Missing parameter: client_id");
@@ -403,21 +403,24 @@
                     "Plugin is not permitted", clientId);
         }
         
-        if (isPluginInstalled(clientId,installedBy)) {
+        if (isPluginInstalled(superClientId,clientId,installedBy)) {
             throw new KustvaktException(StatusCodes.PLUGIN_HAS_BEEN_INSTALLED,
                     "Plugin has been installed", clientId);
         }
         
+        OAuth2Client superClient = clientDao.retrieveClientById(superClientId);
         InstalledPlugin plugin =
-                pluginDao.storeUserPlugin(client, installedBy);
+                pluginDao.storeUserPlugin(superClient, client, installedBy);
         
         InstalledPluginDto dto = new InstalledPluginDto(plugin);
         return dto;
     }
 
-    private boolean isPluginInstalled (String clientId, String installedBy) {
+    private boolean isPluginInstalled (String superClientId, String clientId,
+            String installedBy) {
         try {
-            pluginDao.retrieveInstalledPlugin(clientId, installedBy);
+            pluginDao.retrieveInstalledPlugin(superClientId, clientId,
+                    installedBy);
         }
         catch (KustvaktException e) {
             return false;
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java
index bbd013a..e8f634b 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/OAuthClientController.java
@@ -275,7 +275,7 @@
                     OAuth2Scope.INSTALL_USER_CLIENT);
 
             clientService.verifySuperClient(superClientId, superClientSecret);
-            return clientService.installPlugin(clientId, username);
+            return clientService.installPlugin(superClientId,clientId, username);
         }
         catch (KustvaktException e) {
             throw responseHandler.throwit(e);