mirror of
https://github.com/moparisthebest/davmail
synced 2024-12-13 19:22:22 -05:00
EWS: MultiCondition galFind
git-svn-id: http://svn.code.sf.net/p/davmail/code/trunk@1331 3d1905a2-6b24-0410-a738-b14d5a86fcbd
This commit is contained in:
parent
9513f997dd
commit
19865c50b0
@ -649,6 +649,14 @@ public abstract class ExchangeSession {
|
|||||||
* @return true if condition is empty
|
* @return true if condition is empty
|
||||||
*/
|
*/
|
||||||
public boolean isEmpty();
|
public boolean isEmpty();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if the contact matches current condition.
|
||||||
|
*
|
||||||
|
* @param contact Exchange Contact
|
||||||
|
* @return true if contact matches condition
|
||||||
|
*/
|
||||||
|
public abstract boolean isMatch(ExchangeSession.Contact contact);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -708,6 +716,27 @@ public abstract class ExchangeSession {
|
|||||||
}
|
}
|
||||||
return isEmpty;
|
return isEmpty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isMatch(ExchangeSession.Contact contact) {
|
||||||
|
if (operator == Operator.And) {
|
||||||
|
for (Condition condition : conditions) {
|
||||||
|
if (!condition.isMatch(contact)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
} else if (operator == Operator.Or) {
|
||||||
|
for (Condition condition : conditions) {
|
||||||
|
if (condition.isMatch(contact)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -724,6 +753,9 @@ public abstract class ExchangeSession {
|
|||||||
return condition.isEmpty();
|
return condition.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isMatch(ExchangeSession.Contact contact) {
|
||||||
|
return !condition.isMatch(contact);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -741,6 +773,19 @@ public abstract class ExchangeSession {
|
|||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isMatch(ExchangeSession.Contact contact) {
|
||||||
|
String actualValue = contact.get(attributeName);
|
||||||
|
if (operator == Operator.IsNull) {
|
||||||
|
return actualValue == null;
|
||||||
|
} else if (operator == Operator.IsFalse) {
|
||||||
|
return "false".equals(actualValue);
|
||||||
|
} else if (operator == Operator.IsTrue) {
|
||||||
|
return "true".equals(actualValue);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -449,6 +449,24 @@ public class DavExchangeSession extends ExchangeSession {
|
|||||||
buffer.append('\'');
|
buffer.append('\'');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isMatch(ExchangeSession.Contact contact) {
|
||||||
|
String lowerCaseValue = value.toLowerCase();
|
||||||
|
String actualValue = contact.get(attributeName);
|
||||||
|
if (actualValue == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
actualValue = actualValue.toLowerCase();
|
||||||
|
if (operator == Operator.IsEqualTo) {
|
||||||
|
return actualValue.equals(lowerCaseValue);
|
||||||
|
} else if (operator == Operator.Like) {
|
||||||
|
return actualValue.contains(lowerCaseValue);
|
||||||
|
} else if (operator == Operator.StartsWith) {
|
||||||
|
return actualValue.startsWith(lowerCaseValue);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static class HeaderCondition extends AttributeCondition {
|
protected static class HeaderCondition extends AttributeCondition {
|
||||||
|
@ -315,6 +315,14 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Condition> getConditions() {
|
||||||
|
return conditions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Operator getOperator() {
|
||||||
|
return operator;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static class NotCondition extends ExchangeSession.NotCondition implements SearchExpression {
|
protected static class NotCondition extends ExchangeSession.NotCondition implements SearchExpression {
|
||||||
@ -389,9 +397,22 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
return attributeName;
|
return attributeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ContainmentMode getContainmentMode() {
|
public boolean isMatch(ExchangeSession.Contact contact) {
|
||||||
return containmentMode;
|
String lowerCaseValue = value.toLowerCase();
|
||||||
|
|
||||||
|
String actualValue = contact.get(attributeName);
|
||||||
|
if (actualValue == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
actualValue = actualValue.toLowerCase();
|
||||||
|
if (operator == Operator.IsEqualTo) {
|
||||||
|
return value.equals(actualValue);
|
||||||
|
} else {
|
||||||
|
return operator == Operator.Contains && ((containmentMode.equals(ContainmentMode.Substring) && actualValue.contains(lowerCaseValue)) ||
|
||||||
|
(containmentMode.equals(ContainmentMode.Prefixed) && actualValue.startsWith(lowerCaseValue)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static class HeaderCondition extends AttributeCondition {
|
protected static class HeaderCondition extends AttributeCondition {
|
||||||
@ -424,6 +445,11 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isMatch(ExchangeSession.Contact contact) {
|
||||||
|
String actualValue = contact.get(attributeName);
|
||||||
|
return actualValue == null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -704,7 +730,7 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
/**
|
/**
|
||||||
* Empty constructor for GalFind
|
* Empty constructor for GalFind
|
||||||
*/
|
*/
|
||||||
public Contact() {
|
protected Contact() {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Set<FieldUpdate> buildProperties() {
|
protected Set<FieldUpdate> buildProperties() {
|
||||||
@ -1246,14 +1272,40 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
GALFIND_ATTRIBUTE_MAP.put("email3", "EmailAddress1");
|
GALFIND_ATTRIBUTE_MAP.put("email3", "EmailAddress1");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<ExchangeSession.Contact> galFind(Condition condition) throws IOException {
|
protected Contact buildGalfindContact(EWSMethod.Item response) {
|
||||||
List<ExchangeSession.Contact> contacts = new ArrayList<ExchangeSession.Contact>();
|
Contact contact = new Contact();
|
||||||
if (condition instanceof AttributeCondition) {
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return contact;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Map<String, ExchangeSession.Contact> galFind(Condition condition) throws IOException {
|
||||||
|
Map<String, ExchangeSession.Contact> contacts = new HashMap<String, ExchangeSession.Contact>();
|
||||||
|
if (condition instanceof MultiCondition) {
|
||||||
|
List<Condition> conditions = ((MultiCondition) condition).getConditions();
|
||||||
|
Operator operator = ((MultiCondition) condition).getOperator();
|
||||||
|
if (operator == Operator.Or) {
|
||||||
|
for (Condition innerCondition : conditions) {
|
||||||
|
contacts.putAll(galFind(innerCondition));
|
||||||
|
}
|
||||||
|
} else if (operator == Operator.And && !conditions.isEmpty()) {
|
||||||
|
Map<String, ExchangeSession.Contact> innerContacts = galFind(conditions.get(0));
|
||||||
|
for (ExchangeSession.Contact contact : innerContacts.values()) {
|
||||||
|
if (condition.isMatch(contact)) {
|
||||||
|
contacts.put(contact.getName(), contact);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (condition instanceof AttributeCondition) {
|
||||||
String mappedAttributeName = GALFIND_ATTRIBUTE_MAP.get(((AttributeCondition) condition).getAttributeName());
|
String mappedAttributeName = GALFIND_ATTRIBUTE_MAP.get(((AttributeCondition) condition).getAttributeName());
|
||||||
if (mappedAttributeName != null) {
|
if (mappedAttributeName != null) {
|
||||||
String value = ((AttributeCondition) condition).getValue().toLowerCase();
|
String value = ((AttributeCondition) condition).getValue().toLowerCase();
|
||||||
Operator operator = ((AttributeCondition) condition).getOperator();
|
Operator operator = ((AttributeCondition) condition).getOperator();
|
||||||
ContainmentMode containmentMode = ((AttributeCondition) condition).getContainmentMode();
|
|
||||||
String searchValue = value;
|
String searchValue = value;
|
||||||
if (mappedAttributeName.startsWith("EmailAddress")) {
|
if (mappedAttributeName.startsWith("EmailAddress")) {
|
||||||
searchValue = "smtp:" + searchValue;
|
searchValue = "smtp:" + searchValue;
|
||||||
@ -1265,27 +1317,9 @@ public class EwsExchangeSession extends ExchangeSession {
|
|||||||
executeMethod(resolveNamesMethod);
|
executeMethod(resolveNamesMethod);
|
||||||
List<EWSMethod.Item> responses = resolveNamesMethod.getResponseItems();
|
List<EWSMethod.Item> responses = resolveNamesMethod.getResponseItems();
|
||||||
for (EWSMethod.Item response : responses) {
|
for (EWSMethod.Item response : responses) {
|
||||||
String actualValue = response.get(mappedAttributeName);
|
Contact contact = buildGalfindContact(response);
|
||||||
if (actualValue != null) {
|
if (condition.isMatch(contact)) {
|
||||||
actualValue = actualValue.toLowerCase();
|
contacts.put(contact.getName(), contact);
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import davmail.exchange.ExchangeSession;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Webdav specific unit tests
|
* Webdav specific unit tests
|
||||||
@ -47,18 +48,21 @@ public class TestEwsExchangeSession extends AbstractExchangeSessionTestCase {
|
|||||||
|
|
||||||
public void testGalFind() throws IOException {
|
public void testGalFind() throws IOException {
|
||||||
// find a set of contacts
|
// find a set of contacts
|
||||||
List<ExchangeSession.Contact> contacts = ewsSession.galFind(ewsSession.startsWith("cn", "a"));
|
Map<String, ExchangeSession.Contact> contacts = ewsSession.galFind(ewsSession.startsWith("cn", "a"));
|
||||||
for (ExchangeSession.Contact contact : contacts) {
|
for (ExchangeSession.Contact contact : contacts.values()) {
|
||||||
System.out.println(contact);
|
System.out.println(contact);
|
||||||
}
|
}
|
||||||
if (contacts.size() > 0) {
|
if (!contacts.isEmpty()) {
|
||||||
ExchangeSession.Contact testContact = contacts.get(0);
|
ExchangeSession.Contact testContact = contacts.values().iterator().next();
|
||||||
contacts = ewsSession.galFind(ewsSession.isEqualTo("cn", testContact.get("cn")));
|
contacts = ewsSession.galFind(ewsSession.isEqualTo("cn", testContact.get("cn")));
|
||||||
assertEquals(1, contacts.size());
|
assertEquals(1, contacts.size());
|
||||||
contacts = ewsSession.galFind(ewsSession.isEqualTo("email1", testContact.get("email1")));
|
contacts = ewsSession.galFind(ewsSession.isEqualTo("email1", testContact.get("email1")));
|
||||||
assertEquals(1, contacts.size());
|
assertEquals(1, contacts.size());
|
||||||
contacts = ewsSession.galFind(ewsSession.startsWith("email1", testContact.get("email1")));
|
contacts = ewsSession.galFind(ewsSession.startsWith("email1", testContact.get("email1")));
|
||||||
assertEquals(1, contacts.size());
|
assertEquals(1, contacts.size());
|
||||||
|
contacts = ewsSession.galFind(ewsSession.and(ewsSession.isEqualTo("cn", testContact.get("cn")),
|
||||||
|
ewsSession.startsWith("email1", testContact.get("email1"))));
|
||||||
|
assertEquals(1, contacts.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user