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