Adding Encapsulation in VPLS and correcting bugs.

Change-Id: Idc0c1834ae2bbd0fdaf564fd65360cc0f018d18d
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/cli/VplsCommandUtils.java b/apps/vpls/src/main/java/org/onosproject/vpls/cli/VplsCommandUtils.java
new file mode 100644
index 0000000..52c74a4
--- /dev/null
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/cli/VplsCommandUtils.java
@@ -0,0 +1,118 @@
+package org.onosproject.vpls.cli;
+
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
+import org.onosproject.incubator.net.intf.Interface;
+import org.onosproject.incubator.net.intf.InterfaceService;
+import org.onosproject.vpls.config.VplsConfigurationService;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+
+import static org.onlab.osgi.DefaultServiceDirectory.getService;
+
+/**
+ * Util class for VPLS Commands.
+ */
+public final class VplsCommandUtils {
+
+    protected static final String VPLS_NAME = "VPLS name %s: ";
+    protected static final String VPLS_DISPLAY = "VPLS name: %s, associated " +
+            "interfaces: %s, encapsulation: %s";
+    protected static final String VPLS_NOT_FOUND = "VPLS %s not found.";
+    protected static final String IFACE_NOT_FOUND = "Interface %s not found.";
+    protected static final String VPLS_ALREADY_EXISTS = "VPLS %s already exists.";
+    protected static final String IFACE_ALREADY_ASSOCIATED =
+            "Interface %s already associated to VPLS %s.";
+    protected static final String IFACE_NOT_ASSOCIATED =
+            "Interface %s is associated to VPLS %s.";
+
+    private static VplsConfigurationService vplsConfigService =
+            getService(VplsConfigurationService.class);
+    private static InterfaceService interfaceService =
+            getService(InterfaceService.class);
+
+    private VplsCommandUtils() {}
+
+    /**
+     * States if a VPLS exists or not.
+     *
+     * @param vplsName the name of the VPLS
+     * @return true if the VPLS exists; false otherwise
+     */
+    protected static boolean vplsExists(String vplsName) {
+        return vplsConfigService.vplsNames().contains(vplsName);
+    }
+
+    /**
+     * States if an interface is defined or not in the system.
+     *
+     * @param ifaceName the name of the interface
+     * @return true if the interface is defined; false otherwise
+     */
+    protected static boolean ifaceExists(String ifaceName) {
+        return interfaceService.getInterfaces()
+                .stream()
+                .anyMatch(iface -> iface.name().equals(ifaceName));
+    }
+
+    /**
+     * States if an interface is already associated or not to a VPLS.
+     *
+     * @param ifaceName the name of the interface
+     * @return true if the interface is already associated to a VPLS; false
+     * otherwise
+     */
+    protected static boolean ifaceAlreadyAssociated(String ifaceName) {
+        return vplsConfigService.allIfaces()
+                .stream()
+                .anyMatch(iface -> iface.name().equals(ifaceName));
+    }
+
+    /**
+     * Returns the name of a VPLS, given the name of an interface associated to
+     * it.
+     *
+     * @param ifaceName the name of the interface
+     * @return the name of the VPLS that has the interface configured; null if
+     * the interface does not exist or is not associated to any VPLS
+     */
+    protected static String vplsNameFromIfaceName(String ifaceName) {
+        String vplsName = null;
+
+        Optional<String> optVplsName = vplsConfigService.ifacesByVplsName()
+                .entries()
+                .stream()
+                .filter(iface -> iface.getValue().name().equals(ifaceName))
+                .map(Map.Entry::getKey)
+                .findFirst();
+
+        if (optVplsName.isPresent()) {
+            vplsName = optVplsName.get();
+        }
+
+        return vplsName;
+    }
+
+    /**
+     * Returns a list of interfaces associated to a VPLS, given a VPLS name.
+     *
+     * @param vplsName the name of the VPLS
+     * @return the set of interfaces associated to the given VPLS; null if the
+     * VPLS is not found
+     */
+    protected static Set<String> ifacesFromVplsName(String vplsName) {
+        if (!vplsExists(vplsName)) {
+            return null;
+        }
+
+        SetMultimap<String, Interface> ifacesByVplsName =
+                vplsConfigService.ifacesByVplsName();
+        Set<String> ifaceNames = Sets.newHashSet();
+
+        ifacesByVplsName.get(vplsName).forEach(iface -> ifaceNames.add(iface.name()));
+
+        return ifaceNames;
+    }
+}