Changeset 24977

Show
Ignore:
Timestamp:
26.01.2012 10:38:03 (8 years ago)
Author:
sjm84
Message:

Reformatting this file ahead of some changes

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/BerryBasket.java

    r24221 r24977  
    4747import org.apache.log4j.*; 
    4848 
    49 public class BerryBasket 
    50     extends ServiceRack { 
    51  
    52     static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.BerryBasket.class.getName()); 
    53  
    54     // the services on offer 
    55     // these strings must match what is found in the properties file 
    56     protected static final String ADD_ITEM_SERVICE = "AddItem"; 
    57     protected static final String DISPLAY_ITEMS_SERVICE = "DisplayList"; 
    58     protected static final String ITEM_NUM_SERVICE = "ItemNum"; 
    59     protected static final String DELETE_ITEMS_SERVICE = "DeleteItems"; 
    60     protected static final String SEND_MAIL_SERVICE = "SendMail";   
    61     protected static final String DELETE_ITEM_SERVICE = "DeleteItem"; 
    62  
    63     protected static final String ITEM_PARAM = "item"; 
    64     protected static final String delimiter ="|"; 
    65     protected static final int delay = 1800000; 
    66  
    67     protected Hashtable userMap = null; 
    68     protected Hashtable timerMap = null; 
    69     protected String username=""; 
    70     protected String password=""; 
    71  
    72      
    73     /** constructor */ 
    74     public BerryBasket() 
    75     { 
    76     userMap =  new Hashtable(); 
    77         timerMap = new Hashtable(); 
    78     } 
    79  
    80     private Hashtable updateDocMap(Element request){ 
    81         
    82     String id = request.getAttribute("uid"); 
    83          
    84         if (userMap.containsKey(id)){    
    85         if (timerMap.containsKey(id)){ 
    86         UserTimer timer = (UserTimer)timerMap.get(id); 
    87                 timer.restart(); 
    88         }     
    89         return (Hashtable) userMap.get(id); 
    90            } 
    91     else{ 
    92             UserTimer timer = new UserTimer(delay,id); 
    93             timerMap.put(id,timer); 
    94             timer.start(); 
    95             Hashtable newDocs= new Hashtable();  
    96         userMap.put(id,newDocs); 
    97             return newDocs; 
    98     }     
    99     } 
    100  
    101      
    102     /** configure this service */ 
    103     public boolean configure(Element info, Element extra_info) 
    104     { 
    105     logger.info("Configuring BerryBasket..."); 
    106     this.config_info = info; 
    107  
    108     // set up short_service_info_ - for now just has name and type 
    109     Element add_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    110     add_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    111     add_service.setAttribute(GSXML.NAME_ATT, ADD_ITEM_SERVICE); 
    112     this.short_service_info.appendChild(add_service); 
    113  
    114      
    115     // set up short_service_info_ - for now just has name and type 
    116     Element disp_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    117     disp_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    118     disp_service.setAttribute(GSXML.NAME_ATT, DISPLAY_ITEMS_SERVICE); 
    119     this.short_service_info.appendChild(disp_service); 
    120  
    121     // set up short_service_info_ - for now just has name and type 
    122     Element num_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    123     num_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    124     num_service.setAttribute(GSXML.NAME_ATT, ITEM_NUM_SERVICE); 
    125     this.short_service_info.appendChild(num_service); 
    126  
    127         // set up short_service_info_ - for now just has name and type 
    128     Element delete_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    129     delete_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    130     delete_service.setAttribute(GSXML.NAME_ATT, DELETE_ITEMS_SERVICE); 
    131     this.short_service_info.appendChild(delete_service); 
    132  
    133         // set up short_service_info_ - for now just has name and type 
    134     Element deleteone_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    135     deleteone_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    136     deleteone_service.setAttribute(GSXML.NAME_ATT, DELETE_ITEM_SERVICE); 
    137     this.short_service_info.appendChild(deleteone_service); 
    138  
    139     // set up short_service_info_ - for now just has name and type 
    140     Element mail_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    141     mail_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    142     mail_service.setAttribute(GSXML.NAME_ATT, SEND_MAIL_SERVICE); 
    143     this.short_service_info.appendChild(mail_service); 
    144  
    145  
    146     return true; 
    147      
    148     } 
    149  
    150     /** returns a specific service description */ 
    151     protected Element getServiceDescription(String service_id, String lang, String subset) { 
    152  
    153     if (service_id.equals(ADD_ITEM_SERVICE)) { 
    154         Element add_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    155         add_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    156         add_service.setAttribute(GSXML.NAME_ATT, ADD_ITEM_SERVICE); 
    157         return add_service; 
    158     } 
    159     if (service_id.equals(DISPLAY_ITEMS_SERVICE)) { 
    160          
    161         Element disp_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    162         disp_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    163         disp_service.setAttribute(GSXML.NAME_ATT, DISPLAY_ITEMS_SERVICE); 
    164         return disp_service; 
    165     } 
    166  
    167     if (service_id.equals(ITEM_NUM_SERVICE)) { 
    168          
    169         Element num_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    170         num_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    171         num_service.setAttribute(GSXML.NAME_ATT, ITEM_NUM_SERVICE); 
    172         return num_service; 
    173     } 
    174  
    175     if (service_id.equals(DELETE_ITEMS_SERVICE)) { 
    176          
    177         Element del_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    178         del_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    179         del_service.setAttribute(GSXML.NAME_ATT, DELETE_ITEMS_SERVICE); 
    180         return del_service; 
    181     } 
    182  
    183     if (service_id.equals(DELETE_ITEM_SERVICE)) { 
    184          
    185         Element delone_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    186         delone_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    187         delone_service.setAttribute(GSXML.NAME_ATT, DELETE_ITEM_SERVICE); 
    188         return delone_service; 
    189     } 
    190  
    191     if (service_id.equals(SEND_MAIL_SERVICE)) { 
    192          
    193         Element mail_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
    194         mail_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
    195         mail_service.setAttribute(GSXML.NAME_ATT, SEND_MAIL_SERVICE); 
    196         return mail_service; 
    197     } 
    198  
    199     return null; 
    200     } 
    201  
    202     protected Element processAddItem(Element request) { 
    203         Hashtable docsMap = updateDocMap(request); 
    204  
    205     // Create a new (empty) result message 
    206     Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
    207      
    208     // Get the parameters of the request 
    209     Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 
    210     if (param_list == null) { 
    211         logger.error("BerryBasket Error: AddItem request had no paramList."); 
    212         return result;  // Return the empty result 
    213     } 
    214  
    215     HashMap params = GSXML.extractParams(param_list, false); 
    216  
    217     String item = (String)params.get("item"); 
    218     String collection = ""; 
    219     int pos = item.indexOf(":"); 
    220     if (pos != -1) { 
    221         collection = item.substring(0,pos); 
    222         item = item.substring(pos+1); 
    223     } 
    224  
    225     if (docsMap.containsKey(collection)){ 
    226         Hashtable items = (Hashtable) docsMap.get(collection); 
    227             if (!items.containsKey(item)){ 
    228                 Item newItem = generateItem(collection,item); 
    229                 items.put(item, newItem); 
    230                 result.appendChild(newItem.wrapIntoElement()); 
    231         } 
    232     } 
    233     else{ 
    234         Hashtable items = new Hashtable(); 
    235             Item newItem = generateItem(collection,item); 
    236             items.put(item, newItem); 
    237             docsMap.put(collection,items); 
    238         result.appendChild(newItem.wrapIntoElement()); 
    239     } 
    240  
    241     return result; 
    242     } 
    243  
    244     private Item generateItem(String collection, String id){ 
    245       
    246     Item item = new Item(collection, id); 
    247     String to = GSPath.appendLink(collection, "DocumentMetadataRetrieve"); 
    248     ArrayList tmp = new ArrayList(); 
    249     tmp.add(id);   
    250     Element response = getDocumentMetadata(to,"en","dumy", tmp.iterator()); 
    251     Element doc_node = (Element)response.getElementsByTagName(GSXML.DOC_NODE_ELEM).item(0);  
    252  
    253     String node_id = doc_node.getAttribute(GSXML.NODE_ID_ATT); 
    254     Element metadata_list = (Element)doc_node.getElementsByTagName(GSXML.METADATA_ELEM+GSXML.LIST_MODIFIER).item(0); 
    255  
    256     //assign title metadata if any 
    257     Element metadata = GSXML.getNamedElement(metadata_list,"metadata","name","Title"); 
    258     if (metadata != null){ 
    259         item.title = GSXML.getNodeText(metadata).trim(); 
    260     }  
    261     //assign date metadata if any 
    262     metadata = GSXML.getNamedElement(metadata_list,"metadata","name","Date"); 
    263     if (metadata != null){ 
    264         item.date = GSXML.getNodeText(metadata).trim(); 
    265     }    
    266      
    267     //assign root title metadata if any 
    268     metadata = GSXML.getNamedElement(metadata_list,"metadata","name","root_Title"); 
    269     if (metadata != null){ 
    270             String rootTitle = GSXML.getNodeText(metadata).trim(); 
    271             if (!rootTitle.equals(item.title)){ 
    272               item.rootTitle = rootTitle; 
    273         } 
    274          
    275     } 
    276  
    277     return item; 
    278     } 
    279  
    280  
    281     protected Element processDeleteItems(Element request) { 
    282           Hashtable docsMap = updateDocMap(request); 
    283      
    284     // Create a new (empty) result message 
    285     Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
    286      
    287     // Get the parameters of the request 
    288     Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 
    289  
    290     if (param_list == null) { 
    291         logger.error("BerryBasket Error: DeleteItem request had no paramList."); 
    292         return result;  // Return the empty result 
    293     } 
    294  
    295     HashMap params = GSXML.extractParams(param_list, false); 
    296        
    297     String param = (String)params.get("items"); 
    298   
    299         if (param == null) return result;      
    300  
    301         String[] items = param.split("\\|"); 
    302   
    303     for (int i=0; i<items.length; i++){ 
    304             String item = items[i]; 
    305         if (item.trim().length() == 0) continue; 
    306             String collection = ""; 
    307         int pos = item.indexOf(":"); 
    308         if (pos != -1) { 
    309         collection = item.substring(0,pos); 
    310         item = item.substring(pos+1); 
    311         } 
    312       
    313         if (docsMap.containsKey(collection)){ 
    314         Hashtable itemMap = (Hashtable) docsMap.get(collection); 
    315         if (itemMap.containsKey(item)){ 
    316             itemMap.remove(item); 
    317         } 
    318         if (itemMap.size()==0){ 
    319             docsMap.remove(collection); 
    320         } 
    321         } 
    322  
    323     } 
    324  
    325     return result; 
    326     } 
    327  
    328      protected Element processDeleteItem(Element request) { 
    329           Hashtable docsMap = updateDocMap(request); 
    330      
    331     // Create a new (empty) result message 
    332     Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
    333      
    334     // Get the parameters of the request 
    335     Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 
    336  
    337     if (param_list == null) { 
    338         logger.error("BerryBasket Error: DeleteItem request had no paramList."); 
    339         return result;  // Return the empty result 
    340     } 
    341  
    342     HashMap params = GSXML.extractParams(param_list, false); 
    343        
    344     String param = (String)params.get("item"); 
    345   
    346         if (param == null) return result;      
    347  
    348         String item = param; 
    349   
    350     String collection = ""; 
    351     int pos = item.indexOf(":"); 
    352      
    353     if (pos != -1) { 
    354         collection = item.substring(0,pos); 
    355         item = item.substring(pos+1); 
    356     } 
    357      
    358     if (docsMap.containsKey(collection)){ 
    359         Hashtable itemMap = (Hashtable) docsMap.get(collection); 
    360         if (itemMap.containsKey(item)){ 
    361         itemMap.remove(item); 
    362         } 
    363         if (itemMap.size()==0){ 
    364         docsMap.remove(collection); 
    365         } 
    366     }        
    367  
    368     return result; 
    369     } 
    370  
    371  
    372     protected Element processItemNum(Element request){ 
    373     Hashtable docsMap = updateDocMap(request); 
    374  
    375     // Create a new (empty) result message 
    376     Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
    377      
    378         int size = 0; 
    379         String ids ="";    
    380         Iterator keys = docsMap.keySet().iterator(); 
    381      
    382          while(keys.hasNext()){   
    383          Hashtable items = (Hashtable) docsMap.get((String)keys.next()); 
    384              size+=items.size(); 
    385              Iterator values = items.values().iterator(); 
    386              while(values.hasNext()){  
    387          Item item = (Item)values.next(); 
    388                  result.appendChild(item.wrapIntoElement());  
    389          }   
    390      } 
    391  
    392         Element selement = this.doc.createElement("size"); 
    393     selement.setAttribute("value",size+""); 
    394         result.appendChild(selement); 
    395          
    396         return result; 
    397     } 
    398  
    399      
    400     private Element getDocumentMetadata(String to, String lang, String uid, Iterator ids){ 
    401      
    402         // Build a request to obtain some document metadata 
    403     Element dm_message = this.doc.createElement(GSXML.MESSAGE_ELEM); 
    404     Element dm_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, to, lang, uid); 
    405     dm_message.appendChild(dm_request); 
    406  
    407     // Create a parameter list to specify the required metadata information 
    408     HashSet meta_names = new HashSet(); 
    409     meta_names.add("Title"); // the default 
    410         meta_names.add("root_Title"); 
    411         meta_names.add("Date"); 
    412  
    413  
    414         Element param_list  = this.doc.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 
    415      
    416     Element param = null; 
    417     Iterator i = meta_names.iterator(); 
    418     while (i.hasNext()) { 
    419         String name = (String)i.next(); 
    420         param = this.doc.createElement(GSXML.PARAM_ELEM); 
    421         param_list.appendChild(param); 
    422         param.setAttribute(GSXML.NAME_ATT, "metadata"); 
    423         param.setAttribute(GSXML.VALUE_ATT, name); 
    424      
    425     } 
    426      
    427     dm_request.appendChild(param_list); 
    428      
    429     // create the doc node list for the metadata request 
    430     Element dm_doc_list = this.doc.createElement(GSXML.DOC_NODE_ELEM+GSXML.LIST_MODIFIER); 
    431     dm_request.appendChild(dm_doc_list); 
    432  
    433     while (ids.hasNext()){ 
    434         // Add the documentNode to the list 
    435         Element dm_doc_node = this.doc.createElement(GSXML.DOC_NODE_ELEM); 
    436         dm_doc_list.appendChild(dm_doc_node); 
    437         dm_doc_node.setAttribute(GSXML.NODE_ID_ATT,(String)ids.next()); 
    438     } 
    439  
    440     return (Element) this.router.process(dm_message); 
    441  
    442     } 
    443  
    444  
    445     protected Element processDisplayList(Element request) { 
    446         Hashtable docsMap =  updateDocMap(request); 
    447  
    448     // Create a new (empty) result message 
    449     Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
    450      
    451         Iterator keys = docsMap.keySet().iterator(); 
    452      
    453     while(keys.hasNext()){      
    454         String collection = (String)keys.next();  
    455         Hashtable items = (Hashtable)docsMap.get(collection); 
    456         Iterator itemItr = items.values().iterator(); 
    457          
    458         Element collectionNode = this.doc.createElement("berryList"); 
    459         collectionNode.setAttribute("name",collection); 
    460         result.appendChild(collectionNode); 
    461          
    462         while(itemItr.hasNext()){   
    463                 Item item = (Item)itemItr.next(); 
    464             Element itemElement = this.doc.createElement("item"); 
    465          
    466                 collectionNode.appendChild(itemElement); 
    467         itemElement.setAttribute("name", item.docid); 
    468             itemElement.setAttribute("collection", item.collection); 
    469         itemElement.setAttribute("title",item.title); 
    470         itemElement.setAttribute("date",item.date); 
    471                 itemElement.setAttribute("root_title",item.rootTitle);                 
    472         }         
    473     } 
    474         
    475     return result; 
    476  
    477     } 
    478  
    479  
    480     public Element processSendMail(Element request){ 
     49public class BerryBasket extends ServiceRack 
     50{ 
     51 
     52    static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.BerryBasket.class.getName()); 
     53 
     54    // the services on offer 
     55    // these strings must match what is found in the properties file 
     56    protected static final String ADD_ITEM_SERVICE = "AddItem"; 
     57    protected static final String DISPLAY_ITEMS_SERVICE = "DisplayList"; 
     58    protected static final String ITEM_NUM_SERVICE = "ItemNum"; 
     59    protected static final String DELETE_ITEMS_SERVICE = "DeleteItems"; 
     60    protected static final String SEND_MAIL_SERVICE = "SendMail"; 
     61    protected static final String DELETE_ITEM_SERVICE = "DeleteItem"; 
     62 
     63    protected static final String ITEM_PARAM = "item"; 
     64    protected static final String delimiter = "|"; 
     65    protected static final int delay = 1800000; 
     66 
     67    protected Hashtable userMap = null; 
     68    protected Hashtable timerMap = null; 
     69    protected String username = ""; 
     70    protected String password = ""; 
     71 
     72    /** constructor */ 
     73    public BerryBasket() 
     74    { 
     75        userMap = new Hashtable(); 
     76        timerMap = new Hashtable(); 
     77    } 
     78 
     79    private Hashtable updateDocMap(Element request) 
     80    { 
     81 
     82        String id = request.getAttribute("uid"); 
     83 
     84        if (userMap.containsKey(id)) 
     85        { 
     86            if (timerMap.containsKey(id)) 
     87            { 
     88                UserTimer timer = (UserTimer) timerMap.get(id); 
     89                timer.restart(); 
     90            } 
     91            return (Hashtable) userMap.get(id); 
     92        } 
     93        else 
     94        { 
     95            UserTimer timer = new UserTimer(delay, id); 
     96            timerMap.put(id, timer); 
     97            timer.start(); 
     98            Hashtable newDocs = new Hashtable(); 
     99            userMap.put(id, newDocs); 
     100            return newDocs; 
     101        } 
     102    } 
     103 
     104    /** configure this service */ 
     105    public boolean configure(Element info, Element extra_info) 
     106    { 
     107        logger.info("Configuring BerryBasket..."); 
     108        this.config_info = info; 
     109 
     110        // set up short_service_info_ - for now just has name and type 
     111        Element add_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     112        add_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     113        add_service.setAttribute(GSXML.NAME_ATT, ADD_ITEM_SERVICE); 
     114        this.short_service_info.appendChild(add_service); 
     115 
     116        // set up short_service_info_ - for now just has name and type 
     117        Element disp_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     118        disp_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     119        disp_service.setAttribute(GSXML.NAME_ATT, DISPLAY_ITEMS_SERVICE); 
     120        this.short_service_info.appendChild(disp_service); 
     121 
     122        // set up short_service_info_ - for now just has name and type 
     123        Element num_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     124        num_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     125        num_service.setAttribute(GSXML.NAME_ATT, ITEM_NUM_SERVICE); 
     126        this.short_service_info.appendChild(num_service); 
     127 
     128        // set up short_service_info_ - for now just has name and type 
     129        Element delete_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     130        delete_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     131        delete_service.setAttribute(GSXML.NAME_ATT, DELETE_ITEMS_SERVICE); 
     132        this.short_service_info.appendChild(delete_service); 
     133 
     134        // set up short_service_info_ - for now just has name and type 
     135        Element deleteone_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     136        deleteone_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     137        deleteone_service.setAttribute(GSXML.NAME_ATT, DELETE_ITEM_SERVICE); 
     138        this.short_service_info.appendChild(deleteone_service); 
     139 
     140        // set up short_service_info_ - for now just has name and type 
     141        Element mail_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     142        mail_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     143        mail_service.setAttribute(GSXML.NAME_ATT, SEND_MAIL_SERVICE); 
     144        this.short_service_info.appendChild(mail_service); 
     145 
     146        return true; 
     147 
     148    } 
     149 
     150    /** returns a specific service description */ 
     151    protected Element getServiceDescription(String service_id, String lang, String subset) 
     152    { 
     153 
     154        if (service_id.equals(ADD_ITEM_SERVICE)) 
     155        { 
     156            Element add_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     157            add_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     158            add_service.setAttribute(GSXML.NAME_ATT, ADD_ITEM_SERVICE); 
     159            return add_service; 
     160        } 
     161        if (service_id.equals(DISPLAY_ITEMS_SERVICE)) 
     162        { 
     163 
     164            Element disp_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     165            disp_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     166            disp_service.setAttribute(GSXML.NAME_ATT, DISPLAY_ITEMS_SERVICE); 
     167            return disp_service; 
     168        } 
     169 
     170        if (service_id.equals(ITEM_NUM_SERVICE)) 
     171        { 
     172 
     173            Element num_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     174            num_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     175            num_service.setAttribute(GSXML.NAME_ATT, ITEM_NUM_SERVICE); 
     176            return num_service; 
     177        } 
     178 
     179        if (service_id.equals(DELETE_ITEMS_SERVICE)) 
     180        { 
     181 
     182            Element del_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     183            del_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     184            del_service.setAttribute(GSXML.NAME_ATT, DELETE_ITEMS_SERVICE); 
     185            return del_service; 
     186        } 
     187 
     188        if (service_id.equals(DELETE_ITEM_SERVICE)) 
     189        { 
     190 
     191            Element delone_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     192            delone_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     193            delone_service.setAttribute(GSXML.NAME_ATT, DELETE_ITEM_SERVICE); 
     194            return delone_service; 
     195        } 
     196 
     197        if (service_id.equals(SEND_MAIL_SERVICE)) 
     198        { 
     199 
     200            Element mail_service = this.doc.createElement(GSXML.SERVICE_ELEM); 
     201            mail_service.setAttribute(GSXML.TYPE_ATT, "gather"); // what?? 
     202            mail_service.setAttribute(GSXML.NAME_ATT, SEND_MAIL_SERVICE); 
     203            return mail_service; 
     204        } 
     205 
     206        return null; 
     207    } 
     208 
     209    protected Element processAddItem(Element request) 
     210    { 
     211        Hashtable docsMap = updateDocMap(request); 
     212 
    481213        // Create a new (empty) result message 
    482214        Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
    483          
     215 
    484216        // Get the parameters of the request 
    485         Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER); 
    486          
    487         if (param_list == null) { 
     217        Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER); 
     218        if (param_list == null) 
     219        { 
     220            logger.error("BerryBasket Error: AddItem request had no paramList."); 
     221            return result; // Return the empty result 
     222        } 
     223 
     224        HashMap params = GSXML.extractParams(param_list, false); 
     225 
     226        String item = (String) params.get("item"); 
     227        String collection = ""; 
     228        int pos = item.indexOf(":"); 
     229        if (pos != -1) 
     230        { 
     231            collection = item.substring(0, pos); 
     232            item = item.substring(pos + 1); 
     233        } 
     234 
     235        if (docsMap.containsKey(collection)) 
     236        { 
     237            Hashtable items = (Hashtable) docsMap.get(collection); 
     238            if (!items.containsKey(item)) 
     239            { 
     240                Item newItem = generateItem(collection, item); 
     241                items.put(item, newItem); 
     242                result.appendChild(newItem.wrapIntoElement()); 
     243            } 
     244        } 
     245        else 
     246        { 
     247            Hashtable items = new Hashtable(); 
     248            Item newItem = generateItem(collection, item); 
     249            items.put(item, newItem); 
     250            docsMap.put(collection, items); 
     251            result.appendChild(newItem.wrapIntoElement()); 
     252        } 
     253 
     254        return result; 
     255    } 
     256 
     257    private Item generateItem(String collection, String id) 
     258    { 
     259 
     260        Item item = new Item(collection, id); 
     261        String to = GSPath.appendLink(collection, "DocumentMetadataRetrieve"); 
     262        ArrayList tmp = new ArrayList(); 
     263        tmp.add(id); 
     264        Element response = getDocumentMetadata(to, "en", "dumy", tmp.iterator()); 
     265        Element doc_node = (Element) response.getElementsByTagName(GSXML.DOC_NODE_ELEM).item(0); 
     266 
     267        String node_id = doc_node.getAttribute(GSXML.NODE_ID_ATT); 
     268        Element metadata_list = (Element) doc_node.getElementsByTagName(GSXML.METADATA_ELEM + GSXML.LIST_MODIFIER).item(0); 
     269 
     270        //assign title metadata if any 
     271        Element metadata = GSXML.getNamedElement(metadata_list, "metadata", "name", "Title"); 
     272        if (metadata != null) 
     273        { 
     274            item.title = GSXML.getNodeText(metadata).trim(); 
     275        } 
     276        //assign date metadata if any 
     277        metadata = GSXML.getNamedElement(metadata_list, "metadata", "name", "Date"); 
     278        if (metadata != null) 
     279        { 
     280            item.date = GSXML.getNodeText(metadata).trim(); 
     281        } 
     282 
     283        //assign root title metadata if any 
     284        metadata = GSXML.getNamedElement(metadata_list, "metadata", "name", "root_Title"); 
     285        if (metadata != null) 
     286        { 
     287            String rootTitle = GSXML.getNodeText(metadata).trim(); 
     288            if (!rootTitle.equals(item.title)) 
     289            { 
     290                item.rootTitle = rootTitle; 
     291            } 
     292 
     293        } 
     294 
     295        return item; 
     296    } 
     297 
     298    protected Element processDeleteItems(Element request) 
     299    { 
     300        Hashtable docsMap = updateDocMap(request); 
     301 
     302        // Create a new (empty) result message 
     303        Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
     304 
     305        // Get the parameters of the request 
     306        Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER); 
     307 
     308        if (param_list == null) 
     309        { 
     310            logger.error("BerryBasket Error: DeleteItem request had no paramList."); 
     311            return result; // Return the empty result 
     312        } 
     313 
     314        HashMap params = GSXML.extractParams(param_list, false); 
     315 
     316        String param = (String) params.get("items"); 
     317 
     318        if (param == null) 
     319            return result; 
     320 
     321        String[] items = param.split("\\|"); 
     322 
     323        for (int i = 0; i < items.length; i++) 
     324        { 
     325            String item = items[i]; 
     326            if (item.trim().length() == 0) 
     327                continue; 
     328            String collection = ""; 
     329            int pos = item.indexOf(":"); 
     330            if (pos != -1) 
     331            { 
     332                collection = item.substring(0, pos); 
     333                item = item.substring(pos + 1); 
     334            } 
     335 
     336            if (docsMap.containsKey(collection)) 
     337            { 
     338                Hashtable itemMap = (Hashtable) docsMap.get(collection); 
     339                if (itemMap.containsKey(item)) 
     340                { 
     341                    itemMap.remove(item); 
     342                } 
     343                if (itemMap.size() == 0) 
     344                { 
     345                    docsMap.remove(collection); 
     346                } 
     347            } 
     348 
     349        } 
     350 
     351        return result; 
     352    } 
     353 
     354    protected Element processDeleteItem(Element request) 
     355    { 
     356        Hashtable docsMap = updateDocMap(request); 
     357 
     358        // Create a new (empty) result message 
     359        Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
     360 
     361        // Get the parameters of the request 
     362        Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER); 
     363 
     364        if (param_list == null) 
     365        { 
     366            logger.error("BerryBasket Error: DeleteItem request had no paramList."); 
     367            return result; // Return the empty result 
     368        } 
     369 
     370        HashMap params = GSXML.extractParams(param_list, false); 
     371 
     372        String param = (String) params.get("item"); 
     373 
     374        if (param == null) 
     375            return result; 
     376 
     377        String item = param; 
     378 
     379        String collection = ""; 
     380        int pos = item.indexOf(":"); 
     381 
     382        if (pos != -1) 
     383        { 
     384            collection = item.substring(0, pos); 
     385            item = item.substring(pos + 1); 
     386        } 
     387 
     388        if (docsMap.containsKey(collection)) 
     389        { 
     390            Hashtable itemMap = (Hashtable) docsMap.get(collection); 
     391            if (itemMap.containsKey(item)) 
     392            { 
     393                itemMap.remove(item); 
     394            } 
     395            if (itemMap.size() == 0) 
     396            { 
     397                docsMap.remove(collection); 
     398            } 
     399        } 
     400 
     401        return result; 
     402    } 
     403 
     404    protected Element processItemNum(Element request) 
     405    { 
     406        Hashtable docsMap = updateDocMap(request); 
     407 
     408        // Create a new (empty) result message 
     409        Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
     410 
     411        int size = 0; 
     412        String ids = ""; 
     413        Iterator keys = docsMap.keySet().iterator(); 
     414 
     415        while (keys.hasNext()) 
     416        { 
     417            Hashtable items = (Hashtable) docsMap.get((String) keys.next()); 
     418            size += items.size(); 
     419            Iterator values = items.values().iterator(); 
     420            while (values.hasNext()) 
     421            { 
     422                Item item = (Item) values.next(); 
     423                result.appendChild(item.wrapIntoElement()); 
     424            } 
     425        } 
     426 
     427        Element selement = this.doc.createElement("size"); 
     428        selement.setAttribute("value", size + ""); 
     429        result.appendChild(selement); 
     430 
     431        return result; 
     432    } 
     433 
     434    private Element getDocumentMetadata(String to, String lang, String uid, Iterator ids) 
     435    { 
     436 
     437        // Build a request to obtain some document metadata 
     438        Element dm_message = this.doc.createElement(GSXML.MESSAGE_ELEM); 
     439        Element dm_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, to, lang, uid); 
     440        dm_message.appendChild(dm_request); 
     441 
     442        // Create a parameter list to specify the required metadata information 
     443        HashSet meta_names = new HashSet(); 
     444        meta_names.add("Title"); // the default 
     445        meta_names.add("root_Title"); 
     446        meta_names.add("Date"); 
     447 
     448        Element param_list = this.doc.createElement(GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER); 
     449 
     450        Element param = null; 
     451        Iterator i = meta_names.iterator(); 
     452        while (i.hasNext()) 
     453        { 
     454            String name = (String) i.next(); 
     455            param = this.doc.createElement(GSXML.PARAM_ELEM); 
     456            param_list.appendChild(param); 
     457            param.setAttribute(GSXML.NAME_ATT, "metadata"); 
     458            param.setAttribute(GSXML.VALUE_ATT, name); 
     459 
     460        } 
     461 
     462        dm_request.appendChild(param_list); 
     463 
     464        // create the doc node list for the metadata request 
     465        Element dm_doc_list = this.doc.createElement(GSXML.DOC_NODE_ELEM + GSXML.LIST_MODIFIER); 
     466        dm_request.appendChild(dm_doc_list); 
     467 
     468        while (ids.hasNext()) 
     469        { 
     470            // Add the documentNode to the list 
     471            Element dm_doc_node = this.doc.createElement(GSXML.DOC_NODE_ELEM); 
     472            dm_doc_list.appendChild(dm_doc_node); 
     473            dm_doc_node.setAttribute(GSXML.NODE_ID_ATT, (String) ids.next()); 
     474        } 
     475 
     476        return (Element) this.router.process(dm_message); 
     477 
     478    } 
     479 
     480    protected Element processDisplayList(Element request) 
     481    { 
     482        Hashtable docsMap = updateDocMap(request); 
     483 
     484        // Create a new (empty) result message 
     485        Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
     486 
     487        Iterator keys = docsMap.keySet().iterator(); 
     488 
     489        while (keys.hasNext()) 
     490        { 
     491            String collection = (String) keys.next(); 
     492            Hashtable items = (Hashtable) docsMap.get(collection); 
     493            Iterator itemItr = items.values().iterator(); 
     494 
     495            Element collectionNode = this.doc.createElement("berryList"); 
     496            collectionNode.setAttribute("name", collection); 
     497            result.appendChild(collectionNode); 
     498 
     499            while (itemItr.hasNext()) 
     500            { 
     501                Item item = (Item) itemItr.next(); 
     502                Element itemElement = this.doc.createElement("item"); 
     503 
     504                collectionNode.appendChild(itemElement); 
     505                itemElement.setAttribute("name", item.docid); 
     506                itemElement.setAttribute("collection", item.collection); 
     507                itemElement.setAttribute("title", item.title); 
     508                itemElement.setAttribute("date", item.date); 
     509                itemElement.setAttribute("root_title", item.rootTitle); 
     510            } 
     511        } 
     512 
     513        return result; 
     514 
     515    } 
     516 
     517    public Element processSendMail(Element request) 
     518    { 
     519        // Create a new (empty) result message 
     520        Element result = this.doc.createElement(GSXML.RESPONSE_ELEM); 
     521 
     522        // Get the parameters of the request 
     523        Element param_list = (Element) GSXML.getChildByTagName(request, GSXML.PARAM_ELEM + GSXML.LIST_MODIFIER); 
     524 
     525        if (param_list == null) 
     526        { 
    488527            logger.error("BerryBasket Error: SendMail request had no paramList."); 
    489             return result;  // Return the empty result 
    490         } 
    491          
     528            return result; // Return the empty result 
     529        } 
     530 
    492531        HashMap params = GSXML.extractParams(param_list, false); 
    493          
    494         String to = (String)params.get("address"); 
    495         String subject = (String)params.get("subject"); 
    496         String content = (String)params.get("content"); 
    497         String cc = (String)params.get("cc"); 
    498         String bcc = (String)params.get("bcc"); 
    499          
     532 
     533        String to = (String) params.get("address"); 
     534        String subject = (String) params.get("subject"); 
     535        String content = (String) params.get("content"); 
     536        String cc = (String) params.get("cc"); 
     537        String bcc = (String) params.get("bcc"); 
     538 
    500539        String mailhost = GlobalProperties.getProperty("mail.smtp.host"); 
    501540        username = GlobalProperties.getProperty("mail.smtp.username"); 
    502541        password = GlobalProperties.getProperty("mail.smtp.password"); 
    503542        String from = GlobalProperties.getProperty("mail.from"); 
    504          
     543 
    505544        String mailer = "msgsend"; 
    506          
    507         try { 
    508              
     545 
     546        try 
     547        { 
     548 
    509549            Properties props = System.getProperties(); 
    510              
     550 
    511551            //Setup smtp host and from address 
    512552            // XXX - could use Session.getTransport() and Transport.connect() 
    513553            // XXX - assume we're using SMTP 
    514             if ( mailhost != null && !mailhost.trim().equals("") ) { 
     554            if (mailhost != null && !mailhost.trim().equals("")) 
     555            { 
    515556                props.put("mail.smtp.host", mailhost); 
    516             } else { 
     557            } 
     558            else 
     559            { 
    517560                props.put("mail.smtp.host", "localhost"); 
    518561            } 
    519             if ( from != null && !from.trim().equals("") ) { 
     562            if (from != null && !from.trim().equals("")) 
     563            { 
    520564                props.put("mail.from", from); 
    521565            } 
    522              
     566 
    523567            //setup username and password to the smtp server 
    524             if ( username == null || username.trim().equals("") ) username = ""; 
    525             if ( password == null || password.trim().equals("") ) password = ""; 
    526             Authenticator auth = new Authenticator() { 
    527                 protected PasswordAuthentication getPasswordAuthentication() { 
    528                     return new PasswordAuthentication( username, password ); 
     568            if (username == null || username.trim().equals("")) 
     569                username = ""; 
     570            if (password == null || password.trim().equals("")) 
     571                password = ""; 
     572            Authenticator auth = new Authenticator() 
     573            { 
     574                protected PasswordAuthentication getPasswordAuthentication() 
     575                { 
     576                    return new PasswordAuthentication(username, password); 
    529577                } 
    530578            }; 
    531              
     579 
    532580            Session session = Session.getInstance(props, auth); 
    533              
     581 
    534582            Message msg = new MimeMessage(session); 
    535583            msg.setFrom(); 
    536             msg.setRecipients( Message.RecipientType.TO, InternetAddress.parse(to, false) ); 
    537             if ( cc != null ) { 
    538                 msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc, false) ); 
    539             } 
    540             if ( bcc != null ) { 
    541                 msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc, false) ); 
     584            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false)); 
     585            if (cc != null) 
     586            { 
     587                msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc, false)); 
     588            } 
     589            if (bcc != null) 
     590            { 
     591                msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc, false)); 
    542592            } 
    543593            msg.setSubject(subject); 
    544             msg.setText(content.replaceAll("-------","&")); 
     594            msg.setText(content.replaceAll("-------", "&")); 
    545595            msg.setHeader("X-Mailer", mailer); 
    546596            msg.setSentDate(new Date()); 
    547              
     597 
    548598            // send the thing off 
    549599            Transport.send(msg); 
    550              
     600 
    551601            logger.info("\nMail was sent successfully."); 
    552602            result.appendChild(this.doc.createTextNode("Mail was sent successfully.")); 
    553         } catch (Exception e) { 
     603        } 
     604        catch (Exception e) 
     605        { 
    554606            e.printStackTrace(); 
    555607            result.appendChild(this.doc.createTextNode(e.getMessage())); 
    556608        } 
    557          
     609 
    558610        return result; 
    559611    } 
    560612 
    561  
    562     protected class Item { 
     613    protected class Item 
     614    { 
    563615        public String collection; 
    564616        public String docid; 
    565         public String title=""; 
    566         public String query=""; 
    567         public String date=""; 
    568         public String rootTitle=""; 
    569          
    570         public Item(String coll, String id) { 
     617        public String title = ""; 
     618        public String query = ""; 
     619        public String date = ""; 
     620        public String rootTitle = ""; 
     621 
     622        public Item(String coll, String id) 
     623        { 
    571624            this.collection = coll; 
    572625            this.docid = id; 
    573626        } 
    574627 
    575         public boolean equals(Object o){ 
    576         if (! (o instanceof Item)){ 
    577         return false; 
    578         } 
    579         Item item = (Item)o; 
    580             String id = collection+":"+docid; 
    581         String idin = item.collection+":"+item.docid; 
    582         return id.equals(idin); 
    583  
    584     } 
    585  
    586         public String toString(){ 
    587                  
    588         return collection+":"+docid+":"+"["+((!rootTitle.equals(""))?(rootTitle+":"):"")+title+"]"; 
    589     }        
    590  
    591         public Element wrapIntoElement(){ 
    592               Element itemElement = doc.createElement("item");   
    593               itemElement.setAttribute("name", docid); 
    594           itemElement.setAttribute("collection", collection); 
    595           itemElement.setAttribute("title",title); 
    596           itemElement.setAttribute("date",date); 
    597           itemElement.setAttribute("root_title",rootTitle); 
    598               return itemElement;           
    599     } 
    600     } 
    601     private class UserTimer extends Timer implements ActionListener{ 
    602             String id=""; 
    603  
    604             public UserTimer(int delay, String id){ 
    605                 super(delay,(ActionListener)null); 
    606                 addActionListener(this); 
    607         this.id=id; 
    608         } 
    609  
    610       
    611            public void actionPerformed(ActionEvent e){ 
    612            userMap.remove(id);             
    613                timerMap.remove(id); 
    614                stop(); 
    615         } 
    616  
    617     } 
    618      
     628        public boolean equals(Object o) 
     629        { 
     630            if (!(o instanceof Item)) 
     631            { 
     632                return false; 
     633            } 
     634            Item item = (Item) o; 
     635            String id = collection + ":" + docid; 
     636            String idin = item.collection + ":" + item.docid; 
     637            return id.equals(idin); 
     638 
     639        } 
     640 
     641        public String toString() 
     642        { 
     643 
     644            return collection + ":" + docid + ":" + "[" + ((!rootTitle.equals("")) ? (rootTitle + ":") : "") + title + "]"; 
     645        } 
     646 
     647        public Element wrapIntoElement() 
     648        { 
     649            Element itemElement = doc.createElement("item"); 
     650            itemElement.setAttribute("name", docid); 
     651            itemElement.setAttribute("collection", collection); 
     652            itemElement.setAttribute("title", title); 
     653            itemElement.setAttribute("date", date); 
     654            itemElement.setAttribute("root_title", rootTitle); 
     655            return itemElement; 
     656        } 
     657    } 
     658 
     659    private class UserTimer extends Timer implements ActionListener 
     660    { 
     661        String id = ""; 
     662 
     663        public UserTimer(int delay, String id) 
     664        { 
     665            super(delay, (ActionListener) null); 
     666            addActionListener(this); 
     667            this.id = id; 
     668        } 
     669 
     670        public void actionPerformed(ActionEvent e) 
     671        { 
     672            userMap.remove(id); 
     673            timerMap.remove(id); 
     674            stop(); 
     675        } 
     676 
     677    } 
     678 
    619679}