Browse Source

Remove dangerous coupling of sonar-server on sonar-search

tags/5.0-RC1
Simon Brandhof 9 years ago
parent
commit
8cee55e18d

+ 7
- 0
server/sonar-process/src/main/java/org/sonar/process/ProcessConstants.java View File

@@ -55,4 +55,11 @@ public interface ProcessConstants {
*/
String ENABLE_STOP_COMMAND = "sonar.enableStopCommand";

// Constants declared by the ES plugin ListUpdate (see sonar-search)
// that are used by sonar-server
String ES_PLUGIN_LISTUPDATE_SCRIPT_NAME = "listUpdate";
String ES_PLUGIN_LISTUPDATE_ID_FIELD = "idField";
String ES_PLUGIN_LISTUPDATE_ID_VALUE = "idValue";
String ES_PLUGIN_LISTUPDATE_FIELD = "field";
String ES_PLUGIN_LISTUPDATE_VALUE = "value";
}

+ 2
- 1
server/sonar-search/src/main/java/org/sonar/search/SearchSettings.java View File

@@ -117,7 +117,8 @@ class SearchSettings {
private void configurePlugins(ImmutableSettings.Builder builder) {
builder
.put("script.default_lang", "native")
.put("script.native." + ListUpdate.NAME + ".type", ListUpdate.UpdateListScriptFactory.class.getName());
.put(String.format("script.native.%s.type", ProcessConstants.ES_PLUGIN_LISTUPDATE_SCRIPT_NAME),
ListUpdate.UpdateListScriptFactory.class.getName());
}

private void configureNetwork(ImmutableSettings.Builder builder) {

+ 10
- 17
server/sonar-search/src/main/java/org/sonar/search/script/ListUpdate.java View File

@@ -24,6 +24,7 @@ import org.elasticsearch.common.xcontent.support.XContentMapValues;
import org.elasticsearch.script.AbstractExecutableScript;
import org.elasticsearch.script.ExecutableScript;
import org.elasticsearch.script.NativeScriptFactory;
import org.sonar.process.ProcessConstants;

import java.util.ArrayList;
import java.util.Collection;
@@ -32,35 +33,28 @@ import java.util.Map;

public class ListUpdate extends AbstractExecutableScript {

public static final String NAME = "listUpdate";

public static final String ID_FIELD = "idField";
public static final String ID_VALUE = "idValue";
public static final String FIELD = "field";
public static final String VALUE = "value";

public static class UpdateListScriptFactory implements NativeScriptFactory {
@Override
public ExecutableScript newScript(@Nullable Map<String, Object> params) {
String idField = XContentMapValues.nodeStringValue(params.get(ID_FIELD), null);
String idValue = XContentMapValues.nodeStringValue(params.get(ID_VALUE), null);
String field = XContentMapValues.nodeStringValue(params.get(FIELD), null);
String idField = XContentMapValues.nodeStringValue(params.get(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD), null);
String idValue = XContentMapValues.nodeStringValue(params.get(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE), null);
String field = XContentMapValues.nodeStringValue(params.get(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD), null);
Map value = null;
if (idField == null) {
throw new IllegalStateException("Missing '" + ID_FIELD + "' parameter");
throw new IllegalStateException(String.format("Missing '%s' parameter", ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD));
}
if (idValue == null) {
throw new IllegalStateException("Missing '" + ID_VALUE + "' parameter");
throw new IllegalStateException(String.format("Missing '%s' parameter", ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE));
}
if (field == null) {
throw new IllegalStateException("Missing '" + FIELD + "' parameter");
throw new IllegalStateException(String.format("Missing '%s' parameter", ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD));
}

//NULL case is deletion of nested item
if (params.containsKey(VALUE)) {
Object obj = params.get(VALUE);
if (params.containsKey(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE)) {
Object obj = params.get(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE);
if (obj != null) {
value = XContentMapValues.nodeMapValue(params.get(VALUE), "Update item");
value = XContentMapValues.nodeMapValue(params.get(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE), "Update item");
}
}

@@ -73,7 +67,6 @@ public class ListUpdate extends AbstractExecutableScript {
private final String idValue;
private final String field;
private final Map<String, Object> value;

private Map<String, Object> ctx;

public ListUpdate(String idField, String idValue, String field, @Nullable Map<String, Object> value) {

+ 27
- 26
server/sonar-search/src/test/java/org/sonar/search/script/UpdateListScriptTest.java View File

@@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableMap;
import org.elasticsearch.script.ExecutableScript;
import org.junit.Before;
import org.junit.Test;
import org.sonar.process.ProcessConstants;

import java.util.Collection;
import java.util.HashMap;
@@ -53,7 +54,7 @@ public class UpdateListScriptTest {
}

// Missing ID_VALUE
params.put(ListUpdate.ID_FIELD, "test");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD, "test");
try {
factory.newScript(params);
fail();
@@ -62,7 +63,7 @@ public class UpdateListScriptTest {
}

// Missing FIELD
params.put(ListUpdate.ID_VALUE, "test");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE, "test");
try {
factory.newScript(params);
fail();
@@ -71,12 +72,12 @@ public class UpdateListScriptTest {
}

// Has all required attributes and Null Value
params.put(ListUpdate.FIELD, "test");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD, "test");
ExecutableScript script = factory.newScript(params);
assertThat(script).isNotNull();

// Has all required attributes and VALUE of wrong type
params.put(ListUpdate.VALUE, new Integer(52));
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, new Integer(52));
try {
factory.newScript(params);
fail();
@@ -85,12 +86,12 @@ public class UpdateListScriptTest {
}

// Has all required attributes and Proper VALUE
params.put(ListUpdate.VALUE, ImmutableMap.of("key", "value"));
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, ImmutableMap.of("key", "value"));
script = factory.newScript(params);
assertThat(script).isNotNull();

// Missing ID_FIELD
params.remove(ListUpdate.ID_FIELD);
params.remove(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD);
try {
factory.newScript(params);
fail();
@@ -109,10 +110,10 @@ public class UpdateListScriptTest {

// 0 Create list when field does not exists
Map<String, Object> params = new HashMap<String, Object>();
params.put(ListUpdate.FIELD, listField);
params.put(ListUpdate.ID_FIELD, "key");
params.put(ListUpdate.ID_VALUE, "1");
params.put(ListUpdate.VALUE, mapOf("key", "1", "value", "A"));
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD, listField);
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD, "key");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE, "1");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, mapOf("key", "1", "value", "A"));

ExecutableScript script = factory.newScript(params);
script.setNextVar("ctx", ImmutableMap.of("_source", source));
@@ -124,10 +125,10 @@ public class UpdateListScriptTest {

// Add item to existing list
params = new HashMap<String, Object>();
params.put(ListUpdate.FIELD, listField);
params.put(ListUpdate.ID_FIELD, "key");
params.put(ListUpdate.ID_VALUE, "2");
params.put(ListUpdate.VALUE, mapOf("key", "2", "value", "B"));
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD, listField);
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD, "key");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE, "2");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, mapOf("key", "2", "value", "B"));
script = factory.newScript(params);
script.setNextVar("ctx", ImmutableMap.of("_source", source));
script.run();
@@ -136,10 +137,10 @@ public class UpdateListScriptTest {

// updated first item in list
params = new HashMap<String, Object>();
params.put(ListUpdate.FIELD, listField);
params.put(ListUpdate.ID_FIELD, "key");
params.put(ListUpdate.ID_VALUE, "1");
params.put(ListUpdate.VALUE, mapOf("key", "1", "value", "a"));
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD, listField);
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD, "key");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE, "1");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, mapOf("key", "1", "value", "a"));
script = factory.newScript(params);
script.setNextVar("ctx", ImmutableMap.of("_source", source));
script.run();
@@ -148,10 +149,10 @@ public class UpdateListScriptTest {

// updated second item in list
params = new HashMap<String, Object>();
params.put(ListUpdate.FIELD, listField);
params.put(ListUpdate.ID_FIELD, "key");
params.put(ListUpdate.ID_VALUE, "2");
params.put(ListUpdate.VALUE, mapOf("key", "2", "value", "b"));
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD, listField);
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD, "key");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE, "2");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, mapOf("key", "2", "value", "b"));
script = factory.newScript(params);
script.setNextVar("ctx", ImmutableMap.of("_source", source));
script.run();
@@ -160,10 +161,10 @@ public class UpdateListScriptTest {

// delete first item
params = new HashMap<String, Object>();
params.put(ListUpdate.FIELD, listField);
params.put(ListUpdate.ID_FIELD, "key");
params.put(ListUpdate.ID_VALUE, "1");
params.put(ListUpdate.VALUE, null);
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD, listField);
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD, "key");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE, "1");
params.put(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, null);
script = factory.newScript(params);
script.setNextVar("ctx", ImmutableMap.of("_source", source));
script.run();

