Skip to content

Commit 93cee38

Browse files
Fix for #769 - IllegalArgumentException: state should be: writes is not an empty list upon savings Tags and Sharing Settings
- also workaround for com.mongodb.DuplicateKeyException: Write failed with error code 11000 and error message 'E11000 duplicate key error collection: webprotege.RoleAssignments index: userName_1_projectId_1
1 parent 2500943 commit 93cee38

8 files changed

Lines changed: 102 additions & 29 deletions

File tree

.gitignore

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,30 @@ target/
77
.classpath
88
.project
99
.settings/
10+
**/.factorypath
1011
out/
1112

13+
# https://www.jenv.be/
14+
.java-version
15+
1216
logs/
1317

1418
velocity.log.*
1519
*.log
1620

1721
dependency-reduced-pom.xml
1822

19-
.protegedata/
23+
.protegedata/
24+
25+
# Package Files
26+
*.jar
27+
*.war
28+
*.nar
29+
*.ear
30+
*.zip
31+
*.tar.gz
32+
*.rar
33+
34+
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
35+
hs_err_pid*
36+
replay_pid*

webprotege-server-api/src/main/java/edu/stanford/bmir/protege/web/server/tag/TagRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public interface TagRepository {
1616

1717
void saveTag(@Nonnull Tag tag);
1818

19-
void saveTags(@Nonnull Iterable<Tag> tags);
19+
void saveTags(@Nonnull List<Tag> tags);
2020

2121
void deleteTag(@Nonnull TagId tagId);
2222

webprotege-server-core/src/main/java/edu/stanford/bmir/protege/web/server/jackson/ObjectMapperProvider.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@
1313
import org.semanticweb.owlapi.model.*;
1414
import uk.ac.manchester.cs.owl.owlapi.OWLDataFactoryImpl;
1515

16+
import java.util.concurrent.atomic.AtomicInteger;
17+
1618
import javax.annotation.Nonnull;
1719
import javax.inject.Inject;
1820
import javax.inject.Provider;
1921

22+
import org.slf4j.Logger;
23+
import org.slf4j.LoggerFactory;
24+
2025
/**
2126
* Matthew Horridge
2227
* Stanford Center for Biomedical Informatics Research
@@ -27,6 +32,10 @@ public class ObjectMapperProvider implements Provider<ObjectMapper> {
2732
@Nonnull
2833
private final OWLDataFactory dataFactory;
2934

35+
private static Logger logger = LoggerFactory.getLogger(ObjectMapperProvider.class);
36+
37+
private static AtomicInteger mapperInstanceCount = new AtomicInteger();
38+
3039
@Inject
3140
public ObjectMapperProvider() {
3241
this.dataFactory = new OWLDataFactoryImpl();
@@ -35,6 +44,9 @@ public ObjectMapperProvider() {
3544
@Override
3645
public ObjectMapper get() {
3746
ObjectMapper mapper = new ObjectMapper();
47+
int instanceCount = mapperInstanceCount.incrementAndGet();
48+
String msg = String.format("Instantiated another ObjectMappger#%08x, total: %d", mapper.hashCode(), instanceCount);
49+
logger.info(msg);
3850
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
3951
mapper.setDefaultPrettyPrinter(new DefaultPrettyPrinter());
4052
mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false);

webprotege-server-core/src/main/java/edu/stanford/bmir/protege/web/server/search/EntitySearchFilterRepositoryImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,8 @@ public ImmutableList<EntitySearchFilter> getSearchFilters(@Nonnull ProjectId pro
9494
public void saveSearchFilters(@Nonnull ImmutableList<EntitySearchFilter> filters) {
9595
try {
9696
writeLock.lock();
97+
if (filters.size() < 1)
98+
return;
9799
var writes = filters.stream()
98100
.map(this::toMongoDocument)
99101
.map(this::toReplaceOne)

webprotege-server-core/src/main/java/edu/stanford/bmir/protege/web/server/sharing/ProjectSharingSettingsManagerImpl.java

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,25 @@
11
package edu.stanford.bmir.protege.web.server.sharing;
22

3+
import static edu.stanford.bmir.protege.web.server.access.Subject.forAnySignedInUser;
4+
import static edu.stanford.bmir.protege.web.server.access.Subject.forUser;
5+
import static java.util.Collections.emptySet;
6+
import static java.util.stream.Collectors.toMap;
7+
8+
import java.util.ArrayList;
9+
import java.util.Collection;
10+
import java.util.Collections;
11+
import java.util.List;
12+
import java.util.Map;
13+
import java.util.Optional;
14+
15+
import javax.inject.Inject;
16+
17+
import org.slf4j.Logger;
18+
import org.slf4j.LoggerFactory;
19+
320
import com.google.common.collect.ImmutableSet;
21+
import com.mongodb.DuplicateKeyException;
22+
423
import edu.stanford.bmir.protege.web.server.access.AccessManager;
524
import edu.stanford.bmir.protege.web.server.access.ProjectResource;
625
import edu.stanford.bmir.protege.web.server.access.Subject;
@@ -12,16 +31,6 @@
1231
import edu.stanford.bmir.protege.web.shared.sharing.SharingPermission;
1332
import edu.stanford.bmir.protege.web.shared.sharing.SharingSetting;
1433
import edu.stanford.bmir.protege.web.shared.user.UserId;
15-
import org.slf4j.Logger;
16-
import org.slf4j.LoggerFactory;
17-
18-
import javax.inject.Inject;
19-
import java.util.*;
20-
21-
import static edu.stanford.bmir.protege.web.server.access.Subject.forAnySignedInUser;
22-
import static edu.stanford.bmir.protege.web.server.access.Subject.forUser;
23-
import static java.util.Collections.emptySet;
24-
import static java.util.stream.Collectors.toMap;
2534

2635
/**
2736
* Matthew Horridge
@@ -66,12 +75,24 @@ public ProjectSharingSettings getProjectSharingSettings(ProjectId projectId) {
6675

6776
@Override
6877
public void setProjectSharingSettings(ProjectSharingSettings settings) {
69-
ProjectId projectId = settings.getProjectId();
70-
ProjectResource projectResource = new ProjectResource(projectId);
78+
ProjectId projectId = settings.getProjectId();
79+
ProjectResource projectResource = new ProjectResource(projectId);
7180

72-
// Remove existing assignments
73-
accessManager.getSubjectsWithAccessToResource(projectResource)
74-
.forEach(subject -> accessManager.setAssignedRoles(subject, projectResource, Collections.emptySet()));
81+
// Overwrite existing assignments with blank assignment
82+
for (Subject subject : accessManager.getSubjectsWithAccessToResource(projectResource)) {
83+
try {
84+
logger.info("Subject: {}, resource: {}", subject, projectResource);
85+
accessManager.setAssignedRoles(subject, projectResource, Collections.emptySet());
86+
} catch (DuplicateKeyException e) {
87+
// TODO: fix for intermittent 'E11000 duplicate key error collection:
88+
// webprotege.RoleAssignments
89+
// index: userName_1_projectId_1
90+
// dup key: { userName: null, projectId: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
91+
// }'
92+
String msg = String.format("Subject: %s, resource: %s", subject, projectResource);
93+
logger.warn(msg, e);
94+
}
95+
}
7596

7697
Map<PersonId, SharingSetting> map = settings.getSharingSettings().stream()
7798
.collect(toMap(SharingSetting::getPersonId, s -> s, (s1, s2) -> s1));
@@ -93,7 +114,7 @@ public void setProjectSharingSettings(ProjectSharingSettings settings) {
93114
roles);
94115
}
95116
else {
96-
logger.info("User in sharing setting not found. An email invitation needs to be sent");
117+
logger.warn("User in sharing setting not found. An email invitation needs to be sent");
97118
// TODO
98119
// We need to send the user an email invitation
99120
}

webprotege-server-core/src/main/java/edu/stanford/bmir/protege/web/server/tag/TagRepositoryCachingImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public synchronized void saveTag(@Nonnull Tag tag) {
5353
}
5454

5555
@Override
56-
public synchronized void saveTags(@Nonnull Iterable<Tag> tags) {
56+
public synchronized void saveTags(@Nonnull List<Tag> tags) {
5757
delegate.saveTags(tags);
5858
invalidate();
5959
}

webprotege-server-core/src/main/java/edu/stanford/bmir/protege/web/server/tag/TagRepositoryImpl.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,10 @@ private Document toDocument(@Nonnull Tag tag) {
105105
return objectMapper.convertValue(tag, Document.class);
106106
}
107107

108-
public void saveTags(@Nonnull Iterable<Tag> tags) {
108+
public void saveTags(@Nonnull List<Tag> tags) {
109109
writeLock.lock();
110+
if (tags.size() < 1)
111+
return;
110112
try {
111113
checkNotNull(tags);
112114
Spliterator<Tag> spliterator = tags.spliterator();

webprotege-server/src/main/java/edu/stanford/bmir/protege/web/server/api/resources/ProjectSettingsResource.java

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,24 @@
11
package edu.stanford.bmir.protege.web.server.api.resources;
22

3+
import static com.google.common.base.Preconditions.checkNotNull;
4+
import static com.google.common.collect.ImmutableList.toImmutableList;
5+
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
6+
7+
import javax.annotation.Nonnull;
8+
import javax.ws.rs.Consumes;
9+
import javax.ws.rs.GET;
10+
import javax.ws.rs.POST;
11+
import javax.ws.rs.Path;
12+
import javax.ws.rs.Produces;
13+
import javax.ws.rs.core.Context;
14+
import javax.ws.rs.core.Response;
15+
316
import com.google.auto.factory.AutoFactory;
417
import com.google.auto.factory.Provided;
518
import com.google.common.collect.ImmutableList;
19+
import org.slf4j.Logger;
20+
import org.slf4j.LoggerFactory;
21+
622
import edu.stanford.bmir.protege.web.server.api.ActionExecutor;
723
import edu.stanford.bmir.protege.web.shared.crud.GetEntityCrudKitSettingsAction;
824
import edu.stanford.bmir.protege.web.shared.crud.IRIPrefixUpdateStrategy;
@@ -23,21 +39,14 @@
2339
import edu.stanford.bmir.protege.web.shared.tag.TagData;
2440
import edu.stanford.bmir.protege.web.shared.user.UserId;
2541

26-
import javax.annotation.Nonnull;
27-
import javax.ws.rs.*;
28-
import javax.ws.rs.core.Context;
29-
import javax.ws.rs.core.Response;
30-
31-
import static com.google.common.base.Preconditions.checkNotNull;
32-
import static com.google.common.collect.ImmutableList.toImmutableList;
33-
import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
34-
3542
/**
3643
* Matthew Horridge
3744
* Stanford Center for Biomedical Informatics Research
3845
* 2020-08-24
3946
*/
4047
public class ProjectSettingsResource {
48+
49+
protected static Logger logger = LoggerFactory.getLogger(ProjectSettingsResource.class);
4150

4251
@Nonnull
4352
private final ProjectId projectId;
@@ -78,6 +87,16 @@ public Response getProjectSettings(@Context UserId userId) {
7887
@POST
7988
@Consumes(APPLICATION_JSON)
8089
public Response setProjectSettings(@Context UserId userId, AllProjectSettings allProjectSettings) {
90+
logger.info("Called setProjectSettings for projectId '{}'", this.projectId.getId());
91+
try {
92+
return _setProjectSettings(userId, allProjectSettings);
93+
} catch (Exception e) {
94+
logger.error("setProjectSettings failed", e);
95+
throw e;
96+
}
97+
}
98+
99+
private Response _setProjectSettings(@Context UserId userId, AllProjectSettings allProjectSettings) {
81100
var projectSettings = allProjectSettings.getProjectSettings().withProjectId(projectId);
82101
actionExecutor.execute(new SetProjectSettingsAction(projectSettings), userId);
83102

0 commit comments

Comments
 (0)