Skip to content

Commit

Permalink
Refactoring of package org.sonar.server.computation.ws
Browse files Browse the repository at this point in the history
- class renaming
- add class ComputationWsAction to simplify ComputationWebService
  • Loading branch information
Simon Brandhof committed Jan 7, 2015
1 parent 54e63c0 commit 232fd62
Show file tree
Hide file tree
Showing 13 changed files with 104 additions and 70 deletions.
Expand Up @@ -22,30 +22,31 @@


import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService;


public class AnalysisReportWebService implements WebService { /**
* Web service to interact with the "computation" stack :
* <ul>
* <li>queue of analysis reports to be integrated</li>
* <li>consolidation and aggregation of analysis measures</li>
* <li>persistence in datastores (database/elasticsearch)</li>
* </ul>
*/
public class ComputationWebService implements WebService {
public static final String API_ENDPOINT = "api/analysis_reports"; public static final String API_ENDPOINT = "api/analysis_reports";


private final ActiveAnalysisReportsAction activeAnalysisReportsAction; private final ComputationWsAction[] actions;
private final IsAnalysisReportQueueEmptyAction isAnalysisReportQueueEmptyAction;
private final AnalysisReportHistorySearchAction historySearchAction;


public AnalysisReportWebService(ActiveAnalysisReportsAction activeReports, IsAnalysisReportQueueEmptyAction isAnalysisReportQueueEmptyAction, public ComputationWebService(ComputationWsAction... actions) {
AnalysisReportHistorySearchAction historySearchAction) { this.actions = actions;
this.activeAnalysisReportsAction = activeReports;
this.isAnalysisReportQueueEmptyAction = isAnalysisReportQueueEmptyAction;
this.historySearchAction = historySearchAction;
} }


@Override @Override
public void define(Context context) { public void define(Context context) {
NewController controller = context NewController controller = context
.createController(API_ENDPOINT) .createController(API_ENDPOINT)
.setDescription("Analysis reports processed"); .setDescription("Analysis reports processed");

for (ComputationWsAction action : actions) {
activeAnalysisReportsAction.define(controller); action.define(controller);
isAnalysisReportQueueEmptyAction.define(controller); }
historySearchAction.define(controller);

controller.done(); controller.done();
} }
} }
@@ -0,0 +1,30 @@
/*
* SonarQube, open source software quality management tool.
* Copyright (C) 2008-2014 SonarSource
* mailto:contact AT sonarsource DOT com
*
* SonarQube is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* SonarQube is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.sonar.server.computation.ws;

import org.sonar.api.server.ws.WebService;

/**
* Used by {@link ComputationWebService} to
* loop over all its actions
*/
interface ComputationWsAction {
void define(WebService.NewController controller);
}
Expand Up @@ -38,7 +38,7 @@
import java.util.Arrays; import java.util.Arrays;
import java.util.Map; import java.util.Map;


