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

📄 backendjdbc.java

📁 一个java的LDAP服务器
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
			byte[] entryBytes = rs.getBytes(1);
			entry = new Entry(entryBytes);
			rs = null;
			BackendJDBCConnPool.getInstance().checkIn(dbcon);
		} catch (Exception ioe) {
			ioe.printStackTrace();
			rs = null;
			ps = null;
			if (dbcon != null) {
				BackendJDBCConnPool.getInstance().checkIn(dbcon);
			}
		}
		return entry;
	}
	public Entry getByID(Long id) {
		Entry entry = null;
		Connection dbcon = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			dbcon = (Connection)BackendJDBCConnPool.getInstance().checkOut();
			ps = dbcon.prepareStatement("SELECT entrydata FROM entry WHERE entryid = ?");
			ps.setLong(1,id.longValue());
			rs = ps.executeQuery();
			
			rs.next();

			byte[] entryBytes = rs.getBytes(1);
			entry = new Entry(entryBytes);
			rs.close();
			ps.close();
			BackendJDBCConnPool.getInstance().checkIn(dbcon);
		} catch (Exception ioe) {
			ioe.printStackTrace();
			rs = null;
			ps = null;
			if (dbcon != null) {
				BackendJDBCConnPool.getInstance().checkIn(dbcon);
			}
			entry = new Entry();
		}
		return entry;
	}
	void initialize() {
		

		String entrytable = ServerConfig.getInstance().get(ServerConfig.JAVALDAP_BACKENDJDBC_CREATETABLE) +
		    " entry (entryid INT, dn VARCHAR(255), base VARCHAR(255), entrydata " +
			ServerConfig.getInstance().get(ServerConfig.JAVALDAP_BACKENDJDBC_LONGVARCHAR) +
			", creator VARCHAR(255), modifier VARCHAR(255), createstamp VARCHAR(32), modifystamp VARCHAR(32))";

		Connection dbcon = null;
		try {
			dbcon = (Connection)BackendJDBCConnPool.getInstance().checkOut();
			Statement s = dbcon.createStatement();
			s.execute(entrytable);
			s.execute("CREATE INDEX entryindex ON entry (entryid, dn)");

			s.execute(ServerConfig.getInstance().get(ServerConfig.JAVALDAP_BACKENDJDBC_CREATETABLE) +
				" keytable (keyvalue VARCHAR(64), value VARCHAR(128))");
			s.execute("INSERT INTO keytable VALUES ('entryCount','0')");
			
			for (Enumeration indexenum = exactIndexes.elements(); indexenum.hasMoreElements();) {
				DirectoryString indexName = (DirectoryString) indexenum.nextElement();
				String indexcreate = ServerConfig.getInstance().get(ServerConfig.JAVALDAP_BACKENDJDBC_CREATETABLE) +
					" " + indexName + " (entryid int, value varchar(255))";
				s.execute(indexcreate);
				s.execute("CREATE INDEX " + indexName + "ix ON " + indexName + " (entryid, value)");
			}
			dbcon.commit();
			BackendJDBCConnPool.getInstance().checkIn(dbcon);
		} catch (java.sql.SQLException se) {
			se.printStackTrace();
			try {
				dbcon.rollback();
			} catch (SQLException sqle) {
				sqle.printStackTrace();
			}
			BackendJDBCConnPool.getInstance().checkIn(dbcon);
		} catch (Exception e) {
			e.printStackTrace();
			BackendJDBCConnPool.getInstance().checkIn(dbcon);
		}
	}
