package org.intellij.sonar.persistence; import java.util.ArrayList; import java.util.Collection; 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 = "localAnalysisScripts", storages = { @Storage(id = "localAnalysisScripts", file = StoragePathMacros.APP_CONFIG+"/sonarSettings.xml") } ) public class LocalAnalysisScripts implements PersistentStateComponent<LocalAnalysisScripts> { public static final String NO_LOCAL_ANALYSIS = "<NO LOCAL ANALYSIS>"; public static final String PROJECT = "<PROJECT>"; public Collection<LocalAnalysisScript> beans = new ArrayList<LocalAnalysisScript>(); @NotNull public static LocalAnalysisScripts getInstance() { return ServiceManager.getService(LocalAnalysisScripts.class); } public static void add(final LocalAnalysisScript newLocalAnalysisScript) { final Collection<LocalAnalysisScript> localAnalysisScripts = LocalAnalysisScripts.getInstance().getState().beans; final boolean alreadyExists = localAnalysisScripts.stream() .anyMatch(localAnalysisScript -> localAnalysisScript.equals(newLocalAnalysisScript)); if (alreadyExists) { throw new IllegalArgumentException("already exists"); } else { localAnalysisScripts.add(newLocalAnalysisScript); } } public static void remove(@NotNull final String name) { final Optional<LocalAnalysisScript> bean = get(name); Preconditions.checkArgument(bean.isPresent()); final List<LocalAnalysisScript> newBeans = getAll().stream() .filter(localAnalysisScript -> !bean.get().equals(localAnalysisScript)) .collect(Collectors.toList()); getInstance().beans = new ArrayList<>(newBeans); } public static Optional<LocalAnalysisScript> get(@NotNull final String name) { final Collection<LocalAnalysisScript> allBeans = getAll(); return allBeans.stream().filter(localAnalysisScript -> name.equals(localAnalysisScript.getName())).findFirst(); } public static Collection<LocalAnalysisScript> getAll() { return LocalAnalysisScripts.getInstance().getState().beans; } @NotNull @Override public LocalAnalysisScripts getState() { return this; } @Override public void loadState(LocalAnalysisScripts 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; LocalAnalysisScripts that = (LocalAnalysisScripts) 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; } }