public class AnalysisReportHistorySearchAction implements RequestHandler { public class HistoryWsAction implements ComputationWsAction, RequestHandler {


public static final String PARAM_TYPE = "type"; public static final String PARAM_TYPE = "type";


Expand All @@ -47,12 +47,13 @@ public class AnalysisReportHistorySearchAction implements RequestHandler {
private final ActivityService logService; private final ActivityService logService;
private final ActivityMapping mapping; private final ActivityMapping mapping;


public AnalysisReportHistorySearchAction(ActivityService logService, ActivityMapping mapping) { public HistoryWsAction(ActivityService logService, ActivityMapping mapping) {
this.logService = logService; this.logService = logService;
this.mapping = mapping; this.mapping = mapping;
} }


void define(WebService.NewController controller) { @Override
public void define(WebService.NewController controller) {
WebService.NewAction action = controller WebService.NewAction action = controller
.createAction(SEARCH_ACTION) .createAction(SEARCH_ACTION)
.setDescription("Search for activities") .setDescription("Search for activities")
Expand Down
Expand Up @@ -30,17 +30,18 @@


import java.util.List; import java.util.List;


public class IsAnalysisReportQueueEmptyAction implements RequestHandler { public class IsQueueEmptyWsAction implements ComputationWsAction, RequestHandler {
private final AnalysisReportQueue queue; private final AnalysisReportQueue queue;


public IsAnalysisReportQueueEmptyAction(AnalysisReportQueue queue) { public IsQueueEmptyWsAction(AnalysisReportQueue queue) {
this.queue = queue; this.queue = queue;
} }


void define(WebService.NewController controller) { @Override
public void define(WebService.NewController controller) {
controller controller
.createAction("is_queue_empty") .createAction("is_queue_empty")
.setDescription("Check is the analysis report queue is empty") .setDescription("Check if the analysis report queue is empty")
.setInternal(true) .setInternal(true)
.setHandler(this); .setHandler(this);
} }
Expand Down
Expand Up @@ -33,13 +33,23 @@
/** /**
* @since 5.0 * @since 5.0
*/ */
public class ActiveAnalysisReportsAction implements RequestHandler { public class QueueWsAction implements ComputationWsAction, RequestHandler {
private final AnalysisReportQueue queue; private final AnalysisReportQueue queue;


public ActiveAnalysisReportsAction(AnalysisReportQueue queue) { public QueueWsAction(AnalysisReportQueue queue) {
this.queue = queue; this.queue = queue;
} }


@Override
public void define(WebService.NewController controller) {
controller
.createAction("active")
.setDescription("List all the active analysis reports")
.setSince("5.0")
.setInternal(true)
.setHandler(this);
}

@Override @Override
public void handle(Request request, Response response) throws Exception { public void handle(Request request, Response response) throws Exception {
List<AnalysisReportDto> reports = queue.all(); List<AnalysisReportDto> reports = queue.all();
Expand All @@ -54,7 +64,9 @@ private void writeReports(List<AnalysisReportDto> reports, JsonWriter json) {
json.name("reports").beginArray(); json.name("reports").beginArray();
for (AnalysisReportDto report : reports) { for (AnalysisReportDto report : reports) {
json.beginObject(); json.beginObject();
// TODO naming consistency -> rename id to key
json.prop("id", report.getId()); json.prop("id", report.getId());
// TODO rename to projectKey
json.prop("project", report.getProjectKey()); json.prop("project", report.getProjectKey());
json.prop("projectName", report.getProjectKey()); json.prop("projectName", report.getProjectKey());
json.propDateTime("startedAt", report.getStartedAt()); json.propDateTime("startedAt", report.getStartedAt());
Expand All @@ -66,13 +78,4 @@ private void writeReports(List<AnalysisReportDto> reports, JsonWriter json) {
json.endArray(); json.endArray();
} }


void define(WebService.NewController controller) {
controller
.createAction("active")
.setDescription("List all the active analysis reports")
.setSince("5.0")
.setInternal(true)
.setHandler(this);
}

} }
Expand Up @@ -22,3 +22,4 @@
package org.sonar.server.computation.ws; package org.sonar.server.computation.ws;


import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;

Expand Up @@ -92,10 +92,10 @@
import org.sonar.server.computation.*; import org.sonar.server.computation.*;
import org.sonar.server.computation.db.AnalysisReportDao; import org.sonar.server.computation.db.AnalysisReportDao;
import org.sonar.server.computation.step.*; import org.sonar.server.computation.step.*;
import org.sonar.server.computation.ws.ActiveAnalysisReportsAction; import org.sonar.server.computation.ws.QueueWsAction;
import org.sonar.server.computation.ws.AnalysisReportHistorySearchAction; import org.sonar.server.computation.ws.HistoryWsAction;
import org.sonar.server.computation.ws.AnalysisReportWebService; import org.sonar.server.computation.ws.ComputationWebService;
import org.sonar.server.computation.ws.IsAnalysisReportQueueEmptyAction; import org.sonar.server.computation.ws.IsQueueEmptyWsAction;
import org.sonar.server.config.ws.PropertiesWs; import org.sonar.server.config.ws.PropertiesWs;
import org.sonar.server.dashboard.db.DashboardDao; import org.sonar.server.dashboard.db.DashboardDao;
import org.sonar.server.dashboard.db.WidgetDao; import org.sonar.server.dashboard.db.WidgetDao;
Expand Down Expand Up @@ -636,10 +636,10 @@ void startLevel4Components(ComponentContainer pico) {
pico.addSingleton(AnalysisReportService.class); pico.addSingleton(AnalysisReportService.class);
pico.addSingleton(AnalysisReportQueue.class); pico.addSingleton(AnalysisReportQueue.class);
pico.addSingleton(AnalysisReportTaskLauncher.class); pico.addSingleton(AnalysisReportTaskLauncher.class);
pico.addSingleton(AnalysisReportWebService.class); pico.addSingleton(ComputationWebService.class);
pico.addSingleton(ActiveAnalysisReportsAction.class); pico.addSingleton(QueueWsAction.class);
pico.addSingleton(IsAnalysisReportQueueEmptyAction.class); pico.addSingleton(IsQueueEmptyWsAction.class);
pico.addSingleton(AnalysisReportHistorySearchAction.class); pico.addSingleton(HistoryWsAction.class);
pico.addSingleton(DefaultPeriodCleaner.class); pico.addSingleton(DefaultPeriodCleaner.class);
pico.addSingleton(DefaultPurgeTask.class); pico.addSingleton(DefaultPurgeTask.class);
pico.addSingleton(ProjectCleaner.class); pico.addSingleton(ProjectCleaner.class);
Expand Down
Expand Up @@ -20,33 +20,30 @@


package org.sonar.server.computation.ws; package org.sonar.server.computation.ws;


import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.sonar.api.server.ws.RequestHandler;
import org.sonar.api.server.ws.WebService; import org.sonar.api.server.ws.WebService;
import org.sonar.server.activity.ActivityService;
import org.sonar.server.activity.ws.ActivityMapping;
import org.sonar.server.computation.AnalysisReportQueue;
import org.sonar.server.ws.WsTester;


import static org.fest.assertions.Assertions.assertThat; import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;


public class AnalysisReportWebServiceTest { public class ComputationWebServiceTest {

private WsTester tester;

@Before
public void setUp() throws Exception {
this.tester = new WsTester(new AnalysisReportWebService(new ActiveAnalysisReportsAction(mock(AnalysisReportQueue.class)), new IsAnalysisReportQueueEmptyAction(
mock(AnalysisReportQueue.class)), new AnalysisReportHistorySearchAction(mock(ActivityService.class), mock(ActivityMapping.class))));
}


@Test @Test
public void define() throws Exception { public void define() throws Exception {
WebService.Controller controller = tester.controller(AnalysisReportWebService.API_ENDPOINT); ComputationWebService ws = new ComputationWebService(new ComputationWsAction() {

@Override
public void define(WebService.NewController controller) {
WebService.NewAction upload = controller.createAction("upload");
upload.setHandler(mock(RequestHandler.class));
}
});
WebService.Context context = new WebService.Context();
ws.define(context);

WebService.Controller controller = context.controller("api/analysis_reports");
assertThat(controller).isNotNull(); assertThat(controller).isNotNull();
assertThat(controller.description()).isNotEmpty(); assertThat(controller.description()).isNotEmpty();
assertThat(controller.actions()).hasSize(3); assertThat(controller.actions()).hasSize(1);
} }
} }
Expand Up @@ -39,7 +39,6 @@
import org.sonar.server.component.ComponentTesting; import org.sonar.server.component.ComponentTesting;
import org.sonar.server.computation.AnalysisReportLog; import org.sonar.server.computation.AnalysisReportLog;
import org.sonar.server.computation.AnalysisReportQueue; import org.sonar.server.computation.AnalysisReportQueue;
import org.sonar.server.computation.ComputationService;
import org.sonar.server.db.DbClient; import org.sonar.server.db.DbClient;
import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.tester.ServerTester; import org.sonar.server.tester.ServerTester;
Expand All @@ -50,7 +49,10 @@


import static org.fest.assertions.Assertions.assertThat; import static org.fest.assertions.Assertions.assertThat;


public class AnalysisReportHistorySearchActionMediumTest { /**
* TODO replace this medium test by a small test
*/
public class HistoryWsActionMediumTest {
private static final String DEFAULT_PROJECT_KEY = "DefaultProjectKey"; private static final String DEFAULT_PROJECT_KEY = "DefaultProjectKey";
private static final String DEFAULT_PROJECT_NAME = "DefaultProjectName"; private static final String DEFAULT_PROJECT_NAME = "DefaultProjectName";
private static final String DEFAULT_REPORT_DATA = "default-project"; private static final String DEFAULT_REPORT_DATA = "default-project";
Expand All @@ -63,7 +65,6 @@ public class AnalysisReportHistorySearchActionMediumTest {
private WsTester wsTester; private WsTester wsTester;
private AnalysisReportQueue queue; private AnalysisReportQueue queue;
private MockUserSession userSession; private MockUserSession userSession;
private ComputationService computationService;
private ActivityService activityService; private ActivityService activityService;


@Before @Before
Expand Down Expand Up @@ -108,7 +109,7 @@ public void add_and_try_to_retrieve_activities() throws Exception {
session.commit(); session.commit();
userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN); userSession.setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);


WsTester.TestRequest request = wsTester.newGetRequest(AnalysisReportWebService.API_ENDPOINT, AnalysisReportHistorySearchAction.SEARCH_ACTION); WsTester.TestRequest request = wsTester.newGetRequest(ComputationWebService.API_ENDPOINT, HistoryWsAction.SEARCH_ACTION);
WsTester.Result result = request.execute(); WsTester.Result result = request.execute();


assertThat(result).isNotNull(); assertThat(result).isNotNull();
Expand Down Expand Up @@ -138,7 +139,7 @@ public void user_rights_is_not_enough_throw_ForbiddenException() throws Exceptio
queue.remove(report); queue.remove(report);
userSession.setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION); userSession.setGlobalPermissions(GlobalPermissions.SCAN_EXECUTION);


WsTester.TestRequest sut = wsTester.newGetRequest(AnalysisReportWebService.API_ENDPOINT, AnalysisReportHistorySearchAction.SEARCH_ACTION); WsTester.TestRequest sut = wsTester.newGetRequest(ComputationWebService.API_ENDPOINT, HistoryWsAction.SEARCH_ACTION);
sut.execute(); sut.execute();
} }
} }
Expand Up @@ -36,16 +36,16 @@
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;


public class IsAnalysisReportQueueEmptyActionTest { public class IsQueueEmptyWsActionTest {


IsAnalysisReportQueueEmptyAction sut; IsQueueEmptyWsAction sut;
AnalysisReportQueue queue; AnalysisReportQueue queue;
Response response; Response response;


@Before @Before
public void before() throws Exception { public void before() throws Exception {
queue = mock(AnalysisReportQueue.class); queue = mock(AnalysisReportQueue.class);
sut = new IsAnalysisReportQueueEmptyAction(queue); sut = new IsQueueEmptyWsAction(queue);


response = mock(Response.class); response = mock(Response.class);
when(response.stream()).thenReturn(new FakeStream()); when(response.stream()).thenReturn(new FakeStream());
Expand Down
Expand Up @@ -35,16 +35,15 @@
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING; import static org.sonar.core.computation.db.AnalysisReportDto.Status.PENDING;


public class ActiveAnalysisReportsActionTest { public class QueueWsActionTest {


WsTester tester; WsTester tester;
private AnalysisReportQueue queue; private AnalysisReportQueue queue;


@Before @Before
public void setup() throws Exception { public void setup() throws Exception {
queue = mock(AnalysisReportQueue.class); queue = mock(AnalysisReportQueue.class);
tester = new WsTester(new AnalysisReportWebService(new ActiveAnalysisReportsAction(queue), new IsAnalysisReportQueueEmptyAction(queue), tester = new WsTester(new ComputationWebService(new QueueWsAction(queue)));
mock(AnalysisReportHistorySearchAction.class)));
} }


@Test @Test
Expand All @@ -60,12 +59,12 @@ public void list_active_reports() throws Exception {
List<AnalysisReportDto> reports = Lists.newArrayList(report); List<AnalysisReportDto> reports = Lists.newArrayList(report);
when(queue.all()).thenReturn(reports); when(queue.all()).thenReturn(reports);


WsTester.TestRequest request = tester.newGetRequest(AnalysisReportWebService.API_ENDPOINT, "active"); WsTester.TestRequest request = tester.newGetRequest(ComputationWebService.API_ENDPOINT, "active");
request.execute().assertJson(getClass(), "list_active_reports.json", false); request.execute().assertJson(getClass(), "list_active_reports.json", false);
} }


@Test @Test
public void define() throws Exception { public void define() throws Exception {
assertThat(tester.controller(AnalysisReportWebService.API_ENDPOINT).action("active")).isNotNull(); assertThat(tester.controller(ComputationWebService.API_ENDPOINT).action("active")).isNotNull();
} }
} }

0 comments on commit 232fd62

Please sign in to comment.