/*
* 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;
import jetbrains.mps.components.CoreComponent;
import jetbrains.mps.util.annotation.ToRemove;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
public class PathMacros implements CoreComponent {
private static PathMacros INSTANCE;
private List<PathMacrosProvider> myMacrosProviders = new CopyOnWriteArrayList<PathMacrosProvider>();
private Set<String> reported = new HashSet<String>();
/**
* @deprecated it is a CoreComponent, one can get it from MPSPlatform
*/
@ToRemove(version = 3.4)
@Deprecated
public static PathMacros getInstance() {
return INSTANCE;
}
public PathMacros() {
}
@Override
public void init() {
if (INSTANCE != null) {
throw new IllegalStateException("double initialization");
}
INSTANCE = this;
}
@Override
public void dispose() {
INSTANCE = null;
}
public Set<String> getNames() {
Set<String> result = null;
boolean modifiable = false;
for (PathMacrosProvider p : myMacrosProviders) {
Set<String> pnames = p.getNames();
if (pnames == null || pnames.isEmpty()) continue;
if (result == null) {
result = pnames;
continue;
}
if (!modifiable) {
result = new HashSet<String>(result);
modifiable = true;
}
result.addAll(pnames);
}
return result != null ? result : Collections.<String>emptySet();
}
public Set<String> getUserNames() {
Set<String> result = null;
boolean modifiable = false;
for (PathMacrosProvider p : myMacrosProviders) {
Set<String> pnames = p.getUserNames();
if (pnames == null || pnames.isEmpty()) continue;
if (result == null) {
result = pnames;
continue;
}
if (!modifiable) {
result = new HashSet<String>(result);
modifiable = true;
}
result.addAll(pnames);
}
return result != null ? result : Collections.<String>emptySet();
}
public String getValue(String name) {
for (PathMacrosProvider p : myMacrosProviders) {
final String value = p.getValue(name);
if (value != null) {
return value;
}
}
return null;
}
public void report(String message, String macro) {
if (reported.contains(macro)) return;
reported.add(macro);
for (PathMacrosProvider p : myMacrosProviders) {
p.report(message, macro);
}
}
public void addMacrosProvider(@NotNull PathMacrosProvider provider) {
myMacrosProviders.add(provider);
}
public void removeMacrosProvider(@NotNull PathMacrosProvider provider) {
myMacrosProviders.remove(provider);
}
}