/*
* Copyright 2003-2011 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.project.structure.project;
import gnu.trove.THashSet;
import org.apache.log4j.LogManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* Represents set of project modules ready for persistence.
* Preserves order of module paths.
* TODO make immutable
* XXX why immutable? what for?
*/
public final class ProjectDescriptor {
private final String myName;
private final List<ModulePath> myPaths = new ArrayList<>();
// XXX added just to keep check in addModulePath(), as I don't understand the reason behind it. Remove once cleared.
private final Set<String> myKnownPaths = new THashSet<>();
public ProjectDescriptor(@Nullable String name) {
myName = name;
}
@Nullable
public String getName() {
return myName;
}
public List<ModulePath> getModulePaths() {
return Collections.unmodifiableList(myPaths);
}
private static boolean isEmpty(String s) {
return s == null || s.equals("");
}
public void addModulePath(@NotNull ModulePath path) {
if (myKnownPaths.contains(path.getPath()) && isEmpty(path.getVirtualFolder())) {
LogManager.getLogger(ProjectDescriptor.class).warn("Not adding module path with an empty virtual folder; already have one");
} else {
if (myPaths.contains(path)) {
// Bad smell. We get here when project starts, and existing ProjectDescriptor serves as an input to populate Project (through ModuleLoader),
// which, in turn, in addModule() adds the path to the descriptor again. Shall rather tell 'load' from 'augment' scenario.
return;
}
myPaths.add(path);
myKnownPaths.add(path.getPath());
}
}
public void removeModulePath(@NotNull ModulePath path) {
myPaths.remove(path);
myKnownPaths.remove(path.getPath());
}
public void replacePath(@NotNull ModulePath modulePath, @NotNull ModulePath newPath) {
int i = myPaths.indexOf(modulePath);
assert i != -1;
myPaths.set(i, newPath);
}
public String toString() {
return String.format("%s:%d modules", myName, myPaths.size());
}
}