package org.cloudgraph.web.model.profile;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.cloudgraph.web.sdo.personalization.DefaultElementSetting;
import org.cloudgraph.web.sdo.personalization.Element;
import org.cloudgraph.web.sdo.personalization.ProfileElementSetting;
import org.cloudgraph.web.sdo.personalization.Setting;
import org.plasma.sdo.PlasmaDataGraphVisitor;
import commonj.sdo.DataObject;
public class SettingCollector implements PlasmaDataGraphVisitor
{
private static Log log = LogFactory.getLog(SettingCollector.class);
private Map<String, Map<String, Setting>> settings = new HashMap<String, Map<String, Setting>>();
private Map<String, Element> elements = new HashMap<String, Element>();
private String roleName;
@SuppressWarnings("unused")
private SettingCollector() {}
public SettingCollector(String roleName) {
this.roleName = roleName;
if (this.roleName == null || this.roleName.trim().length() == 0)
throw new IllegalArgumentException("expected roleName arg");
}
public void visit(DataObject target, DataObject source,
String sourceKey, int level) {
if (!(target instanceof Element))
return;
Element element = (Element)target;
this.elements.put(element.getName(), element);
Map<String, Setting> componentMap = settings.get(element.getName());
// map defaults first
if (element.getDefaultElementSettingCount() > 0) {
if (componentMap == null) {
componentMap = new HashMap<String, Setting>();
settings.put(element.getName(), componentMap);
}
for (DefaultElementSetting elementSetting : element.getDefaultElementSetting()) {
if (elementSetting.getRole() != null && elementSetting.getRole().getName() != null) {
if (elementSetting.getRole().getName().equals(this.roleName)) {
componentMap.put(elementSetting.getSetting().getName(),
elementSetting.getSetting());
}
}
else
throw new IllegalStateException("expected Role for DefaultElementSetting");
}
}
// let profile override / overwrite
if (element.getProfileElementSettingCount() > 0) {
if (componentMap == null) {
componentMap = new HashMap<String, Setting>();
settings.put(element.getName(), componentMap);
}
for (ProfileElementSetting elementSetting : element.getProfileElementSetting())
componentMap.put(elementSetting.getSetting().getName(),
elementSetting.getSetting());
}
}
public Map<String, Map<String, Setting>> getSettings() {
return settings;
}
public Map<String, Element> getElements() {
return elements;
}
public void clear() {
this.settings.clear();
}
}