1 /* 2 +-----------------------------------------------------------------------------+ 3 | ILIAS open source | 4 +-----------------------------------------------------------------------------+ 5 | Copyright (c) 1998-2001 ILIAS open source, University of Cologne | 6 | | 7 | This program is free software; you can redistribute it and/or | 8 | modify it under the terms of the GNU General Public License | 9 | as published by the Free Software Foundation; either version 2 | 10 | of the License, or (at your option) any later version. | 11 | | 12 | This program is distributed in the hope that it will be useful, | 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 15 | GNU General Public License for more details. | 16 | | 17 | You should have received a copy of the GNU General Public License | 18 | along with this program; if not, write to the Free Software | 19 | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 20 +-----------------------------------------------------------------------------+ 21 */ 22 23 package de.ilias.services.lucene.index; 24 25 import java.io.IOException; 26 import java.io.PrintWriter; 27 import java.io.StringWriter; 28 import java.sql.SQLException; 29 import java.util.Vector; 30 31 import org.apache.log4j.Logger; 32 import org.apache.lucene.index.CorruptIndexException; 33 import org.apache.lucene.store.LockObtainFailedException; 34 35 import de.ilias.ilServerStatus; 36 import de.ilias.services.db.DBFactory; 37 import de.ilias.services.object.ObjectDefinitionException; 38 import de.ilias.services.object.ObjectDefinitionParser; 39 import de.ilias.services.object.ObjectDefinitionReader; 40 import de.ilias.services.settings.ClientSettings; 41 import de.ilias.services.settings.ConfigurationException; 42 import de.ilias.services.settings.LocalSettings; 43 import de.ilias.services.settings.ServerSettings; 44 45 /** 46 * 47 * 48 * @author Stefan Meyer <smeyer.ilias@gmx.de> 49 * @version $Id$ 50 */ 51 public class RPCIndexHandler { 52 53 protected static Logger logger = Logger.getLogger(RPCIndexHandler.class); 54 55 56 57 /** 58 * Update index for a vector of obj ids 59 * @param clientKey 60 * @param objIds 61 * @return 62 */ indexObjects(String clientKey, Vector<Integer> objIds)63 public boolean indexObjects(String clientKey, Vector<Integer> objIds) { 64 65 // Set client key 66 LocalSettings.setClientKey(clientKey); 67 DBFactory.init(); 68 ClientSettings client; 69 ServerSettings server; 70 ObjectDefinitionReader properties; 71 ObjectDefinitionParser parser; 72 73 CommandController controller; 74 75 try { 76 long s_start = new java.util.Date().getTime(); 77 78 logger.info("Checking if indexer is running for client: " + clientKey); 79 // Return if indexer is already running for this clientKey 80 if(ilServerStatus.isIndexerActive(clientKey)) { 81 logger.error("An Indexer is already running for this client. Aborting!"); 82 return false; 83 } 84 85 // Set status 86 //ilServerStatus.addIndexer(clientKey); 87 88 client = ClientSettings.getInstance(LocalSettings.getClientKey()); 89 server = ServerSettings.getInstance(); 90 91 properties = ObjectDefinitionReader.getInstance(client.getAbsolutePath()); 92 parser = new ObjectDefinitionParser(properties.getObjectPropertyFiles()); 93 parser.parse(); 94 95 //controller = CommandController.getInstance(); 96 controller = new CommandController(); 97 controller.initObjects(objIds); 98 99 // Start threads 100 Vector<CommandControllerThread> threads = new Vector<CommandControllerThread>(); 101 for(int i = 0; i < server.getNumThreads(); i++) { 102 103 CommandControllerThread t = new CommandControllerThread(clientKey,controller); 104 t.start(); 105 threads.add(t); 106 } 107 // Join threads 108 for(int i = 0; i < server.getNumThreads();i++) { 109 threads.get(i).join(); 110 } 111 controller.writeToIndex(); 112 controller.closeIndex(); 113 114 long s_end = new java.util.Date().getTime(); 115 logger.info("Index time: " + ((s_end - s_start)/(1000))+ " seconds"); 116 logger.debug(client.getIndexPath()); 117 return true; 118 119 } 120 catch (Exception e) { 121 logger.error("Unknown error",e); 122 } 123 finally { 124 // Purge resources 125 DBFactory.closeAll(); 126 } 127 128 return false; 129 } 130 131 /** 132 * Refresh index 133 * @param clientKey 134 * @return 135 */ index(String clientKey, boolean incremental)136 public boolean index(String clientKey, boolean incremental) { 137 138 Boolean doPurge = true; 139 140 // Set client key 141 LocalSettings.setClientKey(clientKey); 142 DBFactory.init(); 143 ClientSettings client; 144 ServerSettings server; 145 ObjectDefinitionReader properties; 146 ObjectDefinitionParser parser; 147 148 CommandController controller; 149 150 try { 151 long s_start = new java.util.Date().getTime(); 152 153 logger.info("Checking if indexer is running for client: " + clientKey); 154 // Return if indexer is already running for this clientKey 155 if(ilServerStatus.isIndexerActive(clientKey)) { 156 logger.error("An Indexer is already running for this client. Aborting!"); 157 System.err.println("An Indexer is already running for this client. Aborting!"); 158 doPurge = false; 159 return false; 160 } 161 162 // Set status 163 ilServerStatus.addIndexer(clientKey); 164 165 client = ClientSettings.getInstance(LocalSettings.getClientKey()); 166 server = ServerSettings.getInstance(); 167 168 if(!incremental) { 169 IndexHolder.deleteIndex(); 170 } 171 172 properties = ObjectDefinitionReader.getInstance(client.getAbsolutePath()); 173 parser = new ObjectDefinitionParser(properties.getObjectPropertyFiles()); 174 parser.parse(); 175 176 //controller = CommandController.getInstance(); 177 controller = new CommandController(); 178 if(incremental) { 179 controller.initRefresh(); 180 } 181 else { 182 controller.initCreate(); 183 } 184 // Start threads 185 Vector<CommandControllerThread> threads = new Vector<CommandControllerThread>(); 186 for(int i = 0; i < server.getNumThreads(); i++) { 187 188 CommandControllerThread t = new CommandControllerThread(clientKey,controller); 189 t.start(); 190 threads.add(t); 191 } 192 // Join threads 193 for(int i = 0; i < server.getNumThreads();i++) { 194 threads.get(i).join(); 195 } 196 controller.writeToIndex(); 197 controller.closeIndex(); 198 199 long s_end = new java.util.Date().getTime(); 200 logger.info("Index time: " + ((s_end - s_start)/(1000))+ " seconds"); 201 logger.debug(client.getIndexPath()); 202 return true; 203 204 } 205 catch (Exception e) { 206 logger.error("Unknown error",e); 207 } 208 finally { 209 // Purge resources 210 if(doPurge) { 211 ilServerStatus.removeIndexer(clientKey); 212 DBFactory.closeAll(); 213 } 214 } 215 216 return false; 217 } 218 219 220 } 221