亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? backendmemory.java

?? 一個java的LDAP服務器
?? JAVA
字號:
package org.javaldap.server.backend;

/*
The JavaLDAP Server
Copyright (C) 2000  Clayton Donley (donley@linc-dev.com) - All Rights Reserved

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/

/**
 * BackendMemory is a simple backend that does not persist data beyond the life
 * of the JVM.
 *
 * @author: Clayton Donley
 */

import java.util.*;
import org.javaldap.ldapv3.*;
import org.javaldap.server.Entry;
import org.javaldap.server.EntryChange;
import org.javaldap.server.EntrySet;

import org.javaldap.server.schema.SchemaChecker;
import org.javaldap.server.util.DirectorySchemaViolation;
import org.javaldap.server.util.DirectoryException;
import org.javaldap.server.util.InvalidDNException;
import org.javaldap.server.util.Logger;

import org.javaldap.btree.*;

import org.javaldap.server.syntax.DirectoryString;

public class BackendMemory implements Backend {

	private BTree datastore = null;
	private BTree idtodnmap = null;
	private BTree indextable = null;
	private Vector equalsMatch; //= [ "cn","sn","objectclass","l","ou","o","telephonenumber","c","description","seealso"];
	private long idCounter = 0;

	public BackendMemory() {
		datastore = new BTree(10);
		idtodnmap = new BTree(10);
		indextable = new BTree(10);

		equalsMatch = new Vector();
		equalsMatch.addElement(new DirectoryString("sn"));
		equalsMatch.addElement(new DirectoryString("cn"));
		equalsMatch.addElement(new DirectoryString("objectclass"));
		equalsMatch.addElement(new DirectoryString("l"));
		equalsMatch.addElement(new DirectoryString("o"));
		equalsMatch.addElement(new DirectoryString("ou"));
		equalsMatch.addElement(new DirectoryString("telephonenumber"));
		equalsMatch.addElement(new DirectoryString("description"));
		equalsMatch.addElement(new DirectoryString("seealso"));

		Enumeration equalsMatchEnum = equalsMatch.elements();
		while (equalsMatchEnum.hasMoreElements()) {
			indextable.put((DirectoryString)equalsMatchEnum.nextElement(),new BTree(10));
		}
	}
	public LDAPResultEnum add(Entry entry) {
		if (this.datastore.get(entry.getName()) != null) {
			return new LDAPResultEnum(68);
		}
		this.idCounter++;
		entry.setID(idCounter);
		this.idtodnmap.put(new Long(idCounter),entry.getName());
		this.datastore.put(entry.getName(),entry);
		index(entry);
		return new LDAPResultEnum(0);
	}
	public LDAPResultEnum delete(DirectoryString name) {
		this.datastore.remove(name);
		return new LDAPResultEnum(0);
	}
	private Vector evaluateFilter(Filter currentFilter, DirectoryString base, int scope) {

		Vector matchThisFilter = new Vector();

		switch (currentFilter.choiceId) {
		case Filter.EQUALITYMATCH_CID:
			String matchType = new String(currentFilter.equalityMatch.attributeDesc);
			String matchVal = new String(currentFilter.equalityMatch.assertionValue);
			Logger.getInstance().log(Logger.LOG_DEBUG,"Filter: " + matchType + "=" + matchVal);
			Logger.getInstance().log(Logger.LOG_DEBUG,"Base: " + base);
			matchThisFilter = searchExact(base,scope,matchType,matchVal,true);
			break;

		case Filter.PRESENT_CID:
			matchType = new String(currentFilter.present);
			matchThisFilter = searchExact(base,scope,matchType,null,false);
			break;

		case Filter.AND_CID:
			boolean firstAnd = true;
			for (Enumeration andEnum = currentFilter.and.elements(); andEnum.hasMoreElements();) {
				Vector matched = evaluateFilter((Filter)andEnum.nextElement(),base,scope);
				if (firstAnd) {
					firstAnd = false;
					for (Enumeration matchEnum = matched.elements(); matchEnum.hasMoreElements();) {
						matchThisFilter.addElement(matchEnum.nextElement());
					}
				} else {
					Vector inBoth = new Vector();
					for (Enumeration matchEnum = matched.elements(); matchEnum.hasMoreElements();) {
						Object matchObj = matchEnum.nextElement();
						if (matchThisFilter.contains(matchObj)) {
							inBoth.addElement(matchObj);
						}
					}
					matchThisFilter = inBoth;
				}
			}
			break;

		case Filter.OR_CID:
			for (Enumeration orEnum = currentFilter.or.elements(); orEnum.hasMoreElements();) {
				Vector matched = evaluateFilter((Filter)orEnum.nextElement(),base,scope);
				for (Enumeration matchEnum = matched.elements(); matchEnum.hasMoreElements();) {
					matchThisFilter.addElement(matchEnum.nextElement());
				}
			}
			break;

		case Filter.NOT_CID:
			// Need to fix this...Not a correct implementation
			//Vector matched = evaluateFilter(currentFilter.not,base,scope);
			//matchThisFilter.removeAll(matched);

			break;


		}
		return matchThisFilter;
	}
	public EntrySet get(DirectoryString base, int scope, Filter filter,
					  boolean typesOnly, Vector attributes) {

		Vector matchingEntries = evaluateFilter(filter,base, scope);

		return (EntrySet)new GenericEntrySet(this,matchingEntries);
	}
	public Entry getByDN(DirectoryString dn) throws DirectoryException {
		return (Entry)this.datastore.get(dn);
	}
	public Entry getByID(Long id) {
		DirectoryString dn = (DirectoryString)this.idtodnmap.get(id);
		return (Entry)this.datastore.get(dn);
	}
	private void index(Entry entry) {
		Long entryId = new Long(entry.getID());
		Enumeration indexes = equalsMatch.elements();
		while (indexes.hasMoreElements()) {
			DirectoryString indexKey = (DirectoryString)indexes.nextElement();
			if (entry.get(indexKey) != null) {
				BTree attrIndex = (BTree)indextable.get(indexKey);
				Vector attrValVec = (Vector)entry.get(indexKey);
				Enumeration attrValEnum = attrValVec.elements();
				while (attrValEnum.hasMoreElements()) {
					String oneValue = ((DirectoryString)attrValEnum.nextElement()).normalize();
					Vector eids = (Vector)attrIndex.get(oneValue);
					if (eids != null) {
						//if (!eids.contains(entryId)) {
							eids.addElement(entryId);
						//}
					} else {
						eids = new Vector();
						eids.addElement(entryId);
						attrIndex.put(oneValue,eids);
					}
				}
			}
		}
	}
	private void index(Entry entry,Vector changes) {
		Long entryId = new Long(entry.getID());

		Enumeration changeEnum = changes.elements();
		while (changeEnum.hasMoreElements()) {
			EntryChange change = (EntryChange)changeEnum.nextElement();
			int changeType = change.getModType();
			DirectoryString attr = change.getAttr();
			Vector vals = change.getValues();

			if (equalsMatch.contains(attr)) {
				BTree attrIndex = (BTree)indextable.get(attr);

				if (changeType == ModifyRequestSeqOfSeqEnum.ADD) {

					Vector oldvals = (Vector)entry.get(attr);
					if (oldvals == null) {
						oldvals = new Vector();
					}


					for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
						String oneVal = ((DirectoryString)enumVals.nextElement()).normalize();
						if (!oldvals.contains(oneVal)) {

							Vector eids = (Vector)attrIndex.get(oneVal);
							if (eids != null) {
								if (!eids.contains(entryId)) {
									eids.addElement(entryId);
								}
							} else {
								eids = new Vector();
								eids.addElement(entryId);
								attrIndex.put(oneVal,eids);
							}
						}
					}
				}


				if (changeType == ModifyRequestSeqOfSeqEnum.DELETE) {
					Vector oldvals = (Vector)entry.get(attr);
					if (oldvals == null) {
						oldvals = new Vector();
					}

					for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
						String oneVal = ((DirectoryString)enumVals.nextElement()).normalize();
						if (oldvals.contains(oneVal)) {
							Vector eids = (Vector)attrIndex.get(oneVal);
							if (eids != null) {
								if (eids.contains(entryId)) {
									eids.removeElement(entryId);
								}
							}
						}
					}
				}

				if (changeType == ModifyRequestSeqOfSeqEnum.REPLACE) {
					if (entry.containsKey(attr)) {
						Vector oldvals = (Vector)entry.get(attr);

						for (Enumeration enumVals = oldvals.elements(); enumVals.hasMoreElements();) {
							String oneVal = ((DirectoryString)enumVals.nextElement()).normalize();
							Vector eids = (Vector)attrIndex.get(oneVal);
							if (eids != null) {
								eids.removeElement(entryId);
							}
						}
					}
					for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
						String oneVal = ((DirectoryString)enumVals.nextElement()).normalize();
						Vector eids = (Vector)attrIndex.get(oneVal);
						if (eids != null) {
							if (!eids.contains(entryId)) {
								eids.addElement(entryId);
							}
						} else {
							eids = new Vector();
							eids.addElement(entryId);
							attrIndex.put(oneVal,eids);
						}
					}
				}
			}
		}
	}
	public void modify(DirectoryString name, Vector changeEntries) throws DirectorySchemaViolation {
		Entry entry = (Entry)datastore.get(name);
		if (entry != null) {
			Entry current = (Entry)entry.clone();
			Enumeration changeEnum = changeEntries.elements();
			while (changeEnum.hasMoreElements()) {
				oneChange(current,(EntryChange)changeEnum.nextElement());
			}
			SchemaChecker.getInstance().checkEntry(current);
			index(entry,changeEntries);
			datastore.put(name,current);
		}
	}
	public void oneChange(Entry current, EntryChange change) {

		int changeType = change.getModType();
		DirectoryString attr = change.getAttr();
		Vector vals = change.getValues();

		if (changeType == ModifyRequestSeqOfSeqEnum.ADD) {
			Vector oldvals = null;
			if (!current.containsKey(attr)) {
				oldvals = new Vector();
			} else {
				oldvals = (Vector)current.get(attr);
			}
			for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
				Object oneVal = enumVals.nextElement();
				if (!oldvals.contains(oneVal)) {
					oldvals.addElement(oneVal);
				}
			}
			current.put(attr,oldvals);
		}

		if (changeType == ModifyRequestSeqOfSeqEnum.DELETE) {
			Vector oldvals = null;
			if (!current.containsKey(attr)) {
				oldvals = new Vector();
			} else {
				oldvals = (Vector)current.get(attr);
			}
			for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
				Object oneVal = enumVals.nextElement();
				if (oldvals.contains(oneVal)) {
					oldvals.removeElement(oneVal);
				}
			}
			if (oldvals.size() > 0) {
				current.put(attr,oldvals);
			} else {
				current.remove(attr);
			}
		}

		if (changeType == ModifyRequestSeqOfSeqEnum.REPLACE) {
			current.put(attr,vals);
		}
	}
	public LDAPResultEnum rename(DirectoryString oldname, DirectoryString newname) {
		Entry entry = (Entry)this.datastore.get(oldname);
		try {
			entry.setName(newname);
		} catch (InvalidDNException ide) {
			return new LDAPResultEnum(ide.getLDAPErrorCode());
		}
		this.datastore.put(entry.getName(),entry);
		this.datastore.remove(oldname);
		return new LDAPResultEnum(0);
	}
	private Vector searchExact(DirectoryString base, int scope, String attr, String value, boolean matchValue) {
		Vector results = new Vector();
		DirectoryString cisAttr = new DirectoryString(attr);
		DirectoryString cisValue = null;
		if (value != null) {
			cisValue = new DirectoryString(value);
		}

		if (scope == SearchRequestEnum.BASEOBJECT) {
			Entry current = (Entry) this.datastore.get(base);
			if (current != null) {
				if (current.containsKey(cisAttr)) {
					Vector values = (Vector) current.get(attr);
					if (matchValue == false || values.contains(cisValue)) {
						results.addElement(new Long(current.getID()));
					}
				}
			}
			return results;
		}

		if (indextable.containsKey(cisAttr) && matchValue) {
			BTree attrIndex = (BTree)this.indextable.get(cisAttr);
			if (value == null || !attrIndex.containsKey(cisValue.normalize()) ) {
				return results;
			}
			Vector eids = (Vector)attrIndex.get(cisValue.normalize());
			for (Enumeration enumEntries = eids.elements(); enumEntries.hasMoreElements();) {
				Long currentEid = (Long)enumEntries.nextElement();
				Entry current = getByID(currentEid);
				if ((current.getBase().endsWith(base) || base.equals(new DirectoryString(""))) && !current.getName().equals(base) ) {
					if ((scope == SearchRequestEnum.WHOLESUBTREE || current.getBase().equals(base)) && !current.getName().equals(base) ) {
						results.addElement(currentEid);
					}
				}
			}
			return results;
		}

		for (Enumeration enumEntries = this.datastore.values(); enumEntries.hasMoreElements();) {
			Entry current = (Entry) enumEntries.nextElement();
			if ((current.getBase().endsWith(base) || base.equals(new DirectoryString(""))) && !current.getName().equals(base)) {
				if ((scope == SearchRequestEnum.WHOLESUBTREE || current.getBase().equals(base)) && !current.getName().equals(base)) {
					if (current.containsKey(cisAttr)) {
						Vector values = (Vector) current.get(cisAttr);
						if (matchValue == false || values.contains(cisValue)) {
							results.addElement(new Long(current.getID()));
						}
					}
				}
			}
		}
		return results;
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合色噜噜狠狠| 欧美亚洲国产怡红院影院| 91香蕉视频在线| 欧美精三区欧美精三区| 久久综合999| 自拍偷在线精品自拍偷无码专区| 五月天丁香久久| 国产成人一区在线| 欧美日韩色一区| 国产亚洲精品福利| 天天综合天天做天天综合| 国产精品白丝av| 欧美视频中文字幕| 国产欧美一区二区三区沐欲 | 91在线播放网址| 欧美一区二区三区四区视频| 国产精品毛片无遮挡高清| 日一区二区三区| 成人精品视频一区二区三区尤物| 欧美丰满嫩嫩电影| 国产精品久久久久三级| 蜜桃一区二区三区在线观看| 成年人国产精品| 欧美一区二区三区爱爱| 18涩涩午夜精品.www| 免费精品视频在线| 91成人免费网站| 久久精品视频一区| 青青青伊人色综合久久| 91在线观看一区二区| 精品国产污网站| 亚洲午夜电影网| 99热在这里有精品免费| 精品国产成人在线影院| 三级成人在线视频| 色播五月激情综合网| 国产欧美精品国产国产专区| 奇米一区二区三区| 欧美日韩视频专区在线播放| 综合久久久久久| 丁香激情综合五月| 26uuu亚洲综合色欧美 | 欧美变态凌虐bdsm| 亚洲综合久久av| 97超碰欧美中文字幕| 国产日韩欧美a| 久久99久久99| 5566中文字幕一区二区电影| 亚洲图片欧美综合| 一本色道综合亚洲| 国产精品国产三级国产| 国产美女一区二区| 欧美成人女星排名| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美日韩精品一区二区在线播放| 亚洲男人的天堂在线观看| 成人在线综合网| 久久久美女毛片| 国产一区二区伦理| 2020国产精品久久精品美国| 午夜精品福利视频网站| 欧美优质美女网站| 亚洲综合小说图片| 日本伦理一区二区| 亚洲自拍另类综合| 欧美伊人久久久久久午夜久久久久| 亚洲精品亚洲人成人网在线播放| 白白色 亚洲乱淫| 成人免费一区二区三区在线观看| 91影视在线播放| 亚洲你懂的在线视频| 91福利视频在线| 一区二区三区国产豹纹内裤在线| 色悠悠久久综合| 一区二区在线观看不卡| 在线精品视频免费观看| 亚洲成人综合在线| 3d动漫精品啪啪一区二区竹菊| 日本午夜精品视频在线观看| 91精品蜜臀在线一区尤物| 久久精品国产网站| 久久久亚洲欧洲日产国码αv| 国产成人自拍高清视频在线免费播放| 久久久三级国产网站| 成人av集中营| 亚洲综合成人在线视频| 3d成人动漫网站| 国内精品自线一区二区三区视频| 久久久久久9999| 99久久久国产精品| 亚洲高清视频中文字幕| 日韩欧美区一区二| 丁香另类激情小说| 亚洲四区在线观看| 欧美男人的天堂一二区| 免费视频一区二区| 国产拍欧美日韩视频二区| 一本色道久久综合亚洲精品按摩| 亚洲18女电影在线观看| 日韩欧美国产一区二区三区| 顶级嫩模精品视频在线看| 亚洲精品国产第一综合99久久| 欧美精品视频www在线观看| 久久99精品久久久久久久久久久久 | 国产日韩欧美在线一区| 99久久99久久精品国产片果冻| 亚洲永久精品国产| 日韩精品专区在线| 91在线视频免费观看| 日韩激情视频在线观看| 久久精品人人做人人综合| 色94色欧美sute亚洲线路一久| 日本在线不卡视频| 国产精品污www在线观看| 欧美色综合网站| 韩国精品一区二区| 亚洲精品欧美在线| 日韩欧美一区二区免费| 97se狠狠狠综合亚洲狠狠| 奇米影视一区二区三区| 中文字幕一区在线观看视频| 91麻豆精品国产自产在线观看一区 | 欧美系列亚洲系列| 国产一区二区三区免费在线观看| 亚洲激情图片一区| 精品国产精品一区二区夜夜嗨| 色综合天天综合狠狠| 麻豆91在线观看| 一区二区三区在线不卡| 26uuu另类欧美| 欧美三级电影在线观看| 丁香婷婷综合网| 免费成人结看片| 一区二区三区在线看| 久久青草欧美一区二区三区| 欧美日韩高清一区| 波多野洁衣一区| 久久精品国产成人一区二区三区| 亚洲精品少妇30p| 久久嫩草精品久久久久| 制服丝袜在线91| 91免费精品国自产拍在线不卡| 国内外成人在线| 免费三级欧美电影| 亚洲午夜精品网| 亚洲色图视频网| 国产日韩av一区二区| 日韩视频免费观看高清完整版在线观看 | 欧美绝品在线观看成人午夜影视| 成人动漫一区二区三区| 精品一区二区三区在线播放| 亚洲不卡一区二区三区| 亚洲欧美日韩一区二区| 国产精品污污网站在线观看| 亚洲精品一区二区三区福利 | 久久黄色级2电影| 亚洲自拍偷拍图区| 亚洲视频一二三区| 国产精品色在线| 国产女主播视频一区二区| 精品国产123| 欧美videossexotv100| 欧美精品1区2区3区| 在线亚洲人成电影网站色www| 99久久久久久| www.视频一区| 99久久精品情趣| heyzo一本久久综合| 国产不卡在线播放| 国产美女视频91| 国产一区二区三区电影在线观看| 久久精品久久99精品久久| 奇米色一区二区| 免费亚洲电影在线| 美女视频第一区二区三区免费观看网站| 亚洲一区二区三区四区五区黄| 亚洲视频一区二区在线观看| 亚洲欧美怡红院| 亚洲人成小说网站色在线| 亚洲女同ⅹxx女同tv| 一区二区三区加勒比av| 亚洲国产综合视频在线观看| 亚洲国产精品一区二区久久| 一区二区三区免费在线观看| 亚洲国产视频一区| 日韩国产欧美三级| 久久99精品久久久| 国内偷窥港台综合视频在线播放| 国产一区在线观看视频| 国产精品一区二区黑丝| 国产成人亚洲综合色影视| 不卡在线观看av| 一本大道久久精品懂色aⅴ| 91电影在线观看| 欧美精品自拍偷拍动漫精品| 欧美电视剧免费全集观看| 久久久久久久久99精品| 国产精品不卡一区| 一区二区理论电影在线观看| 亚洲国产wwwccc36天堂|