package org.nate.internal.transformer;
import static java.util.Collections.singletonMap;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.nate.encoder.NateNode;
import org.nate.internal.selector.NateSelector;
import org.nate.internal.selector.NateSelectors;
public class TransformationMap implements NateTransformer {
private final Map<NateSelector, NateTransformer> map;
@SuppressWarnings("unchecked")
public static TransformationMap fromObjectMap(Map data) {
Map<NateSelector, NateTransformer> map = new HashMap<NateSelector, NateTransformer>(data.size());
Set<Map.Entry> entrySet = data.entrySet();
for (Map.Entry entry : entrySet) {
Object key = entry.getKey();
Object value = entry.getValue();
NateSelector selector = NateSelectors.from(key);
NateTransformer transformer = NateTransformers.from(value);
map.put(selector, transformer);
}
return new TransformationMap(map);
}
public TransformationMap(Map<NateSelector, NateTransformer> map) {
this.map = map;
}
public TransformationMap(NateSelector selector, NateTransformer transformer) {
this.map = singletonMap(selector, transformer);
}
@Override
public void transform(NateNode node) {
for (Map.Entry<NateSelector, NateTransformer> entry : map.entrySet()) {
NateSelector selector = entry.getKey();
NateTransformer transformer = entry.getValue();
selector.transformSelectedNodes(transformer, node);
}
}
@Override
public void setAttribute(String attributeName, NateNode node) {
throw new IllegalArgumentException("Illegal attempt to inject into attribute " + attributeName
+ " the map: " + map);
}
}