package jetbrains.buildserver.sonarplugin.sqrunner.manager.projectfeatures;
import jetbrains.buildServer.serverSide.SProject;
import jetbrains.buildServer.serverSide.SProjectFeatureDescriptor;
import jetbrains.buildServer.serverSide.crypt.EncryptUtil;
import jetbrains.buildserver.sonarplugin.sqrunner.manager.SQSInfo;
import jetbrains.buildserver.sonarplugin.sqrunner.manager.SQSManager;
import jetbrains.buildserver.sonarplugin.sqrunner.manager.BaseSQSInfo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Created by linfar on 03.10.16.
*
* Project features based SQSManager. Doesn't store data itself converting it from project features on demand instead.
*/
public class SQSManagerProjectFeatures implements SQSManager {
protected static final String PROJECT_FEATURE_TYPE = "";
@NotNull
@Override
public synchronized List<SQSInfo> getAvailableServers(@NotNull SProject project) {
return getAvailableServersStream(project).collect(Collectors.toList());
}
private Stream<? extends SQSInfo> getAvailableServersStream(@NotNull SProject project) {
return project.getAvailableFeaturesOfType(PROJECT_FEATURE_TYPE).stream().map(SQSInfoImpl::new);
}
@NotNull
@Override
public synchronized List<SQSInfo> getOwnAvailableServers(@NotNull SProject project) {
return project.getOwnFeaturesOfType(PROJECT_FEATURE_TYPE).stream().map(SQSInfoImpl::new).collect(Collectors.toList());
}
@Nullable
@Override
public synchronized SQSInfo getServer(@NotNull SProject project, @NotNull String serverId) {
final Optional<SProjectFeatureDescriptor> optional = project.getAvailableFeaturesOfType(PROJECT_FEATURE_TYPE).stream().filter(f -> {
final String id = f.getParameters().get(BaseSQSInfo.ID);
return id != null && serverId.equals(id);
}).findFirst();
if (optional.isPresent()) {
return new SQSInfoImpl(optional.get());
}
return null;
}
@Nullable
@Override
public synchronized SQSInfo getOwnServer(@NotNull SProject project, @NotNull String serverId) {
final Optional<SProjectFeatureDescriptor> optional = findByServerId(project, serverId);
if (optional.isPresent()) {
return new SQSInfoImpl(optional.get());
}
return null;
}
@NotNull
@Override
public synchronized SQSActionResult editServer(@NotNull SProject project, @NotNull SQSInfo modifiedServer) {
final Optional<SProjectFeatureDescriptor> found = findByServerId(project, modifiedServer.getId());
if (found.isPresent()) {
final SProjectFeatureDescriptor featureDescriptor = found.get();
project.updateFeature(featureDescriptor.getId(), PROJECT_FEATURE_TYPE, toMap(modifiedServer));
return new SQSActionResult(new SQSInfoImpl(found.get()), modifiedServer, "SonarQube Server '" + modifiedServer.getName() + "' updated");
} else {
return addServer(project, modifiedServer);
}
}
@NotNull
@Override
public synchronized SQSActionResult addServer(@NotNull SProject toProject, @NotNull SQSInfo newServer) {
if (getServer(toProject, newServer.getId()) != null) return new SQSActionResult(null, null, "Cannot add: SonarQube Server with id '" + newServer.getId() + "' already exists", true);
doAddServer(toProject, newServer);
return new SQSActionResult(null, newServer, "SonarQube Server '" + newServer.getName() + " added");
}
@NotNull
@Override
public synchronized SQSActionResult removeServer(@NotNull SProject project, @NotNull String serverId) {
final Optional<SProjectFeatureDescriptor> found = findByServerId(project, serverId);
if (found.isPresent() && project.removeFeature(found.get().getId()) != null) {
final SQSInfoImpl old = new SQSInfoImpl(found.get());
return new SQSActionResult(old, null, "SonarQube Server '" + old.getName() + "' removed");
}
return new SQSActionResult(null, null, "Cannot remove: SonarQube Server with id '" + serverId + "' doesn't exist");
}
private Optional<SProjectFeatureDescriptor> findByServerId(@NotNull SProject project, @NotNull String serverId) {
return project.getOwnFeaturesOfType(PROJECT_FEATURE_TYPE).stream().filter(f -> {
final String id = f.getParameters().get(BaseSQSInfo.ID);
return id != null && serverId.equals(id);
}).findFirst();
}
@NotNull
private Map<String, String> toMap(@NotNull final SQSInfo sqsInfo) {
final Map<String, String> res = new HashMap<>();
res.putAll(sqsInfo.getParameters());
for (String key : BaseSQSInfo.ENCRYPTED_FIELDS) {
final String value = sqsInfo.getParameters().get(key);
if (value != null) {
res.put(key, EncryptUtil.scramble(value));
}
}
return res;
}
private void doAddServer(@NotNull SProject toProject, @NotNull SQSInfo newServer) {
toProject.addFeature(PROJECT_FEATURE_TYPE, toMap(newServer));
}
}