ef6648a7917a74b386ded70f1d799becd7b74386ugaston/*
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * CDDL HEADER START
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * The contents of this file are subject to the terms of the
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * Common Development and Distribution License, Version 1.0 only
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * (the "License"). You may not use this file except in compliance
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * with the License.
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * or http://forgerock.org/license/CDDLv1.0.html.
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * See the License for the specific language governing permissions
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * and limitations under the License.
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * When distributing Covered Code, include this CDDL HEADER in each
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * file and include the License file at legal-notices/CDDLv1_0.txt.
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * If applicable, add the following below this CDDL HEADER, with the
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * fields enclosed by brackets "[]" replaced with your own identifying
3437829f938dbb44527d91fbbc5f430a1243c5a5JnRouvignac * information:
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * Portions Copyright [yyyy] [name of copyright owner]
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * CDDL HEADER END
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
ef6648a7917a74b386ded70f1d799becd7b74386ugaston *
ef6648a7917a74b386ded70f1d799becd7b74386ugaston * Copyright 2010 Sun Microsystems, Inc.
ef6648a7917a74b386ded70f1d799becd7b74386ugaston */
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
d81f6d00c343633159fc5ea08599d145135612c0ludovicp
ef6648a7917a74b386ded70f1d799becd7b74386ugastonimport netscape.ldap.*;
ef6648a7917a74b386ded70f1d799becd7b74386ugastonimport netscape.ldap.util.*;
ef6648a7917a74b386ded70f1d799becd7b74386ugastonimport java.util.*;
ef6648a7917a74b386ded70f1d799becd7b74386ugastonimport java.util.concurrent.BlockingQueue;
ef6648a7917a74b386ded70f1d799becd7b74386ugastonimport java.io.*;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugastonclass Writer extends Thread {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston BlockingQueue<Change> q;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston String hostport;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston public Writer(BlockingQueue<Change> q, String hostport) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston this.q = q;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston this.hostport = hostport;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston public void run() {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston try {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston Server application = new Server( hostport );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston ImprovedLDAPConnection applicationConnection = new ImprovedLDAPConnection();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // Connect to the stand-alone server
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println("INFO", "****** Connecting to application "
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + application.host + ":" + application.port + " ......");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston applicationConnection.connect( application.host, application.port );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston applicationConnection.authenticate( 3, EclReadAndPlay.bindDn, EclReadAndPlay.bindPwd );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println("INFO", "****** ...... Connected to application "
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + application.host + ":" + application.port );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston while (true) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // Read change from the queue
ef6648a7917a74b386ded70f1d799becd7b74386ugaston Change change = q.take();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston //EclReadAndPlay.println ("DEBUG", "Change read from the queue -----> : " + change.toString() );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston CSN RUVcsn=EclReadAndPlay.RUV.get(change.replicaIdentifier);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if ( RUVcsn != null ) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // if operation is not replicated
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if ( change.csn == null )
ef6648a7917a74b386ded70f1d799becd7b74386ugaston continue;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if (change.csn.compareTo(RUVcsn) < 0) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // EclReadAndPlay.println ("DEBUG", Integer.toHexString(i.intValue()) + " < " + Integer.toHexString(l.intValue()) );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println("DEBUG", "Operation " + change.changeNumberValue + " csn "
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + change.csn + " has already been replayed");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston continue;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston try {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // Write change on stand-alone server
ef6648a7917a74b386ded70f1d799becd7b74386ugaston applicationConnection.apply(change);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // Write change CSN to file under "db" directory
ef6648a7917a74b386ded70f1d799becd7b74386ugaston File f;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if (EclReadAndPlay.files.containsKey(change.replicaIdentifier)) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston f = EclReadAndPlay.files.get(change.replicaIdentifier);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // f.renameTo(new File(EclReadAndPlay.dbPath, new String(change.replicaIdentifier+".tmp") ));
ef6648a7917a74b386ded70f1d799becd7b74386ugaston } else {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston f = new File(EclReadAndPlay.dbPath, change.replicaIdentifier + ".csn");
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.files.put(change.replicaIdentifier,f);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston FileWriter out = new FileWriter(f);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston out.write(change.csn.value);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston out.flush();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston out.close();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.RUV.put(change.replicaIdentifier,change.csn);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston if ( EclReadAndPlay.eclMode.equals("draft") )
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.inc_ops(change.changeNumber);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston else if ( EclReadAndPlay.eclMode.equals("opends") )
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.inc_ops(change.changelogCookie);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston // Log a message for the written change on "logs/access" file
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.accessOut.println(EclReadAndPlay.getDate()
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + "- INFO: " + change.type + " \""
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + change.dn + "\" (" + change.csn +" / "
ef6648a7917a74b386ded70f1d799becd7b74386ugaston + change.changeNumber + ")" );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston } catch (Exception e) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston EclReadAndPlay.println( "ERROR", e.toString() );
ef6648a7917a74b386ded70f1d799becd7b74386ugaston e.printStackTrace();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston System.exit(1);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston //nb_changes++;
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston } catch (Exception e) {
ef6648a7917a74b386ded70f1d799becd7b74386ugaston e.printStackTrace();
ef6648a7917a74b386ded70f1d799becd7b74386ugaston System.exit(1);
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston }
ef6648a7917a74b386ded70f1d799becd7b74386ugaston
ef6648a7917a74b386ded70f1d799becd7b74386ugaston}