Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.mylyn.reviews.r4e.ldap/src/org/eclipse/mylyn/reviews/ldap/internal/queryUtility/QueryGlobalLdapDirectory.java')
-rw-r--r--org.eclipse.mylyn.reviews.r4e.ldap/src/org/eclipse/mylyn/reviews/ldap/internal/queryUtility/QueryGlobalLdapDirectory.java287
1 files changed, 287 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.reviews.r4e.ldap/src/org/eclipse/mylyn/reviews/ldap/internal/queryUtility/QueryGlobalLdapDirectory.java b/org.eclipse.mylyn.reviews.r4e.ldap/src/org/eclipse/mylyn/reviews/ldap/internal/queryUtility/QueryGlobalLdapDirectory.java
new file mode 100644
index 00000000..41bc7682
--- /dev/null
+++ b/org.eclipse.mylyn.reviews.r4e.ldap/src/org/eclipse/mylyn/reviews/ldap/internal/queryUtility/QueryGlobalLdapDirectory.java
@@ -0,0 +1,287 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ericsson Research Canada
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Description:
+ *
+ * This class accesses the LDAP (Lightweight Directory Access Protocol)
+ * database according to the the database field provided on the
+ * preference store.
+ *
+ * Contributors:
+ * Jacques Bouthillier - Query the LDAP database based on the field description.
+ *
+ *******************************************************************************/
+package org.eclipse.mylyn.reviews.ldap.internal.queryUtility;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.naming.Context;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.directory.Attributes;
+import javax.naming.directory.DirContext;
+import javax.naming.directory.InitialDirContext;
+import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
+
+import org.eclipse.mylyn.reviews.ldap.Activator;
+import org.eclipse.mylyn.reviews.ldap.internal.preferences.R4ELdapPreferencePage;
+import org.eclipse.mylyn.reviews.ldap.internal.util.R4EString;
+import org.eclipse.mylyn.reviews.userSearch.query.IQueryUser;
+import org.eclipse.mylyn.reviews.userSearch.userInfo.IUserInfo;
+import org.eclipse.mylyn.reviews.userSearch.userInfo.UserInformationFactory;
+
+/**
+ * Allow to search the LDAP employee database
+ */
+
+/**
+ * @author Jacques Bouthillier
+ */
+public class QueryGlobalLdapDirectory implements IQueryUser {
+
+ private R4ELdapPreferencePage fLdap = new R4ELdapPreferencePage();
+
+ /**
+ * Search in the Employee Global Directory with all search parameters having a string different than the empty
+ * string (""). The search is done with a logical AND between parameters and all parameters are searched with the
+ * regular expression *<parameter>*. Search parameters cannot be null and should have an empty String ("") if the
+ * search should skip them.
+ *
+ * @param a_inUserID
+ * @param a_inName
+ * @param a_inCompany
+ * @param a_inOffice
+ * @param a_inDepartement
+ * @param a_inCountry
+ * @param a_inCity
+ *
+ * @return ArrayList<IUserInfo> The max seems to be 1200 users, may be empty.
+ * @throws IOException
+ */
+
+ public ArrayList<IUserInfo> search(String a_inUserID, String a_inName, String a_inCompany, String a_inOffice,
+ String a_inDepartement, String a_inCountry, String a_inCity) throws NamingException, IOException {
+ ArrayList<IUserInfo> userList = new ArrayList<IUserInfo>(
+ 50);
+ Hashtable<String, String> env = new Hashtable<String, String>();
+
+ env = (Hashtable<String, String>) getConnectionProperties();
+ DirContext ctx = new InitialDirContext(env);
+
+ // Grammar filter can be found at http://www.ietf.org/rfc/rfc2254.txt
+ StringBuilder filter = new StringBuilder(150);
+ filter.append('(');
+ if (a_inUserID != null && !a_inUserID.equals("")) {
+ filter.append("&(" + fLdap.getFieldUserId() + "=" + a_inUserID + "*)");
+ }
+ if (a_inName != null && !a_inName.equals("")) {
+ filter.append("&(" + fLdap.getFieldUserName() + "=" + a_inName + "*)");
+ }
+ if (a_inCompany != null && !a_inCompany.equals("")) {
+ filter.append("&(" + fLdap.getFieldCompany() + "=*" + a_inCompany + "*)");
+ }
+ if (a_inOffice != null && !a_inOffice.equals("")) {
+ filter.append("&(" + fLdap.getFieldOfficeName() + "=*" + a_inOffice
+ + "*)");
+ }
+ if (a_inDepartement != null && !a_inDepartement.equals("")) {
+ filter.append("&(" + fLdap.getFieldDepartment() + "=" + a_inDepartement
+ + "*)");
+ }
+ if (a_inCountry != null && !a_inCountry.equals("")) {
+ filter.append("&(" + fLdap.getFieldCountry() + "=*" + a_inCountry + "*)");
+ }
+ if (a_inCity != null && !a_inCity.equals("")) {
+ filter.append("&(" + fLdap.getFieldCity() + "=" + a_inCity + "*)");
+ }
+
+ filter.append(')');
+
+ Activator.FTracer.traceInfo("Filter search:" + filter);
+ // Order of data field received from querying the LDAP database
+ String[] returningAttributes = {
+ fLdap.getFieldUserId(), // uid
+ fLdap.getFieldUserName(),
+ fLdap.getFieldCompany(), // "ou",
+ fLdap.getFieldCity(), // "L"
+ fLdap.getFieldDepartment(), // "departmentNumber",
+ fLdap.getFieldCountry(),
+ fLdap.getFieldOfficeName(), // "physicalDeliveryOfficeName",
+ fLdap.getFieldTelephone(), // "telephoneNumber",
+ fLdap.getFieldECN(),
+ fLdap.getFieldMobile(), // "mobile"
+ fLdap.getFieldRoom(), // "roomNumber"
+ fLdap.getFieldOfficeName(), fLdap.getFieldStreetAddress(), fLdap.getFieldTitle(),
+ fLdap.getFieldEmail(), // "mail"
+ fLdap.getFieldDomain(), fLdap.getFieldTitle() };
+ SearchControls mySearchControl = new SearchControls(2, 0, 30000,
+ returningAttributes, false, false); //
+
+ // String dn = "DC=[cie],DC=se";
+ String dn = fLdap.getBaseId();
+ NamingEnumeration<SearchResult> result = ctx.search(dn,
+ filter.toString(), mySearchControl);
+
+ Attributes userAttribs;
+
+ while (result.hasMore()) {
+ userAttribs = (result.next()).getAttributes();
+
+ // Test if we have an e-mail. If not, we do not
+ // add it since we will not be able to send an e-mail to it
+ if (userAttribs.get(fLdap.getFieldEmail()) != null) {
+ IUserInfo userData = UserInformationFactory.getInstance();
+ userList.add(userData.setData(
+ userAttribs.get(fLdap.getFieldUserId()), // "cn"
+ userAttribs.get(fLdap.getFieldUserName()),
+ userAttribs.get(fLdap.getFieldCompany()),// company "ou"
+ userAttribs.get(fLdap.getFieldOfficeName()), // "L"
+ userAttribs.get(fLdap.getFieldDepartment()), // "departmentNumber"
+ userAttribs.get(fLdap.getFieldCountry()),
+ userAttribs.get(fLdap.getFieldCity()), // "physicalDeliveryOfficeName"
+ userAttribs.get(fLdap.getFieldECN()),
+ userAttribs.get(fLdap.getFieldTelephone()), userAttribs.get(fLdap.getFieldMobile()),
+ userAttribs.get(fLdap.getFieldRoom()), userAttribs.get(fLdap.getFieldEmail()), userAttribs
+ .get(fLdap.getFieldDomain()), userAttribs.get(fLdap.getFieldTitle())));
+
+ } else {
+ // Activator.FTracer
+ // .traceWarning("Warning: " + "No E-mail for " + userAttribs.get(fLdap.getFieldUserId()));
+ }
+ }
+
+ // Close the DirContext
+ ctx.close();
+ env.clear();
+ return userList;
+ }
+
+ /**
+ * Perform a query from the database using the user Id only
+ *
+ * @param aUerId
+ * @return ArrayList<IUserInfo>
+ * @throws NamingException
+ * @throws IOException
+ */
+ public ArrayList<IUserInfo> searchByUserId(String aUserId) throws NamingException, IOException {
+ ArrayList<IUserInfo> list = null;
+ if (aUserId == null || aUserId.equals("")) {
+ throw new IOException(R4EString.getString("messageError1") + R4EString.getString("noUserIdProvided"));
+ }
+ list = search(aUserId, // User Id
+ "", // User Name
+ "", // Company name
+ "", // Office
+ "", // Department
+ "", // Country
+ "");
+ return list;
+
+ }
+
+ /**
+ * Perform a query from the database using the user Name only
+ *
+ * @param aUerId
+ * @return ArrayList<IUserInfo>
+ * @throws NamingException
+ * @throws IOException
+ */
+ public ArrayList<IUserInfo> searchByUserName(String aUserName) throws NamingException, IOException {
+ ArrayList<IUserInfo> list = null;
+ if (aUserName == null || aUserName.equals("")) {
+ throw new IOException(R4EString.getString("messageError1") + R4EString.getString("noUserNameProvided"));
+ }
+
+ list = search("", // User Id
+ aUserName, // User Name
+ "", // Company name
+ "", // Office
+ "", // Department
+ "", // Country
+ "");
+ return list;
+
+ }
+
+ /**
+ * Get the information about the server information
+ *
+ * @return String
+ * @throws IOException
+ */
+ private String getProviderURL() throws IOException {
+ // "ldap://localhost:389"
+ final StringBuffer sb = new StringBuffer(150);
+
+ // Server information
+ String serverInfo = fLdap.getServerInfo();
+ if (serverInfo != null) {
+ sb.append(serverInfo); // New LDAP
+ } else {
+ // XX May log an error here since the LDAP server is not defined in the property
+ Activator.FTracer.traceWarning("Warning " + R4EString.getString("messageError4"));
+ }
+ // sb.append("ldap://127.0.0.1:3268"); // To test internally
+
+ return sb.toString();
+ }
+
+ /**
+ * Set the environment properties
+ *
+ * @return Map environment
+ * @throws IOException
+ */
+ private Map<String, String> getConnectionProperties() throws IOException {
+ final Map<String, String> env = new Hashtable<String, String>();
+ env.put(Context.INITIAL_CONTEXT_FACTORY,
+ "com.sun.jndi.ldap.LdapCtxFactory"); //$NON-NLS-1$
+ env.put(Context.PROVIDER_URL, getProviderURL());
+
+ // sowieso default
+ // env.put(Context.SECURITY_AUTHENTICATION, "none");
+
+ // Authentication: "none", "simple", "strong".
+ env.put(Context.SECURITY_AUTHENTICATION, fLdap.getAuthentication());
+ Activator.FTracer.traceInfo("Info: " + "User: " + fLdap.getUserName()
+ + "\t Authentication: " + fLdap.getAuthentication());
+ env.put(Context.SECURITY_PRINCIPAL, fLdap.getUserName());
+ env.put(Context.SECURITY_CREDENTIALS, fLdap.getPassword());
+
+ return env;
+ }
+
+ public void main(String argv[]) {
+ ArrayList<IUserInfo> userList = null;
+
+ try {
+ QueryGlobalLdapDirectory ericGlobalDir = new QueryGlobalLdapDirectory();
+ try {
+ userList = ericGlobalDir.search("", "", "", "", "", "", "");
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ for (int i = 0; i < userList.size(); i++) {
+ System.out.println(userList.get(i) + ", "
+ + userList.get(i).getNTDomain());
+ }
+
+ } catch (NamingException exc) {
+ System.out.println("Error when searching in the LDAP Global Directory");
+ }
+
+ }
+
+} \ No newline at end of file

Back to the top