Changeset 3681


Ignore:
Timestamp:
2003-01-17T10:39:34+13:00 (21 years ago)
Author:
kjdon
Message:

major changes, too many to list

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gsdl3/src/java/org/greenstone/gsdl3/service/GS2Construct.java

    r3649 r3681  
    4444 */
    4545public class GS2Construct
    46     extends ServiceRack { //implements ConstructionEventListener {
     46    extends ServiceRack {
    4747   
    4848    // services offered
    4949    private static final String NEW_SERVICE = "NewCollection";
     50    private static final String ADD_DOC_SERVICE = "AddDocument";
    5051    private static final String IMPORT_SERVICE = "ImportCollection";
    5152    private static final String BUILD_SERVICE = "BuildCollection";
     
    5657    // params used
    5758    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";
    5961    private static final String CREATOR_PARAM = "creator";
     62    private static final String NEW_FILE_PARAM = "newfile";
    6063    private static final String HANDLE_PARAM = "id";
    6164
    62     //private static final String STATUS_PARAM = "us";
    6365    // the list of the collections - store between some method calls
    6466    private String[] collection_list_ = null;
    6567
    66     // set of listeners for nay construciton commands
     68    // set of listeners for any construction commands
    6769    protected Map listeners_ = null;
    6870   
    6971    public GS2Construct() {
    7072    listeners_ = Collections.synchronizedMap(new HashMap());
     73   
    7174    }
    7275
     
    8184    Element descript = (Element)((Element)service_info_map_.get(service)).cloneNode(true);
    8285    // 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
    8487        Element param_list = (Element) GSXML.getChildByTagName(descript, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
    8588        Element old_param = GSXML.getNamedElement(param_list, GSXML.PARAM_ELEM, GSXML.NAME_ATT, COL_PARAM);
     
    104107    Element param;
    105108    if (service.equals(NEW_SERVICE)) {
    106         // have the coll name and creator params
    107         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);
    108111        display.appendChild(param);
    109112        param = GSXML.createParameterDisplay(doc_, CREATOR_PARAM, getTextString("param."+CREATOR_PARAM, lang), null, null);
    110113        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);
    111116    } else {
    112117        // have just the coll param
    113         //use the colleciton 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()
    114119        param = GSXML.createParameterDisplay(doc_, COL_PARAM, getTextString("param."+COL_PARAM, lang), collection_list_, collection_list_);
    115120        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    }
    117127
    118128    return display;
     
    120130    }
    121131
    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);
    128219    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   
    129224    boolean get_status_only = false;
    130225    if (request_type.equals(GSXML.REQUEST_TYPE_STATUS)) {
     
    132227    }
    133228    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   
    135272    Element param_list = (Element)GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
    136273    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   
    137288    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);
    162313    } 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};
    169321       
    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
    171335
    172336    /** configure the service module
     
    182346
    183347    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);
    185349    e.setAttribute(GSXML.NAME_ATT, NEW_SERVICE);
    186350    short_service_info_.appendChild(e);
    187351
    188352    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);
    190354    e.setAttribute(GSXML.NAME_ATT, IMPORT_SERVICE);
    191355    short_service_info_.appendChild(e);
    192356
    193357    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);
    195359    e.setAttribute(GSXML.NAME_ATT, BUILD_SERVICE);
    196360    short_service_info_.appendChild(e);
    197361
    198362    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);
    200364    e.setAttribute(GSXML.NAME_ATT, ACTIVATE_SERVICE);
    201365    short_service_info_.appendChild(e);
    202366
    203367    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);
    205369    e.setAttribute(GSXML.NAME_ATT, DELETE_SERVICE);
    206370    short_service_info_.appendChild(e);
    207371
    208372    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);
    210374    e.setAttribute(GSXML.NAME_ATT, RELOAD_SERVICE);
    211375    short_service_info_.appendChild(e);
    212376
    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.
    219384
    220385    Element param_list;
    221386    Element param;
    222387
    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);
    228390    e.setAttribute(GSXML.NAME_ATT, NEW_SERVICE);
    229391    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);
    231393    param_list.appendChild(param);
    232394    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);
    233397    param_list.appendChild(param);
    234398    e.appendChild(param_list);
     
    236400
    237401    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);
    239403    e.setAttribute(GSXML.NAME_ATT, IMPORT_SERVICE);
    240404    param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
     
    245409
    246410    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);
    248412    e.setAttribute(GSXML.NAME_ATT, BUILD_SERVICE);
    249413    param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
     
    254418
    255419    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);
    257421    e.setAttribute(GSXML.NAME_ATT, ACTIVATE_SERVICE);
    258422    param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
     
    263427
    264428    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);
    266430    e.setAttribute(GSXML.NAME_ATT, DELETE_SERVICE);
    267431    param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
     
    272436
    273437    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);
    275439    e.setAttribute(GSXML.NAME_ATT, RELOAD_SERVICE);
    276440    param_list = doc_.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
     
    284448    }
    285449
    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);
    288457    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
    290473    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);
    308476        GS2PerlListener listener = (GS2PerlListener)listeners_.get(id);
    309477        if (listener==null) {
    310         Text t = doc_.createTextNode("invalid id error");
     478        Text t = doc_.createTextNode(getTextString("general.process_id_error", lang));
    311479        status.appendChild(t);
    312480        status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(GSStatus.ERROR));
     
    315483        status.appendChild(t);
    316484        status.setAttribute(GSXML.STATUS_ERROR_CODE_ATT, Integer.toString(listener.getStatus()));
     485        // check that we actually should be removing the listener here
    317486        if (listener.isFinished()) { // remove this listener - its job is done
    318487            listeners_.remove(id); // not working
    319488        }
    320489        }
    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;
    322515    }
    323516       
    324     // do the actual import
    325     CollectionConstructor constructor = new GS2PerlConstructor("perl_build");
    326517    constructor.setSiteHome(site_home_);
    327518    constructor.setCollectionName(coll_name);
    328     constructor.setActionType(CollectionConstructor.IMPORT);
    329 
     519    constructor.setActionType(type);
     520    constructor.setProcessParams(other_params);
    330521    // the listener
    331522    GS2PerlListener listener = new GS2PerlListener();
     
    333524    constructor.start();
    334525
    335     id = newID();
     526    String id = newID();
    336527    listeners_.put(id, listener);
    337528
    338     Element status = doc_.createElement(GSXML.STATUS_ELEM);
    339529    status.setAttribute(GSXML.STATUS_PROCESS_ID_ATT, id);
    340530    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));
    342532    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 */
    546543    protected String[] getCollectionList() {
    547544   
     
    577574    }
    578575   
     576    /** ids used for process id */
    579577    private int current_id = 0;
    580578    private String newID() {
     
    582580    return Integer.toString(current_id);
    583581    }
     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   
    584636}
     637
     638
Note: See TracChangeset for help on using the changeset viewer.