/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2009-2010 Sun Microsystems, Inc.
*/
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Calendar;
import java.util.Enumeration;
import netscape.ldap.LDAPAttribute;
import netscape.ldap.LDAPAttributeSet;
import netscape.ldap.LDAPConnection;
import netscape.ldap.LDAPEntry;
import netscape.ldap.LDAPException;
import netscape.ldap.LDAPSearchConstraints;
import netscape.ldap.LDAPSearchResults;
import netscape.ldap.LDAPv3;
import netscape.ldap.controls.LDAPPersistSearchControl;
public class PSearchOperations extends Thread {
public static final String ADD = "ADD";
public static final String MODIFY = "MODIFY";
public static final String DELETE = "DELETE";
public static final String MODDN = "MODDN";
public static final String ALL = "ALL";
private LDAPConnection connection;
private String hostname;
private int portnumber;
private String bindDN;
private String bindPW;
private String suffix;
private int threadId;
private String fileName;
private boolean output;
private boolean ldifFormat;
private boolean logFile;
private String operation;
/**
* constructor
* @param id
* @param hostname
* @param portnumber
* @param bindDN
* @param bindPW
* @param suffix
*/
public PSearchOperations(int id, String hostname, int portnumber, String bindDN, String bindPW, String suffix) {
this.hostname = hostname;
this.portnumber = portnumber;
this.bindDN = bindDN;
this.bindPW = bindPW;
this.suffix = suffix;
this.threadId = id;
this.output = false;
this.logFile = false;
this.ldifFormat = false;
//by default all operation
this.operation = ALL;
}
/**
* to use systeme.out
* @param output boolean
*/
public void setOutput(boolean output) {
this.output = output;
}
/**
* to use the log file
* @param logFile boolean
*/
public void useLogFile(boolean logFile) {
this.logFile = logFile;
}
/**
* to define the log file and URI
* @param file String
*/
public void setLogFile(String file) {
//if there one thread the thread id are not add in the file name
this.fileName = file;
//in multy thread for each thread the thread id are add in the file name
if (threadId!=0) {
String ext = file.substring(file.lastIndexOf("."), file.length());
this.fileName = file.substring(0, file.lastIndexOf(".")) + threadId + ext;
}
//delete old log file if logFile is present and enable
File fileToDelete = new File(fileName);
if (fileToDelete.isFile() && logFile) {
fileToDelete.delete();
}
}
/**
* to define the PSearch operation
* @param operation String
*/
public void setOperation(String operation) {
this.operation = operation;
}
public void setLdifFormat(boolean ldifFormat) {
this.ldifFormat = ldifFormat;
}
/**
*Connect to server.
*/
private void connect() {
try {
connection = new LDAPConnection();
connection.connect(3, hostname, portnumber, "", "");
connection.authenticate(3, bindDN, bindPW);
if(!ldifFormat)
write("[Thread id: " + threadId + "] \n" + getDate() + connection);
} catch (LDAPException ex) {
System.out.println("[Thread id: " + threadId + "] Connection :" + ex.getMessage());
System.exit(1);
}
}
/**
* to instanciate new LDAPPersistSearchControl
* @return LDAPPersistSearchControl
*/
private LDAPPersistSearchControl PSearchControl() {
int op = 0;
if (operation.equals(ALL)) {
op = LDAPPersistSearchControl.ADD |
LDAPPersistSearchControl.MODIFY |
LDAPPersistSearchControl.DELETE |
LDAPPersistSearchControl.MODDN;
} else if (operation.equals(ADD)) {
op = LDAPPersistSearchControl.ADD;
} else if (operation.equals(MODIFY)) {
op = LDAPPersistSearchControl.MODIFY;
} else if (operation.equals(DELETE)) {
op = LDAPPersistSearchControl.DELETE;
} else if (operation.equals(MODDN)) {
op = LDAPPersistSearchControl.MODDN;
}
boolean changesOnly = true;
boolean returnControls = true;
boolean isCritical = true;
LDAPPersistSearchControl persistCtrl =
new LDAPPersistSearchControl(
op,
changesOnly,
returnControls,
isCritical);
return persistCtrl;
}
/**
* LDAP Search
* @return LDAPSearchResults
*/
public LDAPSearchResults LDAPSearch() {
LDAPSearchResults res = null;
try {
LDAPPersistSearchControl persistCtrl = PSearchControl();
LDAPSearchConstraints cons = connection.getSearchConstraints();
cons.setBatchSize(1);
cons.setServerControls(persistCtrl);
// Start the persistent search.
res = connection.search(suffix, LDAPv3.SCOPE_SUB, "(objectclass=*)", null, false, cons);
} catch (LDAPException ex) {
System.out.println("[Thread id: " + threadId + "] LDAPSearch :" + ex.getMessage());
System.exit(1);
}
return res;
}
/**
* return the date and time
* @return String
*/
public static String getDate() {
// Initialize the today's date string
String DATE_FORMAT = "yyyy/MM/dd:HH:mm:ss";
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(DATE_FORMAT);
Calendar c1 = Calendar.getInstance(); // today
return ("[" + sdf.format(c1.getTime()) + "]");
}
/**
*
* @param b byte off control operation
* @return
*/
public String controlName(byte b) {
String control;
switch (b) {
case LDAPPersistSearchControl.ADD:
control = "ADD";
break;
case LDAPPersistSearchControl.DELETE:
control = "DELETE";
break;
case LDAPPersistSearchControl.MODDN:
control = "MODDN";
break;
case LDAPPersistSearchControl.MODIFY:
control = "MODIFY";
break;
default:
control = String.valueOf(b);
break;
}
return control;
}
/**
* to write on the log file or to use syteme out
* @param msg String
*/
public void write(String msg) {
if (output) {
System.out.println(msg);
}
if (logFile) {
FileWriter aWriter = null;
try {
aWriter = new FileWriter(fileName, true);
aWriter.write(msg + "\n");
aWriter.flush();
aWriter.close();
} catch (IOException ex) {
System.out.println("[Thread id: " + threadId + "]Write :" + ex.getMessage());
} finally {
try {
aWriter.close();
} catch (IOException ex) {
System.out.println("[Thread id: " + threadId + "]Write :" + ex.getMessage());
}
}
}
}
/**
* run thread methode
*/
public void run() {
connect();
LDAPSearchResults result = LDAPSearch();
while (result.hasMoreElements() && connection.isConnected()) {
byte[] arr = result.getResponseControls()[0].getValue();
LDAPEntry entry = (LDAPEntry) result.nextElement();
LDAPAttributeSet attrSet = entry.getAttributeSet();
Enumeration attrs = attrSet.getAttributes();
if (entry.getDN().contains("break")) {
String message = "\n[Thread id: " + threadId + "] " + getDate() + " [BREAK]";
if(!ldifFormat)
write(message);
System.exit(0);
} else if (entry.getDN().contains("stop")) {
try {
connection.disconnect();
String message = "\n[Thread id: " + threadId + "] " + getDate() + "[STOP]";
if(!ldifFormat)
write(message);
System.exit(0);
} catch (LDAPException ex) {
System.out.println("[Thread id: " + threadId + "]run :" + ex.getLDAPErrorMessage());
}
}
String message = "[Thread id: " + threadId + "] " + getDate() + " [" + controlName(arr[4]) + "]";
if(!ldifFormat)
write("\n" + message);
else
write("\n");
String dn = "dn: " + entry.getDN();
write(dn);
while (attrs.hasMoreElements()) {
LDAPAttribute attr = (LDAPAttribute) attrs.nextElement();
String name = attr.getName();
Enumeration values = attr.getStringValues();
while (values.hasMoreElements()) {
String attribute = name + ": " + values.nextElement();
write(attribute);
}
}
}
if (!connection.isConnected()) {
String message = "\n[Thread id: " + threadId + "] " + getDate() + "[CONNECTION CLOSE]";
write(message);
}
}
}