/*
* Copyright 2003-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jetbrains.mps.library;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.BaseComponent;
import com.intellij.openapi.components.PersistentStateComponent;
import jetbrains.mps.ide.MPSCoreComponents;
import jetbrains.mps.ide.vfs.IdeaFile;
import jetbrains.mps.library.BaseLibraryManager.LibraryState;
import jetbrains.mps.library.contributor.LibDescriptor;
import jetbrains.mps.library.contributor.LibraryContributor;
import jetbrains.mps.util.MacrosFactory;
import jetbrains.mps.vfs.FileSystem;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public abstract class BaseLibraryManager implements BaseComponent, PersistentStateComponent<LibraryState>, LibraryContributor {
private final LibraryInitializer myLibraryInitializer;
public BaseLibraryManager(MPSCoreComponents components) {
myLibraryInitializer = components.getLibraryInitializer();
}
@Override
public boolean hiddenLanguages() {
return false;
}
@Override
public void initComponent() {
final List<LibraryContributor> contributorsToLoad = Collections.<LibraryContributor>singletonList(this);
myLibraryInitializer.load(contributorsToLoad);
}
@Override
public void disposeComponent() {
myLibraryInitializer.unload(Collections.<LibraryContributor>singletonList(this));
}
//-------libraries
@Override
public final Set<LibDescriptor> getPaths() {
Set<LibDescriptor> result = new HashSet<LibDescriptor>();
for (Library lib : getUILibraries()) {
result.add(new LibDescriptor(FileSystem.getInstance().getFile(lib.getPath())));
}
return result;
}
public Library addLibrary(String name) {
Library library = new Library();
library.setName(name);
myLibraries.getLibraries().put(library.getName(), library);
return library;
}
public void remove(Library l) {
myLibraries.getLibraries().remove(l.getName());
}
public Set<Library> getUILibraries() {
Set<Library> result = new HashSet<Library>();
result.addAll(myLibraries.getLibraries().values());
return result;
}
//-------macro stuff
private LibraryState removeMacros(LibraryState state) {
LibraryState result = new LibraryState();
for (Entry<String, Library> entry : state.getLibraries().entrySet()) {
result.getLibraries().put(entry.getKey(), removeMacros(entry.getValue()));
}
return result;
}
private Library addMacros(Library l) {
Library result = l.clone();
result.setPath(addMacros(result.getPath()));
return result;
}
private Library removeMacros(Library l) {
Library result = l.clone();
result.setPath(removeMacros(result.getPath()));
return result;
}
protected String addMacros(String path) {
return MacrosFactory.getGlobal().shrinkPath(path);
}
protected String removeMacros(String path) {
return MacrosFactory.getGlobal().expandPath(path);
}
//-------component stuff
private LibraryState myLibraries = new LibraryState();
@Override
@NonNls
@NotNull
public String getComponentName() {
return "Library Manager";
}
@Override
public LibraryState getState() {
LibraryState result = new LibraryState();
for (Entry<String, Library> entry : myLibraries.getLibraries().entrySet()) {
result.getLibraries().put(entry.getKey(), addMacros(entry.getValue()));
}
return result;
}
@Override
public void loadState(LibraryState state) {
myLibraries = removeMacros(state);
}
@Override
public String toString() {
return "BaseLibraryManager";
}
static class LibraryState {
private Map<String, Library> myLibraries = new HashMap<String, Library>();
public Map<String, Library> getLibraries() {
return myLibraries;
}
public void setLibraries(Map<String, Library> libraries) {
myLibraries = libraries;
}
}
}