/*
* 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.generator;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.annotations.NotNull;
import java.util.*;
/**
* fyodor, 7/13/11
*/
public class DefaultGenerationParametersProvider implements GenerationParametersProviderEx {
private Map<String, Object> defaultParams = new HashMap<String, Object>();
private Map<SModel, Map<String, Object>> paramMaps = new HashMap<SModel, Map<String, Object>>();
private List<String> defaultLanguages = new ArrayList<String>();
private Map<SModel, List<String>> additionalLanguages = new HashMap<SModel, List<String>>();
@Override
public Map<String, Object> getParameters(SModel descriptor) {
if (descriptor == null) { throw new NullPointerException();}
Map<String, Object> params =
paramMaps.containsKey(descriptor) ? paramMaps.get(descriptor) : Collections.<String, Object>emptyMap();
return new DelegatingMapWithDefaults<String, Object> (params, defaultParams);
}
public void addParameter (String key, Object value) {
addParameter(null, key, value);
}
public void addParameter (SModel descriptor, String key, Object value) {
if (descriptor == null) {
defaultParams.put(key, value);
}
else{
if (!paramMaps.containsKey(descriptor)) {
paramMaps.put(descriptor, new HashMap<String, Object>());
}
paramMaps.get(descriptor).put(key, value);
}
}
@Override
public Collection<String> getAdditionalLanguages(SModel descriptor) {
if (descriptor == null) { throw new NullPointerException();}
List<String> modelLanguages = additionalLanguages.containsKey(descriptor) ? additionalLanguages.get(descriptor) : Collections.<String>emptyList();
if(!defaultLanguages.isEmpty()) {
List<String> result = new ArrayList<String>();
result.addAll(defaultLanguages);
result.addAll(modelLanguages);
return result;
}
return Collections.unmodifiableCollection(modelLanguages);
}
public void addLanguagesEngagedOnGeneration(SModel descriptor, Collection<String> languages) {
if (descriptor == null) { throw new NullPointerException();}
if(languages == null || languages.isEmpty()) return;
List<String> modelLanguages = additionalLanguages.get(descriptor);
if(modelLanguages == null) {
modelLanguages = new ArrayList<String>();
additionalLanguages.put(descriptor, modelLanguages);
}
modelLanguages.addAll(languages);
}
public void addLanguagesEngagedOnGeneration(Collection<String> languages) {
defaultLanguages.addAll(languages);
}
private static class DelegatingMapWithDefaults<K,V> extends AbstractMap<K,V> {
private final Map<K, V> myDelegate;
private final Map<K, V> myDefaults;
private DelegatingMapWithDefaults(Map<K, V> delegate, Map<K, V> defaults) {
myDelegate = delegate;
myDefaults = defaults;
}
@NotNull
@Override
public Set<Entry<K, V>> entrySet() {
HashSet<Entry<K, V>> set = new HashSet<Entry<K, V>>(myDelegate.entrySet());
for (Entry<K,V> e: myDefaults.entrySet()) {
if (!myDelegate.containsKey(e.getKey())) {
set.add(e);
}
}
return Collections.unmodifiableSet(set);
}
}
}