+ 1
- 1
server/sonar-server/pom.xml View File

@@ -238,7 +238,7 @@
<groupId>org.codehaus.sonar</groupId>
<artifactId>sonar-search</artifactId>
<version>${project.version}</version>
<scope>provided</scope>
<scope>test</scope>
</dependency>
</dependencies>


+ 11
- 11
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/index/ActiveRuleNormalizer.java View File

@@ -28,7 +28,7 @@ import org.sonar.core.qualityprofile.db.ActiveRuleDto;
import org.sonar.core.qualityprofile.db.ActiveRuleKey;
import org.sonar.core.qualityprofile.db.ActiveRuleParamDto;
import org.sonar.core.qualityprofile.db.QualityProfileDto;
import org.sonar.search.script.ListUpdate;
import org.sonar.process.ProcessConstants;
import org.sonar.server.db.DbClient;
import org.sonar.server.qualityprofile.ActiveRule;
import org.sonar.server.search.BaseNormalizer;
@@ -194,11 +194,11 @@ public class ActiveRuleNormalizer extends BaseNormalizer<ActiveRuleDto, ActiveRu
.replicationType(ReplicationType.ASYNC)
.routing(key.ruleKey().toString())
.id(key.toString())
.script(ListUpdate.NAME)
.addScriptParam(ListUpdate.FIELD, ActiveRuleField.PARAMS.field())
.addScriptParam(ListUpdate.VALUE, newParam)
.addScriptParam(ListUpdate.ID_FIELD, ActiveRuleParamField.NAME.field())
.addScriptParam(ListUpdate.ID_VALUE, param.getKey())
.script(ProcessConstants.ES_PLUGIN_LISTUPDATE_SCRIPT_NAME)
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD, ActiveRuleField.PARAMS.field())
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, newParam)
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD, ActiveRuleParamField.NAME.field())
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE, param.getKey())
);
}

