📄 cachetodohandler.java
字号:
String filter = "(& (" + ldapFormulaExpr + "=*" + expression + "*)(objectClass=" + ldapFormulaClass + "))"; long t = System.currentTimeMillis(); Vector v = ldapUtil.search(ldapFormulaBase, filter, new String[] {ldapCommonName}); t = System.currentTimeMillis() - t; int iMax = v.size(); for (int i = 0; i < iMax; i++) { Vector m = ((LdapGenericObject) v.get(i)).getAttribute(ldapCommonName); int jMax = m.size(); for (int j = 0; j < jMax; j++) { String cn = (String) m.get(j); result.add(cn); } } return result; } private Vector collectReferences(String expression) throws NamingException, JdbcException, CacheManagerException { String s, expr; long t = System.currentTimeMillis(); // Search for direct references Vector result = new Vector(searchReferences(expression)); if (result.contains(expression)) throw new CacheManagerException("Found circular reference inside expression <" + expression + ">"); // Search for indirect references for (int i = 0; i < result.size(); i++) { expr = (String) result.get(i); Set r = searchReferences(expr); Iterator iterator = r.iterator(); while(iterator.hasNext()) { s = (String) iterator.next(); if (s.equalsIgnoreCase(expression)) throw new CacheManagerException("Found circular reference to expression <" + expression + "> in expression <" + expr + ">"); if (!result.contains(s)) result.add(s); } } t = System.currentTimeMillis() - t; logger.info(result.size() + " references to <" + expression + "> found, " + t + " ms"); return result; } private void touchReferences(String expression, Vector references) throws NamingException, JdbcException, CacheManagerException { int iMax = references.size(); for (int i = 0; i < iMax; i++) { String cn = (String) references.get(i); logger.info("References to <" + expression + "> found in <" + cn + ">"); ToDoList todo = new ToDoList(cn, System.currentTimeMillis(), false); todo.insertToDo(adminPool); } } private void updateCache(String expression, long touchTime) throws JdbcException, ParserException { try { if (ignoreCase) expression = expression.toLowerCase(); long time = System.currentTimeMillis(); String md5 = Md5Cache.get(expression); if (md5 == null) { md5 = StringUtil.md5Sum(expression); Md5Cache.put(expression, md5); } Parser p = new Parser(); p.setReturnEmptySets(true); Set s = p.evaluateExpression(expression); JdbcConnectionPool cachePool = manager.getCacheConnectionPool(md5); IndexTable index = IndexTable.selectIndex(cachePool, md5); if (s != null && s.size() > 0) { if (index == null || index.getCreationTime() <= touchTime) { String name = nextTableName(cachePool); CacheTable.createCacheTable(cachePool, name); long t = System.currentTimeMillis(); CacheTable.insertCacheTable(cachePool, name, s, ignoreCase); t = System.currentTimeMillis() - t; logger.info(s.size() + " records written to table <" + name + ">, " + t + " ms"); if (index != null) { String oldTable = index.getTableName(); index.setTableName(name); index.setCreationTime(time); index.updateIndex(cachePool); CacheTable.dropCacheTable(cachePool, oldTable); } else { index = new IndexTable(md5, name, time); index.insertIndex(cachePool); } } else { logger.info("Cache for <" + expression + "> is uptodate"); } } else if (index != null) { String oldTable = index.getTableName(); index.deleteIndex(cachePool); CacheTable.dropCacheTable(cachePool, oldTable); } } catch(NoSuchAlgorithmException nsae) { logger.fatal("Initialisation of MD5 digest failed.", nsae); System.exit(1); } } /** The main method of the CacheToDoHandler thread. */ public void run() { cachePoolCount = manager.getCachePoolCount(); adminPool = manager.getAdminPool(); initializeAdminDb(); initializeCacheDb(); fillToDoList(); fileHandler.start(); while(running) { try { boolean loop = true; do { ToDoList todo = ToDoList.selectToDo(adminPool); if (todo != null) { String expression = todo.getExpression(); logger.info("Found expr=<" + expression + ">"); todo.setLocked(true); todo.updateToDo(adminPool); try { Vector references = collectReferences(expression); updateCache(expression, todo.getTouchTime()); touchReferences(expression, references); } catch(CacheManagerException cme) { String msg = "Circular reference error in <" + expression + ">: " + cme.getMessage(); logger.fatal(msg); manager.errorHandler().sendMail(msg); } catch(ParserException pe) { String msg = "Parser error in <" + expression + ">: " + pe.getMessage(); logger.fatal(msg); manager.errorHandler().sendMail(msg); } todo.deleteToDo(adminPool); } else { loop = false; } } while (loop); for (int i = 0; i < cachePoolCount; i++) CacheTable.dropLostTables(manager.getCacheConnectionPool(i)); try { if (running) sleep(sleepTime); } catch(InterruptedException ie) { // do nothing } } catch(Exception e) { logger.error("Cought error while trying to read <todotable>", e); try { if (running) sleep(sleepTime); } catch(InterruptedException ie) { // do nothing } } } running = false; }}/** * $Log: CacheToDoHandler.java,v $ * Revision 1.27 2003/04/14 20:41:09 joerg * Setting name for thread. * * Revision 1.26 2003/04/13 21:09:56 joerg * Package structure modified * * Revision 1.25 2003/04/13 20:28:01 joerg * Package structure modified * * Revision 1.24 2003/04/13 20:16:41 joerg * Package structure modified * * Revision 1.23 2003/01/29 20:32:06 joerg * MD5-Summen werden zuerst im Cache gesucht. * * Revision 1.22 2003/01/16 21:47:01 joerg * Kleine Bugfixes * * Revision 1.21 2003/01/04 17:15:43 joerg * Zus鋞zliche Config-Option IgnoreCase * * Revision 1.20 2003/01/01 21:04:17 joerg * Copyright-Statement aktualisiert * * Revision 1.19 2002/12/27 20:22:31 joerg * Initiales Einlesen der LDAP Daten komplett ueberarbeitet, bei * LDAP-Fehlern wird nicht mehr System.exit() aufgerufen, sondern * ein reconnect versucht. * * Revision 1.18 2002/12/24 21:04:33 joerg * Umbau der Paketstruktur * iiitLdapPlugin integriert * JavaDoc-Kommentare weiter vervollstaendigt. * * Revision 1.17 2002/12/23 11:25:53 joerg * shutdown()-Methode hinzugefuegt. * * Revision 1.16 2002/12/21 19:55:03 joerg * Nicht mehr benoetigte Methoden entfernt, interne Methoden auf * private oder protected geaendert. * JavaDoc Kommentare ergaenzt. * * Revision 1.15 2002/12/19 15:54:33 joerg * Paket umbenannt in iiitLdapPlugin * * Revision 1.14 2002/12/08 16:37:33 joerg * Aufraeumungsarbeiten nach dem grossen Umbau * * Revision 1.13 2002/12/08 16:09:46 joerg * Paket-Struktur ueberarbeitet * * Revision 1.12 2002/12/08 13:55:31 joerg * Der Zugriff auf das LdapPlugin erfolgt jetzt ueber den CacheManager * und nicht mehr ueber den AccessServer * * Revision 1.11 2002/11/27 16:43:04 joerg * Parameteruebergabe geaendert, um circulaere Recursion * zu erkennen * * Revision 1.10 2002/11/27 12:13:49 joerg * Beim Erkennen fehlerhafte Ausdruecke kann jetzt automatisch * eine Fehler-Mail verschickt werden. * * Revision 1.9 2002/11/26 21:56:06 joerg * Circulaere Referenzen werden jetzt erkannt * Fehlerbehandlung verbessert * * Revision 1.8 2002/11/26 10:56:40 joerg * Package exprparser durch parser erstzt. * * Revision 1.7 2002/11/21 21:49:45 joerg * Umstellung auf JdbcConnectionPool * * Revision 1.6 2002/11/20 20:41:29 joerg * Klassen fuer das HAndling der DB-Tabellen in Packages * de.iiit.AccessServer.db.* verschoben * * Revision 1.5 2002/11/20 20:28:07 joerg * Bezuege auf Spalte 'inverted' in 'IndexTable' entfernt * * Revision 1.4 2002/11/18 22:09:00 joerg * CacheManager ausgelagert als PlugIn * * Revision 1.3 2002/11/18 21:21:52 joerg * LDAP-Anbindung auf LdapPlugin umgestellt. * * Revision 1.2 2002/11/18 15:21:41 joerg * LDAP-Suche jetzt ueber die Klasse LdapClient realisiert. * * Revision 1.1 2002/11/18 10:17:49 joerg * Klassen des CacheManagers in eigenes Package verschoben * * Revision 1.2 2002/11/18 10:13:18 joerg * CacheManager ist jetzt vollstaendig implementiert * * Revision 1.1 2002/11/17 22:03:26 joerg * Neue Klassen fuer 2nd-level Cache * */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -