mirror of
https://github.com/moparisthebest/davmail
synced 2024-12-13 11:12:22 -05:00
EWS: implement basic galFind search
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1330 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
889673e3e3
commit
9513f997dd
@ -27,6 +27,11 @@ public class ContainmentMode extends AttributeOption {
|
|||||||
super("ContainmentMode", value);
|
super("ContainmentMode", value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Full String.
|
* Full String.
|
||||||
*/
|
*/
|
||||||
|
@ -554,6 +554,7 @@ public abstract class EWSMethod extends PostMethod {
|
|||||||
if (errorDetail != null) {
|
if (errorDetail != null) {
|
||||||
if (!"ErrorAccessDenied".equals(errorDetail)
|
if (!"ErrorAccessDenied".equals(errorDetail)
|
||||||
&& !"ErrorNameResolutionMultipleResults".equals(errorDetail)
|
&& !"ErrorNameResolutionMultipleResults".equals(errorDetail)
|
||||||
|
&& !"ErrorNameResolutionNoResults".equals(errorDetail)
|
||||||
&& !"ErrorMailRecipientNotFound".equals(errorDetail)) {
|
&& !"ErrorMailRecipientNotFound".equals(errorDetail)) {
|
||||||
try {
|
try {
|
||||||
throw new EWSException(errorDetail + "\n request: " + new String(generateSoapEnvelope(), "UTF-8"));
|
throw new EWSException(errorDetail + "\n request: " + new String(generateSoapEnvelope(), "UTF-8"));
|
||||||
@ -818,7 +819,7 @@ public abstract class EWSMethod extends PostMethod {
|
|||||||
logger.error("Error while parsing soap response: " + e, e);
|
logger.error("Error while parsing soap response: " + e, e);
|
||||||
}
|
}
|
||||||
if (errorDetail != null) {
|
if (errorDetail != null) {
|
||||||
logger.error(errorDetail);
|
logger.debug(errorDetail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -345,7 +345,7 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
this.containmentComparison = containmentComparison;
|
this.containmentComparison = containmentComparison;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected FieldURI getFieldURI(String attributeName) {
|
protected FieldURI getFieldURI() {
|
||||||
FieldURI fieldURI = Field.get(attributeName);
|
FieldURI fieldURI = Field.get(attributeName);
|
||||||
if (fieldURI == null) {
|
if (fieldURI == null) {
|
||||||
throw new IllegalArgumentException("Unknown field: " + attributeName);
|
throw new IllegalArgumentException("Unknown field: " + attributeName);
|
||||||
@ -353,6 +353,14 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
return fieldURI;
|
return fieldURI;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Operator getOperator() {
|
||||||
|
return operator;
|
||||||
|
}
|
||||||
|
|
||||||
public void appendTo(StringBuilder buffer) {
|
public void appendTo(StringBuilder buffer) {
|
||||||
buffer.append("<t:").append(operator.toString());
|
buffer.append("<t:").append(operator.toString());
|
||||||
if (containmentMode != null) {
|
if (containmentMode != null) {
|
||||||
@ -362,7 +370,7 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
containmentComparison.appendTo(buffer);
|
containmentComparison.appendTo(buffer);
|
||||||
}
|
}
|
||||||
buffer.append('>');
|
buffer.append('>');
|
||||||
FieldURI fieldURI = getFieldURI(attributeName);
|
FieldURI fieldURI = getFieldURI();
|
||||||
fieldURI.appendTo(buffer);
|
fieldURI.appendTo(buffer);
|
||||||
|
|
||||||
buffer.append("<t:FieldURIOrConstant><t:Constant Value=\"");
|
buffer.append("<t:FieldURIOrConstant><t:Constant Value=\"");
|
||||||
@ -376,6 +384,14 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
|
|
||||||
buffer.append("</t:").append(operator.toString()).append('>');
|
buffer.append("</t:").append(operator.toString()).append('>');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getAttributeName() {
|
||||||
|
return attributeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContainmentMode getContainmentMode() {
|
||||||
|
return containmentMode;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static class HeaderCondition extends AttributeCondition {
|
protected static class HeaderCondition extends AttributeCondition {
|
||||||
@ -385,7 +401,7 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected FieldURI getFieldURI(String attributeName) {
|
protected FieldURI getFieldURI() {
|
||||||
return new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.InternetHeaders, attributeName);
|
return new ExtendedFieldURI(ExtendedFieldURI.DistinguishedPropertySetType.InternetHeaders, attributeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -685,6 +701,12 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
super(folderPath, itemName, properties, etag, noneMatch);
|
super(folderPath, itemName, properties, etag, noneMatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty constructor for GalFind
|
||||||
|
*/
|
||||||
|
public Contact() {
|
||||||
|
}
|
||||||
|
|
||||||
protected Set<FieldUpdate> buildProperties() {
|
protected Set<FieldUpdate> buildProperties() {
|
||||||
HashSet<FieldUpdate> list = new HashSet<FieldUpdate>();
|
HashSet<FieldUpdate> list = new HashSet<FieldUpdate>();
|
||||||
for (Map.Entry<String, String> entry : entrySet()) {
|
for (Map.Entry<String, String> entry : entrySet()) {
|
||||||
@ -804,6 +826,10 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
|
|
||||||
return itemResult;
|
return itemResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.itemName = name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected class Event extends ExchangeSession.Event {
|
protected class Event extends ExchangeSession.Event {
|
||||||
@ -1209,6 +1235,64 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static final HashMap<String, String> GALFIND_ATTRIBUTE_MAP = new HashMap<String, String>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
GALFIND_ATTRIBUTE_MAP.put("cn", "DisplayName");
|
||||||
|
GALFIND_ATTRIBUTE_MAP.put("givenName", "GivenName");
|
||||||
|
GALFIND_ATTRIBUTE_MAP.put("sn", "Surname");
|
||||||
|
GALFIND_ATTRIBUTE_MAP.put("email1", "EmailAddress1");
|
||||||
|
GALFIND_ATTRIBUTE_MAP.put("email2", "EmailAddress1");
|
||||||
|
GALFIND_ATTRIBUTE_MAP.put("email3", "EmailAddress1");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<ExchangeSession.Contact> galFind(Condition condition) throws IOException {
|
||||||
|
List<ExchangeSession.Contact> contacts = new ArrayList<ExchangeSession.Contact>();
|
||||||
|
if (condition instanceof AttributeCondition) {
|
||||||
|
String mappedAttributeName = GALFIND_ATTRIBUTE_MAP.get(((AttributeCondition) condition).getAttributeName());
|
||||||
|
if (mappedAttributeName != null) {
|
||||||
|
String value = ((AttributeCondition) condition).getValue().toLowerCase();
|
||||||
|
Operator operator = ((AttributeCondition) condition).getOperator();
|
||||||
|
ContainmentMode containmentMode = ((AttributeCondition) condition).getContainmentMode();
|
||||||
|
String searchValue = value;
|
||||||
|
if (mappedAttributeName.startsWith("EmailAddress")) {
|
||||||
|
searchValue = "smtp:" + searchValue;
|
||||||
|
}
|
||||||
|
if (operator == Operator.IsEqualTo) {
|
||||||
|
searchValue = '=' + searchValue;
|
||||||
|
}
|
||||||
|
ResolveNamesMethod resolveNamesMethod = new ResolveNamesMethod(searchValue);
|
||||||
|
executeMethod(resolveNamesMethod);
|
||||||
|
List<EWSMethod.Item> responses = resolveNamesMethod.getResponseItems();
|
||||||
|
for (EWSMethod.Item response : responses) {
|
||||||
|
String actualValue = response.get(mappedAttributeName);
|
||||||
|
if (actualValue != null) {
|
||||||
|
actualValue = actualValue.toLowerCase();
|
||||||
|
}
|
||||||
|
if (actualValue != null && (
|
||||||
|
(operator == Operator.IsEqualTo && value.equals(actualValue)) ||
|
||||||
|
(operator == Operator.Contains && containmentMode == ContainmentMode.Substring && actualValue.contains(value)) |
|
||||||
|
(operator == Operator.Contains && containmentMode == ContainmentMode.Prefixed && actualValue.startsWith(value))
|
||||||
|
)) {
|
||||||
|
Contact contact = new Contact();
|
||||||
|
contact.setName(response.get("DisplayName"));
|
||||||
|
for (Map.Entry<String, String> entry : GALFIND_ATTRIBUTE_MAP.entrySet()) {
|
||||||
|
String attributeValue = response.get(entry.getValue());
|
||||||
|
if (attributeValue != null) {
|
||||||
|
contact.put(entry.getKey(), attributeValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
contacts.add(contact);
|
||||||
|
} else if (LOGGER.isDebugEnabled()) {
|
||||||
|
LOGGER.debug("Actual value " + actualValue + " does not match " +
|
||||||
|
mappedAttributeName + ' ' + operator + ' ' + containmentMode + ' ' + value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return contacts;
|
||||||
|
}
|
||||||
|
|
||||||
protected String convertDateFromExchange(String exchangeDateValue) throws DavMailException {
|
protected String convertDateFromExchange(String exchangeDateValue) throws DavMailException {
|
||||||
String zuluDateValue = null;
|
String zuluDateValue = null;
|
||||||
if (exchangeDateValue != null) {
|
if (exchangeDateValue != null) {
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
package davmail.exchange.ews;
|
package davmail.exchange.ews;
|
||||||
|
|
||||||
import davmail.exchange.AbstractExchangeSessionTestCase;
|
import davmail.exchange.AbstractExchangeSessionTestCase;
|
||||||
|
import davmail.exchange.ExchangeSession;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -43,4 +44,22 @@ public class TestEwsExchangeSession extends AbstractExchangeSessionTestCase {
|
|||||||
System.out.println(item);
|
System.out.println(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testGalFind() throws IOException {
|
||||||
|
// find a set of contacts
|
||||||
|
List<ExchangeSession.Contact> contacts = ewsSession.galFind(ewsSession.startsWith("cn", "a"));
|
||||||
|
for (ExchangeSession.Contact contact : contacts) {
|
||||||
|
System.out.println(contact);
|
||||||
|
}
|
||||||
|
if (contacts.size() > 0) {
|
||||||
|
ExchangeSession.Contact testContact = contacts.get(0);
|
||||||
|
contacts = ewsSession.galFind(ewsSession.isEqualTo("cn", testContact.get("cn")));
|
||||||
|
assertEquals(1, contacts.size());
|
||||||
|
contacts = ewsSession.galFind(ewsSession.isEqualTo("email1", testContact.get("email1")));
|
||||||
|
assertEquals(1, contacts.size());
|
||||||
|
contacts = ewsSession.galFind(ewsSession.startsWith("email1", testContact.get("email1")));
|
||||||
|
assertEquals(1, contacts.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user