package com.towel.role;
import java.awt.Component;
import java.awt.Container;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JMenu;
import com.towel.cfg.StringConfiguration;
public class RoleManager {
private RoleMember member;
public RoleManager(RoleMember role) {
this.member = role;
}
public void manageAnnotated(Object instance) {
Map<Field, Role> mapped = mapComps(instance.getClass());
for (Entry<Field, Role> ent : mapped.entrySet()) {
if (!ent.getValue().visibleTo().contains(member.getRoleName())) {
try {
Field f = ent.getKey();
f.setAccessible(true);
((Component) f.get(instance)).setVisible(false);
} catch (Exception e) {
}
}
}
}
public void manageNamedComps(Container cont) {
Map<Component, String> mapped = mapComps(cont, null);
for (Entry<Component, String> ent : mapped.entrySet()) {
StringConfiguration cfg = new StringConfiguration(ent.getValue());
if (!cfg.getAttribute("visibleTo").contains(member.getRoleName()))
ent.getKey().setVisible(false);
}
}
private Map<Component, String> mapComps(Container cont,
Map<Component, String> mapped) {
if (mapped == null)
mapped = new HashMap<Component, String>();
for (Component comp : cont.getComponents()) {
if (comp instanceof Component)
if (comp.getName() != null && comp.getName().length() != 0)
if (!comp.getName().startsWith("null"))
mapped.put((Component) comp, comp.getName());
if (comp instanceof JMenu)
mapJMenu((JMenu) comp, mapped);
else if (comp instanceof Container)
mapComps((Container) comp, mapped);
}
return mapped;
}
private void mapJMenu(JMenu menu, Map<Component, String> mapped) {
for (Component comp : menu.getMenuComponents()) {
if (comp instanceof Component)
if (comp.getName() != null && comp.getName().length() != 0)
if (!comp.getName().startsWith("null"))
mapped.put((Component) comp, comp.getName());
if (comp instanceof JMenu)
mapJMenu((JMenu) comp, mapped);
else if (comp instanceof Container)
mapComps((Container) comp, mapped);
}
}
private Map<Field, Role> mapComps(Class<?> view) {
Map<Field, Role> mapped = new HashMap<Field, Role>();
for (Field field : view.getDeclaredFields()) {
if (Component.class.isAssignableFrom(field.getType())) {
if (field.isAnnotationPresent(Role.class))
mapped.put(field, field.getAnnotation(Role.class));
}
}
return mapped;
}
}