Project

General

Profile

1 522 berkley
/**
2
 *  '$RCSfile$'
3
 *    Purpose: A class to asyncronously do delta-T replication checking
4
 *  Copyright: 2000 Regents of the University of California and the
5
 *             National Center for Ecological Analysis and Synthesis
6
 *    Authors: Chad Berkley
7
 *    Release: @release@
8
 *
9
 *   '$Author$'
10
 *     '$Date$'
11
 * '$Revision$'
12 669 jones
 *
13
 * This program is free software; you can redistribute it and/or modify
14
 * it under the terms of the GNU General Public License as published by
15
 * the Free Software Foundation; either version 2 of the License, or
16
 * (at your option) any later version.
17
 *
18
 * This program is distributed in the hope that it will be useful,
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
 * GNU General Public License for more details.
22
 *
23
 * You should have received a copy of the GNU General Public License
24
 * along with this program; if not, write to the Free Software
25
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 522 berkley
 */
27 2286 tao
28 522 berkley
package edu.ucsb.nceas.metacat;
29
30 1751 tao
import edu.ucsb.nceas.dbadapter.AbstractDatabase;
31 522 berkley
import java.sql.*;
32
import java.util.*;
33 2555 tao
import java.util.Date;
34 2286 tao
import java.lang.Thread;
35 522 berkley
import java.io.*;
36
import java.net.*;
37 543 berkley
import java.text.*;
38 2663 sgarg
39
import org.apache.log4j.Logger;
40 522 berkley
import org.xml.sax.AttributeList;
41
import org.xml.sax.ContentHandler;
42
import org.xml.sax.DTDHandler;
43
import org.xml.sax.EntityResolver;
44
import org.xml.sax.ErrorHandler;
45
import org.xml.sax.InputSource;
46
import org.xml.sax.XMLReader;
47
import org.xml.sax.SAXException;
48
import org.xml.sax.SAXParseException;
49
import org.xml.sax.helpers.XMLReaderFactory;
50 561 berkley
import org.xml.sax.helpers.DefaultHandler;
51 522 berkley
52 561 berkley
53
54 522 berkley
/**
55
 * This class handles deltaT replication checking.  Whenever this TimerTask
56
 * is fired it checks each server in xml_replication for updates and updates
57
 * the local db as needed.
58
 */
