Changeset 3681
- Timestamp:
- 2003-01-17T10:39:34+13:00 (21 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gsdl3/src/java/org/greenstone/gsdl3/service/GS2Construct.java
r3649 r3681 44 44 */ 45 45 public class GS2Construct 46 extends ServiceRack { //implements ConstructionEventListener {46 extends ServiceRack { 47 47 48 48 // services offered 49 49 private static final String NEW_SERVICE = "NewCollection"; 50 private static final String ADD_DOC_SERVICE = "AddDocument"; 50 51 private static final String IMPORT_SERVICE = "ImportCollection"; 51 52 private static final String BUILD_SERVICE = "BuildCollection"; … … 56 57 // params used 57 58 private static final String COL_PARAM = "collection"; 58 private static final String NEW_COL_NAME_PARAM = "collectionName"; 59 private static final String NEW_COL_TITLE_PARAM = "collTitle"; 60 private static final String NEW_COL_ABOUT_PARAM = "collAbout"; 59 61 private static final String CREATOR_PARAM = "creator"; 62 private static final String NEW_FILE_PARAM = "newfile"; 60 63 private static final String HANDLE_PARAM = "id"; 61 64 62 //private static final String STATUS_PARAM = "us";63 65 // the list of the collections - store between some method calls 64 66 private String[] collection_list_ = null; 65 67 66 // set of listeners for nay construciton commands68 // set of listeners for any construction commands 67 69 protected Map listeners_ = null; 68 70 69 71 public GS2Construct() { 70 72 listeners_ = Collections.synchronizedMap(new HashMap()); 73 71 74 } 72 75 … … 81 84 Element descript = (Element)((Element)service_info_map_.get(service)).cloneNode(true); 82 85 // need to add in collection param list 83 if (!service.equals(NEW_SERVICE)) { 86 if (!service.equals(NEW_SERVICE)) {//new doesn't need a collection list 84 87 Element param_list = (Element) GSXML.getChildByTagName(descript, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 85 88 Element old_param = GSXML.getNamedElement(param_list, GSXML.PARAM_ELEM, GSXML.NAME_ATT, COL_PARAM); … … 104 107 Element param; 105 108 if (service.equals(NEW_SERVICE)) { 106 // have the coll nameand creator params107 param = GSXML.createParameterDisplay(doc_, NEW_COL_ NAME_PARAM, getTextString("param."+NEW_COL_NAME_PARAM, lang), null, null);109 // have the coll title, about and creator params 110 param = GSXML.createParameterDisplay(doc_, NEW_COL_TITLE_PARAM, getTextString("param."+NEW_COL_TITLE_PARAM, lang), null, null); 108 111 display.appendChild(param); 109 112 param = GSXML.createParameterDisplay(doc_, CREATOR_PARAM, getTextString("param."+CREATOR_PARAM, lang), null, null); 110 113 display.appendChild(param); 114 param = GSXML.createParameterDisplay(doc_, NEW_COL_ABOUT_PARAM, getTextString("param."+NEW_COL_ABOUT_PARAM, lang), null, null); 115 display.appendChild(param); 111 116 } else { 112 117 // have just the coll param 113 //use the collec iton list already created - this method is only called directly after getServiceDescription()118 //use the collection list already created - this method is only called directly after getServiceDescription() 114 119 param = GSXML.createParameterDisplay(doc_, COL_PARAM, getTextString("param."+COL_PARAM, lang), collection_list_, collection_list_); 115 120 display.appendChild(param); 116 } 121 if (service.equals(ADD_DOC_SERVICE)) { 122 // also have the file param 123 param = GSXML.createParameterDisplay(doc_, NEW_FILE_PARAM, getTextString("param."+NEW_FILE_PARAM, lang), null, null); 124 display.appendChild(param); 125 } 126 } 117 127 118 128 return display; … … 120 130 } 121 131 122 /** passes the request Element to the appropriate service function*/ 123 protected Element processService(String name, Element request) { 124 125 System.out.println("perl build request = "); 126 System.out.println(converter_.getString(request)); 127 String language = request.getAttribute(GSXML.LANG_ATT); 132 // each service must have a method "process<New service name>" 133 134 protected Element processNewCollection(Element request) { 135 return runCommand(request, CollectionConstructor.NEW); 136 } 137 138 /** TODO:implement this */ 139 protected Element processAddDocument(Element request) { 140 // decode the file name, add it to the import directory 141 String name = GSPath.getFirstLink(request.getAttribute(GSXML.TO_ATT)); 142 Element response = doc_.createElement(GSXML.RESPONSE_ELEM); 143 response.setAttribute(GSXML.FROM_ATT, name); 144 Element status = doc_.createElement(GSXML.STATUS_ELEM); 145 response.appendChild(status); 146 //String lang = request.getAttribute(GSXML.LANG_ATT); 147 //String request_type = request.getAttribute(GSXML.TYPE_ATT); 148 Text t = doc_.createTextNode("AddDocument: not implemented yet"); 149 status.appendChild(t); 150 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 151 return response; 152 } 153 protected Element processImportCollection(Element request) { 154 return runCommand(request, CollectionConstructor.IMPORT); 155 } 156 157 protected Element processBuildCollection(Element request) { 158 return runCommand(request, CollectionConstructor.BUILD); 159 } 160 protected Element processActivateCollection(Element request) { 161 Element response = runCommand(request, CollectionConstructor.ACTIVATE); 162 // this activates the collection on disk. but now we need to tell 163 // the MR about it. but we have to wait until the process is finished. 164 Element status = (Element)GSXML.getChildByTagName(response, GSXML.STATUS_ELEM); 165 Element param_list = (Element)GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 166 HashMap params = GSXML.extractParams(param_list); 167 String coll_name = (String) params.get(COL_PARAM); 168 String lang = request.getAttribute(GSXML.LANG_ATT); 169 // check for finished 170 int status_code = Integer.parseInt(status.getAttribute(GSXML.STATUS_ERROR_CODE_ATT)); 171 if (GSStatus.isCompleted(status_code) && 172 GSStatus.isError(status_code)) { 173 // we shouldn't carry out the next bit, just return the response 174 return response; 175 } 176 String id = status.getAttribute(GSXML.STATUS_PROCESS_ID_ATT); 177 GS2PerlListener listener = (GS2PerlListener)listeners_.get(id); 178 if (listener==null) { 179 System.err.println("somethings gone wrong, couldn't find the listener"); 180 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 181 return response; 182 } 183 while (!GSStatus.isCompleted(status_code)) { 184 // wait for the process, and keep checking the status code 185 // there is probably a better way to do this. 186 try { 187 Thread.currentThread().sleep(100); 188 } catch (Exception e) { // ignore 189 } 190 status_code = listener.getStatus(); 191 } 192 193 // add the rest of the messages to the status node 194 Text t = doc_.createTextNode("\n"+listener.getUpdate()); 195 status.appendChild(t); 196 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(listener.getStatus())); 197 if (GSStatus.isError(status_code)) { 198 return response; // without doing the next bit 199 } 200 201 t = doc_.createTextNode("\n"); 202 status.appendChild(t); 203 // once have got here, we assume 204 // the first bit proceeded successfully, now reload the collection 205 configureRequest("reload", coll_name, status, lang); // this will append more messages to the status, and overwrite the error code att 206 return response; 207 208 } 209 protected Element processDeleteCollection(Element request) { 210 211 // the response to send back 212 String name = GSPath.getFirstLink(request.getAttribute(GSXML.TO_ATT)); 213 Element response = doc_.createElement(GSXML.RESPONSE_ELEM); 214 response.setAttribute(GSXML.FROM_ATT, name); 215 Element status = doc_.createElement(GSXML.STATUS_ELEM); 216 response.appendChild(status); 217 Text t = null; // the text node for the error/success message 218 String lang = request.getAttribute(GSXML.LANG_ATT); 128 219 String request_type = request.getAttribute(GSXML.TYPE_ATT); 220 221 Element param_list = (Element)GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 222 HashMap params = GSXML.extractParams(param_list); 223 129 224 boolean get_status_only = false; 130 225 if (request_type.equals(GSXML.REQUEST_TYPE_STATUS)) { … … 132 227 } 133 228 System.out.println("get status only = "+get_status_only); 134 // extract the collection out of here 229 if (get_status_only) { 230 // at the moment, delete is synchronous. but it may take ages so should do the command in another thread maybe? in which case we will want to ask for status 231 System.err.println("had a status request for delete - this shouldn't happen!!"); 232 //t = doc_.createTextNode(""); 233 //status.appendChild(t); 234 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 235 return response; 236 } 237 String coll_name = (String)params.get(COL_PARAM); 238 String[] args={coll_name}; 239 File coll_dir = new File(GSFile.collectionBaseDir(site_home_, coll_name)); 240 // check that the coll is there in the first place 241 if (!coll_dir.exists()) { 242 t = doc_.createTextNode(getTextString("delete.exists_error", args, lang)); 243 status.appendChild(t); 244 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 245 return response; 246 } 247 248 // try to delete the directory 249 if (!GSFile.deleteFile(coll_dir)) { 250 t = doc_.createTextNode(getTextString("delete.delete_error", args, lang)); 251 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 252 status.appendChild(t); 253 return response; 254 } 255 configureRequest("delete", coll_name, status, lang); 256 return response; 257 } 258 259 protected Element processReloadCollection(Element request) { 260 261 // the response to send back 262 String name = GSPath.getFirstLink(request.getAttribute(GSXML.TO_ATT)); 263 Element response = doc_.createElement(GSXML.RESPONSE_ELEM); 264 response.setAttribute(GSXML.FROM_ATT, name); 265 Element status = doc_.createElement(GSXML.STATUS_ELEM); 266 response.appendChild(status); 267 Text t = null; // the text node for the error/success message 268 269 String lang = request.getAttribute(GSXML.LANG_ATT); 270 String request_type = request.getAttribute(GSXML.TYPE_ATT); 271 135 272 Element param_list = (Element)GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 136 273 HashMap params = GSXML.extractParams(param_list); 274 275 boolean get_status_only = false; 276 if (request_type.equals(GSXML.REQUEST_TYPE_STATUS)) { 277 get_status_only = true; 278 } 279 if (get_status_only) { 280 // reload is synchronous - this makes no sense 281 System.err.println("had a status request for reload - this shouldn't happen!!"); 282 //t = doc_.createTextNode(""); 283 //status.appendChild(t); 284 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 285 return response; 286 } 287 137 288 String coll_name = (String)params.get(COL_PARAM); 138 139 String id = (String)params.get(HANDLE_PARAM);140 141 Element response = doc_.createElement(GSXML.RESPONSE_ELEM); 142 response.setAttribute(GSXML.FROM_ATT, name); 143 Element status=null; 144 if (name.equals(NEW_SERVICE)) { 145 // need to do something different here 146 status = newCollection(coll_name, language, get_status_only); 147 } else if (name.equals(IMPORT_SERVICE)) {148 status = importCollection(coll_name, language, get_status_only, id);149 } else if (name.equals(BUILD_SERVICE)) {150 status = buildCollection(coll_name, language, get_status_only, id);151 } else if (name.equals(ACTIVATE_SERVICE)) {152 status = activateCollection(coll_name, language, get_status_only);153 } else if (name.equals(DELETE_SERVICE)) {154 status = deleteCollection(coll_name, language, get_status_only);155 } else if (name.equals(RELOAD_SERVICE)) {156 status = reloadCollection(coll_name, language, get_status_only);157 }158 159 if (status !=null) {160 response.appendChild(status);161 return response;289 configureRequest("reload", coll_name, status, lang); 290 return response; 291 292 } 293 294 /** send a configure request to the message router 295 * action name should be "delete" or "reload" 296 * response will be put into the status element 297 */ 298 protected void configureRequest(String action_name, String coll_name, Element status, String lang) { 299 300 // send the request to the MR 301 Element message = doc_.createElement(GSXML.MESSAGE_ELEM); 302 Element request = doc_.createElement(GSXML.REQUEST_ELEM); 303 request.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_CONFIGURE); 304 request.setAttribute(GSXML.TO_ATT, ""); 305 message.appendChild(request); 306 Element command = doc_.createElement(GSXML.CONFIGURE_ELEM); 307 command.setAttribute(GSXML.TYPE_ATT, GSXML.COLLECTION_ELEM); 308 command.setAttribute(GSXML.NAME_ATT, coll_name); 309 if (action_name.equals("delete")) { 310 command.setAttribute(GSXML.ACTION_ATT, GSXML.CONFIG_ACTION_DEACTIVATE); 311 } else if (action_name.equals("reload")) { 312 command.setAttribute(GSXML.ACTION_ATT, GSXML.CONFIG_ACTION_ACTIVATE); 162 313 } else { 163 System.err.println("error: status is null!"); 164 return response; 165 } 166 167 //System.err.println("GS2Construct: should never get here. service type wrong:"+name); 168 //return null; 314 System.err.println("invalid action name passed to configureRequest:"+action_name); 315 return; 316 } 317 request.appendChild(command); 318 Element response = router_.process(message); // at the moment, get no info in response so ignore it 319 Text t; 320 String[] args={coll_name}; 169 321 170 } 322 if (response == null) { 323 t = doc_.createTextNode(getTextString(action_name+".configure_error", args , lang)); 324 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 325 status.appendChild(t); 326 return; 327 } 328 329 // if we got here, we have succeeded! 330 t = doc_.createTextNode(getTextString(action_name+".success", args, lang)); 331 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.SUCCESS)); 332 status.appendChild(t); 333 } 334 171 335 172 336 /** configure the service module … … 182 346 183 347 e = doc_.createElement(GSXML.SERVICE_ELEM); 184 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);348 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 185 349 e.setAttribute(GSXML.NAME_ATT, NEW_SERVICE); 186 350 short_service_info_.appendChild(e); 187 351 188 352 e = doc_.createElement(GSXML.SERVICE_ELEM); 189 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);353 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 190 354 e.setAttribute(GSXML.NAME_ATT, IMPORT_SERVICE); 191 355 short_service_info_.appendChild(e); 192 356 193 357 e = doc_.createElement(GSXML.SERVICE_ELEM); 194 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);358 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 195 359 e.setAttribute(GSXML.NAME_ATT, BUILD_SERVICE); 196 360 short_service_info_.appendChild(e); 197 361 198 362 e = doc_.createElement(GSXML.SERVICE_ELEM); 199 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);363 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 200 364 e.setAttribute(GSXML.NAME_ATT, ACTIVATE_SERVICE); 201 365 short_service_info_.appendChild(e); 202 366 203 367 e = doc_.createElement(GSXML.SERVICE_ELEM); 204 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);368 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 205 369 e.setAttribute(GSXML.NAME_ATT, DELETE_SERVICE); 206 370 short_service_info_.appendChild(e); 207 371 208 372 e = doc_.createElement(GSXML.SERVICE_ELEM); 209 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);373 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 210 374 e.setAttribute(GSXML.NAME_ATT, RELOAD_SERVICE); 211 375 short_service_info_.appendChild(e); 212 376 213 //e = doc_.createElement(GSXML.SERVICE_ELEM); 214 //e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_BUILD); 215 //e.setAttribute(GSXML.NAME_ATT, "AddDocument"); 216 //short_service_info_.appendChild(e); 217 218 // set up service_info_map_ - for now, just has the same elements as above 377 e = doc_.createElement(GSXML.SERVICE_ELEM); 378 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 379 e.setAttribute(GSXML.NAME_ATT, ADD_DOC_SERVICE); 380 short_service_info_.appendChild(e); 381 382 // set up service_info_map_ 383 // should have full details about each service incl params lists etc. 219 384 220 385 Element param_list; 221 386 Element param; 222 387 223 String lang = Locale.US.toString(); 224 225 // should have full details about each service incl params lists etc. 226 e = doc_.createElement(GSXML.SERVICE_ELEM); 227 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_BUILD); 388 e = doc_.createElement(GSXML.SERVICE_ELEM); 389 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 228 390 e.setAttribute(GSXML.NAME_ATT, NEW_SERVICE); 229 391 param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 230 param = GSXML.createParameter(doc_, NEW_COL_ NAME_PARAM, GSXML.PARAM_TYPE_STRING, "", null);392 param = GSXML.createParameter(doc_, NEW_COL_TITLE_PARAM, GSXML.PARAM_TYPE_STRING, "", null); 231 393 param_list.appendChild(param); 232 394 param = GSXML.createParameter(doc_, CREATOR_PARAM, GSXML.PARAM_TYPE_STRING, "", null); 395 param_list.appendChild(param); 396 param = GSXML.createParameter(doc_, NEW_COL_ABOUT_PARAM, GSXML.PARAM_TYPE_TEXT, "", null); 233 397 param_list.appendChild(param); 234 398 e.appendChild(param_list); … … 236 400 237 401 e = doc_.createElement(GSXML.SERVICE_ELEM); 238 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);402 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 239 403 e.setAttribute(GSXML.NAME_ATT, IMPORT_SERVICE); 240 404 param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); … … 245 409 246 410 e = doc_.createElement(GSXML.SERVICE_ELEM); 247 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);411 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 248 412 e.setAttribute(GSXML.NAME_ATT, BUILD_SERVICE); 249 413 param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); … … 254 418 255 419 e = doc_.createElement(GSXML.SERVICE_ELEM); 256 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);420 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 257 421 e.setAttribute(GSXML.NAME_ATT, ACTIVATE_SERVICE); 258 422 param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); … … 263 427 264 428 e = doc_.createElement(GSXML.SERVICE_ELEM); 265 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);429 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 266 430 e.setAttribute(GSXML.NAME_ATT, DELETE_SERVICE); 267 431 param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); … … 272 436 273 437 e = doc_.createElement(GSXML.SERVICE_ELEM); 274 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_ BUILD);438 e.setAttribute(GSXML.TYPE_ATT, GSXML.SERVICE_TYPE_PROCESS); 275 439 e.setAttribute(GSXML.NAME_ATT, RELOAD_SERVICE); 276 440 param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); … … 284 448 } 285 449 286 /** creates a new collection using mkcol.pl */ 287 protected Element newCollection(String coll_name, String lang, boolean get_status_only) { 450 /** returns a response element */ 451 protected Element runCommand(Element request, int type ) { 452 453 // the response to send back 454 String name = GSPath.getFirstLink(request.getAttribute(GSXML.TO_ATT)); 455 Element response = doc_.createElement(GSXML.RESPONSE_ELEM); 456 response.setAttribute(GSXML.FROM_ATT, name); 288 457 Element status = doc_.createElement(GSXML.STATUS_ELEM); 289 Text t; 458 response.appendChild(status); 459 460 String lang = request.getAttribute(GSXML.LANG_ATT); 461 String request_type = request.getAttribute(GSXML.TYPE_ATT); 462 463 Element param_list = (Element)GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 464 HashMap params = GSXML.extractParams(param_list); 465 466 boolean get_status_only = false; 467 if (request_type.equals(GSXML.REQUEST_TYPE_STATUS)) { 468 get_status_only = true; 469 } 470 System.out.println("get status only = "+get_status_only); 471 472 // just check for status messages if that's all that's required 290 473 if (get_status_only) { 291 t = doc_.createTextNode("status for create new coll:"+coll_name); 292 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.SUCCESS)); 293 } else { 294 t = doc_.createTextNode("trying to start to create new coll:"+coll_name); 295 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ACCEPTED)); 296 297 } 298 status.appendChild(t); 299 return status; 300 } 301 302 /** imports a collection using import.pl */ 303 protected Element importCollection(String coll_name, String lang, boolean get_status_only, String id) { 304 305 if (get_status_only) { 306 307 Element status = doc_.createElement(GSXML.STATUS_ELEM); 474 System.out.println("in get status only bit"); 475 String id = (String)params.get(HANDLE_PARAM); 308 476 GS2PerlListener listener = (GS2PerlListener)listeners_.get(id); 309 477 if (listener==null) { 310 Text t = doc_.createTextNode( "invalid id error");478 Text t = doc_.createTextNode(getTextString("general.process_id_error", lang)); 311 479 status.appendChild(t); 312 480 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); … … 315 483 status.appendChild(t); 316 484 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(listener.getStatus())); 485 // check that we actually should be removing the listener here 317 486 if (listener.isFinished()) { // remove this listener - its job is done 318 487 listeners_.remove(id); // not working 319 488 } 320 489 } 321 return status; 490 return response; 491 492 } 493 System.out.println("not in get status only bit"); 494 495 // do teh actual command 496 String coll_name=null; 497 if (type==CollectionConstructor.NEW) { 498 String coll_title = (String)params.get(NEW_COL_TITLE_PARAM); 499 coll_name = createNewCollName(coll_title); 500 } else { 501 coll_name = (String)params.get(COL_PARAM); 502 } 503 System.err.println("Coll name = "+coll_name); 504 // makes a paramList of the relevant params 505 Element other_params = extractOtherParams(params, type); 506 507 //create the constructor to do the work 508 509 CollectionConstructor constructor = new GS2PerlConstructor("perl_build"); 510 if (!constructor.configure()) { 511 Text t = doc_.createTextNode(getTextString("general.configure_constructor_error", lang)); 512 status.appendChild(t); 513 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 514 return response; 322 515 } 323 516 324 // do the actual import325 CollectionConstructor constructor = new GS2PerlConstructor("perl_build");326 517 constructor.setSiteHome(site_home_); 327 518 constructor.setCollectionName(coll_name); 328 constructor.setActionType( CollectionConstructor.IMPORT);329 519 constructor.setActionType(type); 520 constructor.setProcessParams(other_params); 330 521 // the listener 331 522 GS2PerlListener listener = new GS2PerlListener(); … … 333 524 constructor.start(); 334 525 335 id = newID();526 String id = newID(); 336 527 listeners_.put(id, listener); 337 528 338 Element status = doc_.createElement(GSXML.STATUS_ELEM);339 529 status.setAttribute(GSXML.STATUS_PROCESS_ID_ATT, id); 340 530 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ACCEPTED)); 341 Text t = doc_.createTextNode( "starting");531 Text t = doc_.createTextNode(getTextString("general.process_start", lang)); 342 532 status.appendChild(t); 343 return status; 344 } 345 /** builds a collection using buildcol.pl */ 346 protected Element buildCollection(String coll_name, String lang, boolean get_status_only, String id) { 347 348 if (get_status_only) { 349 350 Element status = doc_.createElement(GSXML.STATUS_ELEM); 351 GS2PerlListener listener = (GS2PerlListener)listeners_.get(id); 352 if (listener==null) { 353 Text t = doc_.createTextNode("invalid id error"); 354 status.appendChild(t); 355 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 356 } else { 357 Text t = doc_.createTextNode(listener.getUpdate()); 358 status.appendChild(t); 359 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(listener.getStatus())); 360 if (listener.isFinished()) { // remove this listener - its job is done 361 System.out.println("listener is finished, remove it"); 362 listeners_.remove(id); // not working 363 } 364 } 365 return status; 366 } 367 368 // do the actual import 369 CollectionConstructor constructor = new GS2PerlConstructor("perl_build"); 370 constructor.setSiteHome(site_home_); 371 constructor.setCollectionName(coll_name); 372 constructor.setActionType(CollectionConstructor.BUILD); 373 374 // the listener 375 GS2PerlListener listener = new GS2PerlListener(); 376 constructor.addListener(listener); 377 constructor.start(); 378 379 id = newID(); 380 listeners_.put(id, listener); 381 382 Element status = doc_.createElement(GSXML.STATUS_ELEM); 383 status.setAttribute(GSXML.STATUS_PROCESS_ID_ATT, id); 384 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ACCEPTED)); 385 Text t = doc_.createTextNode("starting"); 386 status.appendChild(t); 387 return status; 388 389 /*Element status = doc_.createElement(GSXML.STATUS_ELEM); 390 Text t; 391 if (get_status_only) { 392 t = doc_.createTextNode("status for build coll:"+coll_name); 393 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.SUCCESS)); 394 } else { 395 t= doc_.createTextNode("trying to build coll:"+coll_name); 396 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ACCEPTED)); 397 } 398 status.appendChild(t); 399 return status;*/ 400 } 401 protected Element reloadCollection(String coll_name, String lang, boolean get_status_only) { 402 Element status = doc_.createElement(GSXML.STATUS_ELEM); 403 Text t; 404 if (get_status_only) { // this makes no sense for this service 405 t = doc_.createTextNode("no status for reload coll:"+coll_name); 406 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.SUCCESS)); 407 } else { 408 Element message = doc_.createElement(GSXML.MESSAGE_ELEM); 409 Element request = doc_.createElement(GSXML.REQUEST_ELEM); 410 request.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_CONFIGURE); 411 request.setAttribute(GSXML.TO_ATT, ""); 412 message.appendChild(request); 413 Element command = doc_.createElement(GSXML.CONFIGURE_ELEM); 414 command.setAttribute(GSXML.TYPE_ATT, GSXML.COLLECTION_ELEM); 415 command.setAttribute(GSXML.NAME_ATT, coll_name); 416 command.setAttribute(GSXML.ACTION_ATT, GSXML.CONFIG_ACTION_ACTIVATE); 417 request.appendChild(command); 418 Element response = router_.process(message); // at the moment, get no info in response so ignore it 419 420 String[] args={coll_name}; 421 422 if (response == null) { 423 t = doc_.createTextNode(getTextString("reload.activate_error", args , lang)); 424 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 425 status.appendChild(t); 426 return status; 427 } 428 429 // if we got here, we have succeeded! 430 t = doc_.createTextNode(getTextString("reload.success", args, lang)); 431 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.SUCCESS)); 432 } 433 status.appendChild(t); 434 return status; 435 } 436 437 /** activates a collection by removing index, copying building over 438 * also instructs the MR to activate this new/modified collection 439 * fails if no valid building directory */ 440 protected Element activateCollection(String coll_name, String lang, boolean get_status_only) { 441 // the return element 442 Element status = doc_.createElement(GSXML.STATUS_ELEM); 443 Text t; 444 if (get_status_only) { // makes no sense 445 t = doc_.createTextNode("no status for activate coll:"+coll_name); 446 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ACCEPTED)); 447 status.appendChild(t); 448 return status; 449 } 450 451 String[] args={coll_name}; 452 453 // check that we have buildcfg.xml in the building directory 454 File coll_build_dir = new File(GSFile.collectionBuildDir(site_home_, coll_name)); 455 if (!coll_build_dir.exists()) { 456 t = doc_.createTextNode(getTextString("activate.build_dir_error", args, lang)); 457 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 458 status.appendChild(t); 459 return status; 460 } 461 462 /* 463 File coll_build_file = new File(GSFile.collectionBuildConfigFileBuilding(site_home_, coll_name)); 464 if (!coll_build_file.exists()) { 465 t = doc_.createTextNode(getTextString("activate.build_config_error", args, lang)); 466 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 467 status.appendChild(t); 468 return status; 469 } 470 471 472 File coll_index_dir = new File(GSFile.collectionIndexDir(site_home_, coll_name)); 473 if (coll_index_dir.exists()) { 474 // remove it 475 if (!GSFile.deleteFile(coll_index_dir)) { 476 t = doc_.createTextNode(getTextString("activate.rm_index_error", args, lang)); 477 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 478 status.appendChild(t); 479 return status; 480 } 481 } 482 483 // copy building to index 484 if (!GSFile.moveDirectory(coll_build_dir, coll_index_dir)) { 485 t = doc_.createTextNode(getTextString("activate.rename_building_error", args, lang)); 486 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 487 status.appendChild(t); 488 return status; 489 } 490 */ 491 // now have to tell the message router 492 return reloadCollection(coll_name, lang, get_status_only); 493 494 } 495 /** deletes a collection - removes the whole directory 496 * also instructs the MR to deactivate this collection*/ 497 protected Element deleteCollection(String coll_name, String lang, boolean get_status_only) { 498 499 Element status = doc_.createElement(GSXML.STATUS_ELEM); 500 Text t; 501 if (get_status_only) { 502 t = doc_.createTextNode("no status for delete coll:"+coll_name); 503 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ACCEPTED)); 504 status.appendChild(t); 505 return status; 506 } 507 508 String[] args={coll_name}; 509 File coll_dir = new File(GSFile.collectionBaseDir(site_home_, coll_name)); 510 if (coll_dir.exists()) { 511 if (!GSFile.deleteFile(coll_dir)) { 512 t = doc_.createTextNode(getTextString("delete.delete_error", args, lang)); 513 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 514 status.appendChild(t); 515 return status; 516 } 517 // now tell the MR about it 518 519 Element message = doc_.createElement(GSXML.MESSAGE_ELEM); 520 Element request = doc_.createElement(GSXML.REQUEST_ELEM); 521 request.setAttribute(GSXML.TYPE_ATT, GSXML.REQUEST_TYPE_CONFIGURE); 522 request.setAttribute(GSXML.TO_ATT, ""); 523 message.appendChild(request); 524 Element command = doc_.createElement(GSXML.CONFIGURE_ELEM); 525 command.setAttribute(GSXML.TYPE_ATT, GSXML.COLLECTION_ELEM); 526 command.setAttribute(GSXML.NAME_ATT, coll_name); 527 command.setAttribute(GSXML.ACTION_ATT, GSXML.CONFIG_ACTION_DEACTIVATE); 528 request.appendChild(command); 529 530 Element response = router_.process(message); // at the moment, get no info in response so ignore it 531 if (response == null) { 532 t = doc_.createTextNode(getTextString("delete.deactivate_error", args, lang)); 533 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR)); 534 status.appendChild(t); 535 return status; 536 } 537 } 538 // success 539 540 t = doc_.createTextNode(getTextString("delete.success", args, lang)); 541 status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ACCEPTED)); 542 status.appendChild(t); 543 return status; 544 } 545 533 return response; 534 535 } 536 537 538 //************************ 539 // some helper functions 540 //************************ 541 542 /** parse the collect directory and return a list of collection names */ 546 543 protected String[] getCollectionList() { 547 544 … … 577 574 } 578 575 576 /** ids used for process id */ 579 577 private int current_id = 0; 580 578 private String newID() { … … 582 580 return Integer.toString(current_id); 583 581 } 582 583 /** creates a new short name from the collection title */ 584 protected String createNewCollName(String coll_title) { 585 586 String base_name = null; 587 // take the first 6 letters 588 if (coll_title.length()<6) { 589 base_name = coll_title; 590 } else { 591 base_name = coll_title.substring(0,6); 592 } 593 File coll_dir = new File(GSFile.collectionBaseDir(site_home_, base_name)); 594 if (!coll_dir.exists()) { // this name is ok - not used yet 595 return base_name; 596 } 597 598 // now we have to make a new name until we get a good one 599 // try name1, name2 name3 etc 600 int i=0; 601 while(coll_dir.exists()) { 602 i++; 603 coll_dir = new File(GSFile.collectionBaseDir(site_home_, base_name+Integer.toString(i))); 604 } 605 return base_name+Integer.toString(i); 606 607 } 608 609 /** takes the params from the request (in the HashMap) and extracts any 610 * that need to be passed to the constructor and puts them into a 611 * paramList element */ 612 protected Element extractOtherParams(HashMap params, int type) { 613 614 Element param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 615 if (type == CollectionConstructor.NEW) { 616 Element param = doc_.createElement(GSXML.PARAM_ELEM); 617 param.setAttribute(GSXML.NAME_ATT, "creator"); 618 param.setAttribute(GSXML.VALUE_ATT, (String)params.get(CREATOR_PARAM)); 619 620 param_list.appendChild(param); 621 param = doc_.createElement(GSXML.PARAM_ELEM); 622 param.setAttribute(GSXML.NAME_ATT, "about"); 623 param.setAttribute(GSXML.VALUE_ATT, (String)params.get(NEW_COL_ABOUT_PARAM)); 624 param_list.appendChild(param); 625 param = doc_.createElement(GSXML.PARAM_ELEM); 626 param.setAttribute(GSXML.NAME_ATT, "title"); 627 param.setAttribute(GSXML.VALUE_ATT, (String)params.get(NEW_COL_TITLE_PARAM)); 628 param_list.appendChild(param); 629 return param_list; 630 } 631 632 // other ones dont have params yet 633 return null; 634 } 635 584 636 } 637 638
Note:
See TracChangeset
for help on using the changeset viewer.