📄 strutsmenubuilderimpl.java
字号:
/*
* Copyright 2004-2005 wangz.
* Project shufe_newsroom
*/
package com.skyon.um.security.acegi.strutsmenu;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import net.sf.navigator.displayer.MenuDisplayerMapping;
import net.sf.navigator.menu.MenuComponent;
import net.sf.navigator.menu.MenuRepository;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.collections.FastHashMap;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
/**
* @since 2005-8-4
* @author 王政
* @version $Id: StrutsMenuBuilderImpl.java,v 1.4 2005/10/26 04:13:02 wangzheng Exp $
*/
public class StrutsMenuBuilderImpl implements StrutsMenuBuilder, InitializingBean {
private static final Log logger = LogFactory.getLog(StrutsMenuBuilderImpl.class);
private MenuItemProvider menuItemProvider;
private FastHashMap displayerMap = new FastHashMap();
public StrutsMenuBuilderImpl() {
initDisplayers();
}
private void initDisplayers() {
MenuDisplayerMapping displayMapping = new MenuDisplayerMapping();
displayMapping.setName("ListMenu");
displayMapping.setType("net.sf.navigator.displayer.ListMenuDisplayer");
displayerMap.put(displayMapping.getName(), displayMapping);
displayMapping = new MenuDisplayerMapping();
displayMapping.setName("Velocity");
displayMapping.setType("net.sf.navigator.displayer.VelocityMenuDisplayer");
displayMapping.setConfig("/templates/xtree.html");
displayerMap.put(displayMapping.getName(), displayMapping);
//TODO add other menu supports
}
public void setMenuItemProvider(MenuItemProvider menuItemProvider) {
this.menuItemProvider = menuItemProvider;
}
/**
* @return Returns the menuItemProvider.
*/
public MenuItemProvider getMenuItemProvider() {
return menuItemProvider;
}
public void registerDisplayer(String displayerName, MenuDisplayerMapping mapping) {
displayerMap.put(displayerName, mapping);
}
/**
* @return Returns the displayerMap.
*/
public FastHashMap getDisplayerMap() {
return displayerMap;
}
public String[] getAllSupportDisplayerNames() {
List list = new LinkedList();
for (Iterator iter = displayerMap.keySet().iterator(); iter.hasNext(); ) {
list.add((String) iter.next());
}
return (String[]) list.toArray(new String[0]);
}
public MenuRepository getMenuRepository(String[] recipients) {
MenuCompentWrapper[] items = getMenuItemProvider().getMenuItems(recipients);
Arrays.sort(items, new Comparator() {
public int compare(Object o1, Object o2) {
Assert.isInstanceOf(MenuCompentWrapper.class, o1);
Assert.isInstanceOf(MenuCompentWrapper.class, o1);
MenuCompentWrapper wrapper1 = (MenuCompentWrapper) o1;
MenuCompentWrapper wrapper2 = (MenuCompentWrapper) o2;
String resourceName1 = wrapper1.getResourceName();
String resourceName2 = wrapper2.getResourceName();
return resourceName1.compareTo(resourceName2);
}
});
String[] resourceNames = new String[items.length];
for (int i = 0; i < items.length; i++) {
resourceNames[i] = items[i].getResourceName();
}
MenuRepository repository = new MenuRepository();
repository.setDisplayers(getDisplayerMap());
if (items == null || items.length ==0) {
if (logger.isDebugEnabled()) {
logger.debug("No corresponding menu for this user");
}
return repository;
}
for (int i = 0; i < items.length; i++) {
MenuCompentWrapper wrapper = items[i];
MenuComponent component = new MenuComponent();
try {
BeanUtils.copyProperties(component, wrapper);
} catch (Exception e) {
//Just simply skip it
logger.error("Menu Resoruce copy failled!");
} finally {
//Set the difference properties
component.setName(wrapper.getResourceName());
}
String parentName = wrapper.getParentName();
if (! StringUtils.isBlank(parentName)) {
int pos = searchInArray(resourceNames, parentName);
if (pos >= 0) {
MenuComponent parentMenu = repository.getMenu(parentName);
if (parentMenu == null) {
parentMenu = new MenuComponent();
MenuCompentWrapper parent = items[pos];
try {
BeanUtils.copyProperties(parentMenu, parent);
} catch (Exception e) {
//Just simply skip it
} finally {
//Set the difference properties
parentMenu.setName(parent.getResourceName());
}
repository.addMenu(parentMenu);
}
component.setParent(parentMenu);
}
repository.addMenu(component);
}
}
return repository;
}
private static int searchInArray(Object[] array, Object o) {
Assert.notNull(array, " array must be specified. ");
for (int i = 0; i < array.length; i++) {
if (ObjectUtils.nullSafeEquals(array[i], o)) {
return i;
}
}
return -1;
}
public void afterPropertiesSet() throws Exception {
Assert.notNull(getMenuItemProvider(), " Menu item provider is required . ");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -