/*
|
* 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(0);
|
}
|
}
|
/**
|
* 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(0);
|
}
|
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);
|
}
|
}
|
}
|