Revision 4488
Added by daigle about 16 years ago
src/edu/ucsb/nceas/metacat/MetacatReplication.java | ||
---|---|---|
43 | 43 |
import edu.ucsb.nceas.metacat.util.MetaCatUtil; |
44 | 44 |
import edu.ucsb.nceas.metacat.util.SessionData; |
45 | 45 |
import edu.ucsb.nceas.metacat.util.SystemUtil; |
46 |
import edu.ucsb.nceas.utilities.FileUtil; |
|
46 | 47 |
import edu.ucsb.nceas.utilities.GeneralPropertyException; |
47 | 48 |
import edu.ucsb.nceas.utilities.PropertyNotFoundException; |
48 | 49 |
|
... | ... | |
57 | 58 |
private Date firstTime; |
58 | 59 |
private boolean timedReplicationIsOn = false; |
59 | 60 |
Timer replicationDaemon; |
60 |
private Vector fileLocks = new Vector();
|
|
61 |
private Vector<String> fileLocks = new Vector<String>();
|
|
61 | 62 |
private Thread lockThread = null; |
62 | 63 |
public static final String FORCEREPLICATEDELETE = "forcereplicatedelete"; |
63 | 64 |
private static final String TIMEREPLICATION = "replication.timedreplication"; |
... | ... | |
137 | 138 |
{ |
138 | 139 |
//PrintWriter out = response.getWriter(); |
139 | 140 |
//ServletOutputStream outPut = response.getOutputStream(); |
140 |
Hashtable params = new Hashtable();
|
|
141 |
Enumeration paramlist = request.getParameterNames(); |
|
141 |
Hashtable<String, String[]> params = new Hashtable<String, String[]>();
|
|
142 |
Enumeration<String> paramlist = request.getParameterNames();
|
|
142 | 143 |
|
143 | 144 |
|
144 | 145 |
|
... | ... | |
371 | 372 |
* servercontrol delete server |
372 | 373 |
* servercontrol list |
373 | 374 |
*/ |
374 |
private void handleServerControlRequest(PrintWriter out, Hashtable params, |
|
375 |
private void handleServerControlRequest(PrintWriter out, Hashtable<String, String[]> params,
|
|
375 | 376 |
HttpServletResponse response) |
376 | 377 |
{ |
377 | 378 |
String subaction = ((String[])params.get("subaction"))[0]; |
... | ... | |
601 | 602 |
* to the requesting server (remote server) for the specified docid. Then |
602 | 603 |
* store it in local database. |
603 | 604 |
*/ |
604 |
private void handleForceReplicateRequest(PrintWriter out, Hashtable params, |
|
605 |
private void handleForceReplicateRequest(PrintWriter out, Hashtable<String, String[]> params,
|
|
605 | 606 |
HttpServletResponse response, HttpServletRequest request) |
606 | 607 |
{ |
607 | 608 |
String server = ((String[])params.get("server"))[0]; // the server that |
608 | 609 |
String docid = ((String[])params.get("docid"))[0]; // sent the document |
609 | 610 |
String dbaction = "UPDATE"; // the default action is UPDATE |
610 |
boolean override = false; |
|
611 |
int serverCode = 1; |
|
611 |
// boolean override = false;
|
|
612 |
// int serverCode = 1;
|
|
612 | 613 |
DBConnection dbConn = null; |
613 | 614 |
int serialNumber = -1; |
614 | 615 |
|
... | ... | |
640 | 641 |
DocInfoHandler dih = new DocInfoHandler(); |
641 | 642 |
XMLReader docinfoParser = ReplicationHandler.initParser(dih); |
642 | 643 |
docinfoParser.parse(new InputSource(new StringReader(docInfoStr))); |
643 |
Hashtable docinfoHash = dih.getDocInfo(); |
|
644 |
// Hashtable<String,Vector<AccessControlForSingleFile>> docinfoHash = dih.getDocInfo(); |
|
645 |
Hashtable<String,String> docinfoHash = dih.getDocInfo(); |
|
644 | 646 |
|
645 | 647 |
// Get user owner of this docid |
646 | 648 |
String user = (String)docinfoHash.get("user_owner"); |
... | ... | |
690 | 692 |
} |
691 | 693 |
|
692 | 694 |
//process extra access rules before dealing with the write exception (doc exist already) |
693 |
Vector accessControlList = (Vector) docinfoHash.get("accessControl");
|
|
695 |
Vector<AccessControlForSingleFile> accessControlList = dih.getAccessControlList();
|
|
694 | 696 |
if (accessControlList != null) { |
695 | 697 |
for (int i = 0; i < accessControlList.size(); i++) { |
696 | 698 |
AccessControlForSingleFile acfsf = (AccessControlForSingleFile) accessControlList.get(i); |
... | ... | |
730 | 732 |
* when a forcereplication delete request comes in, local host will delete this |
731 | 733 |
* document |
732 | 734 |
*/ |
733 |
private void handleForceReplicateDeleteRequest(PrintWriter out, Hashtable params, |
|
735 |
private void handleForceReplicateDeleteRequest(PrintWriter out, Hashtable<String, String[]> params,
|
|
734 | 736 |
HttpServletResponse response, HttpServletRequest request) |
735 | 737 |
{ |
736 | 738 |
String server = ((String[])params.get("server"))[0]; // the server that |
... | ... | |
764 | 766 |
* readdata request to the requesting server (remote server) for the specified |
765 | 767 |
* docid. Then store it in local database and file system |
766 | 768 |
*/ |
767 |
private void handleForceReplicateDataFileRequest(Hashtable params, HttpServletRequest request) |
|
769 |
private void handleForceReplicateDataFileRequest(Hashtable<String, String[]> params, HttpServletRequest request)
|
|
768 | 770 |
{ |
769 | 771 |
|
770 | 772 |
//make sure there is some parameters |
... | ... | |
784 | 786 |
} |
785 | 787 |
|
786 | 788 |
// Overide or not |
787 |
boolean override = false; |
|
789 |
// boolean override = false;
|
|
788 | 790 |
// dbaction - update or insert |
789 | 791 |
String dbaction=null; |
790 | 792 |
|
... | ... | |
817 | 819 |
DocInfoHandler dih = new DocInfoHandler(); |
818 | 820 |
XMLReader docinfoParser = ReplicationHandler.initParser(dih); |
819 | 821 |
docinfoParser.parse(new InputSource(new StringReader(docInfoStr))); |
820 |
Hashtable docinfoHash = dih.getDocInfo(); |
|
822 |
Hashtable<String,String> docinfoHash = dih.getDocInfo();
|
|
821 | 823 |
String user = (String)docinfoHash.get("user_owner"); |
822 | 824 |
|
823 | 825 |
String docName = (String)docinfoHash.get("docname"); |
... | ... | |
863 | 865 |
writeException = e; |
864 | 866 |
} |
865 | 867 |
//process extra access rules |
866 |
Vector accessControlList = (Vector) docinfoHash.get("accessControl");
|
|
868 |
Vector<AccessControlForSingleFile> accessControlList = dih.getAccessControlList();
|
|
867 | 869 |
if (accessControlList != null) { |
868 | 870 |
for (int i = 0; i < accessControlList.size(); i++) { |
869 | 871 |
AccessControlForSingleFile acfsf = (AccessControlForSingleFile) accessControlList.get(i); |
... | ... | |
904 | 906 |
* currentdate: the timestamp of the document on the remote server |
905 | 907 |
* |
906 | 908 |
*/ |
907 |
private void handleGetLockRequest(PrintWriter out, Hashtable params, |
|
909 |
private void handleGetLockRequest(PrintWriter out, Hashtable<String, String[]> params,
|
|
908 | 910 |
HttpServletResponse response) |
909 | 911 |
{ |
910 | 912 |
|
... | ... | |
960 | 962 |
* user_updated, home_server, public_access, rev)/> |
961 | 963 |
* all of the subelements of document info are #PCDATA |
962 | 964 |
*/ |
963 |
private void handleGetDocumentInfoRequest(PrintWriter out, Hashtable params, |
|
965 |
private void handleGetDocumentInfoRequest(PrintWriter out, Hashtable<String, String[]> params,
|
|
964 | 966 |
HttpServletResponse response) |
965 | 967 |
{ |
966 | 968 |
String docid = ((String[])(params.get("docid")))[0]; |
... | ... | |
992 | 994 |
|
993 | 995 |
//permissions on the document |
994 | 996 |
PermissionController permController = new PermissionController(docid); |
995 |
Vector accessControlList = permController.getAccessControl(); |
|
997 |
Vector<AccessControlForSingleFile> accessControlList = permController.getAccessControl();
|
|
996 | 998 |
sb.append("<accessControl>"); |
997 | 999 |
for (int i = 0; i < accessControlList.size(); i++) { |
998 | 1000 |
AccessControlForSingleFile acfsf = (AccessControlForSingleFile) accessControlList.get(i); |
... | ... | |
1018 | 1020 |
* Sends a datafile to a remote host |
1019 | 1021 |
*/ |
1020 | 1022 |
private void handleGetDataFileRequest(OutputStream outPut, |
1021 |
Hashtable params, HttpServletResponse response) |
|
1023 |
Hashtable<String, String[]> params, HttpServletResponse response)
|
|
1022 | 1024 |
|
1023 | 1025 |
{ |
1024 | 1026 |
// File path for data file |
... | ... | |
1037 | 1039 |
try |
1038 | 1040 |
{ |
1039 | 1041 |
filepath = PropertyService.getProperty("application.datafilepath"); |
1040 |
String server = ((String[])params.get("server"))[0];
|
|
1042 |
String server = params.get("server")[0];
|
|
1041 | 1043 |
URL u = new URL("https://" + server + "?server=" |
1042 | 1044 |
+MetaCatUtil.getLocalReplicationServerName() |
1043 | 1045 |
+"&action=test"); |
... | ... | |
1134 | 1136 |
/** |
1135 | 1137 |
* Sends a document to a remote host |
1136 | 1138 |
*/ |
1137 |
private void handleGetDocumentRequest(PrintWriter out, Hashtable params, |
|
1139 |
private void handleGetDocumentRequest(PrintWriter out, Hashtable<String, String[]> params,
|
|
1138 | 1140 |
HttpServletResponse response) |
1139 | 1141 |
{ |
1140 | 1142 |
|
... | ... | |
1142 | 1144 |
{ |
1143 | 1145 |
//try to open a https stream to test if the request server's public key |
1144 | 1146 |
//in the key store, this is security issue |
1145 |
String server = ((String[])params.get("server"))[0];
|
|
1147 |
String server = params.get("server")[0];
|
|
1146 | 1148 |
URL u = new URL("https://" + server + "?server=" |
1147 | 1149 |
+MetaCatUtil.getLocalReplicationServerName() |
1148 | 1150 |
+"&action=test"); |
... | ... | |
1156 | 1158 |
return; |
1157 | 1159 |
} |
1158 | 1160 |
|
1159 |
String docid = ((String[])(params.get("docid")))[0]; |
|
1160 |
|
|
1161 |
String docid = params.get("docid")[0]; |
|
1161 | 1162 |
DocumentImpl di = new DocumentImpl(docid); |
1162 |
response.setContentType("text/xml"); |
|
1163 |
out.print(di.toString(null, null, true)); |
|
1163 |
|
|
1164 |
String documentDir = PropertyService.getProperty("application.documentfilepath"); |
|
1165 |
String documentPath = documentDir + FileUtil.getFS() + docid; |
|
1166 |
|
|
1167 |
// if the document does not exist on disk, read it from db and write |
|
1168 |
// it to disk. |
|
1169 |
if (FileUtil.getFileStatus(documentPath) == FileUtil.DOES_NOT_EXIST) { |
|
1170 |
FileWriter fileWriter = new FileWriter(documentPath); |
|
1171 |
di.toXml(fileWriter, null, null, true); |
|
1172 |
} |
|
1173 |
|
|
1174 |
// read the file from disk and sent it to PrintWriter |
|
1175 |
// PrintWriter out = new PrintWriter(streamOut); |
|
1176 |
di.readFromFileSystem(out, null, null, documentPath); |
|
1164 | 1177 |
|
1178 |
// response.setContentType("text/xml"); |
|
1179 |
// out.print(di.toString(null, null, true)); |
|
1180 |
|
|
1165 | 1181 |
MetacatReplication.replLog("document " + docid + " sent"); |
1166 | 1182 |
|
1167 | 1183 |
} |
... | ... | |
1192 | 1208 |
* note that the rev in deletedDocument is always empty. I just left |
1193 | 1209 |
* it in there to make the parser implementation easier. |
1194 | 1210 |
*/ |
1195 |
private void handleUpdateRequest(PrintWriter out, Hashtable params, |
|
1211 |
private void handleUpdateRequest(PrintWriter out, Hashtable<String, String[]> params,
|
|
1196 | 1212 |
HttpServletResponse response) |
1197 | 1213 |
{ |
1198 | 1214 |
// Checked out DBConnection |
... | ... | |
1258 | 1274 |
// Store the deleted docid list |
1259 | 1275 |
StringBuffer delsql = new StringBuffer(); |
1260 | 1276 |
// Store the data set file |
1261 |
Vector packageFiles = new Vector();
|
|
1277 |
Vector<Vector<String>> packageFiles = new Vector<Vector<String>>();
|
|
1262 | 1278 |
|
1263 | 1279 |
// Append local server's name and replication servlet to doclist |
1264 | 1280 |
doclist.append("<?xml version=\"1.0\"?><replication>"); |
... | ... | |
1309 | 1325 |
while(tablehasrows) |
1310 | 1326 |
{ |
1311 | 1327 |
String recordDoctype = rs.getString(3); |
1312 |
Vector packagedoctypes = MetaCatUtil.getOptionList( |
|
1328 |
Vector<String> packagedoctypes = MetaCatUtil.getOptionList(
|
|
1313 | 1329 |
PropertyService.getProperty("xml.packagedoctype")); |
1314 | 1330 |
//if this is a package file, put it at the end |
1315 | 1331 |
//because if a package file is read before all of the files it |
... | ... | |
1342 | 1358 |
}//if packagedoctpes |
1343 | 1359 |
else |
1344 | 1360 |
{ //the package files are saved to be put into the xml later. |
1345 |
Vector v = new Vector();
|
|
1346 |
v.add(new String(rs.getString(1)));
|
|
1347 |
v.add(new Integer(rs.getInt(2)));
|
|
1348 |
packageFiles.add(new Vector(v));
|
|
1361 |
Vector<String> v = new Vector<String>();
|
|
1362 |
v.add(rs.getString(1));
|
|
1363 |
v.add(String.valueOf(rs.getInt(2)));
|
|
1364 |
packageFiles.add(v);
|
|
1349 | 1365 |
}//esle |
1350 | 1366 |
tablehasrows = rs.next(); |
1351 | 1367 |
}//while |
... | ... | |
1357 | 1373 |
String recordDoctype = rs.getString(3); |
1358 | 1374 |
if(!recordDoctype.equals("BIN")) |
1359 | 1375 |
{ //don't replicate data files |
1360 |
Vector packagedoctypes = MetaCatUtil.getOptionList( |
|
1376 |
Vector<String> packagedoctypes = MetaCatUtil.getOptionList(
|
|
1361 | 1377 |
PropertyService.getProperty("xml.packagedoctype")); |
1362 | 1378 |
if(recordDoctype != null && !packagedoctypes.contains(recordDoctype)) |
1363 | 1379 |
{ //if this is a package file, put it at the end |
... | ... | |
1371 | 1387 |
} |
1372 | 1388 |
else |
1373 | 1389 |
{ //the package files are saved to be put into the xml later. |
1374 |
Vector v = new Vector();
|
|
1375 |
v.add(new String(rs.getString(1)));
|
|
1376 |
v.add(new Integer(rs.getInt(2)));
|
|
1377 |
packageFiles.add(new Vector(v));
|
|
1390 |
Vector<String> v = new Vector<String>();
|
|
1391 |
v.add(rs.getString(1));
|
|
1392 |
v.add(String.valueOf(rs.getInt(2)));
|
|
1393 |
packageFiles.add(v);
|
|
1378 | 1394 |
} |
1379 | 1395 |
}//if |
1380 | 1396 |
tablehasrows = rs.next(); |
... | ... | |
1399 | 1415 |
//now we can put the package files into the xml results |
1400 | 1416 |
for(int i=0; i<packageFiles.size(); i++) |
1401 | 1417 |
{ |
1402 |
Vector v = (Vector)packageFiles.elementAt(i);
|
|
1418 |
Vector<String> v = packageFiles.elementAt(i);
|
|
1403 | 1419 |
doclist.append("<updatedDocument>"); |
1404 |
doclist.append("<docid>").append((String)v.elementAt(0));
|
|
1420 |
doclist.append("<docid>").append(v.elementAt(0)); |
|
1405 | 1421 |
doclist.append("</docid><rev>"); |
1406 |
doclist.append(((Integer)v.elementAt(1)).intValue());
|
|
1422 |
doclist.append(v.elementAt(1));
|
|
1407 | 1423 |
doclist.append("</rev>"); |
1408 | 1424 |
doclist.append("</updatedDocument>"); |
1409 | 1425 |
} |
... | ... | |
1513 | 1529 |
* If printFlag == false then do not print to out. |
1514 | 1530 |
*/ |
1515 | 1531 |
private static String handleGetCatalogRequest(PrintWriter out, |
1516 |
Hashtable params, |
|
1532 |
Hashtable<String, String[]> params,
|
|
1517 | 1533 |
HttpServletResponse response, |
1518 | 1534 |
boolean printFlag) |
1519 | 1535 |
{ |
... | ... | |
1597 | 1613 |
* for replication gets rid of any problems with syncronizing clocks |
1598 | 1614 |
* because a time specific to a document is always kept on its home server. |
1599 | 1615 |
*/ |
1600 |
private void handleGetTimeRequest(PrintWriter out, Hashtable params, |
|
1616 |
private void handleGetTimeRequest(PrintWriter out, Hashtable<String, String[]> params,
|
|
1601 | 1617 |
HttpServletResponse response) |
1602 | 1618 |
{ |
1603 | 1619 |
SimpleDateFormat formatter = new SimpleDateFormat ("MM/dd/yy HH:mm:ss"); |
... | ... | |
1756 | 1772 |
* Method to get a host server information for given docid |
1757 | 1773 |
* @param conn a connection to the database |
1758 | 1774 |
*/ |
1759 |
public static Hashtable getHomeServerInfoForDocId(String docId) |
|
1775 |
public static Hashtable<String,String> getHomeServerInfoForDocId(String docId)
|
|
1760 | 1776 |
{ |
1761 |
Hashtable sl = new Hashtable();
|
|
1777 |
Hashtable<String,String> sl = new Hashtable<String,String>();
|
|
1762 | 1778 |
DBConnection dbConn = null; |
1763 | 1779 |
int serialNumber = -1; |
1764 | 1780 |
docId=MetaCatUtil.getDocIdFromString(docId); |
Also available in: Unified diff
Add some generic typing