@@ -207,11 +207,11 @@ public class ActiveRuleNormalizer extends BaseNormalizer<ActiveRuleDto, ActiveRu
.replicationType(ReplicationType.ASYNC)
.routing(key.ruleKey().toString())
.id(key.toString())
.script(ListUpdate.NAME)
.addScriptParam(ListUpdate.FIELD, ActiveRuleField.PARAMS.field())
.addScriptParam(ListUpdate.VALUE, null)
.addScriptParam(ListUpdate.ID_FIELD, ActiveRuleParamField.NAME.field())
.addScriptParam(ListUpdate.ID_VALUE, param.getKey())
.script(ProcessConstants.ES_PLUGIN_LISTUPDATE_SCRIPT_NAME)
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD, ActiveRuleField.PARAMS.field())
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, null)
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD, ActiveRuleParamField.NAME.field())
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE, param.getKey())
);
}
}

+ 11
- 11
server/sonar-server/src/main/java/org/sonar/server/rule/index/RuleNormalizer.java View File

@@ -31,7 +31,7 @@ import org.sonar.core.rule.RuleDto;
import org.sonar.core.rule.RuleParamDto;
import org.sonar.core.technicaldebt.db.CharacteristicDto;
import org.sonar.markdown.Markdown;
import org.sonar.search.script.ListUpdate;
import org.sonar.process.ProcessConstants;
import org.sonar.server.db.DbClient;
import org.sonar.server.search.BaseNormalizer;
import org.sonar.server.search.IndexField;
@@ -324,22 +324,22 @@ public class RuleNormalizer extends BaseNormalizer<RuleDto, RuleKey> {

return ImmutableList.of(new UpdateRequest()
.id(key.toString())
.script(ListUpdate.NAME)
.addScriptParam(ListUpdate.FIELD, RuleField.PARAMS.field())
.addScriptParam(ListUpdate.VALUE, newParam)
.addScriptParam(ListUpdate.ID_FIELD, RuleParamField.NAME.field())
.addScriptParam(ListUpdate.ID_VALUE, param.getName())
.script(ProcessConstants.ES_PLUGIN_LISTUPDATE_SCRIPT_NAME)
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD, RuleField.PARAMS.field())
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, newParam)
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD, RuleParamField.NAME.field())
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE, param.getName())
);
}

private List<UpdateRequest> nestedDelete(RuleParamDto param, RuleKey key) {
return ImmutableList.of(new UpdateRequest()
.id(key.toString())
.script(ListUpdate.NAME)
.addScriptParam(ListUpdate.FIELD, RuleField.PARAMS.field())
.addScriptParam(ListUpdate.VALUE, null)
.addScriptParam(ListUpdate.ID_FIELD, RuleParamField.NAME.field())
.addScriptParam(ListUpdate.ID_VALUE, param.getName())
.script(ProcessConstants.ES_PLUGIN_LISTUPDATE_SCRIPT_NAME)
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_FIELD, RuleField.PARAMS.field())
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_VALUE, null)
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_FIELD, RuleParamField.NAME.field())
.addScriptParam(ProcessConstants.ES_PLUGIN_LISTUPDATE_ID_VALUE, param.getName())
);
}


Loading…
Cancel
Save