Skip to content

Commit 1d0bbff

Browse files
author
Vladimir Kotal
committed
specify which Messages to delete with text
1 parent 3a27879 commit 1d0bbff

File tree

6 files changed

+132
-7
lines changed

6 files changed

+132
-7
lines changed

apiary.apib

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ see https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html#parse-java
9393

9494
### deletes messages with specified tag [DELETE]
9595

96+
+ Request (application/text)
97+
98+
string value of the message text - only messages with the text (and specified tag) will be deleted
99+
96100
+ Parameters
97101
+ tag (string) - tag
98102

opengrok-indexer/src/main/java/org/opengrok/indexer/configuration/RuntimeEnvironment.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1935,11 +1935,11 @@ public void addMessage(final Message message) {
19351935

19361936
/**
19371937
* Remove all messages containing at least one of the tags.
1938-
*
19391938
* @param tags set of tags
1939+
* @param text message text (can be null, empty)
19401940
*/
1941-
public void removeAnyMessage(final Set<String> tags) {
1942-
messagesContainer.removeAnyMessage(tags);
1941+
public void removeAnyMessage(final Set<String> tags, final String text) {
1942+
messagesContainer.removeAnyMessage(tags, text);
19431943
}
19441944

19451945
/**

opengrok-indexer/src/main/java/org/opengrok/indexer/web/messages/Message.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,19 @@ public boolean hasAny(Set<String> t) {
112112
return !tmp.isEmpty();
113113
}
114114

115+
/**
116+
* @param tags set of tags to check
117+
* @param text message text
118+
* @return true if a mesage has at least one of the tags and text
119+
*/
120+
public boolean hasTagsAndText(Set<String> tags, String text) {
121+
if (text == null || text.isEmpty()) {
122+
return hasAny(tags);
123+
}
124+
125+
return hasAny(tags) && getText().equals(text);
126+
}
127+
115128
@Override
116129
public boolean equals(Object o) {
117130
if (this == o) {

opengrok-indexer/src/main/java/org/opengrok/indexer/web/messages/MessagesContainer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,13 @@ public void removeAnyMessage(Set<String> tags) {
167167
removeAnyMessage(t -> t.getMessage().hasAny(tags));
168168
}
169169

170+
public void removeAnyMessage(Set<String> tags, String text) {
171+
if (tags == null) {
172+
return;
173+
}
174+
removeAnyMessage(t -> t.getMessage().hasTagsAndText(tags, text));
175+
}
176+
170177
/**
171178
* Remove messages which have expired.
172179
*/

opengrok-web/src/main/java/org/opengrok/web/api/v1/controller/MessagesController.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919

2020
/*
21-
* Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
21+
* Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved.
2222
*/
2323
package org.opengrok.web.api.v1.controller;
2424

@@ -54,11 +54,12 @@ public Response addMessage(@Valid final Message message) {
5454
}
5555

5656
@DELETE
57-
public void removeMessagesWithTag(@QueryParam("tag") final String tag) {
57+
@Consumes(MediaType.TEXT_PLAIN)
58+
public void removeMessagesWithTag(@QueryParam("tag") final String tag, final String text) {
5859
if (tag == null) {
5960
throw new WebApplicationException("Message tag has to be specified", Response.Status.BAD_REQUEST);
6061
}
61-
env.removeAnyMessage(Collections.singleton(tag));
62+
env.removeAnyMessage(Collections.singleton(tag), text);
6263
}
6364

6465
@GET

opengrok-web/src/test/java/org/opengrok/web/api/v1/controller/MessagesControllerTest.java

Lines changed: 101 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,20 @@
1818
*/
1919

2020
/*
21-
* Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved.
21+
* Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved.
2222
*/
2323
package org.opengrok.web.api.v1.controller;
2424

25+
import org.glassfish.grizzly.http.server.HttpServer;
26+
import org.glassfish.jersey.client.ClientConfig;
27+
import org.glassfish.jersey.client.ClientProperties;
28+
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
2529
import org.glassfish.jersey.server.ResourceConfig;
30+
import org.glassfish.jersey.test.DeploymentContext;
2631
import org.glassfish.jersey.test.JerseyTest;
32+
import org.glassfish.jersey.test.spi.TestContainer;
33+
import org.glassfish.jersey.test.spi.TestContainerException;
34+
import org.glassfish.jersey.test.spi.TestContainerFactory;
2735
import org.junit.After;
2836
import org.junit.Before;
2937
import org.junit.Test;
@@ -35,9 +43,13 @@
3543
import javax.ws.rs.client.Entity;
3644
import javax.ws.rs.core.Application;
3745
import javax.ws.rs.core.GenericType;
46+
import javax.ws.rs.core.MediaType;
3847
import javax.ws.rs.core.Response;
48+
import javax.ws.rs.core.UriBuilder;
3949

50+
import java.io.IOException;
4051
import java.lang.reflect.Field;
52+
import java.net.URI;
4153
import java.time.Duration;
4254
import java.util.Arrays;
4355
import java.util.Collections;
@@ -72,6 +84,67 @@ protected Application configure() {
7284
return new ResourceConfig(MessagesController.class);
7385
}
7486

87+
// Allow entity body for DELETE method on the client side.
88+
@Override
89+
protected void configureClient(ClientConfig config) {
90+
config.property(ClientProperties.SUPPRESS_HTTP_COMPLIANCE_VALIDATION, true);
91+
}
92+
93+
// Allow entity body for DELETE method on the server side.
94+
public static class CustomGrizzlyTestContainerFactory implements TestContainerFactory {
95+
public CustomGrizzlyTestContainerFactory() {
96+
}
97+
98+
public TestContainer create(URI baseUri, DeploymentContext context) {
99+
return new GrizzlyTestContainer(baseUri, context);
100+
}
101+
102+
private class GrizzlyTestContainer implements TestContainer {
103+
private URI baseUri;
104+
private final HttpServer server;
105+
106+
private GrizzlyTestContainer(URI baseUri, DeploymentContext context) {
107+
this.baseUri = UriBuilder.fromUri(baseUri).path(context.getContextPath()).build(new Object[0]);
108+
this.server = GrizzlyHttpServerFactory.createHttpServer(this.baseUri, context.getResourceConfig(), false);
109+
this.server.getServerConfiguration().setAllowPayloadForUndefinedHttpMethods(true);
110+
}
111+
112+
public ClientConfig getClientConfig() {
113+
return null;
114+
}
115+
116+
public URI getBaseUri() {
117+
return this.baseUri;
118+
}
119+
120+
public void start() {
121+
if (this.server.isStarted()) {
122+
return;
123+
}
124+
125+
try {
126+
this.server.start();
127+
if (this.baseUri.getPort() == 0) {
128+
this.baseUri = UriBuilder.fromUri(this.baseUri).port(this.server.getListener("grizzly").getPort()).build(new Object[0]);
129+
}
130+
} catch (IOException e) {
131+
throw new TestContainerException(e);
132+
}
133+
}
134+
135+
public void stop() {
136+
if (this.server.isStarted()) {
137+
this.server.shutdownNow();
138+
}
139+
}
140+
}
141+
}
142+
143+
@Override
144+
protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
145+
return new CustomGrizzlyTestContainerFactory();
146+
}
147+
75148
@Before
76149
public void setupMessageListener() throws Exception {
77150
setMessageContainer(env, new MessagesContainer());
@@ -135,6 +208,15 @@ private void removeMessages(final String tag) {
135208
.delete();
136209
}
137210

211+
private void removeMessages(final String tag, final String text) {
212+
Entity<String> requestEntity = Entity.entity(text, MediaType.TEXT_PLAIN);
213+
target("messages")
214+
.queryParam("tag", tag)
215+
.request()
216+
.build("DELETE", requestEntity).
217+
invoke();
218+
}
219+
138220
@Test
139221
public void addAndRemoveTest() {
140222
addMessage("test", "test");
@@ -147,6 +229,24 @@ public void addAndRemoveTest() {
147229
assertTrue(env.getMessages("test").isEmpty());
148230
}
149231

232+
@Test
233+
public void addAndRemoveWithTextTest() {
234+
final String tag = "foo";
235+
final String text = "text";
236+
237+
addMessage(text, tag);
238+
assertEquals(1, env.getMessages(tag).size());
239+
240+
removeMessages(tag + "bar", text);
241+
assertEquals(1, env.getMessages(tag).size());
242+
243+
removeMessages(tag, text + "bar");
244+
assertEquals(1, env.getMessages(tag).size());
245+
246+
removeMessages(tag, text);
247+
assertTrue(env.getMessages(tag).isEmpty());
248+
}
249+
150250
@Test
151251
public void addAndRemoveDifferentTagsTest() {
152252
addMessage("test", "tag1");

0 commit comments

Comments
 (0)