⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 permissionpackage.java

📁 OBPM是一个开源
💻 JAVA
字号:
package cn.myapps.core.permission.ejb;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import cn.myapps.base.dao.PersistenceUtils;
import cn.myapps.base.dao.ValueObject;
import cn.myapps.core.resource.ejb.ResourceProcess;
import cn.myapps.core.resource.ejb.ResourceType;
import cn.myapps.core.resource.ejb.ResourceVO;
import cn.myapps.core.user.action.WebUser;
import cn.myapps.util.ProcessFactory;

public class PermissionPackage {

	private static Map _cache;

	private static Set getPermissionSet(Object key) {
		if (_cache == null) {
			try {
				loadCache();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		Set ps = (Set) _cache.get(key);
		return ps;
	}

	public synchronized static boolean checkPermission(HttpServletRequest req,
			WebUser user) {
		if (user.getLoginno().equalsIgnoreCase("admin")) {
			return true;
		}

		Object key = getPerimissionKeyByUri(req);
		Set ps = getPermissionSet(key);
		if (ps == null || ps.contains(user.getId())) {
			return true;
		} else {
			if (user.getRoles() != null)
				for (Iterator iter = user.getRoles().iterator(); iter.hasNext();) {
					ValueObject vo = (ValueObject) iter.next();
					if (ps.contains(vo.getId()))
						return true;
				}
			if (user.getDepartments() != null)
				for (Iterator iter = user.getDepartments().iterator(); iter
						.hasNext();) {
					ValueObject vo = (ValueObject) iter.next();
					if (ps.contains(vo.getId()))
						return true;
				}
		}

		return false;
	}

	public synchronized static boolean checkPermission(ResourceVO r,
			WebUser user) {
		if (!r.isIsprotected())
			return true;

		if (user.getLoginno().equalsIgnoreCase("admin")) {
			return true;
		}

		try {

			
			Object key = getPermissionKey(r);
			

			
			Set ps = getPermissionSet(key);
			
			if (ps == null || ps.contains(user.getId())) {
				return true;
			} else {
				if (user.getRoles() != null)
					for (Iterator iter = user.getRoles().iterator(); iter.hasNext();) {
						ValueObject vo = (ValueObject) iter.next();
						if (ps.contains(vo.getId()))
							return true;
					}
				if (user.getDepartments() != null)
					for (Iterator iter = user.getDepartments().iterator(); iter
							.hasNext();) {
						ValueObject vo = (ValueObject) iter.next();
						if (ps.contains(vo.getId()))
							return true;
					}
			}

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

	public synchronized static void clearCache() throws Exception {
		if (_cache != null) {
			_cache.clear();
		}
		_cache = null;
	}

	public synchronized static void loadCache() throws Exception {
		try {
			//PersistenceUtils.getSessionSignal().sessionSignal++;
			_cache = new MyLinkedMap();

			ResourceProcess rp = (ResourceProcess) ProcessFactory
					.createProcess(ResourceProcess.class);
			Collection cols = rp.doSimpleQuery(null, null);

//			for (Iterator iter = cols.iterator(); iter.hasNext();) {
//				ResourceVO element = (ResourceVO) iter.next();
//				System.out.println("resourceelement-->>"+element.getDescription());
//			}

			if (cols != null) {
				for (Iterator iter = cols.iterator(); iter.hasNext();) {
					ResourceVO r = (ResourceVO) iter.next();
					if (r.isIsprotected()) {
						Object key = getPermissionKey(r);
						Set ps = getPermissionSet(key);
						if (ps == null) {
							ps = new HashSet();

							if (r.getRelatedPermissions() != null)
								for (Iterator iterator = r
										.getRelatedPermissions().iterator(); iterator
										.hasNext();) {
									PermissionVO pmvo = (PermissionVO) iterator
											.next();
									if (pmvo.getUser() != null) {
										ps.add(pmvo.getUser().getId());
									} else if (pmvo.getDepartment() != null) {
										ps.add(pmvo.getDepartment().getId());
									} else if (pmvo.getRole() != null) {
										ps.add(pmvo.getRole().getId());
									}

								}

							_cache.put(key, ps);
						}
					}
				}
			}

			/*
			 * PermissionProcess pp = (PermissionProcess) ProcessFactory
			 * .createProcess(PermissionProcess.class); Collection pms =
			 * pp.doSimpleQuery(null); for (Iterator iter2 = pms.iterator();
			 * iter2.hasNext();) { PermissionVO pm = (PermissionVO)
			 * iter2.next();
			 * 
			 * ResourceVO r = pm.getResource(); if (r != null) { Object key =
			 * getPermissionKey(r); Set ps = getPermissionSet(key);
			 * 
			 * if (ps != null) { System.out.print("pm->"+pm); if (pm.getRole() !=
			 * null) { ps.add(pm.getRole().getId()); System.out.print("
			 * role->"+pm.getRole().getName()); } else if (pm.getDepartment() !=
			 * null) { ps.add(pm.getDepartment().getId()); System.out.print("
			 * dept->"+pm.getDepartment().getName()); } else if (pm.getUser() !=
			 * null) { ps.add(pm.getUser().getId()); System.out.print("
			 * user->"+pm.getUser().getName()); } else { System.out.print("
			 * none->null"); } System.out.println(); } } }
			 */
			System.out.println(_cache);
		} catch (Exception e) {
			throw e;
		} finally {
			//PersistenceUtils.getSessionSignal().sessionSignal--;
			PersistenceUtils.closeSession();
		}
	}

	private static Object getPermissionKey(ResourceVO r)
			throws ClassNotFoundException {
		return new PerimissionKey(r);
	}

	private static Object getPerimissionKeyByUri(HttpServletRequest req) {
		String uri = ((HttpServletRequest) req).getRequestURI();
		String querystr = ((HttpServletRequest) req).getQueryString();
		String application = (String)req.getSession().getAttribute("application");

		return getPerimissionKeyByUri(uri, querystr, application);
	}

	public static Object getPerimissionKeyByUri(String uri, String querystr, String application) {
		return new PerimissionKey(uri, querystr, application);
	}

}

class PerimissionKey extends Object {
	private ArrayList key = new ArrayList();

	PerimissionKey(ResourceVO r) {
		if (r.getResourceAction() != null) {
			if (r.getResourceAction().equals(
					ResourceType.ACTION_TYPE_ACTIONCLASS)) {
				key.add(r.getActionurl()+"$$"+r.getApplicationid());
			} else if (r.getResourceAction().equals(
					ResourceType.ACTION_TYPE_VIEW)) {
				String viewid = r.getDisplayView();
				key.add(viewid+"$$"+r.getApplicationid());
			} else if (r.getResourceAction().equals(
					ResourceType.ACTION_TYPE_OTHERURL)) {
				String url = r.getOtherurl();
				if (url != null) {
					int p = url.indexOf("?");
					if (p > 0) {
						String uri = url.substring(0, p);
						String querystr = url.substring(p + 1);
						setKeyByURI(uri, querystr, r.getApplicationid());
					} else {
						setKeyByURI(url, "", r.getApplicationid());
					}
				}
			} else {
				key.add(r.getId());
			}
		}

	}

	private void setKeyByURI(String uri, String querystr, String application) {
		if (uri != null) {
			if (uri.endsWith("displayView.action")) {
				if (querystr != null) {
					int p1 = querystr.indexOf("_viewid");
					int p2 = querystr.indexOf("=", p1);
					int p3 = querystr.indexOf("&", p2);
					if (p1 >= 0 && p2 > 0) {
						String viewid = p3 > 0 ? querystr.substring(p2 + 1, p3)
								: querystr.substring(p2);
						key.add(viewid);
					}
				}
			} else if (uri.indexOf(".action") > 0) {
				key.add(uri.substring(0, uri.indexOf(".action") + 7));
			} else {
				// int p = querystr!=null?querystr.length();
				// if (p >= 0) {
				String major = uri;
				major = major.replaceAll("\\\\", "/");
				major = major.replaceAll("//", "/");
				key.add(major);
				if (querystr != null) {
					String[] tmp = querystr.split("&");
					for (int i = 0; i < tmp.length; i++) {
						key.add(tmp[i]);
					}
					// }
				}
				// else {
				// String major = uri;
				// major = major.replaceAll("\\\\", "/");
				// major = major.replaceAll("//", "/");
				// key.add(major);
				// }
			}
		}

	}

	PerimissionKey(String uri, String querystr, String application) {
		setKeyByURI(uri, querystr, application);
	}

	public boolean equals(Object obj) {
		boolean flag = false;
		if (obj instanceof PerimissionKey) {
			PerimissionKey pk = (PerimissionKey) obj;

			if (pk.key.size() > 0 && this.key.containsAll(pk.key)) {
				System.out.println("this->>" + this + " obj->>" + obj);
				flag = true;
			}

			// for (Iterator iter = this.key.iterator(); iter.hasNext();) {
			// Object element = (Object) iter.next();
			// if (pk.key.contains(element)) {
			// System.out.println("this->>" + this + " obj->>" + obj);
			// System.out.println("false");
			// flag = true;
			// }
			// }
		} else {
			flag = false;
		}
		return flag;
	}

	public String toString() {
		StringBuffer buffer = new StringBuffer();
		for (Iterator iter = key.iterator(); iter.hasNext();) {
			Object element = iter.next();
			buffer.append("{").append(element).append("}");
		}
		return buffer.toString();
	}

}

class MyLinkedMap implements Map {
	private ArrayList keys = new ArrayList();

	private ArrayList values = new ArrayList();

	public int size() {
		return keys.size();
	}

	public boolean isEmpty() {
		return keys.isEmpty();
	}

	public boolean containsKey(Object key) {
		return keys.contains(key);
	}

	public boolean containsValue(Object value) {
		return values.contains(value);
	}

	public Object get(Object key) {
		int idx = keys.indexOf(key);
		if (idx >= 0) {
			return values.get(idx);
		}
		// TODO Auto-generated method stub
		return null;
	}

	public Object put(Object key, Object value) {
		int idx = keys.indexOf(key);
		Object rtn = null;
		if (idx >= 0) {
			rtn = values.set(idx, value);
		} else {
			keys.add(key);
			values.add(value);
		}
		return rtn;
	}

	public Object remove(Object key) {
		int idx = keys.indexOf(key);
		Object rtn = null;
		if (idx >= 0) {
			keys.remove(idx);
			rtn = values.remove(idx);
		}
		return rtn;
	}

	public void putAll(Map map) {
		if (map != null) {
			for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
				Object key = (Object) iter.next();
				put(key, map.get(key));
			}
		}
	}

	public void clear() {
		keys.clear();
		values.clear();
	}

	public Set keySet() {
		HashSet keySet = new HashSet();
		for (Iterator iter = keys.iterator(); iter.hasNext();) {
			Object key = (Object) iter.next();
			keySet.add(key);
		}
		return keySet;
	}

	public Collection values() {
		return values;
	}

	public Set entrySet() {
		class MyEntry implements Map.Entry {
			Object key;

			Object value;

			MyEntry(Object key, Object value) {
				this.key = key;
				this.value = value;
			}

			public Object getKey() {
				return key;
			}

			public Object getValue() {
				return value;
			}

			public Object setValue(Object arg0) {
				value = arg0;
				return value;
			}

		}
		;

		HashSet set = new HashSet();
		for (Iterator iter = keys.iterator(); iter.hasNext();) {
			Object key = (Object) iter.next();
			set.add(new MyEntry(key, this.get(key)));
		}

		return set;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -