package org.intellij.sonar.persistence; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import com.google.common.base.Preconditions; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; import com.intellij.openapi.components.StoragePathMacros; import com.intellij.util.xmlb.XmlSerializerUtil; import org.jetbrains.annotations.NotNull; @State( name = "sonarServers", storages = { @Storage(id = "sonarServers", file = StoragePathMacros.APP_CONFIG+"/sonarSettings.xml") } ) public class SonarServers implements PersistentStateComponent<SonarServers> { public static final String NO_SONAR = "<NO SONAR>"; public static final String PROJECT = "<PROJECT>"; public Collection<SonarServerConfig> beans = new ArrayList<SonarServerConfig>(); @NotNull public static SonarServers getInstance() { return ServiceManager.getService(SonarServers.class); } public static void add(final SonarServerConfig newSonarServerConfigBean) { final Collection<SonarServerConfig> sonarServerConfigBeans = SonarServers.getInstance().getState().beans; final boolean alreadyExists = sonarServerConfigBeans.stream() .anyMatch(sonarServerConfigurationBean -> sonarServerConfigurationBean.equals(newSonarServerConfigBean)); if (alreadyExists) { throw new IllegalArgumentException("already exists"); } else { sonarServerConfigBeans.add(newSonarServerConfigBean); if (newSonarServerConfigBean.isPasswordChanged()) { newSonarServerConfigBean.storePassword(); } newSonarServerConfigBean.clearPassword(); } } public static void remove(@NotNull final String sonarServerName) { final Optional<SonarServerConfig> bean = get(sonarServerName); Preconditions.checkArgument(bean.isPresent()); final List<SonarServerConfig> newBeans = getAll().get().stream() .filter(sonarServerConfigurationBean -> !bean.get().equals(sonarServerConfigurationBean)) .collect(Collectors.toList()); getInstance().beans = new LinkedList<SonarServerConfig>(newBeans); } public static Optional<SonarServerConfig> get(@NotNull final String sonarServerName) { Optional<SonarServerConfig> bean = Optional.empty(); final Optional<Collection<SonarServerConfig>> allBeans = getAll(); if (allBeans.isPresent()) { bean = allBeans.get().stream().filter(sonarServerConfigBean -> sonarServerName.equals(sonarServerConfigBean.getName())).findFirst(); } return bean; } public static Optional<Collection<SonarServerConfig>> getAll() { return Optional.ofNullable(SonarServers.getInstance().getState().beans); } @NotNull @Override public SonarServers getState() { return this; } @Override public void loadState(SonarServers state) { XmlSerializerUtil.copyBean(state,this); } @SuppressWarnings("RedundantIfStatement") @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; SonarServers that = (SonarServers) o; if (beans != null ? !beans.equals(that.beans) : that.beans != null) return false; return true; } @Override public int hashCode() { return beans != null ? beans.hashCode() : 0; } }