Distributed group store using eventual consistent map abstraction

Change-Id: I618a0f6fa80e0e25285d7a2026032f09ba90aa70
diff --git a/core/store/dist/src/main/java/org/onosproject/store/group/impl/GroupStoreMessage.java b/core/store/dist/src/main/java/org/onosproject/store/group/impl/GroupStoreMessage.java
new file mode 100644
index 0000000..b82754b
--- /dev/null
+++ b/core/store/dist/src/main/java/org/onosproject/store/group/impl/GroupStoreMessage.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.store.group.impl;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.group.GroupBuckets;
+import org.onosproject.net.group.GroupDescription;
+import org.onosproject.net.group.GroupKey;
+import org.onosproject.net.group.GroupStore.UpdateType;
+
+/**
+ * Format of the Group store message that is used to
+ * communicate with the peer nodes in the cluster.
+ */
+public final class GroupStoreMessage {
+    private final DeviceId deviceId;
+    private final GroupKey appCookie;
+    private final GroupDescription groupDesc;
+    private final UpdateType updateType;
+    private final GroupBuckets updateBuckets;
+    private final GroupKey newAppCookie;
+    private final Type type;
+
+    /**
+     * Type of group store request.
+     */
+    public enum Type {
+        ADD,
+        UPDATE,
+        DELETE
+    }
+
+    private GroupStoreMessage(Type type,
+                             DeviceId deviceId,
+                             GroupKey appCookie,
+                             GroupDescription groupDesc,
+                             UpdateType updateType,
+                             GroupBuckets updateBuckets,
+                             GroupKey newAppCookie) {
+        this.type = type;
+        this.deviceId = deviceId;
+        this.appCookie = appCookie;
+        this.groupDesc = groupDesc;
+        this.updateType = updateType;
+        this.updateBuckets = updateBuckets;
+        this.newAppCookie = newAppCookie;
+    }
+
+    /**
+     * Creates a group store message for group ADD request.
+     *
+     * @param deviceId device identifier in which group to be added
+     * @param desc group creation parameters
+     * @return constructed group store message
+     */
+    public static GroupStoreMessage createGroupAddRequestMsg(DeviceId deviceId,
+                                                             GroupDescription desc) {
+        return new GroupStoreMessage(Type.ADD,
+                              deviceId,
+                              null,
+                              desc,
+                              null,
+                              null,
+                              null);
+    }
+
+    /**
+     * Creates a group store message for group UPDATE request.
+     *
+     * @param deviceId the device ID
+     * @param appCookie the current group key
+     * @param updateType update (add or delete) type
+     * @param updateBuckets group buckets for updates
+     * @param newAppCookie optional new group key
+     * @return constructed group store message
+     */
+    public static GroupStoreMessage createGroupUpdateRequestMsg(DeviceId deviceId,
+                                                        GroupKey appCookie,
+                                                        UpdateType updateType,
+                                                        GroupBuckets updateBuckets,
+                                                        GroupKey newAppCookie) {
+        return new GroupStoreMessage(Type.UPDATE,
+                              deviceId,
+                              appCookie,
+                              null,
+                              updateType,
+                              updateBuckets,
+                              newAppCookie);
+    }
+
+    /**
+     * Creates a group store message for group DELETE request.
+     *
+     * @param deviceId the device ID
+     * @param appCookie the group key
+     * @return constructed group store message
+     */
+    public static GroupStoreMessage createGroupDeleteRequestMsg(DeviceId deviceId,
+                                                                GroupKey appCookie) {
+        return new GroupStoreMessage(Type.DELETE,
+                                     deviceId,
+                                     appCookie,
+                                     null,
+                                     null,
+                                     null,
+                                     null);
+    }
+
+    /**
+     * Returns the device identifier of this group request.
+     *
+     * @return device identifier
+     */
+    public DeviceId deviceId() {
+        return deviceId;
+    }
+
+    /**
+     * Returns the application cookie associated with this group request.
+     *
+     * @return application cookie
+     */
+    public GroupKey appCookie() {
+        return appCookie;
+    }
+
+    /**
+     * Returns the group create parameters associated with this group request.
+     *
+     * @return group create parameters
+     */
+    public GroupDescription groupDesc() {
+        return groupDesc;
+    }
+
+    /**
+     * Returns the group buckets to be updated as part of this group request.
+     *
+     * @return group buckets to be updated
+     */
+    public GroupBuckets updateBuckets() {
+        return updateBuckets;
+    }
+
+    /**
+     * Returns the update group operation type.
+     *
+     * @return update operation type
+     */
+    public UpdateType updateType() {
+        return updateType;
+    }
+
+    /**
+     * Returns the new application cookie associated with this group operation.
+     *
+     * @return new application cookie
+     */
+    public GroupKey newAppCookie() {
+        return newAppCookie;
+    }
+
+    /**
+     * Returns the type of this group operation.
+     *
+     * @return group message type
+     */
+    public Type type() {
+        return type;
+    }
+}