1 /*******************************************************************************
\r
2 * ============LICENSE_START==================================================
\r
4 * * ===========================================================================
\r
5 * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
\r
6 * * ===========================================================================
\r
7 * * Licensed under the Apache License, Version 2.0 (the "License");
\r
8 * * you may not use this file except in compliance with the License.
\r
9 * * You may obtain a copy of the License at
\r
11 * * http://www.apache.org/licenses/LICENSE-2.0
\r
13 * * Unless required by applicable law or agreed to in writing, software
\r
14 * * distributed under the License is distributed on an "AS IS" BASIS,
\r
15 * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
16 * * See the License for the specific language governing permissions and
\r
17 * * limitations under the License.
\r
18 * * ============LICENSE_END====================================================
\r
20 * * ECOMP is a trademark and service mark of AT&T Intellectual Property.
\r
22 ******************************************************************************/
\r
24 package org.onap.dmaap.datarouter.provisioning.beans;
\r
26 import com.att.eelf.configuration.EELFLogger;
\r
27 import com.att.eelf.configuration.EELFManager;
\r
28 import java.io.InvalidObjectException;
\r
29 import java.sql.Connection;
\r
30 import java.sql.PreparedStatement;
\r
31 import java.sql.ResultSet;
\r
32 import java.sql.SQLException;
\r
33 import java.util.ArrayList;
\r
34 import java.util.Collection;
\r
35 import java.util.Date;
\r
36 import java.util.List;
\r
37 import java.util.Objects;
\r
38 import org.json.JSONObject;
\r
39 import org.onap.dmaap.datarouter.provisioning.utils.ProvDbUtils;
\r
42 * The representation of a Subscription. Subscriptions can be retrieved from the DB, or stored/updated in the DB.
\r
45 * @version $Id: Group.java,v 1.0 2016/07/19
\r
48 public class Group extends Syncable {
\r
50 private static final String GROUP_ID_CONST = "groupid";
\r
51 private static EELFLogger intlogger = EELFManager.getInstance().getLogger("InternalLog");
\r
52 private static int nextGroupid = getMaxGroupID() + 1;
\r
54 private int groupid;
\r
55 private String authid;
\r
56 private String name;
\r
57 private String description;
\r
58 private String classification;
\r
59 private String members;
\r
60 private Date lastMod;
\r
67 * Group constructor.
\r
68 * @param name group name
\r
69 * @param desc group description
\r
70 * @param members group members
\r
72 public Group(String name, String desc, String members) {
\r
76 this.description = desc;
\r
77 this.members = members;
\r
78 this.classification = "";
\r
79 this.lastMod = new Date();
\r
84 * Group constructor from ResultSet.
\r
85 * @param rs ResultSet
\r
86 * @throws SQLException in case of SQL statement error
\r
88 public Group(ResultSet rs) throws SQLException {
\r
89 this.groupid = rs.getInt("GROUPID");
\r
90 this.authid = rs.getString("AUTHID");
\r
91 this.name = rs.getString("NAME");
\r
92 this.description = rs.getString("DESCRIPTION");
\r
93 this.classification = rs.getString("CLASSIFICATION");
\r
94 this.members = rs.getString("MEMBERS");
\r
95 this.lastMod = rs.getDate("LAST_MOD");
\r
99 * Group constructor for JSONObject.
\r
100 * @param jo JSONObject
\r
101 * @throws InvalidObjectException in case of JSON error
\r
103 public Group(JSONObject jo) throws InvalidObjectException {
\r
106 // The JSONObject is assumed to contain a vnd.dmaap-dr.group representation
\r
107 this.groupid = jo.optInt(GROUP_ID_CONST, -1);
\r
108 String gname = jo.getString("name");
\r
109 String gdescription = jo.getString("description");
\r
111 this.authid = jo.getString("authid");
\r
113 this.description = gdescription;
\r
114 this.classification = jo.getString("classification");
\r
115 this.members = jo.getString("members");
\r
117 if (gname.length() > 50) {
\r
118 throw new InvalidObjectException("Group name is too long");
\r
120 if (gdescription.length() > 256) {
\r
121 throw new InvalidObjectException("Group Description is too long");
\r
123 } catch (InvalidObjectException e) {
\r
125 } catch (Exception e) {
\r
126 intlogger.error("Invalid JSON: " + e.getMessage(), e);
\r
127 throw new InvalidObjectException("Invalid JSON: " + e.getMessage());
\r
132 * Get a group frpm DB.
\r
133 * @param gup group object
\r
134 * @return Group object
\r
136 public static Group getGroupMatching(Group gup) {
\r
137 String sql = String.format(
\r
138 "select * from GROUPS where NAME='%s'",
\r
141 List<Group> list = getGroupsForSQL(sql);
\r
142 return !list.isEmpty() ? list.get(0) : null;
\r
146 * Get a group from DB using name and groupid.
\r
147 * @param gup group object
\r
148 * @param groupid id of group
\r
149 * @return group object
\r
151 public static Group getGroupMatching(Group gup, int groupid) {
\r
152 String sql = String.format(
\r
153 "select * from GROUPS where NAME = '%s' and GROUPID != %d ", gup.getName(), groupid);
\r
154 List<Group> list = getGroupsForSQL(sql);
\r
155 return !list.isEmpty() ? list.get(0) : null;
\r
159 * Get group from DB using groupid only.
\r
160 * @param id id of group
\r
161 * @return group object
\r
163 public static Group getGroupById(int id) {
\r
164 String sql = "select * from GROUPS where GROUPID = " + id;
\r
165 List<Group> list = getGroupsForSQL(sql);
\r
166 return !list.isEmpty() ? list.get(0) : null;
\r
170 * Get group from DB using AUTHID.
\r
172 * @return group object
\r
174 static Group getGroupByAuthId(String id) {
\r
175 String sql = "select * from GROUPS where AUTHID = '" + id + "'";
\r
176 List<Group> list = getGroupsForSQL(sql);
\r
177 return !list.isEmpty() ? list.get(0) : null;
\r
180 public static Collection<Group> getAllgroups() {
\r
181 return getGroupsForSQL("select * from GROUPS");
\r
184 private static List<Group> getGroupsForSQL(String sql) {
\r
185 List<Group> list = new ArrayList<>();
\r
186 try (Connection conn = ProvDbUtils.getInstance().getConnection();
\r
187 PreparedStatement ps = conn.prepareStatement(sql);
\r
188 ResultSet rs = ps.executeQuery()) {
\r
189 while (rs.next()) {
\r
190 Group group = new Group(rs);
\r
193 } catch (SQLException e) {
\r
194 intlogger.error("PROV0009 getGroupsForSQL: " + e.getMessage(), e);
\r
199 private static int getMaxGroupID() {
\r
201 try (Connection conn = ProvDbUtils.getInstance().getConnection();
\r
202 PreparedStatement ps = conn.prepareStatement("select MAX(groupid) from GROUPS");
\r
203 ResultSet rs = ps.executeQuery()) {
\r
205 max = rs.getInt(1);
\r
207 } catch (SQLException e) {
\r
208 intlogger.error("PROV0001 getMaxSubID: " + e.getMessage(), e);
\r
213 public int getGroupid() {
\r
217 public static EELFLogger getIntlogger() {
\r
221 public void setGroupid(int groupid) {
\r
222 this.groupid = groupid;
\r
225 public static void setIntlogger(EELFLogger intlogger) {
\r
226 Group.intlogger = intlogger;
\r
229 public String getAuthid() {
\r
233 public void setAuthid(String authid) {
\r
234 this.authid = authid;
\r
237 public String getName() {
\r
241 public void setName(String name) {
\r
245 public String getDescription() {
\r
246 return description;
\r
249 public void setDescription(String description) {
\r
250 this.description = description;
\r
253 public String getClassification() {
\r
254 return classification;
\r
257 public void setClassification(String classification) {
\r
258 this.classification = classification;
\r
261 public String getMembers() {
\r
266 public JSONObject asJSONObject() {
\r
267 JSONObject jo = new JSONObject();
\r
268 jo.put(GROUP_ID_CONST, groupid);
\r
269 jo.put("authid", authid);
\r
270 jo.put("name", name);
\r
271 jo.put("description", description);
\r
272 jo.put("classification", classification);
\r
273 jo.put("members", members);
\r
274 jo.put("last_mod", lastMod.getTime());
\r
279 public boolean doInsert(Connection conn) {
\r
281 try (PreparedStatement ps = conn.prepareStatement(
\r
282 "insert into GROUPS(GROUPID, AUTHID, NAME, DESCRIPTION, CLASSIFICATION, MEMBERS) "
\r
283 + "values (?, ?, ?, ?, ?, ?)", new String[]{"GROUPID"})) {
\r
284 if (groupid == -1) {
\r
285 // No feed ID assigned yet, so assign the next available one
\r
286 setGroupid(nextGroupid++);
\r
288 // In case we insert a group from synchronization
\r
289 if (groupid > nextGroupid) {
\r
290 nextGroupid = groupid + 1;
\r
292 // Create the GROUPS row
\r
293 ps.setInt(1, groupid);
\r
294 ps.setString(2, authid);
\r
295 ps.setString(3, name);
\r
296 ps.setString(4, description);
\r
297 ps.setString(5, classification);
\r
298 ps.setString(6, members);
\r
300 } catch (SQLException e) {
\r
302 intlogger.error("PROV0005 doInsert: " + e.getMessage(), e);
\r
308 public boolean doUpdate(Connection conn) {
\r
310 try (PreparedStatement ps = conn.prepareStatement(
\r
311 "update GROUPS set AUTHID = ?, NAME = ?, DESCRIPTION = ?, CLASSIFICATION = ? , MEMBERS = ? where GROUPID = ?")) {
\r
312 ps.setString(1, authid);
\r
313 ps.setString(2, name);
\r
314 ps.setString(3, description);
\r
315 ps.setString(4, classification);
\r
316 ps.setString(5, members);
\r
317 ps.setInt(6, groupid);
\r
318 ps.executeUpdate();
\r
319 } catch (SQLException e) {
\r
321 intlogger.error("PROV0006 doUpdate: " + e.getMessage(), e);
\r
327 public boolean doDelete(Connection conn) {
\r
329 try (PreparedStatement ps = conn.prepareStatement("delete from GROUPS where GROUPID = ?")) {
\r
330 ps.setInt(1, groupid);
\r
332 } catch (SQLException e) {
\r
334 intlogger.error("PROV0007 doDelete: " + e.getMessage(), e);
\r
340 public String getKey() {
\r
341 return "" + getGroupid();
\r
345 public boolean equals(Object obj) {
\r
346 if (!(obj instanceof Group)) {
\r
349 Group os = (Group) obj;
\r
350 if (groupid != os.groupid) {
\r
353 if (!authid.equals(os.authid)) {
\r
356 if (!name.equals(os.name)) {
\r
359 if (!description.equals(os.description)) {
\r
362 if (!classification.equals(os.classification)) {
\r
365 return members.equals(os.members);
\r
369 public String toString() {
\r
370 return "GROUP: groupid=" + groupid;
\r
374 public int hashCode() {
\r
375 return Objects.hash(groupid, authid, name, description, classification, members, lastMod);
\r