Revision 458
Added by berkley over 23 years ago
MetaCatServlet.java | ||
---|---|---|
20 | 20 |
import java.io.BufferedReader; |
21 | 21 |
import java.io.File; |
22 | 22 |
import java.io.FileInputStream; |
23 |
import java.io.FileOutputStream; |
|
24 |
import java.io.InputStreamReader; |
|
23 | 25 |
import java.io.DataInputStream; |
24 | 26 |
import java.util.Enumeration; |
25 | 27 |
import java.util.Hashtable; |
... | ... | |
33 | 35 |
import java.sql.SQLException; |
34 | 36 |
import java.lang.reflect.*; |
35 | 37 |
import java.net.*; |
38 |
import java.util.zip.*; |
|
36 | 39 |
|
37 | 40 |
import javax.servlet.ServletConfig; |
38 | 41 |
import javax.servlet.ServletContext; |
... | ... | |
43 | 46 |
import javax.servlet.http.HttpServletResponse; |
44 | 47 |
import javax.servlet.http.HttpSession; |
45 | 48 |
import javax.servlet.http.HttpUtils; |
49 |
import javax.servlet.ServletOutputStream; |
|
46 | 50 |
|
47 | 51 |
import oracle.xml.parser.v2.XSLStylesheet; |
48 | 52 |
import oracle.xml.parser.v2.XSLException; |
... | ... | |
180 | 184 |
} |
181 | 185 |
} |
182 | 186 |
// Get a handle to the output stream back to the client |
183 |
PrintWriter out = response.getWriter(); |
|
187 |
//PrintWriter out = response.getWriter();
|
|
184 | 188 |
//response.setContentType("text/html"); |
185 | 189 |
|
186 | 190 |
String name = null; |
... | ... | |
222 | 226 |
String username = null; |
223 | 227 |
String groupname = null; |
224 | 228 |
if (action.equals("Login") || action.equals("Login Client")) { |
225 |
handleLoginAction(out, params, request, response);
|
|
229 |
handleLoginAction(response.getWriter(), params, request, response);
|
|
226 | 230 |
// handle logout action |
227 | 231 |
} else if (action.equals("Logout") || action.equals("Logout Client")) { |
228 | 232 |
HttpSession sess = request.getSession(false); |
229 | 233 |
if (sess != null) { sess.invalidate(); } |
230 | 234 |
if (action.equals("Logout Client")) { |
235 |
PrintWriter out = response.getWriter(); |
|
231 | 236 |
out.println("<?xml version=\"1.0\"?>"); |
232 | 237 |
out.println("<success>"); |
233 | 238 |
out.println("User logout."); |
... | ... | |
255 | 260 |
// to a particular action handler |
256 | 261 |
if(action.equals("query")) |
257 | 262 |
{ |
258 |
handleQuery(out, params, response, username, groupname);
|
|
263 |
handleQuery(response.getWriter(), params, response, username, groupname);
|
|
259 | 264 |
} |
260 | 265 |
else if(action.equals("squery")) |
261 | 266 |
{ |
262 | 267 |
if(params.containsKey("query")) |
263 | 268 |
{ |
264 |
handleSQuery(out, params, response, username, groupname);
|
|
269 |
handleSQuery(response.getWriter(), params, response, username, groupname);
|
|
265 | 270 |
} |
266 | 271 |
else |
267 | 272 |
{ |
273 |
PrintWriter out = response.getWriter(); |
|
268 | 274 |
out.println("Illegal action squery without \"query\" parameter"); |
269 | 275 |
} |
270 | 276 |
} |
271 | 277 |
else if (action.equals("getdocument")) { |
278 |
PrintWriter out = response.getWriter(); |
|
272 | 279 |
try { |
273 | 280 |
handleGetDocumentAction(out, params, response); |
274 | 281 |
} catch (ClassNotFoundException e) { |
... | ... | |
278 | 285 |
} |
279 | 286 |
} |
280 | 287 |
else if (action.equals("getrelateddocument")) { |
288 |
PrintWriter out = response.getWriter(); |
|
281 | 289 |
try { |
282 | 290 |
handleGetRelatedDocumentAction(out, params, response); |
283 | 291 |
} catch (ClassNotFoundException e) { |
... | ... | |
287 | 295 |
} |
288 | 296 |
} |
289 | 297 |
else if (action.equals("insert") || action.equals("update")) { |
298 |
PrintWriter out = response.getWriter(); |
|
290 | 299 |
if ( !username.equals("public") && (username != null) ) { |
291 | 300 |
handleInsertOrUpdateAction(out, params, response, username, groupname); |
292 | 301 |
} else { |
293 | 302 |
out.println("Permission denied for " + action); |
294 | 303 |
} |
295 | 304 |
} else if (action.equals("delete")) { |
305 |
PrintWriter out = response.getWriter(); |
|
296 | 306 |
if ( !username.equals("public") && (username != null) ) { |
297 | 307 |
handleDeleteAction(out, params, response, username, groupname); |
298 | 308 |
} else { |
299 | 309 |
out.println("Permission denied for " + action); |
300 | 310 |
} |
301 | 311 |
} else if (action.equals("validate")) { |
312 |
PrintWriter out = response.getWriter(); |
|
302 | 313 |
handleValidateAction(out, params, response); |
303 | 314 |
} else if (action.equals("getabstract")) { |
315 |
PrintWriter out = response.getWriter(); |
|
304 | 316 |
try{ |
305 | 317 |
handleViewAbstractAction(out, params, response); |
306 | 318 |
} |
... | ... | |
309 | 321 |
out.println("error viewing abstract: " + e.getMessage()); |
310 | 322 |
} |
311 | 323 |
} else if (action.equals("getdatadoc")) { |
324 |
response.setContentType("application/zip"); |
|
325 |
ServletOutputStream out = response.getOutputStream(); |
|
312 | 326 |
handleGetDataDocumentAction(out, params, response); |
313 | 327 |
} else if (action.equals("getdoctypes")) { |
328 |
PrintWriter out = response.getWriter(); |
|
314 | 329 |
handleGetDoctypesAction(out, params, response); |
315 | 330 |
} else if (action.equals("getdataguide")) { |
331 |
PrintWriter out = response.getWriter(); |
|
316 | 332 |
handleGetDataGuideAction(out, params, response); |
317 | 333 |
} else if (action.equals("Login") || action.equals("Login Client")) { |
318 | 334 |
} else { |
335 |
PrintWriter out = response.getWriter(); |
|
319 | 336 |
out.println("Error: action not registered. Please report this error."); |
320 | 337 |
} |
321 | 338 |
|
322 | 339 |
// Close the stream to the client |
323 |
out.close(); |
|
340 |
//out.close();
|
|
324 | 341 |
} |
325 | 342 |
|
326 | 343 |
/** |
... | ... | |
653 | 670 |
if(murlParams[0].equals("httpurl")) |
654 | 671 |
{//httpurl is the param name for an http url. |
655 | 672 |
URL urlconn = new URL(murlParams[1]); //create a new url obj. |
656 |
DataInputStream htmldoc = new DataInputStream(urlconn.openStream()); |
|
673 |
//DataInputStream htmldoc = new DataInputStream(urlconn.openStream()); |
|
674 |
BufferedReader htmldoc = new BufferedReader( |
|
675 |
new InputStreamReader(urlconn.openStream())); |
|
657 | 676 |
//bind a data stream. |
658 | 677 |
try |
659 | 678 |
{ //display the document |
... | ... | |
925 | 944 |
|
926 | 945 |
/** |
927 | 946 |
* Handle the document request and return the results to the requestor |
947 |
* If a docid is passed in through the params then that document |
|
948 |
* will be retrieved form the DB and put in the zip file. |
|
949 |
* In addition if 1 or more relations parameters are passed, those file |
|
950 |
* will be zipped as well. Currently this is only implemented for |
|
951 |
* metacat:// and http:// files. Support should be added for srb:// files |
|
952 |
* as well. |
|
928 | 953 |
*/ |
929 |
private void handleGetDataDocumentAction(PrintWriter out, Hashtable params, |
|
954 |
private void handleGetDataDocumentAction(ServletOutputStream out, |
|
955 |
Hashtable params, |
|
930 | 956 |
HttpServletResponse response) { |
957 |
//find the related files, get them from their source and zip them into |
|
958 |
//a zip file. |
|
959 |
try |
|
960 |
{ |
|
961 |
Connection conn = util.getConnection(); |
|
962 |
String currentDocid = ((String[])params.get("docid"))[0]; |
|
963 |
ZipOutputStream zout = new ZipOutputStream(out); |
|
964 |
byte[] bytestring = null; |
|
965 |
ZipEntry zentry = null; |
|
966 |
DocumentImpl xmldoc = null; |
|
967 |
String[] reldocs = null; |
|
968 |
|
|
969 |
if(params.containsKey("relation")) |
|
970 |
{ //get the relations from the parameters. |
|
971 |
reldocs = ((String[])params.get("relation")); |
|
972 |
} |
|
973 |
else |
|
974 |
{ //let the for loop know that there are no relations to zip |
|
975 |
reldocs = new String[0]; |
|
976 |
} |
|
977 |
|
|
978 |
//write the base file to the zip file. |
|
979 |
xmldoc = new DocumentImpl(conn, currentDocid); |
|
980 |
bytestring = (xmldoc.toString()).getBytes(); |
|
981 |
zentry = new ZipEntry(currentDocid + ".xml"); |
|
982 |
//create a new zip entry and write the file to the stream |
|
983 |
zentry.setSize(bytestring.length); |
|
984 |
zout.putNextEntry(zentry); |
|
985 |
zout.write(bytestring, 0, bytestring.length); |
|
986 |
zout.closeEntry(); //get ready for the next entry. |
|
987 |
|
|
988 |
//zip up the related documents |
|
989 |
for(int i=0; i<reldocs.length; i++) |
|
990 |
{ |
|
991 |
metacatURL murl = new metacatURL(((String)reldocs[i])); |
|
992 |
if(murl.getURLType().equals("metacat")) |
|
993 |
{ |
|
994 |
//get the document from the database |
|
995 |
xmldoc = new DocumentImpl(conn, (murl.getParam(0))[1]); |
|
996 |
bytestring = (xmldoc.toString()).getBytes(); |
|
997 |
zentry = new ZipEntry((murl.getParam(0))[1] + ".xml"); |
|
998 |
//create a new zip entry and write the file to the stream |
|
999 |
zentry.setSize(bytestring.length); |
|
1000 |
zout.putNextEntry(zentry); |
|
1001 |
zout.write(bytestring, 0, bytestring.length); |
|
1002 |
zout.closeEntry(); //get ready for the next entry. |
|
1003 |
} |
|
1004 |
else if(murl.getURLType().equals("http")) |
|
1005 |
{ |
|
1006 |
String[] murlParams = murl.getParam(0); |
|
1007 |
if(murlParams[0].equals("httpurl")) |
|
1008 |
{//httpurl is the param name for an http url. |
|
1009 |
URL urlconn = new URL(murlParams[1]); //create a new url obj. |
|
1010 |
BufferedReader htmldoc = new BufferedReader( |
|
1011 |
new InputStreamReader(urlconn.openStream())); |
|
1012 |
//get the data from the web server |
|
1013 |
try |
|
1014 |
{ //zip the document |
|
1015 |
String line=null; |
|
1016 |
zentry = new ZipEntry((murl.getParam(1))[1]); |
|
1017 |
//get just the filename from the URL. |
|
1018 |
zout.putNextEntry(zentry); |
|
1019 |
//make a new entry in the zip file stream |
|
1020 |
while((line = htmldoc.readLine()) != null) |
|
1021 |
{ |
|
1022 |
bytestring = (line.toString()).getBytes(); |
|
1023 |
zout.write(bytestring, 0, bytestring.length); |
|
1024 |
//write out the file line by line |
|
1025 |
} |
|
1026 |
zout.closeEntry(); //close the entry in the file |
|
1027 |
} |
|
1028 |
catch(Exception e) |
|
1029 |
{ |
|
1030 |
util.debugMessage("error downloading html document"); |
|
1031 |
} |
|
1032 |
} |
|
1033 |
} |
|
1034 |
} |
|
1035 |
zout.finish(); //terminate the zip file |
|
1036 |
zout.close(); //close the stream. |
|
1037 |
util.returnConnection(conn); //return the connection to the pool |
|
1038 |
} |
|
1039 |
catch(Exception e) |
|
1040 |
{ |
|
1041 |
System.out.println("Error creating zip file: " + e.getMessage()); |
|
1042 |
e.printStackTrace(System.out); |
|
1043 |
} |
|
1044 |
|
|
1045 |
/* |
|
1046 |
//////////old code using a shell script///////////////////////////////// |
|
1047 |
|
|
931 | 1048 |
boolean error_flag = false; |
932 | 1049 |
String error_message = ""; |
933 | 1050 |
// Get the document indicated |
... | ... | |
975 | 1092 |
e.getMessage(); |
976 | 1093 |
} |
977 | 1094 |
} // end defaultdatapath not null if |
1095 |
*/ |
|
978 | 1096 |
} |
979 | 1097 |
|
980 | 1098 |
/** |
Also available in: Unified diff
Updated the download data function. the download data function now pulls a document from the database, zips it up and sends the zip stream to the client. It also zips up any related files. a relation parameter is used to pass related files to the servlet. If only one document should be zipped and sent, a single docid in the param hashtable is sufficient.