source: greenstone3/trunk/src/java/org/greenstone/gsdl3/core/DefaultReceptionist.java@ 16874

Last change on this file since 16874 was 16874, checked in by kjdon, 16 years ago

when testing to see if we need to get service descriptions or not, ignore oai type services as well as retrieve services cos these never have descriptions

  • Property svn:keywords set to Author Date Id Revision
File size: 6.4 KB
Line 
1package org.greenstone.gsdl3.core;
2
3import org.greenstone.gsdl3.util.*;
4import org.greenstone.gsdl3.action.*;
5// XML classes
6import org.w3c.dom.Node;
7import org.w3c.dom.NodeList;
8import org.w3c.dom.Document;
9import org.w3c.dom.Element;
10
11// other java classes
12import java.io.File;
13import java.util.HashMap;
14import java.util.Enumeration;
15
16import org.apache.log4j.*;
17
18/** The default greenstone receptionist - needs some extra info for each page
19 */
20public class DefaultReceptionist extends TransformingReceptionist {
21
22 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.core.DefaultReceptionist.class.getName());
23
24 /** add in the collection description to the page, then for each service, add in the service description */
25 protected void addExtraInfo(Element page) {
26 super.addExtraInfo(page);
27
28 Element page_request = (Element)GSXML.getChildByTagName(page, GSXML.PAGE_REQUEST_ELEM);
29 // if it is a system request, then we don't bother with this.
30 String action = page_request.getAttribute(GSXML.ACTION_ATT);
31 if (action.equals("s")) {
32 logger.error("HACK: don't ask for coll info if system action");
33 return;
34 }
35 logger.debug("add extra info, page request="+this.converter.getString(page_request));
36 // is a collection defined?
37 Element param_list = (Element)GSXML.getChildByTagName(page_request, GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
38 if (param_list==null) { // must be the original home page
39 logger.debug(" no param list, assuming home page");
40 return;
41 }
42 Element coll_param = GSXML.getNamedElement(param_list, GSXML.PARAM_ELEM, GSXML.NAME_ATT, GSParams.COLLECTION);
43 if (coll_param == null) {
44 logger.debug(" coll param is null, returning");
45 return;
46 }
47
48 // see if the collection/cluster element is already there
49 String coll_name = coll_param.getAttribute(GSXML.VALUE_ATT);
50 String lang = page_request.getAttribute(GSXML.LANG_ATT);
51 String uid = page_request.getAttribute(GSXML.USER_ID_ATT);
52
53 boolean get_service_description = false;
54 Element page_response = (Element)GSXML.getChildByTagName(page, GSXML.PAGE_RESPONSE_ELEM);
55 if (this.language_list != null) {
56 page_response.appendChild(this.language_list);
57 }
58 Element coll_description = (Element)GSXML.getChildByTagName(page_response, GSXML.COLLECTION_ELEM);
59 if (coll_description == null) {
60 // try cluster
61 coll_description = (Element)GSXML.getChildByTagName(page_response, GSXML.CLUSTER_ELEM);
62 }
63 if (coll_description == null) {
64 // we dont have one yet - get it
65 Element coll_about_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
66 Element coll_about_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, coll_name, lang, uid);
67 coll_about_message.appendChild(coll_about_request);
68
69 Node coll_about_response_message = this.mr.process(coll_about_message);
70 Element coll_about_response = (Element)GSXML.getChildByTagName(coll_about_response_message, GSXML.RESPONSE_ELEM);
71 if (coll_about_response == null) {
72 return;
73 }
74 coll_description = (Element)GSXML.getChildByTagName(coll_about_response, GSXML.COLLECTION_ELEM);
75 if (coll_description==null) { // may be a cluster
76 coll_description = (Element)GSXML.getChildByTagName(coll_about_response, GSXML.CLUSTER_ELEM);
77 }
78
79 if (coll_description == null) {
80 logger.error(" no collection description, returning");
81 return;
82 }
83 // have found one, append it to the page response
84 coll_description = (Element)this.doc.importNode(coll_description, true);
85 page_response.appendChild(coll_description);
86 get_service_description = true;
87 }
88
89 // have got a coll description
90
91 // now get the dispay info for the services
92 Element service_list = (Element)GSXML.getChildByTagName(coll_description, GSXML.SERVICE_ELEM+GSXML.LIST_MODIFIER);
93 if (service_list == null) {
94 logger.error(" no service list, returning");
95 // something weird has gone wrong
96 return;
97 }
98
99 NodeList services = service_list.getElementsByTagName(GSXML.SERVICE_ELEM);
100 if (services.getLength()==0) {
101 logger.error("DefaultReceoptionist: no services found for colllection/cluster "+ coll_name);
102 return;
103 }
104 // check one service for display items
105 if (!get_service_description) {
106 // we dont know yet if we need to get these
107 int i=1;
108 Element test_s = (Element)services.item(0);
109 while (i<services.getLength() && (test_s.getAttribute(GSXML.TYPE_ATT).equals(GSXML.SERVICE_TYPE_RETRIEVE) || test_s.getAttribute(GSXML.TYPE_ATT).equals(GSXML.SERVICE_TYPE_OAI))) {
110 test_s = (Element)services.item(i); i++;
111 }
112 if (i==services.getLength()) {
113 // we have only found retrieve or oai services, so dont need descripitons anyway
114 return;
115 }
116 if (GSXML.getChildByTagName(test_s, GSXML.DISPLAY_TEXT_ELEM) !=null) {
117 // have got descriptions already,
118 return;
119 }
120 }
121
122 // if get here, we need to get the service descriptions
123
124 // we will send all the requests in a single message
125 Element info_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
126 for (int i=0; i<services.getLength(); i++) {
127 Element c = (Element)services.item(i);
128 String name = c.getAttribute(GSXML.NAME_ATT);
129 String address = GSPath.appendLink(coll_name, name);
130 Element info_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_DESCRIBE, address, lang, uid);
131 Element req_param_list = this.doc.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
132 req_param_list.appendChild(GSXML.createParameter(this.doc, GSXML.SUBSET_PARAM, GSXML.DISPLAY_TEXT_ELEM+GSXML.LIST_MODIFIER));
133 info_request.appendChild(req_param_list);
134 info_message.appendChild(info_request);
135
136 }
137
138 Element info_response = (Element)this.mr.process(info_message);
139
140 NodeList service_responses = info_response.getElementsByTagName(GSXML.RESPONSE_ELEM);
141 // check that have same number of responses as collections
142 if (services.getLength() != service_responses.getLength()) {
143 logger.error(" didn't get a response for each service - somethings gone wrong!");
144 // for now, dont use the metadata
145 } else {
146 for (int i=0; i<services.getLength(); i++) {
147 Element c1 = (Element)services.item(i);
148 Element c2 = (Element)GSXML.getChildByTagName((Element)service_responses.item(i), GSXML.SERVICE_ELEM);
149 if (c1 !=null && c2 !=null && c1.getAttribute(GSXML.NAME_ATT).equals(c2.getAttribute(GSXML.NAME_ATT))) {
150 //add the service data into the original response
151 GSXML.mergeElements(c1, c2);
152 } else {
153 logger.error(" response does not correspond to request!");
154 }
155
156 }
157 }
158
159 }
160}
161
Note: See TracBrowser for help on using the repository browser.