59
public class ReplicationHandler extends TimerTask
60
{
61 573 berkley
  int serverCheckCode = 1;
62 522 berkley
  MetaCatUtil util = new MetaCatUtil();
63 2286 tao
  ReplicationServerList serverList = null;
64 2573 tao
  //PrintWriter out;
65 1751 tao
  private static final AbstractDatabase dbAdapter = MetaCatUtil.dbAdapter;
66 2663 sgarg
  private static Logger logMetacat = Logger.getLogger(ReplicationHandler.class);
67 2725 tao
  private static int DOCINSERTNUMBER = 1;
68
  private static int DOCERRORNUMBER  = 1;
69
  private static int REVINSERTNUMBER = 1;
70
  private static int REVERRORNUMBER  = 1;
71 2573 tao
  public ReplicationHandler()
72 522 berkley
  {
73 2573 tao
    //this.out = o;
74 1292 tao
    serverList = new ReplicationServerList();
75 522 berkley
  }
76 2286 tao
77 2573 tao
  public ReplicationHandler(int serverCheckCode)
78 573 berkley
  {
79 2573 tao
    //this.out = o;
80 573 berkley
    this.serverCheckCode = serverCheckCode;
81 1292 tao
    serverList = new ReplicationServerList();
82 573 berkley
  }
83 2286 tao
84 522 berkley
  /**
85 2286 tao
   * Method that implements TimerTask.run().  It runs whenever the timer is
86 522 berkley
   * fired.
87
   */
88
  public void run()
89
  {
90
    //find out the last_checked time of each server in the server list and
91 2286 tao
    //send a query to each server to see if there are any documents in
92 522 berkley
    //xml_documents with an update_date > last_checked
93
    try
94
    {
95 1032 tao
      //if serverList is null, metacat don't need to replication
96
      if (serverList==null||serverList.isEmpty())
97
      {
98
        return;
99
      }
100 1292 tao
      updateCatalog();
101
      update();
102 1217 tao
      //conn.close();
103
    }//try
104 522 berkley
    catch (Exception e)
105
    {
106 2663 sgarg
      logMetacat.error("Error in replicationHandler.run():"
107
                                                    +e.getMessage());
108 1292 tao
      e.printStackTrace();
109 1217 tao
    }//catch
110 522 berkley
  }
111 2286 tao
112 522 berkley
  /**
113 577 berkley
   * Method that uses revision taging for replication instead of update_date.
114
   */
115 1292 tao
  private void update()
116 577 berkley
  {
117
    /*
118
     Pseudo-algorithm
119
     - request a doc list from each server in xml_replication
120 2286 tao
     - check the rev number of each of those documents agains the
121 577 berkley
       documents in the local database
122
     - pull any documents that have a lesser rev number on the local server
123
       from the remote server
124
     - delete any documents that still exist in the local xml_documents but
125
       are in the deletedDocuments tag of the remote host response.
126
     - update last_checked to keep track of the last time it was checked.
127 2286 tao
       (this info is theoretically not needed using this system but probably
128 577 berkley
       should be kept anyway)
129
    */
130 2286 tao
131
    ReplicationServer replServer = null; // Variable to store the
132
                                        // ReplicationServer got from
133 1292 tao
                                        // Server list
134 2298 tao
    String server = null; // Variable to store server name
135 577 berkley
    String update;
136
    ReplMessageHandler message = new ReplMessageHandler();
137
    Vector responses = new Vector();
138
    XMLReader parser;
139
    URL u;
140 2286 tao
141
142 577 berkley
    try
143
    {
144
      parser = initParser(message);
145 1585 tao
    }
146
    catch (Exception e)
147
    {
148
      MetacatReplication.replErrorLog("Failed to replicate becaue couldn't "+
149
                                 " initParser for message and" +e.getMessage());
150 2663 sgarg
      logMetacat.error("Failed to replicate becaue couldn't " +
151
                            " initParser for message and " +e.getMessage());
152 1585 tao
       // stop replication
153
       return;
154
    }
155
    //Check for every server in server list to get updated list and put
156
    // them in to response
157
    for (int i=0; i<serverList.size(); i++)
158
    {
159 1292 tao
        // Get ReplicationServer object from server list
160
        replServer = serverList.serverAt(i);
161
        // Get server name from ReplicationServer object
162 2578 tao
        server = replServer.getServerName().trim();
163 1585 tao
        String result = null;
164 584 berkley
        MetacatReplication.replLog("full update started to: " + server);
165 1292 tao
        // Send command to that server to get updated docid information
166
        try
167
        {
168 1585 tao
          u = new URL("https://" + server + "?server="
169
          +util.getLocalReplicationServerName()+"&action=update");
170 2663 sgarg
          logMetacat.info("Sending infomation " +u.toString());
171 1292 tao
          result = MetacatReplication.getURLContent(u);
172 1585 tao
        }
173 1292 tao
        catch (Exception e)
174
        {
175 1585 tao
          MetacatReplication.replErrorLog("Failed to get updated doc list "+
176
                          "for server " + server + " because "+e.getMessage());
177 2663 sgarg
          logMetacat.error( "Failed to get updated doc list "+
178
                       "for server " + server + " because "+e.getMessage());
179 1292 tao
          continue;
180 1585 tao
        }
181 2286 tao
182 2663 sgarg
        logMetacat.info("docid: "+server+" "+result);
183 1292 tao
        //check if result have error or not, if has skip it.
184 1609 tao
        if (result.indexOf("<error>")!=-1 && result.indexOf("</error>")!=-1)
185 1102 tao
        {
186 1585 tao
          MetacatReplication.replErrorLog("Failed to get updated doc list "+
187
                          "for server " + server + " because "+result);
188 2663 sgarg
          logMetacat.info( "Failed to get updated doc list "+
189
                       "for server " + server + " because "+result);
190 1102 tao
          continue;
191
        }
192 1585 tao
        //Add result to vector
193 577 berkley
        responses.add(result);
194 1585 tao
    }
195 2286 tao
196 1585 tao
    //make sure that there is updated file list
197
    //If response is null, metacat don't need do anything
198
    if (responses==null || responses.isEmpty())
199
    {
200
        MetacatReplication.replErrorLog("No updated doc list for "+
201
                           "every server and failed to replicate");
202 2663 sgarg
        logMetacat.info( "No updated doc list for "+
203
                           "every server and failed to replicate");
204 1032 tao
        return;
205 1585 tao
    }
206 2286 tao
207
208 2663 sgarg
    logMetacat.info("Responses from remote metacat about updated "+
209
                   "document information: "+ responses.toString());
210 1585 tao
    // go through response vector(it contains updated vector and delete vector
211
    for(int i=0; i<responses.size(); i++)
212 2286 tao
    {
213 1585 tao
        try
214
        {
215
          parser.parse(new InputSource(
216 577 berkley
                     new StringReader(
217
                     (String)(responses.elementAt(i)))));
218 1585 tao
        }
219
        catch(Exception e)
220
        {
221
          MetacatReplication.replErrorLog("Couldn't parse one responses "+
222
                           "because "+ e.getMessage());
223 2663 sgarg
          logMetacat.error("Couldn't parse one responses "+
224
                                   "because "+ e.getMessage());
225 1585 tao
          continue;
226
        }
227 1037 tao
        //v is the list of updated documents
228 1585 tao
        Vector updateList = new Vector(message.getUpdatesVect());
229 2725 tao
        MetacatReplication.replLog("The document list size is "+updateList.size());
230 577 berkley
        //System.out.println("v: " + v.toString());
231 1037 tao
        //d is the list of deleted documents
232 1585 tao
        Vector deleteList = new Vector(message.getDeletesVect());
233 1037 tao
        //System.out.println("d: " + d.toString());
234 2663 sgarg
        logMetacat.info("Update vector size: "+ updateList.size());
235
        logMetacat.info("Delete vector size: "+ deleteList.size());
236 2725 tao
        MetacatReplication.replLog("The delete document list size is "+deleteList.size());
237 1585 tao
        // go though every element in updated document vector
238 2608 tao
        handleDocList(updateList, DocumentImpl.DOCUMENTTABLE);
239 1037 tao
        //handle deleted docs
240 1585 tao
        for(int k=0; k<deleteList.size(); k++)
241 577 berkley
        { //delete the deleted documents;
242 1585 tao
          Vector w = new Vector((Vector)deleteList.elementAt(k));
243
          String docId = (String)w.elementAt(0);
244
          try
245 579 berkley
          {
246 2298 tao
            handleDeleteSingleDocument(docId, server);
247 579 berkley
          }
248 1585 tao
          catch (Exception ee)
249
          {
250
            continue;
251
          }
252 1037 tao
        }//for delete docs
253 2608 tao
254
        // handle replicate doc in xml_revision
255
        Vector revisionList = new Vector(message.getRevisionsVect());
256 2725 tao
        MetacatReplication.replLog("The revision document list size is "+revisionList.size());
257 2608 tao
        handleDocList(revisionList, DocumentImpl.REVISIONTABLE);
258 2725 tao
        DOCINSERTNUMBER = 1;
259
        DOCERRORNUMBER  = 1;
260
        REVINSERTNUMBER = 1;
261
        REVERRORNUMBER  = 1;
262 1585 tao
    }//for response
263 2286 tao
264 1585 tao
    //updated last_checked
265
    for (int i=0;i<serverList.size(); i++)
266
    {
267
       // Get ReplicationServer object from server list
268
       replServer = serverList.serverAt(i);
269
       try
270
       {
271
         updateLastCheckTimeForSingleServer(replServer);
272
       }
273
       catch(Exception e)
274
       {
275
         continue;
276
       }
277
    }//for
278 2286 tao
279 1585 tao
  }//update
280 2286 tao
281 1585 tao
  /* Handle replicate single xml document*/
282 2286 tao
  private void handleSingleXMLDocument(String remoteserver, String actions,
283 2641 tao
                                       String accNumber, String tableName)
284 1585 tao
               throws Exception
285
  {
286
    DBConnection dbConn = null;
287
    int serialNumber = -1;
288
    try
289
    {
290
      // Get DBConnection from pool
291
      dbConn=DBConnectionPool.
292
                  getDBConnection("ReplicationHandler.handleSingleXMLDocument");
293
      serialNumber=dbConn.getCheckOutSerialNumber();
294
      //if the document needs to be updated or inserted, this is executed
295 1600 tao
      String readDocURLString = "https://" + remoteserver + "?server="+
296 2641 tao
              util.getLocalReplicationServerName()+"&action=read&docid="+accNumber;
297 1600 tao
      readDocURLString = MetaCatUtil.replaceWhiteSpaceForURL(readDocURLString);
298
      URL u = new URL(readDocURLString);
299 2286 tao
300 1585 tao
      // Get docid content
301
      String newxmldoc = MetacatReplication.getURLContent(u);
302
      // If couldn't get skip it
303 1609 tao
      if ( newxmldoc.indexOf("<error>")!= -1 && newxmldoc.indexOf("</error>")!=-1)
304 1292 tao
      {
305 1585 tao
         throw new Exception(newxmldoc);
306
      }
307 2663 sgarg
      //logMetacat.info("xml documnet:");
308
      //logMetacat.info(newxmldoc);
309 2286 tao
310 1585 tao
      // Try get the docid info from remote server
311
      DocInfoHandler dih = new DocInfoHandler();
312
      XMLReader docinfoParser = initParser(dih);
313 2286 tao
      String docInfoURLStr = "https://" + remoteserver +
314 1585 tao
                       "?server="+util.getLocalReplicationServerName()+
315 2641 tao
                       "&action=getdocumentinfo&docid="+accNumber;
316 1600 tao
      docInfoURLStr = MetaCatUtil.replaceWhiteSpaceForURL(docInfoURLStr);
317
      URL docinfoUrl = new URL(docInfoURLStr);
318 2663 sgarg
      logMetacat.info("Sending message: " +
319
                                                  docinfoUrl.toString());
320 1585 tao
      String docInfoStr = MetacatReplication.getURLContent(docinfoUrl);
321
      docinfoParser.parse(new InputSource(new StringReader(docInfoStr)));
322
      Hashtable docinfoHash = dih.getDocInfo();
323
      // Get home server of the docid
324
      String docHomeServer = (String)docinfoHash.get("home_server");
325 2663 sgarg
      logMetacat.info("doc home server in repl: "+docHomeServer);
326 2624 tao
      String createdDate = (String)docinfoHash.get("date_created");
327
      String updatedDate = (String)docinfoHash.get("date_updated");
328 1585 tao
      //docid should include rev number too
329 2641 tao
      /*String accnum=docId+util.getOption("accNumSeparator")+
330
                                              (String)docinfoHash.get("rev");*/
331 2663 sgarg
      logMetacat.info("docid in repl: "+accNumber);
332 1585 tao
      String docType = (String)docinfoHash.get("doctype");
333 2663 sgarg
      logMetacat.info("doctype in repl: "+docType);
334 2286 tao
335 1585 tao
      String parserBase = null;
336
      // this for eml2 and we need user eml2 parser
337 2169 sgarg
      if (docType != null && (docType.trim()).equals(DocumentImpl.EML2_0_0NAMESPACE))
338 1585 tao
      {
339 2163 tao
         parserBase = DocumentImpl.EML200;
340 1585 tao
      }
341 2286 tao
      else if (docType != null && (docType.trim()).equals(DocumentImpl.EML2_0_1NAMESPACE))
342
      {
343
        parserBase = DocumentImpl.EML200;
344
      }
345
      else if (docType != null && (docType.trim()).equals(DocumentImpl.EML2_1_0NAMESPACE))
346
      {
347
        parserBase = DocumentImpl.EML210;
348
      }
349 1585 tao
      // Write the document into local host
350
      DocumentImplWrapper wrapper = new DocumentImplWrapper(parserBase, false);
351 2286 tao
      String newDocid = wrapper.writeReplication(dbConn,
352 1585 tao
                              new StringReader(newxmldoc),
353
                              (String)docinfoHash.get("public_access"),
354
                              null,  /* the dtd text */
355 2286 tao
                              actions,
356 2641 tao
                              accNumber,
357 1585 tao
                              (String)docinfoHash.get("user_owner"),
358
                              null, /* null for groups[] */
359 2286 tao
                              docHomeServer,
360 2624 tao
                              remoteserver, tableName, true,// true is for time replication
361
                              createdDate,
362
                              updatedDate);
363 2663 sgarg
      logMetacat.info("Successfully replicated doc " + accNumber);
364 2725 tao
      if (tableName.equals(DocumentImpl.DOCUMENTTABLE))
365
      {
366
        MetacatReplication.replLog("" +DOCINSERTNUMBER + " Wrote xml doc " + accNumber +
367
                                     " into "+tableName + " from " +
368 1585 tao
                                         remoteserver);
369 2725 tao
        DOCINSERTNUMBER++;
370
      }
371
      else
372
      {
373
          MetacatReplication.replLog("" +REVINSERTNUMBER + " Wrote xml doc " + accNumber +
374
                  " into "+tableName + " from " +
375
                      remoteserver);
376
          REVINSERTNUMBER++;
377
      }
378
379 2286 tao
380
    }//try
381 577 berkley
    catch(Exception e)
382
    {
383 2725 tao
384
        if (tableName.equals(DocumentImpl.DOCUMENTTABLE))
385
        {
386
          MetacatReplication.replErrorLog("" +DOCERRORNUMBER + " Failed to write xml doc " + accNumber +
387
                                       " into "+tableName + " from " +
388
                                           remoteserver + " because "+e.getMessage());
389
          DOCERRORNUMBER++;
390
        }
391
        else
392
        {
393
            MetacatReplication.replLog("" +REVERRORNUMBER + " Failed to write xml doc " + accNumber +
394
                    " into "+tableName + " from " +
395
                        remoteserver +" because "+e.getMessage());
396
            REVERRORNUMBER++;
397
        }
398
399 2663 sgarg
      logMetacat.error("Failed to write doc " + accNumber +
400
                                      " into db because " +e.getMessage());
401 1585 tao
      throw e;
402 577 berkley
    }
403 667 berkley
    finally
404
    {
405 1585 tao
       //return DBConnection
406
       DBConnectionPool.returnDBConnection(dbConn, serialNumber);
407
    }//finally
408
  }
409 2286 tao
410
411
412 1585 tao
  /* Handle replicate single xml document*/
413 2286 tao
  private void handleSingleDataFile(String remoteserver, String actions,
414 2641 tao
                                    String accNumber, String tableName)
415 1585 tao
               throws Exception
416
  {
417 2663 sgarg
    logMetacat.info("Try to replicate data file: "+accNumber);
418 1585 tao
    DBConnection dbConn = null;
419
    int serialNumber = -1;
420
    try
421
    {
422
      // Get DBConnection from pool
423
      dbConn=DBConnectionPool.
424
                  getDBConnection("ReplicationHandler.handleSinlgeDataFile");
425
      serialNumber=dbConn.getCheckOutSerialNumber();
426
      // Try get docid info from remote server
427
      DocInfoHandler dih = new DocInfoHandler();
428
      XMLReader docinfoParser = initParser(dih);
429 2286 tao
      String docInfoURLString = "https://" + remoteserver +
430 1585 tao
                  "?server="+util.getLocalReplicationServerName()+
431 2641 tao
                  "&action=getdocumentinfo&docid="+accNumber;
432 1600 tao
      docInfoURLString = MetaCatUtil.replaceWhiteSpaceForURL(docInfoURLString);
433
      URL docinfoUrl = new URL(docInfoURLString);
434 2286 tao
435 1585 tao
      String docInfoStr = MetacatReplication.getURLContent(docinfoUrl);
436
      docinfoParser.parse(new InputSource(new StringReader(docInfoStr)));
437
      Hashtable docinfoHash = dih.getDocInfo();
438
      // Get doicd owner
439
      String user = (String)docinfoHash.get("user_owner");
440
      // Get docid name (such as acl or dataset)
441
      String docName = (String)docinfoHash.get("docname");
442 2286 tao
      // Get doc type (eml public id)
443 1585 tao
      String docType = (String)docinfoHash.get("doctype");
444
      // Get docid home sever. it might be different to remoteserver
445
      // becuause of hub feature
446
      String docHomeServer = (String)docinfoHash.get("home_server");
447 2624 tao
      String createdDate = (String)docinfoHash.get("date_created");
448
      String updatedDate = (String)docinfoHash.get("date_updated");
449 1585 tao
      //docid should include rev number too
450 2641 tao
      /*String accnum=docId+util.getOption("accNumSeparator")+
451
                                              (String)docinfoHash.get("rev");*/
452 2286 tao
453
454 1585 tao
      String datafilePath = util.getOption("datafilepath");
455
      // Get data file content
456 1600 tao
      String readDataURLString = "https://" + remoteserver + "?server="+
457 1585 tao
                                        util.getLocalReplicationServerName()+
458 2641 tao
                                            "&action=readdata&docid="+accNumber;
459 1600 tao
      readDataURLString = MetaCatUtil.replaceWhiteSpaceForURL(readDataURLString);
460
      URL u = new URL(readDataURLString);
461 2286 tao
      InputStream input = u.openStream();
462 1585 tao
      //register data file into xml_documents table and wite data file
463
      //into file system
464 1600 tao
      if ( input != null)
465 667 berkley
      {
466 2286 tao
        DocumentImpl.writeDataFileInReplication(input,
467 2608 tao
                                                datafilePath,
468
                                                docName,docType,
469 2641 tao
                                                accNumber, user,
470 2608 tao
                                                docHomeServer,
471
                                                remoteserver,
472
                                                tableName,
473 2624 tao
                                                true, //true means timed replication
474
                                                createdDate,
475
                                                updatedDate);
476
477 2663 sgarg
        logMetacat.info("Successfully to write datafile " + accNumber);
478 2725 tao
        /*MetacatReplication.replLog("wrote datafile " + accNumber + " from " +
479
                                    remoteserver);*/
480
        if (tableName.equals(DocumentImpl.DOCUMENTTABLE))
481
        {
482
          MetacatReplication.replLog("" +DOCINSERTNUMBER + " Wrote data file" + accNumber +
483
                                       " into "+tableName + " from " +
484
                                           remoteserver);
485
          DOCINSERTNUMBER++;
486
        }
487
        else
488
        {
489
            MetacatReplication.replLog("" +REVINSERTNUMBER + " Wrote data file" + accNumber +
490
                    " into "+tableName + " from " +
491
                        remoteserver);
492
            REVINSERTNUMBER++;
493
        }
494
495 1585 tao
      }//if
496
      else
497 1217 tao
      {
498 2663 sgarg
         logMetacat.info("Couldn't open the data file: " + accNumber);
499 2641 tao
         throw new Exception("Couldn't open the data file: " + accNumber);
500 1585 tao
      }//else
501 2286 tao
502
    }//try
503 1585 tao
    catch(Exception e)
504
    {
505 2725 tao
      /*MetacatReplication.replErrorLog("Failed to try wrote datafile " + accNumber +
506
                                      " because " +e.getMessage());*/
507
      if (tableName.equals(DocumentImpl.DOCUMENTTABLE))
508
      {
509
        MetacatReplication.replErrorLog("" +DOCERRORNUMBER + " Failed to write xml doc " + accNumber +
510
                                     " into "+tableName + " from " +
511
                                         remoteserver + " because "+e.getMessage());
512
        DOCERRORNUMBER++;
513
      }
514
      else
515
      {
516
          MetacatReplication.replLog("" +REVERRORNUMBER + " Failed to write xml doc " + accNumber +
517
                  " into "+tableName + " from " +
518
                      remoteserver +" because "+e.getMessage());
519
          REVERRORNUMBER++;
520
      }
521 2663 sgarg
      logMetacat.error("Failed to try wrote datafile " + accNumber +
522
                                      " because " +e.getMessage());
523 1585 tao
      throw e;
524
    }
525
    finally
526
    {
527
       //return DBConnection
528
       DBConnectionPool.returnDBConnection(dbConn, serialNumber);
529
    }//finally
530
  }
531 2286 tao
532
533
534 1585 tao
  /* Handle delete single document*/
535 2298 tao
  private void handleDeleteSingleDocument(String docId, String notifyServer)
536 1585 tao
               throws Exception
537
  {
538 2663 sgarg
    logMetacat.info("Try delete doc: "+docId);
539 1585 tao
    DBConnection dbConn = null;
540
    int serialNumber = -1;
541
    try
542
    {
543
      // Get DBConnection from pool
544
      dbConn=DBConnectionPool.
545
                  getDBConnection("ReplicationHandler.handleDeleteSingleDoc");
546
      serialNumber=dbConn.getCheckOutSerialNumber();
547
      if(!alreadyDeleted(docId))
548 1217 tao
      {
549 2286 tao
550 1585 tao
         //because delete method docid should have rev number
551
         //so we just add one for it. This rev number is no sence.
552
         String accnum=docId+util.getOption("accNumSeparator")+"1";
553
         //System.out.println("accnum: "+accnum);
554 2298 tao
         DocumentImpl.delete(accnum, null, null, notifyServer);
555 2663 sgarg
         logMetacat.info("Successfully deleted doc " + docId);
556 1585 tao
         MetacatReplication.replLog("Doc " + docId + " deleted");
557
      }
558 2286 tao
559
    }//try
560 1585 tao
    catch(Exception e)
561
    {
562
      MetacatReplication.replErrorLog("Failed to delete doc " + docId +
563
                                      " in db because " +e.getMessage());
564 2663 sgarg
      logMetacat.error("Failed to delete doc " + docId +
565
                                 " in db because because " + e.getMessage());
566 1585 tao
      throw e;
567
    }
568
    finally
569
    {
570
       //return DBConnection
571
       DBConnectionPool.returnDBConnection(dbConn, serialNumber);
572 1037 tao
    }//finally
573 1585 tao
  }
574 2286 tao
575 1585 tao
  /* Handle updateLastCheckTimForSingleServer*/
576 2286 tao
  private void updateLastCheckTimeForSingleServer(ReplicationServer repServer)
577 1585 tao
                                                  throws Exception
578 590 berkley
  {
579 1585 tao
    String server = repServer.getServerName();
580 1217 tao
    DBConnection dbConn = null;
581
    int serialNumber = -1;
582
    PreparedStatement pstmt = null;
583 590 berkley
    try
584
    {
585 1585 tao
      // Get DBConnection from pool
586 1217 tao
      dbConn=DBConnectionPool.
587 1585 tao
             getDBConnection("ReplicationHandler.updateLastCheckTimeForServer");
588 1217 tao
      serialNumber=dbConn.getCheckOutSerialNumber();
589 2286 tao
590 2663 sgarg
      logMetacat.info("Try to update last_check for server: "+server);
591 1585 tao
      // Get time from remote server
592
      URL dateurl = new URL("https://" + server + "?server="+
593
      util.getLocalReplicationServerName()+"&action=gettime");
594
      String datexml = MetacatReplication.getURLContent(dateurl);
595 2663 sgarg
      logMetacat.info("datexml: "+datexml);
596 1585 tao
      if (datexml!=null && !datexml.equals(""))
597
      {
598
         String datestr = datexml.substring(11, datexml.indexOf('<', 11));
599
         StringBuffer sql = new StringBuffer();
600 1751 tao
         /*sql.append("update xml_replication set last_checked = to_date('");
601 1585 tao
         sql.append(datestr).append("', 'YY-MM-DD HH24:MI:SS') where ");
602 1751 tao
         sql.append("server like '").append(server).append("'");*/
603
         sql.append("update xml_replication set last_checked = ");
604 1753 tao
         sql.append(dbAdapter.toDate(datestr, "MM/DD/YY HH24:MI:SS"));
605 1751 tao
         sql.append(" where server like '").append(server).append("'");
606 1585 tao
         pstmt = dbConn.prepareStatement(sql.toString());
607 2286 tao
608 1585 tao
         pstmt.executeUpdate();
609
         dbConn.commit();
610
         pstmt.close();
611 2663 sgarg
         logMetacat.info("last_checked updated to "+datestr+" on "
612
                                      + server);
613 1585 tao
      }//if
614
      else
615
      {
616 2286 tao
617 2663 sgarg
         logMetacat.info("Failed to update last_checked for server "  +
618 2286 tao
                                  server + " in db because couldn't get time "
619 2663 sgarg
                                  );
620 1585 tao
         throw new Exception("Couldn't get time for server "+ server);
621
      }
622 2286 tao
623
    }//try
624 1585 tao
    catch(Exception e)
625
    {
626 2286 tao
627 2663 sgarg
      logMetacat.error("Failed to update last_checked for server " +
628 1585 tao
                                server + " in db because because " +
629 2663 sgarg
                                e.getMessage());
630 1585 tao
      throw e;
631
    }
632
    finally
633
    {
634
       //return DBConnection
635
       DBConnectionPool.returnDBConnection(dbConn, serialNumber);
636
    }//finally
637
  }
638 2286 tao
639
640
641 1585 tao
  /**
642
   * updates xml_catalog with entries from other servers.
643
   */
644
  private void updateCatalog()
645
  {
646 2663 sgarg
    logMetacat.info("Start of updateCatalog");
647 1585 tao
    // ReplicationServer object in server list
648
    ReplicationServer replServer = null;
649
    PreparedStatement pstmt = null;
650
    String server = null;
651 2286 tao
652
653 1585 tao
    // Go through each ReplicationServer object in sererlist
654
    for (int j=0; j<serverList.size(); j++)
655 2286 tao
    {
656 1585 tao
      Vector remoteCatalog = new Vector();
657
      Vector publicId = new Vector();
658
      try
659
      {
660 1292 tao
        // Get ReplicationServer object from server list
661
        replServer = serverList.serverAt(j);
662
        // Get server name from the ReplicationServer object
663
        server = replServer.getServerName();
664
        // Try to get catalog
665 1011 tao
        URL u = new URL("https://" + server + "?server="+
666 1015 tao
        util.getLocalReplicationServerName()+"&action=getcatalog");
667 2663 sgarg
        logMetacat.info("sending message " + u.toString());
668 590 berkley
        String catxml = MetacatReplication.getURLContent(u);
669 2286 tao
670 1292 tao
        // Make sure there are not error, no empty string
671
        if (catxml.indexOf("error")!=-1 || catxml==null||catxml.equals(""))
672
        {
673 1585 tao
          throw new Exception("Couldn't get catalog list form server " +server);
674 1292 tao
        }
675 2663 sgarg
        logMetacat.info("catxml: " + catxml);
676 590 berkley
        CatalogMessageHandler cmh = new CatalogMessageHandler();
677
        XMLReader catparser = initParser(cmh);
678
        catparser.parse(new InputSource(new StringReader(catxml)));
679
        //parse the returned catalog xml and put it into a vector
680 1585 tao
        remoteCatalog = cmh.getCatalogVect();
681 2286 tao
682 1292 tao
        // Makse sure remoteCatalog is not empty
683
        if (remoteCatalog.isEmpty())
684
        {
685 1585 tao
          throw new Exception("Couldn't get catalog list form server " +server);
686 1292 tao
        }
687 2286 tao
688 590 berkley
        String localcatxml = MetacatReplication.getCatalogXML();
689 2286 tao
690 1292 tao
        // Make sure local catalog is no empty
691
        if (localcatxml==null||localcatxml.equals(""))
692
        {
693 1585 tao
          throw new Exception("Couldn't get catalog list form server " +server);
694 1292 tao
        }
695 2286 tao
696 590 berkley
        cmh = new CatalogMessageHandler();
697
        catparser = initParser(cmh);
698
        catparser.parse(new InputSource(new StringReader(localcatxml)));
699
        Vector localCatalog = cmh.getCatalogVect();
700 2286 tao
701 590 berkley
        //now we have the catalog from the remote server and this local server
702
        //we now need to compare the two and merge the differences.
703
        //the comparison is base on the public_id fields which is the 4th
704
        //entry in each row vector.
705 1585 tao
        publicId = new Vector();
706 590 berkley
        for(int i=0; i<localCatalog.size(); i++)
707
        {
708
          Vector v = new Vector((Vector)localCatalog.elementAt(i));
709 2663 sgarg
          logMetacat.info("v1: " + v.toString());
710 590 berkley
          publicId.add(new String((String)v.elementAt(3)));
711 595 berkley
          //System.out.println("adding " + (String)v.elementAt(3));
712 590 berkley
        }
713 1585 tao
      }//try
714
      catch (Exception e)
715
      {
716
        MetacatReplication.replErrorLog("Failed to update catalog for server "+
717
                                    server + " because " +e.getMessage());
718 2663 sgarg
        logMetacat.error("Failed to update catalog for server "+
719
                                    server + " because " +e.getMessage());
720 1585 tao
      }//catch
721 2286 tao
722 1585 tao
      for(int i=0; i<remoteCatalog.size(); i++)
723
      {
724
         // DConnection
725
        DBConnection dbConn = null;
726
        // DBConnection checkout serial number
727
        int serialNumber = -1;
728
        try
729 590 berkley
        {
730 1585 tao
            dbConn=DBConnectionPool.
731
                  getDBConnection("ReplicationHandler.updateCatalog");
732
            serialNumber=dbConn.getCheckOutSerialNumber();
733
            Vector v = (Vector)remoteCatalog.elementAt(i);
734
            //System.out.println("v2: " + v.toString());
735
            //System.out.println("i: " + i);
736
            //System.out.println("remoteCatalog.size(): " + remoteCatalog.size());
737
            //System.out.println("publicID: " + publicId.toString());
738 2663 sgarg
            logMetacat.info
739
                              ("v.elementAt(3): " + (String)v.elementAt(3));
740 1585 tao
           if(!publicId.contains(v.elementAt(3)))
741
           { //so we don't have this public id in our local table so we need to
742
             //add it.
743
             //System.out.println("in if");
744
             StringBuffer sql = new StringBuffer();
745
             sql.append("insert into xml_catalog (entry_type, source_doctype, ");
746
             sql.append("target_doctype, public_id, system_id) values (?,?,?,");
747
             sql.append("?,?)");
748
             //System.out.println("sql: " + sql.toString());
749
             pstmt = dbConn.prepareStatement(sql.toString());
750
             pstmt.setString(1, (String)v.elementAt(0));
751
             pstmt.setString(2, (String)v.elementAt(1));
752
             pstmt.setString(3, (String)v.elementAt(2));
753
             pstmt.setString(4, (String)v.elementAt(3));
754
             pstmt.setString(5, (String)v.elementAt(4));
755
             pstmt.execute();
756
             pstmt.close();
757
             MetacatReplication.replLog("Success fully to insert new publicid "+
758
                               (String)v.elementAt(3) + " from server"+server);
759 2663 sgarg
             logMetacat.info("Success fully to insert new publicid "+
760
                             (String)v.elementAt(3) + " from server" +server);
761 1585 tao
           }
762 590 berkley
        }
763 1585 tao
        catch(Exception e)
764
        {
765
           MetacatReplication.replErrorLog("Failed to update catalog for server "+
766
                                    server + " because " +e.getMessage());
767 2663 sgarg
           logMetacat.error("Failed to update catalog for server "+
768
                                    server + " because " +e.getMessage());
769 1585 tao
        }//catch
770
        finally
771
        {
772
           DBConnectionPool.returnDBConnection(dbConn, serialNumber);
773
        }//finall
774
      }//for remote catalog
775
    }//for server list
776 2663 sgarg
    logMetacat.info("End of updateCatalog");
777 590 berkley
  }
778 2286 tao
779 590 berkley
  /**
780 579 berkley
   * Method that returns true if docid has already been "deleted" from metacat.
781 582 berkley
   * This method really implements a truth table for deleted documents
782 590 berkley
   * The table is (a docid in one of the tables is represented by the X):
783 582 berkley
   * xml_docs      xml_revs      deleted?
784
   * ------------------------------------
785
   *   X             X             FALSE
786
   *   X             _             FALSE
787
   *   _             X             TRUE
788
   *   _             _             TRUE
789 579 berkley
   */
790 1585 tao
  private static boolean alreadyDeleted(String docid) throws Exception
791 579 berkley
  {
792 1217 tao
    DBConnection dbConn = null;
793
    int serialNumber = -1;
794
    PreparedStatement pstmt = null;
795 579 berkley
    try
796
    {
797 1217 tao
      dbConn=DBConnectionPool.
798
                  getDBConnection("ReplicationHandler.alreadyDeleted");
799
      serialNumber=dbConn.getCheckOutSerialNumber();
800 582 berkley
      boolean xml_docs = false;
801
      boolean xml_revs = false;
802 2286 tao
803 579 berkley
      StringBuffer sb = new StringBuffer();
804 582 berkley
      sb.append("select docid from xml_revisions where docid like '");
805 579 berkley
      sb.append(docid).append("'");
806 1217 tao
      pstmt = dbConn.prepareStatement(sb.toString());
807 579 berkley
      pstmt.execute();
808
      ResultSet rs = pstmt.getResultSet();
809
      boolean tablehasrows = rs.next();
810
      if(tablehasrows)
811
      {
812 582 berkley
        xml_revs = true;
813
      }
814 2286 tao
815 582 berkley
      sb = new StringBuffer();
816
      sb.append("select docid from xml_documents where docid like '");
817
      sb.append(docid).append("'");
818 667 berkley
      pstmt.close();
819 1217 tao
      pstmt = dbConn.prepareStatement(sb.toString());
820
      //increase usage count
821
      dbConn.increaseUsageCount(1);
822 582 berkley
      pstmt.execute();
823
      rs = pstmt.getResultSet();
824
      tablehasrows = rs.next();
825 667 berkley
      pstmt.close();
826 582 berkley
      if(tablehasrows)
827
      {
828
        xml_docs = true;
829
      }
830 2286 tao
831 582 berkley
      if(xml_docs && xml_revs)
832
      {
833
        return false;
834
      }
835
      else if(xml_docs && !xml_revs)
836
      {
837
        return false;
838
      }
839
      else if(!xml_docs && xml_revs)
840
      {
841 579 berkley
        return true;
842
      }
843 582 berkley
      else if(!xml_docs && !xml_revs)
844
      {
845
        return true;
846
      }
847 579 berkley
    }
848
    catch(Exception e)
849
    {
850 2663 sgarg
      logMetacat.error("error in ReplicationHandler.alreadyDeleted: " +
851
                          e.getMessage());
852 1585 tao
      throw e;
853 579 berkley
    }
854 667 berkley
    finally
855
    {
856 1217 tao
      try
857
      {
858
        pstmt.close();
859
      }//try
860
      catch (SQLException ee)
861
      {
862 2663 sgarg
        logMetacat.error("Error in replicationHandler.alreadyDeleted "+
863
                          "to close pstmt: "+ee.getMessage());
864 1585 tao
        throw ee;
865 1217 tao
      }//catch
866
      finally
867
      {
868
        DBConnectionPool.returnDBConnection(dbConn, serialNumber);
869
      }//finally
870
    }//finally
871 579 berkley
    return false;
872
  }
873 533 berkley
874 2286 tao
875 533 berkley
  /**
876 574 berkley
   * Method to initialize the message parser
877
   */
878
  public static XMLReader initParser(DefaultHandler dh)
879
          throws Exception
880
  {
881
    XMLReader parser = null;
882
883
    try {
884
      ContentHandler chandler = dh;
885
886
      // Get an instance of the parser
887
      MetaCatUtil util = new MetaCatUtil();
888
      String parserName = util.getOption("saxparser");
889
      parser = XMLReaderFactory.createXMLReader(parserName);
890
891
      // Turn off validation
892
      parser.setFeature("http://xml.org/sax/features/validation", false);
893 2286 tao
894 574 berkley
      parser.setContentHandler((ContentHandler)chandler);
895
      parser.setErrorHandler((ErrorHandler)chandler);
896
897
    } catch (Exception e) {
898
      throw e;
899
    }
900
901
    return parser;
902
  }
903 2286 tao
904 2555 tao
  /**
905
   * This method will combinate given time string(in short format) to
906
   * current date. If the given time (e.g 10:00 AM) passed the current time
907
   * (e.g 2:00 PM Aug 21, 2005), then the time will set to second day,
908
   * 10:00 AM Aug 22, 2005. If the given time (e.g 10:00 AM) haven't passed
909
   * the current time (e.g 8:00 AM Aug 21, 2005) The time will set to be
910
   * 10:00 AM Aug 21, 2005.
911
   * @param givenTime  the format should be "10:00 AM " or "2:00 PM"
912
   * @return
913
   * @throws Exception
914
   */
915
  public static Date combinateCurrentDateAndGivenTime(String givenTime) throws Exception
916
  {
917
     Date givenDate = parseTime(givenTime);
918
     Date newDate = null;
919
     Date now = new Date();
920
     String currentTimeString = getTimeString(now);
921
     Date currentTime = parseTime(currentTimeString);
922
     if ( currentTime.getTime() >= givenDate.getTime())
923
     {
924 2663 sgarg
        logMetacat.info("Today already pass the given time, we should set it as tomorrow");
925 2555 tao
        String dateAndTime = getDateString(now) + " " + givenTime;
926
        Date combinationDate = parseDateTime(dateAndTime);
927
        // new date should plus 24 hours to make is the second day
928
        newDate = new Date(combinationDate.getTime()+24*3600*1000);
929
     }
930
     else
931
     {
932 2663 sgarg
         logMetacat.info("Today haven't pass the given time, we should it as today");
933 2555 tao
         String dateAndTime = getDateString(now) + " " + givenTime;
934
         newDate = parseDateTime(dateAndTime);
935
     }
936 2663 sgarg
     logMetacat.warn("final setting time is "+ newDate.toString());
937 2555 tao
     return newDate;
938
  }
939 2286 tao
940 2555 tao
  /*
941
   * parse a given string to Time in short format.
942
   * For example, given time is 10:00 AM, the date will be return as
943
   * Jan 1 1970, 10:00 AM
944
   */
945
  private static Date parseTime(String timeString) throws Exception
946
  {
947
    DateFormat format = DateFormat.getTimeInstance(DateFormat.SHORT);
948
    Date time = format.parse(timeString);
949 2663 sgarg
    logMetacat.info("Date string is after parse a time string "
950
                              +time.toString());
951 2555 tao
    return time;
952
953
  }
954
955
  /*
956
   * Pasre a given string to date and time. Date format is long and time
957
   * format is short.
958
   */
959
  private static Date parseDateTime(String timeString) throws Exception
960
  {
961
    DateFormat format = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT);
962
    Date time = format.parse(timeString);
963 2663 sgarg
    logMetacat.info("Date string is after parse a time string "+
964
                             time.toString());
965 2555 tao
    return time;
966
  }
