Skip to content

Commit bef6e05

Browse files
authored
Merge pull request #1002 from WildMeOrg/issue-756-merge-individual
Issue 756 merge individual automation and notification fixes
2 parents 971a6f2 + 38e85ef commit bef6e05

File tree

10 files changed

+119
-67
lines changed

10 files changed

+119
-67
lines changed

frontend/src/components/navBar/MergeMessages.jsx

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
import React, { useState } from "react";
22
import BrutalismButton from "../BrutalismButton";
33
import { FormattedMessage } from "react-intl";
4+
import changeIndividualMergeState from "../../models/notifications/changeIndividualMergeState";
45

56
export default function MergeMessages({
67
mergeData,
78
getAllNotifications,
89
setModalOpen,
910
}) {
10-
const handleClick = () => {
11-
// const result = changeIndividualMergeState(action, taskId);
12-
// setError('Error: ' + result);
13-
getAllNotifications();
14-
setModalOpen(false);
11+
const [error, setError] = useState(false);
12+
const handleClick = async (action, taskId) => {
13+
const result = await changeIndividualMergeState(action, taskId);
14+
if (result.status === 200) {
15+
getAllNotifications();
16+
setModalOpen(false);
17+
} else {
18+
setError(true);
19+
}
1520
};
1621

17-
// eslint-disable-next-line no-unused-vars
18-
const [showError, setShowError] = useState(false);
19-
// eslint-disable-next-line no-unused-vars
20-
const [error, setError] = useState("");
21-
2222
const content = mergeData?.map((data) => {
2323
const mergePending = data.notificationType === "mergePending";
2424
const mergeComplete = data.notificationType === "mergeComplete";
@@ -103,7 +103,6 @@ export default function MergeMessages({
103103
display: "flex",
104104
marginTop: "10px",
105105
marginBottom: "10px",
106-
// width: 105
107106
}}
108107
>
109108
<BrutalismButton onClick={() => handleClick("ignore", data.taskId)}>
@@ -167,7 +166,11 @@ export default function MergeMessages({
167166
</h4>
168167
)}
169168
{content}
170-
{showError && <h6>{error}</h6>}
169+
{error && (
170+
<h4>
171+
<FormattedMessage id="BEERROR_UNKNOWN" />
172+
</h4>
173+
)}
171174
</div>
172175
);
173176
}
Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,18 @@
1-
import axios from 'axios';
1+
import axios from "axios";
22

33
export default async function changeIndividualMergeState(action, mergeId) {
4+
let json = {};
5+
json["mergeId"] = mergeId;
6+
json["action"] = action;
47

5-
let json = {};
6-
json['mergeId'] = mergeId;
7-
json['action'] = action;
8-
9-
console.log("Trying to change individual merge state on mergeId "+mergeId+" to "+action+".");
10-
11-
const response = await axios.post('/ScheduledIndividualMergeUpdate', json, {
12-
headers: {
13-
'Content-Type': 'application/json'
14-
}
8+
try {
9+
const response = await axios.post("/ScheduledIndividualMergeUpdate", json, {
10+
headers: {
11+
"Content-Type": "application/json",
12+
},
1513
});
16-
17-
console.log('changeIndividualMergeState result:', response.json());
18-
19-
return response.json();
20-
21-
}
14+
return response;
15+
} catch (error) {
16+
return error;
17+
}
18+
}

src/main/java/org/ecocean/MarkedIndividual.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2599,7 +2599,9 @@ public void mergeIndividual(MarkedIndividual other, String username, Shepherd my
25992599
+ other.getIndividualID() + "' || secondaryIndividual.individualID == '" +
26002600
other.getIndividualID() + "'";
26012601
Query q = myShepherd.getPM().newQuery(filter);
2602-
Collection c = (Collection)q.execute();
2602+
Collection cTemp = (Collection)q.execute();
2603+
ArrayList<ScheduledIndividualMerge> c = new ArrayList<ScheduledIndividualMerge>(cTemp);
2604+
q.closeAll();
26032605
ArrayList<ScheduledIndividualMerge> merges = new ArrayList<ScheduledIndividualMerge>(c);
26042606
// throw out any scheduled merge related to this individual as it is now being merged.
26052607
for (ScheduledIndividualMerge merge : merges) {

src/main/java/org/ecocean/StartupWildbook.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,19 +290,18 @@ private static void startWildbookScheduledTaskThread(String context) {
290290
System.out.println("[INFO]: checking for scheduled tasks to execute...");
291291
Shepherd myShepherd = new Shepherd(context);
292292
myShepherd.setAction("WildbookScheduledTaskThread");
293+
myShepherd.beginDBTransaction();
293294
try {
294-
ArrayList<WildbookScheduledTask> scheduledTasks =
295-
myShepherd.getAllIncompleteWildbookScheduledTasks();
295+
ArrayList<WildbookScheduledTask> scheduledTasks = myShepherd.getAllIncompleteWildbookScheduledTasks();
296296
for (WildbookScheduledTask scheduledTask : scheduledTasks) {
297297
if (scheduledTask.isTaskEligibleForExecution()) {
298298
scheduledTask.execute(myShepherd);
299299
}
300300
}
301301
} catch (Exception e) {
302-
myShepherd.rollbackAndClose();
303302
e.printStackTrace();
304303
}
305-
myShepherd.closeDBTransaction();
304+
myShepherd.rollbackAndClose();
306305
}
307306
}, 0, 1, TimeUnit.HOURS);
308307
}

src/main/java/org/ecocean/scheduled/ScheduledIndividualMerge.java

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class ScheduledIndividualMerge extends WildbookScheduledTask {
1313

1414
private MarkedIndividual primaryIndividual = null;
1515
private MarkedIndividual secondaryIndividual = null;
16-
// participant names, with Boolean list of denied state in position 0, ignored state in position 2.
16+
// participant names, with Boolean list of denied state in position 0, ignored state in position 1.
1717
private HashMap<String, ArrayList<Boolean> > participantsDeniedIgnored = new HashMap<>();
1818

1919
private List<String> participants = new ArrayList<>();
@@ -36,21 +36,22 @@ public ScheduledIndividualMerge(MarkedIndividual primaryIndividual,
3636
+ this.scheduledTaskType + ". Failed.");
3737
}
3838

39+
3940
@Override public void execute(Shepherd myShepherd) {
4041
try {
41-
myShepherd.beginDBTransaction();
4242

43-
// if not denied by a user !
4443
mergeIndividuals(primaryIndividual, secondaryIndividual, myShepherd);
45-
4644
this.setTaskComplete();
45+
myShepherd.updateDBTransaction();
46+
4747
} catch (Exception e) {
48-
myShepherd.rollbackDBTransaction();
4948
this.setTaskIncomplete();
49+
//rollback this Shepherd to unwind this task and re-open the Shepherd in case it is being reused by a subsequent Task
50+
myShepherd.rollbackDBTransaction();
51+
myShepherd.beginDBTransaction();
5052
e.printStackTrace();
51-
} finally {
52-
myShepherd.updateDBTransaction();
5353
}
54+
5455
}
5556

5657
private void mergeIndividuals(MarkedIndividual primaryIndividual,
@@ -113,46 +114,70 @@ public List<String> getParticipantUsernames() {
113114
}
114115

115116
public void setTaskDeniedStateForUser(String username, boolean denied) {
116-
List<Boolean> stateForUser = participantsDeniedIgnored.get(username);
117+
ArrayList<Boolean> stateForUser = participantsDeniedIgnored.get(username);
117118

118119
if (stateForUser != null) {
119120
stateForUser.add(0, denied);
120121
}
122+
participantsDeniedIgnored.put(username, stateForUser);
123+
System.out.println("setTaskDeniedStateForUser:participantsDeniedIgnored:"+participantsDeniedIgnored.toString());
121124
}
122125

123126
public void setTaskIgnoredStateForUser(String username, boolean ignored) {
124-
List<Boolean> stateForUser = participantsDeniedIgnored.get(username);
127+
ArrayList<Boolean> stateForUser = participantsDeniedIgnored.get(username);
125128

126129
if (stateForUser != null) {
127130
stateForUser.add(1, ignored);
128131
}
132+
133+
participantsDeniedIgnored.put(username, stateForUser);
134+
System.out.println("setTaskIgnoredStateForUser:participantsDeniedIgnored:"+participantsDeniedIgnored.toString());
129135
}
130136

131137
public boolean deniedByUser(String username) {
132138
List<Boolean> stateForUser = participantsDeniedIgnored.get(username);
133139

134-
if (stateForUser == null) return Boolean.FALSE;
135-
return stateForUser.get(0);
140+
if (stateForUser != null && stateForUser.get(0)) {
141+
return true;
142+
}
143+
144+
return false;
136145
}
137146

138147
public boolean ignoredByUser(String username) {
148+
149+
System.out.println("ignoredByUser: Participants: "+participants.toString());
150+
System.out.println("ignoredByUser: Participants that denied: "+participantsDeniedIgnored.toString());
151+
139152
List<Boolean> stateForUser = participantsDeniedIgnored.get(username);
140153

141-
if (stateForUser == null) return Boolean.FALSE;
142-
return stateForUser.get(1);
154+
if (stateForUser != null && stateForUser.get(1)) {
155+
return true;
156+
}
157+
158+
return false;
143159
}
144160

145161
public String getUsernameThatDeniedMerge() {
162+
163+
System.out.println("getUsernameThatDeniedMerge(): Participants: "+participants.toString());
164+
System.out.println("getUsernameThatDeniedMerge():Participants that denied: "+participantsDeniedIgnored.toString());
165+
146166
for (String participant : participants) {
147167
if (participantsDeniedIgnored.get(participant) != null &&
148168
participantsDeniedIgnored.get(participant).get(0)) {
169+
System.out.println("...was denied by: "+participant);
149170
return participant;
150171
}
151172
}
173+
System.out.println("...returning null.");
152174
return null;
153175
}
154176

155177
public boolean isDenied() {
178+
System.out.println("isDenied: Participants: "+participants.toString());
179+
System.out.println("isDenied: Participants that denied: "+participantsDeniedIgnored.toString());
180+
156181
return getUsernameThatDeniedMerge() != null;
157182
}
158183

src/main/java/org/ecocean/security/Collaboration.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,14 @@ public static String getNotificationsWidgetHtml(HttpServletRequest request,
357357
try {
358358
ArrayList<ScheduledIndividualMerge> potentialForNotification =
359359
myShepherd.getAllCompleteScheduledIndividualMergesForUsername(username);
360-
ArrayList<ScheduledIndividualMerge> incomplete =
361-
myShepherd.getAllIncompleteScheduledIndividualMerges();
360+
361+
System.out.println("Collaboration:potentialForNotification: "+potentialForNotification.size());
362+
363+
ArrayList<ScheduledIndividualMerge> incomplete = myShepherd.getAllIncompleteScheduledIndividualMerges();
364+
365+
System.out.println("Collaboration:incomplete: "+incomplete.size());
366+
367+
362368
potentialForNotification.addAll(incomplete);
363369
for (ScheduledIndividualMerge merge : potentialForNotification) {
364370
if (!merge.ignoredByUser(username) && merge.isUserParticipent(username)) {

src/main/java/org/ecocean/servlet/MergeIndividual.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@
1414
import org.ecocean.security.Collaboration;
1515

1616
public class MergeIndividual extends HttpServlet {
17-
Shepherd myShepherd;
18-
PrintWriter out;
19-
boolean locked = false;
17+
18+
2019

2120
public void init(ServletConfig config)
2221
throws ServletException {
@@ -30,8 +29,12 @@ public void doGet(HttpServletRequest request, HttpServletResponse response)
3029

3130
public void doPost(HttpServletRequest request, HttpServletResponse response)
3231
throws ServletException, IOException {
32+
33+
PrintWriter out = response.getWriter();
34+
boolean locked = false;
35+
3336
response.setContentType("text/html");
34-
out = response.getWriter();
37+
3538

3639
String id1 = request.getParameter("id1");
3740
String id2 = request.getParameter("id2");
@@ -40,18 +43,19 @@ public void doPost(HttpServletRequest request, HttpServletResponse response)
4043
"<strong>Error:</strong> Missing two valid individualIDs for MergeIndividual. ";
4144
if (id1 == null) msg += "<br>Bad id1: " + id1;
4245
if (id2 == null) msg += "<br>Bad id2: " + id2;
43-
errorAndClose(msg, response);
46+
errorAndClose(msg, response,out);
4447
return;
4548
}
4649
String oldName1;
4750
String oldName2;
4851
boolean canMergeAutomatically = false;
52+
4953

50-
myShepherd = new Shepherd(request);
54+
Shepherd myShepherd = new Shepherd(request);
5155
myShepherd.setAction("MergeIndividual.class");
52-
56+
myShepherd.beginDBTransaction();
5357
try {
54-
myShepherd.beginDBTransaction();
58+
5559

5660
MarkedIndividual mark1 = myShepherd.getMarkedIndividualQuiet(id1);
5761
MarkedIndividual mark2 = myShepherd.getMarkedIndividualQuiet(id2);
@@ -60,7 +64,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response)
6064
"<strong>Error:</strong> Could not find both individuals in our database. ";
6165
if (mark1 == null) msg += "<br>could not find individual " + mark1;
6266
if (mark2 == null) msg += "<br>could not find individual " + mark2;
63-
errorAndClose(msg, response);
67+
errorAndClose(msg, response,out);
6468
myShepherd.rollbackDBTransaction();
6569
myShepherd.closeDBTransaction();
6670
return;
@@ -161,7 +165,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response)
161165
}
162166
} catch (Exception le) {
163167
le.printStackTrace();
164-
errorAndClose("An exception occurred. Please contact the admins.", response);
168+
errorAndClose("An exception occurred. Please contact the admins.", response, out);
165169
myShepherd.rollbackDBTransaction();
166170
myShepherd.closeDBTransaction();
167171
return;
@@ -190,11 +194,11 @@ public void doPost(HttpServletRequest request, HttpServletResponse response)
190194
} else {
191195
errorAndClose(
192196
"<strong>Failure!</strong> This encounter is currently being modified by another user, or an exception occurred. Please wait a few seconds before trying to modify this encounter again.",
193-
response);
197+
response,out);
194198
}
195199
}
196200

197-
private void errorAndClose(String msg, HttpServletResponse response) {
201+
private void errorAndClose(String msg, HttpServletResponse response, PrintWriter out) {
198202
// out.println(ServletUtilities.getHeader(request));
199203
out.println(msg);
200204
// out.println("<p><a href=\"http://"+CommonConfiguration.getURLLocation(request)+"/encounters/encounter.jsp?number="+encNum+"\">Return to

src/main/java/org/ecocean/servlet/ScheduledIndividualMergeUpdate.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,12 @@ public class ScheduledIndividualMergeUpdate extends HttpServlet {
6262
if (merge != null && merge.isUserParticipent(username)) {
6363
System.out.println("user is participant? " + merge.isUserParticipent(username));
6464
if ("deny".equals(action)) {
65+
//I denied it
6566
merge.setTaskDeniedStateForUser(username, true);
67+
//I am therefore ignoring it too
68+
merge.setTaskIgnoredStateForUser(username, true);
69+
//and let's call it done
70+
merge.setTaskComplete();
6671
myShepherd.updateDBTransaction();
6772
System.out.println("Set ScheduledIndividual merge " + mergeId +
6873
" to DENIED for user " + username + ".");

src/main/java/org/ecocean/servlet/UserGetNotifications.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,14 @@ private JSONArray addAllScheduledIndividualMergeNotifications(JSONArray notifica
101101
if (pendingMerge.isUserParticipent(username)) {
102102
System.out.println("Is pending merge ignored by user? : " +
103103
pendingMerge.ignoredByUser(username));
104-
if (pendingMerge.isDenied() && !pendingMerge.ignoredByUser(username)) {
105-
notificationArr.put(individualMergeDeniedNotification(pendingMerge, username,
106-
myShepherd, request));
107-
} else if (!pendingMerge.ignoredByUser(username)) {
104+
if (!pendingMerge.isDenied() && !pendingMerge.ignoredByUser(username)) {
108105
notificationArr.put(individualMergePendingNotification(pendingMerge, username,
109106
myShepherd, request));
110-
}
107+
}
108+
//else if (!pendingMerge.isDenied() && !pendingMerge.ignoredByUser(username)) {
109+
// notificationArr.put(individualMergePendingNotification(pendingMerge, username,
110+
// myShepherd, request));
111+
//}
111112
}
112113
}
113114
ArrayList<ScheduledIndividualMerge> completeMergesOwnedByUser =
@@ -117,10 +118,16 @@ private JSONArray addAllScheduledIndividualMergeNotifications(JSONArray notifica
117118
for (ScheduledIndividualMerge completeMerge : completeMergesOwnedByUser) {
118119
System.out.println("Is merge ignored by user? : " +
119120
completeMerge.ignoredByUser(username));
120-
if (!completeMerge.ignoredByUser(username)) {
121+
if (!completeMerge.isDenied()&&!completeMerge.ignoredByUser(username)) {
121122
notificationArr.put(individualMergeCompleteNotification(completeMerge, username,
122123
myShepherd, request));
124+
System.out.println("...not denied");
123125
}
126+
else if (completeMerge.isDenied() && !completeMerge.ignoredByUser(username)) {
127+
notificationArr.put(individualMergeDeniedNotification(completeMerge, username,
128+
myShepherd, request));
129+
System.out.println("...denied");
130+
}
124131
}
125132
return notificationArr;
126133
}

0 commit comments

Comments
 (0)