ONOS-7887 Rename action profile-related entities

Members can exist outside of a group. Previous naming was ambiguous
about this.

Action group -> action profile group
Action group member -> action profile member

Change-Id: I5097e92253353d355b864e689f9653df2d318230
diff --git a/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroup.java b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroup.java
new file mode 100644
index 0000000..96168b9
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/pi/runtime/PiActionProfileGroup.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.net.pi.runtime;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import org.onosproject.net.pi.model.PiActionProfileId;
+
+import java.util.Collection;
+import java.util.Map;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Instance of an action profile group of a protocol-independent pipeline.
+ */
+@Beta
+public final class PiActionProfileGroup implements PiEntity {
+
+    private final PiActionProfileGroupId id;
+    private final ImmutableSet<PiActionProfileMember> members;
+    private final PiActionProfileId actionProfileId;
+
+    private PiActionProfileGroup(PiActionProfileGroupId id,
+                                 ImmutableSet<PiActionProfileMember> members,
+                                 PiActionProfileId actionProfileId) {
+        this.id = id;
+        this.members = members;
+        this.actionProfileId = actionProfileId;
+    }
+
+    /**
+     * Returns the identifier of this action profile group.
+     *
+     * @return action profile group identifier
+     */
+    public PiActionProfileGroupId id() {
+        return id;
+    }
+
+    /**
+     * Returns the members of this action profile group.
+     *
+     * @return collection of action profile members.
+     */
+    public Collection<PiActionProfileMember> members() {
+        return members;
+    }
+
+    /**
+     * Gets identifier of the action profile.
+     *
+     * @return action profile id
+     */
+    public PiActionProfileId actionProfileId() {
+        return actionProfileId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || !(o instanceof PiActionProfileGroup)) {
+            return false;
+        }
+        PiActionProfileGroup that = (PiActionProfileGroup) o;
+        return Objects.equal(id, that.id) &&
+                Objects.equal(members, that.members) &&
+                Objects.equal(actionProfileId, that.actionProfileId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(id, members);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("groupId", id)
+                .add("members", members)
+                .add("piActionProfileId", actionProfileId)
+                .toString();
+    }
+
+    /**
+     * Returns a new builder of action profile groups.
+     *
+     * @return action profile group builder
+     */
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    @Override
+    public PiEntityType piEntityType() {
+        return PiEntityType.ACTION_PROFILE_GROUP;
+    }
+
+    /**
+     * Builder of action profile groups.
+     */
+    public static final class Builder {
+
+        private PiActionProfileGroupId id;
+        private Map<PiActionProfileMemberId, PiActionProfileMember> members = Maps.newHashMap();
+        private PiActionProfileId piActionProfileId;
+
+        private Builder() {
+            // hides constructor.
+        }
+
+        /**
+         * Sets the identifier of this action profile group.
+         *
+         * @param id action profile group identifier
+         * @return this
+         */
+        public Builder withId(PiActionProfileGroupId id) {
+            this.id = id;
+            return this;
+        }
+
+        /**
+         * Adds one member to this action profile group.
+         *
+         * @param member action profile member
+         * @return this
+         */
+        public Builder addMember(PiActionProfileMember member) {
+            members.put(member.id(), member);
+            return this;
+        }
+
+        /**
+         * Adds many members to this action profile group.
+         *
+         * @param members action profile members
+         * @return this
+         */
+        public Builder addMembers(Collection<PiActionProfileMember> members) {
+            members.forEach(this::addMember);
+            return this;
+        }
+
+        /**
+         * Sets the identifier of the action profile.
+         *
+         * @param piActionProfileId the identifier of the action profile
+         * @return this
+         */
+        public Builder withActionProfileId(PiActionProfileId piActionProfileId) {
+            this.piActionProfileId = piActionProfileId;
+            return this;
+        }
+
+        /**
+         * Creates a new action profile group.
+         *
+         * @return action profile group
+         */
+        public PiActionProfileGroup build() {
+            checkNotNull(id);
+            checkNotNull(piActionProfileId);
+            return new PiActionProfileGroup(
+                    id, ImmutableSet.copyOf(members.values()), piActionProfileId);
+        }
+    }
+}