public void modify(DirectoryString name, Vector changeEntries) throws DirectorySchemaViolation {
	Entry entry = null;
	try {
		entry = getByDN(name);
	} catch (DirectoryException de) {
		de.printStackTrace();
	}
	if (entry != null) {
		Entry current = (Entry) entry.clone();
		Enumeration changeEnum = changeEntries.elements();
		while (changeEnum.hasMoreElements()) {
			oneChange(current, (EntryChange) changeEnum.nextElement());
		}
		SchemaChecker.getInstance().checkEntry(current);
		Connection dbcon = null;
		try {
			dbcon = (Connection) BackendJDBCConnPool.getInstance().checkOut();
			Statement s = dbcon.createStatement();

			// Get the current entry as a byte array
			byte[] byteEntry = current.getAsByteArray();
			
			// Update the entrydata for this entry
			PreparedStatement ps = dbcon.prepareStatement("UPDATE entry SET entryData = ? WHERE entryid = ?");
			ps.setBytes(1,byteEntry);
			ps.setLong(2,current.getID());
			System.out.println("Changing Entry: " + current.getID());
			ps.execute();

			// Change indexes
			changeEnum = changeEntries.elements();
			while (changeEnum.hasMoreElements()) {
				EntryChange change = (EntryChange) changeEnum.nextElement();
				int changeType = change.getModType();
				DirectoryString attr = change.getAttr();
				Vector vals = change.getValues();
				if (exactIndexes.contains(attr)) {
					if (changeType == ModifyRequestSeqOfSeqEnum.ADD) {
						Vector oldvals = null;
						for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
							DirectoryString oneVal = (DirectoryString) enumVals.nextElement();
							ps = dbcon.prepareStatement("INSERT INTO " + attr + " VALUES (?,?)");
							ps.setLong(1,current.getID());
							ps.setString(2,oneVal.normalize());
							ps.execute();
						}
					}
					if (changeType == ModifyRequestSeqOfSeqEnum.DELETE) {
						for (Enumeration enumVals = vals.elements(); enumVals.hasMoreElements();) {
							DirectoryString oneVal = (DirectoryString) enumVals.nextElement();
							ps = dbcon.prepareStatement("DELETE FROM " + attr + " WHERE entryid = ? AND value = ?");
							ps.setLong(1,current.getID());
							ps.setString(2,oneVal.normalize());
							ps.execute();
						}
					}
					if (changeType == ModifyRequestSeqOfSeqEnum.REPLACE) {
						if (entry.containsKey(attr)) {
							ps = dbcon.prepareStatement("DELETE FROM " + attr + " WHERE entryid = ?");
							ps.setLong(1,current.getID());
							ps.execute();
							for (Enumeration valsEnum = ((Vector) current.get(attr)).elements(); valsEnum.hasMoreElements();) {
								DirectoryString valString = (DirectoryString) valsEnum.nextElement();
								ps = dbcon.prepareStatement("INSERT INTO " + attr + " VALUES (?,?)");
								ps.setLong(1,current.getID());
								ps.setString(2,valString.normalize());
								ps.execute();
							}
						}
					}
				}
			}
			dbcon.commit();
			BackendJDBCConnPool.getInstance().checkIn(dbcon);
		} catch (Exception e) {
			e.printStackTrace();
			try {
				dbcon.rollback();
			} catch (SQLException sqle) {
				sqle.printStackTrace();
			}
			BackendJDBCConnPool.getInstance().checkIn(dbcon);
		}
	}
}
	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) {
		// Need to implement
		/* 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 = null;
			try {
				current = getByDN(base);
			} catch (DirectoryException de) {
				de.printStackTrace();
			}
			
			if (current != null) {
				if (current.containsKey(cisAttr)) {
					Vector values = (Vector) current.get(cisAttr);
					if (matchValue == false || values.contains(cisValue)) {
						results.addElement(new Long(current.getID()));
					}
				}
			}
			return results;
		}

		if (exactIndexes.contains(cisAttr)) {
			Connection dbcon = null;
			try {
				dbcon = (Connection)BackendJDBCConnPool.getInstance().checkOut();
				Statement s = dbcon.createStatement();
				ResultSet rs = null;
				String scopeQuery = null;
				if (scope == SearchRequestEnum.WHOLESUBTREE) {
					scopeQuery = "entry.base LIKE '%" + base + "'";
				} else {
					scopeQuery = "entry.base = '" + base + "'";
				} 
				if (matchValue == true) {
					rs = s.executeQuery("SELECT DISTINCT entry.entryid from entry," + cisAttr +
						" where entry.entryid = " + cisAttr + ".entryid and UPPER(value) = UPPER('" + cisValue + 
						"') AND " + scopeQuery);
				} else {
					rs = s.executeQuery("SELECT DISTINCT entry.entryid from entry," + cisAttr +
						" where entry.entryid = " + cisAttr + ".entryid AND " + scopeQuery);
				}
				while (rs.next()) {
					Entry current = null;
					long entryid = rs.getLong(1);
					results.addElement(new Long(entryid));
				}
				BackendJDBCConnPool.getInstance().checkIn(dbcon);
			} catch (Exception e) {
				e.printStackTrace();
				if (dbcon != null) {
					BackendJDBCConnPool.getInstance().checkIn(dbcon);
				}
			}
			return results;
		}

		return results;
	}
	private Vector searchSubstring(DirectoryString base, int scope, String attr, String value) {
		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 = null;
			try {
				current = getByDN(base);
			} catch (DirectoryException de) {
				de.printStackTrace();
			}
			
			if (current != null) {
				if (current.containsKey(cisAttr)) {
					Vector values = (Vector) current.get(cisAttr);
					if (values.contains(cisValue)) {
						results.addElement(new Long(current.getID()));
					}
				}
			}
			return results;
		}

		if (exactIndexes.contains(cisAttr)) {
			Connection dbcon = null;
			try {
				dbcon = (Connection)BackendJDBCConnPool.getInstance().checkOut();
				Statement s = dbcon.createStatement();
				ResultSet rs = null;
				String scopeQuery = null;
				if (scope == SearchRequestEnum.WHOLESUBTREE) {
					scopeQuery = "entry.base LIKE '%" + base + "'";
				} else {
					scopeQuery = "entry.base = '" + base + "'";
				}
				rs = s.executeQuery("SELECT DISTINCT entry.entryid FROM entry," + cisAttr +
					" WHERE entry.entryid = " + cisAttr + ".entryid AND UPPER(value) LIKE UPPER('" + cisValue + "')" +
					" AND " + scopeQuery);
				
				while (rs.next()) {
					Entry current = null;
					long entryid = rs.getLong(1);
					results.addElement(new Long(entryid));
				}
				BackendJDBCConnPool.getInstance().checkIn(dbcon);
			} catch (Exception e) {
				e.printStackTrace();
				if (dbcon != null) {
					BackendJDBCConnPool.getInstance().checkIn(dbcon);
				}
			}
			return results;
		}

		
		return results;
	}
}

⌨️ 快捷键说明

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