@@ -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"; | |||
} |
@@ -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) { |
@@ -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) { |
@@ -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(); |
@@ -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> | |||
@@ -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()) | |||
); | |||
} | |||
} |
@@ -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()) | |||
); | |||
} | |||