967
968
  /*
969
   * Get a date string from a Date object. The date format will be long
970
   */
971
  private static String getDateString(Date now)
972
  {
973
     DateFormat df = DateFormat.getDateInstance(DateFormat.LONG);
974
     String s = df.format(now);
975 2663 sgarg
     logMetacat.info("Today is " + s);
976 2555 tao
     return s;
977
  }
978
979
  /*
980
   * Get a time string from a Date object, the time format will be short
981
   */
982
  private static String getTimeString(Date now)
983
  {
984
     DateFormat df = DateFormat.getTimeInstance(DateFormat.SHORT);
985
     String s = df.format(now);
986 2663 sgarg
     logMetacat.info("Time is " + s);
987 2555 tao
     return s;
988
  }
989 2608 tao
990
991
  /*
992
   * This method will go through the docid list both in xml_Documents table
993
   * and in xml_revisions table
994
   * @author tao
995
   */
996
   private void handleDocList(Vector docList, String tableName)
997
   {
998
       boolean dataFile=false;
999
       for(int j=0; j<docList.size(); j++)
1000
       {
1001
         //initial dataFile is false
1002
         dataFile=false;
1003
         //w is information for one document, information contain
1004
         //docid, rev, server or datafile.
1005
         Vector w = new Vector((Vector)(docList.elementAt(j)));
1006
         //Check if the vector w contain "datafile"
1007
         //If it has, this document is data file
1008
         if (w.contains((String)util.getOption("datafileflag")))
1009
         {
1010
           dataFile=true;
1011
         }
1012
         //System.out.println("w: " + w.toString());
1013
         // Get docid
1014
         String docid = (String)w.elementAt(0);
1015 2663 sgarg
         logMetacat.info("docid: " + docid);
1016 2608 tao
         // Get revision number
1017
         int rev = Integer.parseInt((String)w.elementAt(1));
1018 2663 sgarg
         logMetacat.info("rev: " + rev);
1019 2608 tao
         // Get remote server name (it is may not be doc homeserver because
1020
         // the new hub feature
1021
         String remoteServer = (String)w.elementAt(2);
1022
         remoteServer = remoteServer.trim();
1023
1024
         try
1025
         {
1026
             if (tableName.equals(DocumentImpl.DOCUMENTTABLE))
1027
             {
1028
                 handleDocInXMLDocuments(docid, rev, remoteServer, dataFile);
1029
             }
1030
             else if (tableName.equals(DocumentImpl.REVISIONTABLE))
1031
             {
1032
                 handleDocInXMLRevisions(docid, rev, remoteServer, dataFile);
1033
             }
1034
             else
1035
             {
1036
                 continue;
1037
             }
1038
1039
         }
1040
         catch (Exception e)
1041
         {
1042 2663 sgarg
             logMetacat.error("error to handle update doc in "+
1043
                     tableName +" in time replication"+e.getMessage());
1044 2608 tao
             continue;
1045
         }
1046
1047
       }//for update docs
1048
1049
   }
