LDAP: Additional Contact attributes

git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@696 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
mguessan 2009-09-03 23:08:35 +00:00
parent 4e9e374ea1
commit 693f4cb0ed
2 changed files with 113 additions and 27 deletions

View File

@ -144,6 +144,7 @@ public class ExchangeSession {
private static final String YYYY_MM_DD_HH_MM_SS = "yyyy/MM/dd HH:mm:ss";
private static final String YYYYMMDD_T_HHMMSS_Z = "yyyyMMdd'T'HHmmss'Z'";
private static final String YYYY_MM_DD_T_HHMMSS_Z = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private static final String YYYY_MM_DD_T_HHMMSS_SSS_Z = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
/**
* Create an exchange session for the given URL.
@ -217,6 +218,12 @@ public class ExchangeSession {
return dateFormat;
}
protected SimpleDateFormat getExchangeZuluDateFormatMillisecond() {
SimpleDateFormat dateFormat = new SimpleDateFormat(YYYY_MM_DD_T_HHMMSS_SSS_Z, Locale.ENGLISH);
dateFormat.setTimeZone(GMT_TIMEZONE);
return dateFormat;
}
protected Date parseDate(String dateString) throws ParseException {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
dateFormat.setTimeZone(GMT_TIMEZONE);
@ -2595,11 +2602,47 @@ public class ExchangeSession {
*/
public Map<String, Map<String, String>> contactFind(String searchFilter) throws IOException {
StringBuilder searchRequest = new StringBuilder();
searchRequest.append("Select \"DAV:uid\", \"urn:schemas:contacts:email1\", \"urn:schemas:contacts:cn\"," +
" \"urn:schemas:contacts:givenName\",\"urn:schemas:contacts:sn\", \"urn:schemas:contacts:title\"," +
"\"urn:schemas:contacts:o\", \"urn:schemas:contacts:location\", \"urn:schemas:contacts:department\"," +
"\"urn:schemas:contacts:telephoneNumber\", \"urn:schemas:contacts:initials\", \"urn:schemas:contacts:street\"," +
"\"urn:schemas:contacts:st\", \"urn:schemas:contacts:c\", \"urn:schemas:contacts:mobile\"")
searchRequest.append("Select \"DAV:uid\", " +
"\"http://schemas.microsoft.com/exchange/extensionattribute1\"," +
"\"http://schemas.microsoft.com/exchange/extensionattribute2\"," +
"\"http://schemas.microsoft.com/exchange/extensionattribute3\"," +
"\"http://schemas.microsoft.com/exchange/extensionattribute4\"," +
"\"urn:schemas:contacts:bday\"," +
"\"urn:schemas:contacts:businesshomepage\"," +
"\"urn:schemas:contacts:c\"," +
"\"urn:schemas:contacts:cn\"," +
"\"urn:schemas:contacts:co\"," +
"\"urn:schemas:contacts:department\"," +
"\"urn:schemas:contacts:email1\"," +
"\"urn:schemas:contacts:email2\"," +
"\"urn:schemas:contacts:facsimiletelephonenumber\"," +
"\"urn:schemas:contacts:givenName\"," +
"\"urn:schemas:contacts:homeCity\"," +
"\"urn:schemas:contacts:homeCountry\"," +
"\"urn:schemas:contacts:homePhone\"," +
"\"urn:schemas:contacts:homePostalCode\"," +
"\"urn:schemas:contacts:homeState\"," +
"\"urn:schemas:contacts:homeStreet\"," +
"\"urn:schemas:contacts:l\"," +
"\"urn:schemas:contacts:manager\"," +
"\"urn:schemas:contacts:mobile\"," +
"\"urn:schemas:contacts:namesuffix\"," +
"\"urn:schemas:contacts:nickname\"," +
"\"urn:schemas:contacts:o\"," +
"\"urn:schemas:contacts:pager\"," +
"\"urn:schemas:contacts:personaltitle\"," +
"\"urn:schemas:contacts:postalcode\"," +
"\"urn:schemas:contacts:postofficebox\"," +
"\"urn:schemas:contacts:profession\"," +
"\"urn:schemas:contacts:roomnumber\"," +
"\"urn:schemas:contacts:secretarycn\"," +
"\"urn:schemas:contacts:sn\"," +
"\"urn:schemas:contacts:spousecn\"," +
"\"urn:schemas:contacts:st\"," +
"\"urn:schemas:contacts:street\"," +
"\"urn:schemas:contacts:telephoneNumber\"," +
"\"urn:schemas:contacts:title\"," +
"\"urn:schemas:httpmail:textdescription\"")
.append(" FROM Scope('SHALLOW TRAVERSAL OF \"").append(contactsUrl).append("\"')\n");
if (searchFilter != null) {
searchRequest.append(" WHERE ").append(searchFilter);
@ -2618,16 +2661,29 @@ public class ExchangeSession {
DavProperty property = propertiesIterator.nextProperty();
String propertyName = property.getName().getName();
String propertyValue = (String) property.getValue();
if ("email1".equals(propertyName)) {
propertyName = "mail";
if (propertyName.startsWith("email")) {
if (propertyValue != null && propertyValue.startsWith("\"")) {
int endIndex = propertyValue.indexOf('\"', 1);
if (endIndex > 0) {
propertyValue = propertyValue.substring(1, endIndex);
}
}
} else if ("bday".equals(propertyName)) {
SimpleDateFormat parser = getExchangeZuluDateFormatMillisecond();
try {
Calendar calendar = Calendar.getInstance();
calendar.setTime(parser.parse(propertyValue));
item.put("birthday", String.valueOf(calendar.get(Calendar.DAY_OF_MONTH)));
item.put("birthmonth", String.valueOf(calendar.get(Calendar.MONTH)+1));
item.put("birthyear", String.valueOf(calendar.get(Calendar.YEAR)));
propertyValue = null;
} catch (ParseException e) {
throw new IOException(e);
}
}
if (propertyValue != null && propertyValue.length() > 0) {
item.put(propertyName, propertyValue);
}
item.put(propertyName, propertyValue);
}
results.put(item.get("uid"), item);
}

View File

@ -97,6 +97,27 @@ public class LdapConnection extends AbstractConnection {
ATTRIBUTE_MAP.put("mobile", "mobile");
}
static final HashMap<String, String> CONTACT_ATTRIBUTE_MAP = new HashMap<String, String>();
static {
CONTACT_ATTRIBUTE_MAP.put("co", "countryname");
CONTACT_ATTRIBUTE_MAP.put("extensionattribute1", "custom1");
CONTACT_ATTRIBUTE_MAP.put("extensionattribute2", "custom2");
CONTACT_ATTRIBUTE_MAP.put("extensionattribute3", "custom3");
CONTACT_ATTRIBUTE_MAP.put("extensionattribute4", "custom4");
CONTACT_ATTRIBUTE_MAP.put("email1", "mail");
CONTACT_ATTRIBUTE_MAP.put("email2", "xmozillasecondemail");
CONTACT_ATTRIBUTE_MAP.put("homeCountry", "mozillahomecountryname");
CONTACT_ATTRIBUTE_MAP.put("homeCity", "mozillahomelocalityname");
CONTACT_ATTRIBUTE_MAP.put("homePostalCode", "mozillahomepostalcode");
CONTACT_ATTRIBUTE_MAP.put("homeState", "mozillahomestate");
CONTACT_ATTRIBUTE_MAP.put("homeStreet", "mozillahomestreet");
CONTACT_ATTRIBUTE_MAP.put("businesshomepage", "mozillaworkurl");
CONTACT_ATTRIBUTE_MAP.put("textdescription", "notes");
CONTACT_ATTRIBUTE_MAP.put("nickname", "xmozillanickname");
}
static final HashMap<String, String> STATIC_ATTRIBUTE_MAP = new HashMap<String, String>();
static final String COMPUTER_GUID = "52486C30-F0AB-48E3-9C37-37E9B28CDD7B";
@ -734,30 +755,39 @@ public class LdapConnection extends AbstractConnection {
}
for (Map<String, String> person : persons.values()) {
// add detailed information, only for GAL entries
if (needDetails && person.get("AN") != null) {
session.galLookup(person);
}
returningAttributes.add("uid");
Map<String, Object> ldapPerson = new HashMap<String, Object>();
// Process all attributes that are mapped from exchange
// convert GAL entries
if (person.get("AN") != null) {
// add detailed information, only for GAL entries
if (needDetails) {
session.galLookup(person);
}
// Process all attributes that are mapped from exchange
for (Map.Entry<String, String> entry : ATTRIBUTE_MAP.entrySet()) {
String ldapAttribute = entry.getKey();
String exchangeAttribute = entry.getValue();
String value = person.get(exchangeAttribute);
// contactFind return ldap attributes directly
if (value == null) {
value = person.get(ldapAttribute);
}
if (value != null
&& (returnAllAttributes || returningAttributes.contains(ldapAttribute.toLowerCase()))) {
ldapPerson.put(ldapAttribute, value);
}
}
} else {
// convert Contact entries
for (Map.Entry<String, String> entry : person.entrySet()) {
String contactAttribute = entry.getKey();
String ldapAttribute = CONTACT_ATTRIBUTE_MAP.get(contactAttribute);
String value = entry.getValue();
ldapPerson.put(ldapAttribute == null ? contactAttribute : ldapAttribute, value);
}
for (Map.Entry<String, String> entry : ATTRIBUTE_MAP.entrySet()) {
String ldapAttribute = entry.getKey();
String exchangeAttribute = entry.getValue();
String value = person.get(exchangeAttribute);
// contactFind return ldap attributes directly
if (value == null) {
value = person.get(ldapAttribute);
}
if (value != null
&& (returnAllAttributes || returningAttributes.contains(ldapAttribute.toLowerCase()))) {
ldapPerson.put(ldapAttribute, value);
}
}
// iCal: copy cn to sn
if (iCalSearch && ldapPerson.get("cn") != null) {