Revision 4467
Added by daigle about 16 years ago
src/edu/ucsb/nceas/metacat/DocumentImpl.java | ||
---|---|---|
28 | 28 |
|
29 | 29 |
import java.io.BufferedInputStream; |
30 | 30 |
import java.io.BufferedOutputStream; |
31 |
import java.io.BufferedReader; |
|
32 | 31 |
import java.io.File; |
33 | 32 |
import java.io.FileOutputStream; |
34 |
import java.io.FileReader; |
|
35 | 33 |
import java.io.IOException; |
36 | 34 |
import java.io.InputStream; |
37 | 35 |
import java.io.PrintWriter; |
... | ... | |
104 | 102 |
public static final String NAMESPACEFEATURE = "http://xml.org/sax/features/namespaces"; |
105 | 103 |
public static final String NAMESPACEPREFIXESFEATURE = "http://xml.org/sax/features/namespace-prefixes"; |
106 | 104 |
|
105 |
public static final String EML2_0_0NAMESPACE; |
|
106 |
public static final String EML2_0_1NAMESPACE; |
|
107 | 107 |
public static final String EML2_1_0NAMESPACE; |
108 |
public static final String EML2_0_1NAMESPACE; |
|
109 |
public static final String EML2_0_0NAMESPACE; |
|
110 | 108 |
|
111 | 109 |
static { |
110 |
String eml200NameSpace = null; |
|
111 |
String eml201NameSpace = null; |
|
112 | 112 |
String eml210NameSpace = null; |
113 |
String eml201NameSpace = null; |
|
114 |
String eml200NameSpace = null; |
|
115 | 113 |
try { |
114 |
eml200NameSpace = PropertyService.getProperty("xml.eml2_0_0namespace"); |
|
115 |
eml201NameSpace = PropertyService.getProperty("xml.eml2_0_1namespace"); |
|
116 | 116 |
eml210NameSpace = PropertyService.getProperty("xml.eml2_1_0namespace"); |
117 |
eml200NameSpace = PropertyService.getProperty("xml.eml2_0_1namespace"); |
|
118 |
eml201NameSpace = PropertyService.getProperty("xml.eml2_0_0namespace"); |
|
119 | 117 |
} catch (PropertyNotFoundException pnfe) { |
120 | 118 |
System.err.println("Could not get property in static block: " |
121 | 119 |
+ pnfe.getMessage()); |
... | ... | |
152 | 150 |
private String publicaccess; |
153 | 151 |
protected long rootnodeid; |
154 | 152 |
private ElementNode rootNode = null; |
155 |
private TreeSet nodeRecordList = null; |
|
156 |
|
|
157 |
|
|
153 |
private TreeSet<NodeRecord> nodeRecordList = null; |
|
154 |
|
|
158 | 155 |
private static Logger logMetacat = Logger.getLogger(DocumentImpl.class); |
159 | 156 |
|
160 | 157 |
/** |
... | ... | |
625 | 622 |
{ |
626 | 623 |
ForceReplicationHandler forceReplication = new ForceReplicationHandler( |
627 | 624 |
accnum, false, notificationServer); |
625 |
logMetacat.debug("ForceReplicationHandler created: " + forceReplication.toString()); |
|
628 | 626 |
} |
629 | 627 |
} |
630 | 628 |
|
... | ... | |
642 | 640 |
int revInDataBase =DBUtil.getLatestRevisionInDocumentTable(docid); |
643 | 641 |
logMetacat.warn("The rev in data base: " + revInDataBase); |
644 | 642 |
// String to store the revision |
645 |
String rev = null; |
|
643 |
// String rev = null;
|
|
646 | 644 |
|
647 | 645 |
//revIndataBase=-1, there is no record in xml_documents table |
648 | 646 |
//the document is a new one for local server, inert it into table |
649 | 647 |
//user specified rev should be great than 0 |
650 | 648 |
if (revInDataBase == -1 && userSpecifyRev >= 0) { |
651 | 649 |
// rev equals user specified |
652 |
rev = (new Integer(userSpecifyRev)).toString(); |
|
650 |
// rev = (new Integer(userSpecifyRev)).toString();
|
|
653 | 651 |
// action should be INSERT |
654 | 652 |
action = "INSERT"; |
655 | 653 |
} |
... | ... | |
657 | 655 |
// it is a updated file |
658 | 656 |
else if (userSpecifyRev > revInDataBase && revInDataBase >= 0) { |
659 | 657 |
// rev equals user specified |
660 |
rev = (new Integer(userSpecifyRev)).toString(); |
|
658 |
// rev = (new Integer(userSpecifyRev)).toString();
|
|
661 | 659 |
// action should be update |
662 | 660 |
action = "UPDATE"; |
663 | 661 |
} |
... | ... | |
684 | 682 |
private static String checkXMLRevisionTable(String docid, int rev) throws Exception |
685 | 683 |
{ |
686 | 684 |
String action = "INSERT"; |
687 |
Vector localrev = null; |
|
685 |
Vector<Integer> localrev = null;
|
|
688 | 686 |
|
689 | 687 |
try |
690 | 688 |
{ |
... | ... | |
999 | 997 |
proccessEml2 = true; |
1000 | 998 |
} |
1001 | 999 |
// flag for process inline data |
1002 |
boolean prcocessInlineData = false;
|
|
1000 |
boolean processInlineData = false; |
|
1003 | 1001 |
|
1004 |
TreeSet nodeRecordLists = null; |
|
1002 |
TreeSet<NodeRecord> nodeRecordLists = null;
|
|
1005 | 1003 |
PrintWriter out = null; |
1006 | 1004 |
if (pw instanceof PrintWriter) { |
1007 | 1005 |
out = (PrintWriter) pw; |
... | ... | |
1027 | 1025 |
} else { |
1028 | 1026 |
nodeRecordLists = this.nodeRecordList; |
1029 | 1027 |
} |
1030 |
Stack openElements = new Stack();
|
|
1028 |
Stack<NodeRecord> openElements = new Stack<NodeRecord>();
|
|
1031 | 1029 |
boolean atRootElement = true; |
1032 | 1030 |
boolean previousNodeWasElement = false; |
1033 | 1031 |
|
1034 | 1032 |
// Step through all of the node records we were given |
1035 | 1033 |
|
1036 |
Iterator it = nodeRecordLists.iterator(); |
|
1034 |
Iterator<NodeRecord> it = nodeRecordLists.iterator();
|
|
1037 | 1035 |
|
1038 | 1036 |
while (it.hasNext()) { |
1039 | 1037 |
|
1040 |
NodeRecord currentNode = (NodeRecord) it.next();
|
|
1038 |
NodeRecord currentNode = it.next(); |
|
1041 | 1039 |
logMetacat.debug("[Got Node ID: " + currentNode.getNodeId() + " (" |
1042 | 1040 |
+ currentNode.getParentNodeId() + ", " + currentNode.getNodeIndex() |
1043 | 1041 |
+ ", " + currentNode.getNodeType() + ", " + currentNode.getNodeName() |
... | ... | |
1059 | 1057 |
// having been sorted in a depth first traversal of the nodes, which |
1060 | 1058 |
// is handled by the NodeComparator class used by the TreeSet |
1061 | 1059 |
if (!atRootElement) { |
1062 |
NodeRecord currentElement = (NodeRecord) openElements.peek();
|
|
1060 |
NodeRecord currentElement = openElements.peek(); |
|
1063 | 1061 |
if (currentNode.getParentNodeId() != currentElement.getNodeId()) { |
1064 | 1062 |
while (currentNode.getParentNodeId() != currentElement.getNodeId()) { |
1065 | 1063 |
currentElement = (NodeRecord) openElements.pop(); |
... | ... | |
1075 | 1073 |
} else { |
1076 | 1074 |
out.print("</" + currentElement.getNodeName() + ">"); |
1077 | 1075 |
} |
1078 |
currentElement = (NodeRecord) openElements.peek();
|
|
1076 |
currentElement = openElements.peek(); |
|
1079 | 1077 |
} |
1080 | 1078 |
} |
1081 | 1079 |
} |
... | ... | |
1120 | 1118 |
out.print("<" + currentNode.getNodeName()); |
1121 | 1119 |
} |
1122 | 1120 |
|
1123 |
// if currentNode is inline and handle eml2, set flag proccess
|
|
1124 |
// in
|
|
1121 |
// if currentNode is inline and handle eml2, set flag process |
|
1122 |
// on
|
|
1125 | 1123 |
if (currentNode.getNodeName() != null |
1126 | 1124 |
&& currentNode.getNodeName().equals(Eml200SAXHandler.INLINE) |
1127 | 1125 |
&& proccessEml2) { |
1128 |
prcocessInlineData = true;
|
|
1126 |
processInlineData = true;
|
|
1129 | 1127 |
} |
1130 | 1128 |
|
1131 | 1129 |
// Handle the ATTRIBUTE nodes |
... | ... | |
1155 | 1153 |
if (previousNodeWasElement) { |
1156 | 1154 |
out.print(">"); |
1157 | 1155 |
} |
1158 |
if (!prcocessInlineData) {
|
|
1156 |
if (!processInlineData) { |
|
1159 | 1157 |
// if it is not inline data just out put data |
1160 | 1158 |
out.print(currentNode.getNodeData()); |
1161 | 1159 |
} else { |
... | ... | |
1167 | 1165 |
// check if user has read permision for this inline data |
1168 | 1166 |
boolean readInlinedata = false; |
1169 | 1167 |
try { |
1170 |
Hashtable unReadableInlineDataList = |
|
1168 |
Hashtable<String, String> unReadableInlineDataList =
|
|
1171 | 1169 |
PermissionController |
1172 | 1170 |
.getUnReadableInlineDataIdList(accessfileName, |
1173 | 1171 |
user, groups, true); |
... | ... | |
1179 | 1177 |
} |
1180 | 1178 |
|
1181 | 1179 |
if (readInlinedata) { |
1182 |
//user want to see it, pull out from |
|
1183 |
// file system and output it |
|
1184 |
// for inline data, the data base only store the file |
|
1185 |
// name, so we |
|
1186 |
// can combine the file name and inline data file path, |
|
1187 |
// to get it |
|
1180 |
//user want to see it, pull out from file system and |
|
1181 |
// output it for inline data, the data base only store |
|
1182 |
// the file name, so we can combine the file name and |
|
1183 |
// inline data file path, to get it |
|
1188 | 1184 |
|
1189 | 1185 |
Reader reader = Eml200SAXHandler |
1190 | 1186 |
.readInlineDataFromFileSystem(fileName); |
... | ... | |
1192 | 1188 |
try { |
1193 | 1189 |
int length = reader.read(characterArray); |
1194 | 1190 |
while (length != -1) { |
1195 |
out |
|
1196 |
.print(new String(characterArray, 0, |
|
1191 |
out.print(new String(characterArray, 0, |
|
1197 | 1192 |
length)); |
1198 | 1193 |
out.flush(); |
1199 | 1194 |
length = reader.read(characterArray); |
... | ... | |
1205 | 1200 |
}//if can read inline data |
1206 | 1201 |
else { |
1207 | 1202 |
// if user can't read it, we only send it back a empty |
1208 |
// string |
|
1209 |
// in inline element. |
|
1203 |
// string in inline element. |
|
1210 | 1204 |
out.print(""); |
1211 | 1205 |
}// else can't read inlinedata |
1212 | 1206 |
// reset proccess inline data false |
1213 |
prcocessInlineData = false;
|
|
1207 |
processInlineData = false; |
|
1214 | 1208 |
}// in inlinedata part |
1215 | 1209 |
previousNodeWasElement = false; |
1216 | 1210 |
// Handle the COMMENT nodes |
... | ... | |
1299 | 1293 |
*/ |
1300 | 1294 |
public void readFromFileSystem(Writer pw, String user, String[] groups, |
1301 | 1295 |
String documentPath) throws McdbException { |
1302 |
|
|
1303 |
boolean proccessEml2 = false; |
|
1304 |
boolean readInlinedata = false; |
|
1305 |
|
|
1306 |
// if this is not EML version 2.x, we do not need to worry about |
|
1307 |
// inline data |
|
1308 |
if (doctype != null |
|
1309 |
&& (doctype.equals(EML2_0_0NAMESPACE) |
|
1310 |
|| doctype.equals(EML2_0_1NAMESPACE) |
|
1311 |
|| doctype.equals(EML2_1_0NAMESPACE))) { |
|
1312 |
proccessEml2 = true; |
|
1313 |
} |
|
1314 | 1296 |
|
1315 |
// create a printwriter |
|
1316 |
PrintWriter out = null; |
|
1317 |
if (pw instanceof PrintWriter) { |
|
1318 |
out = (PrintWriter) pw; |
|
1319 |
} else { |
|
1320 |
out = new PrintWriter(pw); |
|
1321 |
} |
|
1297 |
// // create a printwriter
|
|
1298 |
// PrintWriter out = null;
|
|
1299 |
// if (pw instanceof PrintWriter) {
|
|
1300 |
// out = (PrintWriter) pw;
|
|
1301 |
// } else {
|
|
1302 |
// out = new PrintWriter(pw);
|
|
1303 |
// }
|
|
1322 | 1304 |
|
1323 |
|
|
1324 |
String xmlFileLine; |
|
1325 | 1305 |
String xmlFileContents = ""; |
1326 | 1306 |
|
1327 | 1307 |
try { |
... | ... | |
1334 | 1314 |
.getUnReadableInlineDataIdList(docid, |
1335 | 1315 |
user, groups, true); |
1336 | 1316 |
|
1337 |
// for each unreadable section, strip the inline data from the doc |
|
1338 |
if (proccessEml2 && unReadableInlineDataList.size() > 0) { |
|
1339 |
Set<String> inlineKeySet = unReadableInlineDataList.keySet(); |
|
1340 |
for(String inlineKey : inlineKeySet) { |
|
1341 |
String inlineValue = unReadableInlineDataList.get(inlineKey); |
|
1342 |
if (inlineValue.startsWith(docid)) { |
|
1343 |
xmlFileContents = stripInlineData(xmlFileContents, inlineKey); |
|
1344 |
} |
|
1345 |
} |
|
1346 |
} |
|
1317 |
// If this is for each unreadable section, strip the inline data |
|
1318 |
// from the doc |
|
1319 |
if (unReadableInlineDataList.size() > 0 && doctype != null) { |
|
1320 |
Set<String> inlineKeySet = unReadableInlineDataList.keySet(); |
|
1321 |
|
|
1322 |
boolean pre210Doc = doctype.equals(EML2_0_0NAMESPACE) |
|
1323 |
|| doctype.equals(EML2_0_1NAMESPACE); |
|
1324 |
|
|
1325 |
for (String inlineKey : inlineKeySet) { |
|
1326 |
String inlineValue = unReadableInlineDataList.get(inlineKey); |
|
1327 |
if (inlineValue.startsWith(docid)) { |
|
1328 |
// There are two different methods of stripping inline data depending |
|
1329 |
// on whether this is a 2.0.1 or earlier doc or 2.1.0 and later. This |
|
1330 |
// is because of eml schema changes for inline access. |
|
1331 |
if (pre210Doc) { |
|
1332 |
xmlFileContents = stripInline20XData(xmlFileContents, |
|
1333 |
inlineKey); |
|
1334 |
} else { |
|
1335 |
xmlFileContents = stripInline21XData(xmlFileContents, inlineKey); |
|
1336 |
} |
|
1337 |
} |
|
1338 |
} |
|
1339 |
} |
|
1347 | 1340 |
|
1348 | 1341 |
// write the doc |
1349 | 1342 |
pw.write(xmlFileContents); |
... | ... | |
1358 | 1351 |
} |
1359 | 1352 |
|
1360 | 1353 |
/** |
1361 |
* Strip out an inline data section from a document. This assumes that the
|
|
1362 |
* inline element is within a distribution element and the key for the
|
|
1354 |
* Strip out an inline data section from a 2.0.X version document. This assumes
|
|
1355 |
* that the inline element is within a distribution element and the id for the
|
|
1363 | 1356 |
* distribution is the same as the subtreeid in the xml_access table. |
1364 | 1357 |
* |
1365 | 1358 |
* @param xmlFileContents |
... | ... | |
1367 | 1360 |
* @param inLineKey |
1368 | 1361 |
* the unique key for this inline element |
1369 | 1362 |
*/ |
1370 |
private String stripInlineData(String xmlFileContents, String inLineKey) { |
|
1363 |
private String stripInline20XData(String xmlFileContents, String inLineId) |
|
1364 |
throws Exception { |
|
1365 |
String changedString = xmlFileContents; |
|
1366 |
|
|
1367 |
Pattern distStartPattern = Pattern.compile("<distribution", Pattern.CASE_INSENSITIVE); |
|
1368 |
Pattern distEndPattern = Pattern.compile("</distribution>", Pattern.CASE_INSENSITIVE); |
|
1369 |
Pattern idPattern = Pattern.compile("id=\"" + inLineId); |
|
1370 |
Pattern inlinePattern = Pattern.compile("<inline>.*</inline>"); |
|
1371 |
|
|
1372 |
Matcher distStartMatcher = distStartPattern.matcher(xmlFileContents); |
|
1373 |
Matcher distEndMatcher = distEndPattern.matcher(xmlFileContents); |
|
1374 |
Matcher idMatcher = idPattern.matcher(xmlFileContents); |
|
1375 |
Matcher inlineMatcher = inlinePattern.matcher(xmlFileContents); |
|
1376 |
|
|
1377 |
// loop through the document looking for distribution elements |
|
1378 |
while (distStartMatcher.find()) { |
|
1379 |
// find the index of the corresponding end element |
|
1380 |
int distStart = distStartMatcher.end(); |
|
1381 |
if (!distEndMatcher.find(distStart)) { |
|
1382 |
throw new Exception("Could not find end tag for distribution"); |
|
1383 |
} |
|
1384 |
int distEnd = distEndMatcher.start(); |
|
1385 |
|
|
1386 |
// look for our inline id within the range of this distribution. |
|
1387 |
idMatcher.region(distStart, distEnd); |
|
1388 |
if (idMatcher.find()) { |
|
1389 |
// if this distribution has the desired id, replace any |
|
1390 |
// <inline>.*</inline> in this distribution with <inline></inline> |
|
1391 |
inlineMatcher.region(distStart, distEnd); |
|
1392 |
if (inlineMatcher.find()) { |
|
1393 |
changedString = inlineMatcher.replaceAll("<inline></inline>"); |
|
1394 |
} else { |
|
1395 |
logMetacat.warn("Could not find an inline element for distribution: " + inLineId); |
|
1396 |
} |
|
1397 |
} |
|
1398 |
|
|
1399 |
} |
|
1400 |
|
|
1401 |
return changedString; |
|
1402 |
} |
|
1403 |
|
|
1404 |
/** |
|
1405 |
* Strip out an inline data section from a 2.1.X version document. This |
|
1406 |
* assumes that the inline element is within a distribution element and the |
|
1407 |
* subtreeid in the xml_access table is an integer that represents the nth |
|
1408 |
* distribution element in the document. |
|
1409 |
* |
|
1410 |
* @param xmlFileContents |
|
1411 |
* the contents of the file |
|
1412 |
* @param inLineKey |
|
1413 |
* the unique key for this inline element |
|
1414 |
*/ |
|
1415 |
private String stripInline21XData(String xmlFileContents, String inLineId) throws Exception { |
|
1416 |
int distributionIndex = Integer.valueOf(inLineId); |
|
1371 | 1417 |
String changedString = xmlFileContents; |
1372 |
String regex = "(<distribution .*id=\"" + inLineKey + "\">.*)<inline>.*</inline>(.*</distribution>)"; |
|
1373 |
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); |
|
1374 |
Matcher matcher = pattern.matcher(xmlFileContents); |
|
1375 |
if (matcher.find()) { |
|
1376 |
changedString = matcher.replaceFirst(matcher.group(1) + "<inline></inline>" + matcher.group(2)); |
|
1418 |
Pattern distStartPattern = Pattern.compile("<distribution", Pattern.CASE_INSENSITIVE); |
|
1419 |
Pattern distEndPattern = Pattern.compile("</distribution>", Pattern.CASE_INSENSITIVE); |
|
1420 |
Pattern inlinePattern = Pattern.compile("<inline>.*</inline>"); |
|
1421 |
Matcher matcher = distStartPattern.matcher(xmlFileContents); |
|
1422 |
|
|
1423 |
// iterate through distributions until we find the nth match. The nth match |
|
1424 |
// corresponds to the inLineKey that was passed in. Use the end of that match |
|
1425 |
// to set the start range we will search for the inline element. |
|
1426 |
for (int i = 0; i < distributionIndex; i++) { |
|
1427 |
if (!matcher.find()) { |
|
1428 |
throw new Exception("Could not find distribution number " + (i + 1)); |
|
1429 |
} |
|
1377 | 1430 |
} |
1431 |
int distStart = matcher.end(); |
|
1378 | 1432 |
|
1433 |
// find the end tag for the distribution. Use the beginning of that match to set |
|
1434 |
// the end range we will search for the inline element |
|
1435 |
matcher.usePattern(distEndPattern); |
|
1436 |
if (!matcher.find(distStart)) { |
|
1437 |
throw new Exception("Could not find end tag for distribution"); |
|
1438 |
} |
|
1439 |
int distEnd = matcher.start(); |
|
1440 |
|
|
1441 |
// set the inline search range |
|
1442 |
matcher.region(distStart, distEnd); |
|
1443 |
|
|
1444 |
// match any inline elements and replace with an empty inline element |
|
1445 |
matcher.usePattern(inlinePattern); |
|
1446 |
if (matcher.find()) { |
|
1447 |
changedString = matcher.replaceAll("<inline></inline>"); |
|
1448 |
} else { |
|
1449 |
logMetacat.warn("Could not find an inline element for distribution: " |
|
1450 |
+ inLineId); |
|
1451 |
} |
|
1452 |
|
|
1379 | 1453 |
return changedString; |
1380 | 1454 |
} |
1381 | 1455 |
|
... | ... | |
1392 | 1466 |
{ |
1393 | 1467 |
logMetacat.warn("buildIndex called on docid " + docid); |
1394 | 1468 |
double start = System.currentTimeMillis()/1000; |
1395 |
TreeSet nodeRecordLists = getNodeRecordList(rootnodeid); |
|
1469 |
TreeSet<NodeRecord> nodeRecordLists = getNodeRecordList(rootnodeid);
|
|
1396 | 1470 |
boolean atRootElement = true; |
1397 | 1471 |
long rootNodeId = -1; |
1398 | 1472 |
|
1399 | 1473 |
// Build a map of the same records that are present in the |
1400 | 1474 |
// TreeSet so that any node can be easily accessed by nodeId |
1401 |
HashMap nodeRecordMap = new HashMap();
|
|
1402 |
Iterator it = nodeRecordLists.iterator(); |
|
1475 |
HashMap<Long, NodeRecord> nodeRecordMap = new HashMap<Long, NodeRecord>();
|
|
1476 |
Iterator<NodeRecord> it = nodeRecordLists.iterator();
|
|
1403 | 1477 |
while (it.hasNext()) { |
1404 | 1478 |
NodeRecord currentNode = (NodeRecord) it.next(); |
1405 | 1479 |
Long nodeId = new Long(currentNode.getNodeId()); |
1406 | 1480 |
nodeRecordMap.put(nodeId, currentNode); |
1407 | 1481 |
} |
1408 | 1482 |
|
1409 |
String doc = docid; |
|
1483 |
// String doc = docid;
|
|
1410 | 1484 |
double afterPutNode = System.currentTimeMillis()/1000; |
1411 | 1485 |
logMetacat.info("The time for put node id into map is "+(afterPutNode - start)); |
1412 | 1486 |
double afterDelete = 0; |
... | ... | |
1429 | 1503 |
// TEXT nodes with their parent ELEMENT node ids to associate the |
1430 | 1504 |
// element with it's node data (stored in the text node) |
1431 | 1505 |
it = nodeRecordLists.iterator(); |
1432 |
HashMap pathsFound = new HashMap();
|
|
1506 |
HashMap<String, PathIndexEntry> pathsFound = new HashMap<String, PathIndexEntry>();
|
|
1433 | 1507 |
while (it.hasNext()) { |
1434 | 1508 |
NodeRecord currentNode = (NodeRecord) it.next(); |
1435 |
HashMap pathList = new HashMap();
|
|
1509 |
HashMap<String, PathIndexEntry> pathList = new HashMap<String, PathIndexEntry>();
|
|
1436 | 1510 |
if ( currentNode.getNodeType().equals("ELEMENT") || |
1437 | 1511 |
currentNode.getNodeType().equals("ATTRIBUTE") ){ |
1438 | 1512 |
|
... | ... | |
1453 | 1527 |
// with ELEMENT paths with TEXT nodedata (since it's modeled |
1454 | 1528 |
// this way in the DOM) |
1455 | 1529 |
NodeRecord parentNode = |
1456 |
(NodeRecord) nodeRecordMap.get(new Long(currentNode.getParentNodeId()));
|
|
1530 |
nodeRecordMap.get(new Long(currentNode.getParentNodeId()));
|
|
1457 | 1531 |
|
1458 | 1532 |
if ( parentNode.getNodeType().equals("ELEMENT") ) { |
1459 | 1533 |
|
... | ... | |
1534 | 1608 |
* @param nodedata |
1535 | 1609 |
* the nodedata for the current node |
1536 | 1610 |
*/ |
1537 |
private void traverseParents(HashMap records, long rootNodeId, |
|
1538 |
long leafNodeId, long id, |
|
1539 |
String children, HashMap pathList, HashMap pathsFoundForIndexing) { |
|
1540 |
Long nodeId = new Long(id); |
|
1611 |
private void traverseParents(HashMap<Long,NodeRecord> records, long rootNodeId, |
|
1612 |
long leafNodeId, long id,String children, |
|
1613 |
HashMap<String, PathIndexEntry> pathList, |
|
1614 |
HashMap<String, PathIndexEntry> pathsFoundForIndexing) { |
|
1615 |
Long nodeId = new Long(id); |
|
1541 | 1616 |
NodeRecord current = (NodeRecord)records.get(nodeId); |
1542 | 1617 |
long parentId = current.getParentNodeId(); |
1543 | 1618 |
String currentName = current.getNodeName(); |
1544 |
String nodeData = current.getNodeData(); |
|
1545 |
float nodeDataNumerical = current.getNodeDataNumerical(); |
|
1619 |
// String nodeData = current.getNodeData();
|
|
1620 |
// float nodeDataNumerical = current.getNodeDataNumerical();
|
|
1546 | 1621 |
NodeRecord leafRecord = (NodeRecord)records.get(new Long(leafNodeId)); |
1547 | 1622 |
String leafData = leafRecord.getNodeData(); |
1548 | 1623 |
long leafParentId = leafRecord.getParentNodeId(); |
... | ... | |
1677 | 1752 |
* @param pathList the hash of paths to insert |
1678 | 1753 |
* @throws SQLException if there is an error inserting into the db |
1679 | 1754 |
*/ |
1680 |
private void updateNodeIndex(DBConnection conn, HashMap pathList) |
|
1755 |
private void updateNodeIndex(DBConnection conn, HashMap<String, PathIndexEntry> pathList)
|
|
1681 | 1756 |
throws SQLException |
1682 | 1757 |
{ |
1683 | 1758 |
// Create an insert statement to reuse for all of the path |
... | ... | |
1692 | 1767 |
pstmt.setString(4, doctype); |
1693 | 1768 |
|
1694 | 1769 |
// Step through the hashtable and insert each of the path values |
1695 |
Iterator it = pathList.values().iterator(); |
|
1770 |
Iterator<PathIndexEntry> it = pathList.values().iterator();
|
|
1696 | 1771 |
while (it.hasNext()) { |
1697 | 1772 |
PathIndexEntry entry = (PathIndexEntry)it.next(); |
1698 | 1773 |
logMetacat.debug("Inserting: " + entry.nodeId + |
... | ... | |
1714 | 1789 |
* @param pathList the hash of paths to insert |
1715 | 1790 |
* @throws SQLException if there is an error inserting into the db |
1716 | 1791 |
*/ |
1717 |
private void updatePathIndex(DBConnection conn, HashMap pathsFound) |
|
1792 |
private void updatePathIndex(DBConnection conn, HashMap<String, PathIndexEntry> pathsFound)
|
|
1718 | 1793 |
throws SQLException { |
1719 | 1794 |
// Increase usage count for the connection |
1720 | 1795 |
conn.increaseUsageCount(1); |
... | ... | |
1727 | 1802 |
+ " VALUES (?, ?, ?, ?, ?)"); |
1728 | 1803 |
|
1729 | 1804 |
// Step through the hashtable and insert each of the path values |
1730 |
Iterator it = pathsFound.values().iterator(); |
|
1805 |
Iterator<PathIndexEntry> it = pathsFound.values().iterator();
|
|
1731 | 1806 |
while (it.hasNext()) { |
1732 | 1807 |
PathIndexEntry entry = (PathIndexEntry)it.next(); |
1733 | 1808 |
pstmt.setString(1,entry.docid); |
... | ... | |
1785 | 1860 |
//System.out.println("in revision table branch -------"); |
1786 | 1861 |
// if we couldn't find it in xml_documents we |
1787 | 1862 |
// need to find it in xml_revision table |
1788 |
Vector revList = DBUtil.getRevListFromRevisionTable(docid); |
|
1863 |
Vector<Integer> revList = DBUtil.getRevListFromRevisionTable(docid);
|
|
1789 | 1864 |
for (int i=0; i<revList.size(); i++) |
1790 | 1865 |
{ |
1791 |
Integer k = (Integer) revList.elementAt(i); |
|
1792 |
//System.out.println("The rev in xml_revision talbe "+ k.toString());
|
|
1866 |
// Integer k = (Integer) revList.elementAt(i);
|
|
1867 |
// System.out.println("The rev in xml_revision table "+ k.toString());
|
|
1793 | 1868 |
} |
1794 | 1869 |
|
1795 | 1870 |
if (revList.contains(new Integer(revision))) |
... | ... | |
1953 | 2028 |
* @param rootnodeid |
1954 | 2029 |
* the id of the root node of the node tree to look up |
1955 | 2030 |
*/ |
1956 |
private TreeSet getNodeRecordList(long rootnodeid) throws McdbException |
|
2031 |
private TreeSet<NodeRecord> getNodeRecordList(long rootnodeid) throws McdbException
|
|
1957 | 2032 |
{ |
1958 | 2033 |
PreparedStatement pstmt = null; |
1959 | 2034 |
DBConnection dbconn = null; |
1960 | 2035 |
int serialNumber = -1; |
1961 |
TreeSet nodeRecordList = new TreeSet(new NodeComparator());
|
|
2036 |
TreeSet<NodeRecord> nodeRecordList = new TreeSet<NodeRecord>(new NodeComparator());
|
|
1962 | 2037 |
long nodeid = 0; |
1963 | 2038 |
long parentnodeid = 0; |
1964 | 2039 |
long nodeindex = 0; |
... | ... | |
1967 | 2042 |
String nodeprefix = null; |
1968 | 2043 |
String nodedata = null; |
1969 | 2044 |
float nodedatanumerical = -1; |
1970 |
String quotechar = DatabaseService.getDBAdapter().getStringDelimiter(); |
|
2045 |
// String quotechar = DatabaseService.getDBAdapter().getStringDelimiter();
|
|
1971 | 2046 |
String table = "xml_nodes"; |
1972 | 2047 |
//System.out.println("in getNodeREcorelist !!!!!!!!!!!for root node id "+rootnodeid); |
1973 | 2048 |
try { |
... | ... | |
2362 | 2437 |
// the resident server will not give a lock then we send the user |
2363 | 2438 |
// a message saying that he/she needs to download a new copy of |
2364 | 2439 |
// the file and merge the differences manually. |
2365 |
int istreamInt; |
|
2366 |
char istreamChar; |
|
2440 |
// int istreamInt;
|
|
2441 |
// char istreamChar;
|
|
2367 | 2442 |
|
2368 | 2443 |
// check for 'write' permission for 'user' to update this document |
2369 | 2444 |
if (!hasWritePermission(user, groups, accnum)) { |
... | ... | |
2430 | 2505 |
// Force replication the docid |
2431 | 2506 |
ForceReplicationHandler frh = new ForceReplicationHandler( |
2432 | 2507 |
accnum, true, null); |
2508 |
logMetacat.debug("ForceReplicationHandler created: " + frh.toString()); |
|
2433 | 2509 |
return (accnum); |
2434 | 2510 |
|
2435 | 2511 |
} |
... | ... | |
2529 | 2605 |
// metacat notify the force replication. |
2530 | 2606 |
ForceReplicationHandler frh = new ForceReplicationHandler(accnum, |
2531 | 2607 |
action, true, null); |
2608 |
logMetacat.debug("ForceReplicationHandler created: " + frh.toString()); |
|
2532 | 2609 |
// clear cache after inserting or updating a document |
2533 | 2610 |
if (PropertyService.getProperty("database.queryCacheOn").equals("true")) |
2534 | 2611 |
{ |
... | ... | |
2714 | 2791 |
{ |
2715 | 2792 |
ForceReplicationHandler forceReplication = new ForceReplicationHandler( |
2716 | 2793 |
accnum, action, true, notifyServer); |
2794 |
logMetacat.debug("ForceReplicationHandler created: " + forceReplication.toString()); |
|
2717 | 2795 |
} |
2718 | 2796 |
|
2719 | 2797 |
// clear cache after inserting or updating a document |
... | ... | |
2732 | 2810 |
{ |
2733 | 2811 |
DBConnection dbconn = null; |
2734 | 2812 |
int serialNumber = -1; |
2735 |
PreparedStatement pstmt = null; |
|
2813 |
// PreparedStatement pstmt = null;
|
|
2736 | 2814 |
String documenttype = getDocTypeFromDBForCurrentDocument(accnumber); |
2737 | 2815 |
try { |
2738 | 2816 |
String packagedoctype = PropertyService.getProperty("xml.packagedoctype"); |
2739 |
Vector packagedoctypes = new Vector();
|
|
2817 |
Vector<String> packagedoctypes = new Vector<String>();
|
|
2740 | 2818 |
packagedoctypes = MetaCatUtil.getOptionList(packagedoctype); |
2741 | 2819 |
String docIdWithoutRev = MetaCatUtil.getDocIdFromAccessionNumber(accnumber); |
2742 | 2820 |
int revision = MetaCatUtil.getRevisionFromAccessionNumber(accnumber); |
... | ... | |
2919 | 2997 |
double afterArchiveDocAndNode = System.currentTimeMillis()/1000; |
2920 | 2998 |
logMetacat.info("The time for archiveDocAndNodesRevision is "+(afterArchiveDocAndNode - start)); |
2921 | 2999 |
// Now delete it from the xml_index table |
2922 |
boolean useXMLIndex = (new Boolean(PropertyService |
|
2923 |
.getProperty("database.usexmlindex"))).booleanValue(); |
|
3000 |
// boolean useXMLIndex = (new Boolean(PropertyService
|
|
3001 |
// .getProperty("database.usexmlindex"))).booleanValue();
|
|
2924 | 3002 |
|
2925 | 3003 |
|
2926 | 3004 |
|
... | ... | |
3029 | 3107 |
// add force delete replcation document here. |
3030 | 3108 |
ForceReplicationHandler frh = new ForceReplicationHandler( |
3031 | 3109 |
accnum, ForceReplicationHandler.DELETE, isXML, notifyServer); |
3110 |
logMetacat.debug("ForceReplicationHandler created: " + frh.toString()); |
|
3032 | 3111 |
// clear cache after inserting or updating a document |
3033 | 3112 |
if (PropertyService.getProperty("database.queryCacheOn").equals("true")) |
3034 | 3113 |
{ |
... | ... | |
3939 | 4018 |
{ |
3940 | 4019 |
DBConnection dbconn = null; |
3941 | 4020 |
int serialNumber = -1; |
3942 |
AccessionNumber ac; |
|
3943 |
PreparedStatement pstmt = null; |
|
3944 |
String action = null; |
|
4021 |
// AccessionNumber ac;
|
|
4022 |
// PreparedStatement pstmt = null;
|
|
4023 |
// String action = null;
|
|
3945 | 4024 |
try |
3946 | 4025 |
{ |
3947 | 4026 |
//dbconn = util.openDBConnection(); |
... | ... | |
3973 | 4052 |
*/ |
3974 | 4053 |
static private void deleteXMLNodes(DBConnection dbconn, long rootId) throws Exception |
3975 | 4054 |
{ |
3976 |
AccessionNumber ac; |
|
4055 |
// AccessionNumber ac;
|
|
3977 | 4056 |
PreparedStatement pstmt = null; |
3978 | 4057 |
double start = System.currentTimeMillis()/1000; |
3979 | 4058 |
String sql = "DELETE FROM xml_nodes WHERE rootnodeid ="+ rootId; |
Also available in: Unified diff
Add some generics typing. Separate the code that strips inline data from document files to have a different strategy for 2.0.X versus 2.1.X documents.