1050
1051
   /*
1052
    * This method will handle doc in xml_documents table.
1053
    */
1054
   private void handleDocInXMLDocuments(String docid, int rev, String remoteServer, boolean dataFile)
1055
                                        throws Exception
1056
   {
1057
       // compare the update rev and local rev to see what need happen
1058
       int localrev = -1;
1059
       String action = null;
1060
       boolean flag = false;
1061
       try
1062
       {
1063 2641 tao
         localrev = DBUtil.getLatestRevisionInDocumentTable(docid);
1064 2608 tao
       }
1065
       catch (SQLException e)
1066
       {
1067 2663 sgarg
         logMetacat.error("Local rev for docid "+ docid + " could not "+
1068
                                " be found because " + e.getMessage());
1069 2608 tao
         MetacatReplication.replErrorLog("Docid "+ docid + " could not be "+
1070
                 "written because error happend to find it's local revision");
1071
         throw new Exception (e.getMessage());
1072
       }
1073 2663 sgarg
       logMetacat.info("Local rev for docid "+ docid + " is "+
1074
                               localrev);
1075 2608 tao
1076
       //check the revs for an update because this document is in the
1077
       //local DB, it might be out of date.
1078
       if (localrev == -1)
1079
       {
1080 2713 tao
          // check if the revision is in the revision table
1081
         Vector localRevVector = DBUtil.getRevListFromRevisionTable(docid);
1082
         if (localRevVector != null && localRevVector.contains(new Integer(rev)))
1083
         {
1084
             // this version was deleted, so don't need replicate
1085
             flag = false;
1086
         }
1087
         else
1088
         {
1089
           //insert this document as new because it is not in the local DB
1090
           action = "INSERT";
1091
           flag = true;
1092
         }
1093 2608 tao
       }
1094
       else
1095
       {
1096
         if(localrev == rev)
1097
         {
1098
           // Local meatacat has the same rev to remote host, don't need
1099
           // update and flag set false
1100
           flag = false;
1101
         }
1102
         else if(localrev < rev)
1103
         {
1104
           //this document needs to be updated so send an read request
1105
           action = "UPDATE";
1106
           flag = true;
1107
         }
1108
       }
1109 2641 tao
1110
       String accNumber = docid + MetaCatUtil.getOption("accNumSeparator") + rev;
1111 2608 tao
       // this is non-data file
1112
       if(flag && !dataFile)
1113
       {
1114
         try
1115
         {
1116 2641 tao
           handleSingleXMLDocument(remoteServer, action, accNumber, DocumentImpl.DOCUMENTTABLE);
1117 2608 tao
         }
1118
         catch(Exception e)
1119
         {
1120
           // skip this document
1121
           throw e;
1122
         }
1123
       }//if for non-data file
1124
1125
        // this is for data file
1126
       if(flag && dataFile)
1127
       {
1128
         try
1129
         {
1130 2641 tao
           handleSingleDataFile(remoteServer, action, accNumber, DocumentImpl.DOCUMENTTABLE);
1131 2608 tao
         }
1132
         catch(Exception e)
1133
         {
1134
           // skip this datafile
1135
           throw e;
1136
         }
1137
1138
       }//for datafile
1139
   }
