From a0f7bc374e1cae1451c0f160e9dec748fd7953ce Mon Sep 17 00:00:00 2001
From: Mikhail-Petrov <dragon294@mail.ru>
Date: Mon, 28 Mar 2016 16:17:34 +0300
Subject: [PATCH] added unsubscribe

---
 src/wrapper/SmartSpaceKPI.java | 50 +++++++++++++++++++++++++++++-----
 1 file changed, 43 insertions(+), 7 deletions(-)

diff --git a/src/wrapper/SmartSpaceKPI.java b/src/wrapper/SmartSpaceKPI.java
index 151f08d..5604ecc 100644
--- a/src/wrapper/SmartSpaceKPI.java
+++ b/src/wrapper/SmartSpaceKPI.java
@@ -11,10 +11,12 @@ public class SmartSpaceKPI {
 
     private KPICore core;
     private ArrayList<String> subscriptionIdList;
+    private ArrayList<SmartSpaceTriplet> tripletList;
 
     public SmartSpaceKPI(String host, int port, String spaceName) throws SmartSpaceException {
         core = new KPICore(host, port, spaceName);
         subscriptionIdList = new ArrayList<String>();
+        tripletList = new ArrayList<SmartSpaceTriplet>();
 
         SIBResponse joinResponse = core.join();
 
@@ -28,8 +30,8 @@ public class SmartSpaceKPI {
         SIBResponse insertResponse = core.insert(triplet.getSubject(), triplet.getPredicate(), triplet.getObject(), triplet.getSubjectType(), triplet.getObjectType());
         if (!insertResponse.isConfirmed()) {
             String text = String.format("KPI failed to insert triplet: (%s, %s, %s, %s, %s)",
-                                        triplet.getSubject(), triplet.getPredicate(), triplet.getObject(),
-                                        triplet.getSubjectType(), triplet.getObjectType());
+                    triplet.getSubject(), triplet.getPredicate(), triplet.getObject(),
+                    triplet.getSubjectType(), triplet.getObjectType());
 
             throw new SmartSpaceException(text + '\n' + insertResponse.Message);
         }
@@ -39,8 +41,8 @@ public class SmartSpaceKPI {
         SIBResponse removeResponse = core.remove(triplet.getSubject(), triplet.getPredicate(), triplet.getObject(), triplet.getSubjectType(), triplet.getObjectType());
         if (!removeResponse.isConfirmed()) {
             String text = String.format("KP failed to remove triplet: (%s, %s, %s, %s, %s)",
-                                        triplet.getSubject(), triplet.getPredicate(), triplet.getObject(),
-                                        triplet.getSubjectType(), triplet.getObjectType());
+                    triplet.getSubject(), triplet.getPredicate(), triplet.getObject(),
+                    triplet.getSubjectType(), triplet.getObjectType());
 
             throw new SmartSpaceException(text + '\n' + removeResponse.Message);
         }
@@ -84,6 +86,7 @@ public class SmartSpaceKPI {
 
         if (subscribeResponse != null && subscribeResponse.isConfirmed()) {
             subscriptionIdList.add(subscribeResponse.subscription_id);
+            tripletList.add(triplet);
         } else {
             System.err.println("Some problems with subscribing");
             throw new SmartSpaceException(subscribeResponse != null ? subscribeResponse.Message : null);
@@ -94,9 +97,7 @@ public class SmartSpaceKPI {
 
         try {
             unsubscribe();
-        }
-        catch (SmartSpaceException exception)
-        {
+        } catch (SmartSpaceException exception) {
             System.err.println(exception.getMessage());
         }
 
@@ -127,4 +128,39 @@ public class SmartSpaceKPI {
             throw new SmartSpaceException(exceptionMessage);
         }
     }
+
+    public void unsubscribe(SmartSpaceTriplet triplet, boolean fullMatch) throws SmartSpaceException {
+        String exceptionMessage = "";
+
+        String subject = triplet.getSubject(), predicate = triplet.getPredicate(), object = triplet.getObject();
+
+        for (int i = 0; i < subscriptionIdList.size(); i++) {
+            SmartSpaceTriplet curTriplet = tripletList.get(i);
+
+            if (check2Strings(subject, curTriplet.getSubject(), fullMatch))
+                if (check2Strings(predicate, curTriplet.getPredicate(), fullMatch))
+                    if (check2Strings(object, curTriplet.getObject(), fullMatch)) {
+                        SIBResponse unsubscribeResponse = core.unsubscribe(subscriptionIdList.get(i));
+
+                        // у нас проблемы с отпиской от интеллектуального пространства
+                        if (!unsubscribeResponse.isConfirmed()) {
+                            exceptionMessage += subscriptionIdList.get(i) + ": " + unsubscribeResponse.Message + '\n';
+                        }
+                    }
+        }
+
+        // проблемы во время отписки были, сигнализируем это
+        if (!exceptionMessage.isEmpty()) {
+            throw new SmartSpaceException(exceptionMessage);
+        }
+    }
+
+    private boolean check2Strings(String mainString, String curString, boolean fullMatch) {
+        if (mainString == null)
+            if (fullMatch)
+                return (curString == null);
+            else
+                return true;
+        return mainString.equals(curString);
+    }
 }
-- 
GitLab