source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/core/FormatReceptionist.java@ 24203

Last change on this file since 24203 was 24203, checked in by sjb48, 13 years ago

Working on document-level format editting

File size: 8.7 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 FormatReceptionist 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.debug(" response does not correspond to request!");
154 }
155
156 }
157 }
158
159 // Request collection metadata
160 info_message = this.doc.createElement(GSXML.MESSAGE_ELEM);
161 String address = GSPath.appendLink(coll_name, "CoverageMetadataRetrieve");
162 Element info_request = GSXML.createBasicRequest(this.doc, GSXML.REQUEST_TYPE_PROCESS, address, lang, uid);
163 Element req_param_list = this.doc.createElement(GSXML.PARAM_ELEM+GSXML.LIST_MODIFIER);
164 req_param_list.appendChild(GSXML.createParameter(this.doc, "metadata", "All")); // GSXML.SUBSET_PARAM, GSXML.DISPLAY_TEXT_ELEM+GSXML.LIST_MODIFIER));
165 info_request.appendChild(req_param_list);
166 info_message.appendChild(info_request);
167
168 logger.error("************ Coverage Metadata request created");
169 logger.error("************ add extra info, page request="+this.converter.getString(info_message));
170
171 info_response = (Element)this.mr.process(info_message);
172 logger.error("************ page response="+this.converter.getString(info_response));
173
174 Element coverage_metadata = (Element)GSXML.getNodeByPath(info_response, "response/metadataSetList");
175 logger.error("************ This should be metadata set list="+this.converter.getString(coverage_metadata));
176 if(coverage_metadata != null)
177 {
178 coverage_metadata = (Element)this.doc.importNode(coverage_metadata, true);
179 coll_description.appendChild(coverage_metadata);
180 }
181
182 }
183}
184
Note: See TracBrowser for help on using the repository browser.