1140
1141
   /*
1142
    * This method will handle doc in xml_documents table.
1143
    */
1144
   private void handleDocInXMLRevisions(String docid, int rev, String remoteServer, boolean dataFile)
1145
                                        throws Exception
1146
   {
1147
       // compare the update rev and local rev to see what need happen
1148 2663 sgarg
       logMetacat.info("In handle repliation revsion table");
1149
       logMetacat.info("the docid is "+ docid);
1150
       logMetacat.info("The rev is "+rev);
1151 2608 tao
       Vector localrev = null;
1152
       String action = "INSERT";
1153
       boolean flag = false;
1154
       try
1155
       {
1156
         localrev = DBUtil.getRevListFromRevisionTable(docid);
1157
       }
1158
       catch (SQLException e)
1159
       {
1160 2663 sgarg
         logMetacat.error("Local rev for docid "+ docid + " could not "+
1161
                                " be found because " + e.getMessage());
1162 2608 tao
         MetacatReplication.replErrorLog("Docid "+ docid + " could not be "+
1163
                 "written because error happend to find it's local revision");
1164
         throw new Exception (e.getMessage());
1165
       }
1166 2663 sgarg
       logMetacat.info("rev list in xml_revision table for docid "+ docid + " is "+
1167
                               localrev.toString());
1168 2608 tao
1169
       // if the rev is not in the xml_revision, we need insert it
1170
       if (!localrev.contains(new Integer(rev)))
1171
       {
1172
           flag = true;
1173
       }
1174 2641 tao
1175
       String accNumber = docid + MetaCatUtil.getOption("accNumSeparator") + rev;
1176 2608 tao
       // this is non-data file
1177
       if(flag && !dataFile)
1178
       {
1179
         try
1180
         {
1181 2641 tao
1182
           handleSingleXMLDocument(remoteServer, action, accNumber, DocumentImpl.REVISIONTABLE);
1183 2608 tao
         }
1184
         catch(Exception e)
1185
         {
1186
           // skip this document
1187
           throw e;
1188
         }
1189
       }//if for non-data file
1190
1191
        // this is for data file
1192
       if(flag && dataFile)
1193
       {
1194
         try
1195
         {
1196 2641 tao
           handleSingleDataFile(remoteServer, action, accNumber, DocumentImpl.REVISIONTABLE);
1197 2608 tao
         }
1198
         catch(Exception e)
1199
         {
1200
           // skip this datafile
1201
           throw e;
1202
         }
1203
1204
       }//for datafile
1205
   }
1206
1207 522 berkley
}