opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Config.java
@@ -16,24 +16,17 @@ package org.forgerock.opendj.rest2ldap; import org.forgerock.opendj.ldap.DecodeOptions; import org.forgerock.opendj.ldap.Filter; import org.forgerock.opendj.ldap.schema.Schema; /** * Common configuration options. */ final class Config { private final Filter falseFilter; private final DecodeOptions options; private final ReadOnUpdatePolicy readOnUpdatePolicy; private final Schema schema; private final Filter trueFilter; Config(final Filter trueFilter, final Filter falseFilter, final ReadOnUpdatePolicy readOnUpdatePolicy, final Schema schema) { this.trueFilter = trueFilter; this.falseFilter = falseFilter; Config(final ReadOnUpdatePolicy readOnUpdatePolicy, final Schema schema) { this.readOnUpdatePolicy = readOnUpdatePolicy; this.schema = schema; this.options = new DecodeOptions().setSchema(schema); @@ -51,16 +44,6 @@ } /** * Returns the absolute false filter which should be used when querying the * LDAP server. * * @return The absolute false filter. */ public Filter falseFilter() { return falseFilter; } /** * Returns the policy which should be used in order to read an entry before * it is deleted, or after it is added or modified. * @@ -81,29 +64,4 @@ public Schema schema() { return schema; } /** * {@inheritDoc} */ @Override public String toString() { final StringBuilder builder = new StringBuilder(); builder.append("trueFilter="); builder.append(trueFilter); builder.append(", falseFilter="); builder.append(falseFilter); builder.append(", readOnUpdatePolicy="); builder.append(readOnUpdatePolicy); return builder.toString(); } /** * Returns the absolute true filter which should be used when querying the * LDAP server. * * @return The absolute true filter. */ public Filter trueFilter() { return trueFilter; } } opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/JSONConstantAttributeMapper.java
@@ -15,6 +15,7 @@ */ package org.forgerock.opendj.rest2ldap; import static org.forgerock.opendj.rest2ldap.Utils.toFilter; import static org.forgerock.opendj.rest2ldap.Utils.toLowerCase; import java.util.Collections; @@ -50,20 +51,18 @@ final Filter filter; final JsonValue subValue = value.get(jsonAttribute); if (subValue == null) { filter = c.getConfig().falseFilter(); filter = toFilter(false); } else if (type == FilterType.PRESENT) { filter = c.getConfig().trueFilter(); filter = toFilter(true); } else if (value.isString() && valueAssertion instanceof String) { final String v1 = toLowerCase(value.asString()); final String v2 = toLowerCase((String) valueAssertion); switch (type) { case CONTAINS: filter = v1.contains(v2) ? c.getConfig().trueFilter() : c.getConfig().falseFilter(); filter = toFilter(v1.contains(v2)); break; case STARTS_WITH: filter = v1.startsWith(v2) ? c.getConfig().trueFilter() : c.getConfig() .falseFilter(); filter = toFilter(v1.startsWith(v2)); break; default: filter = compare(c, type, v1, v2); @@ -79,7 +78,7 @@ filter = compare(c, type, v1, v2); } else { // This attribute mapper is a candidate but it does not match. filter = c.getConfig().falseFilter(); filter = toFilter(false); } h.handleResult(filter); } @@ -100,28 +99,22 @@ final Filter filter; switch (type) { case EQUAL_TO: filter = v1.equals(v2) ? c.getConfig().trueFilter() : c.getConfig().falseFilter(); filter = toFilter(v1.equals(v2)); break; case GREATER_THAN: filter = v1.compareTo(v2) > 0 ? c.getConfig().trueFilter() : c.getConfig().falseFilter(); filter = toFilter(v1.compareTo(v2) > 0); break; case GREATER_THAN_OR_EQUAL_TO: filter = v1.compareTo(v2) >= 0 ? c.getConfig().trueFilter() : c.getConfig() .falseFilter(); filter = toFilter(v1.compareTo(v2) >= 0); break; case LESS_THAN: filter = v1.compareTo(v2) < 0 ? c.getConfig().trueFilter() : c.getConfig().falseFilter(); filter = toFilter(v1.compareTo(v2) < 0); break; case LESS_THAN_OR_EQUAL_TO: filter = v1.compareTo(v2) <= 0 ? c.getConfig().trueFilter() : c.getConfig() .falseFilter(); filter = toFilter(v1.compareTo(v2) <= 0); break; default: filter = c.getConfig().falseFilter(); // Not supported. filter = toFilter(false); // Not supported. break; } return filter; opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/LDAPCollectionResourceProvider.java
@@ -15,8 +15,11 @@ */ package org.forgerock.opendj.rest2ldap; import static org.forgerock.opendj.ldap.Filter.alwaysFalse; import static org.forgerock.opendj.ldap.Filter.alwaysTrue; import static org.forgerock.opendj.rest2ldap.ReadOnUpdatePolicy.USE_READ_ENTRY_CONTROLS; import static org.forgerock.opendj.rest2ldap.Utils.accumulate; import static org.forgerock.opendj.rest2ldap.Utils.toFilter; import static org.forgerock.opendj.rest2ldap.Utils.transform; import java.util.Collection; @@ -335,7 +338,7 @@ @Override public void handleResult(final Filter ldapFilter) { // Avoid performing a search if the filter could not be mapped or if it will never match. if (ldapFilter == null || ldapFilter == c.getConfig().falseFilter()) { if (ldapFilter == null || ldapFilter == alwaysFalse()) { handler.handleResult(new QueryResult()); } else { final ConnectionCompletionHandler<Result> outerHandler = @@ -350,7 +353,9 @@ getLDAPAttributes(c, request.getFieldFilters()); final SearchRequest request = Requests.newSearchRequest(getBaseDN(c), SearchScope.SINGLE_LEVEL, ldapFilter, SearchScope.SINGLE_LEVEL, ldapFilter == Filter .alwaysTrue() ? Filter .objectClassPresent() : ldapFilter, attributes); connection.searchAsync(request, null, innerHandler); } @@ -531,18 +536,15 @@ final Iterator<Filter> i = value.iterator(); while (i.hasNext()) { final Filter f = i.next(); if (f == null) { // Filter component did not match any attribute mappers. return c.getConfig().falseFilter(); } else if (f == c.getConfig().falseFilter()) { return c.getConfig().falseFilter(); } else if (f == c.getConfig().trueFilter()) { if (f == null || f == alwaysFalse()) { return alwaysFalse(); } else if (f == alwaysTrue()) { i.remove(); } } switch (value.size()) { case 0: return c.getConfig().trueFilter(); return alwaysTrue(); case 1: return value.get(0); default: @@ -559,8 +561,7 @@ @Override public Void visitBooleanLiteralFilter(final ResultHandler<Filter> p, final boolean value) { p.handleResult(value ? c.getConfig().trueFilter() : c.getConfig() .falseFilter()); p.handleResult(toFilter(value)); return null; } @@ -627,13 +628,10 @@ subFilter.accept(this, transform(new Function<Filter, Filter, Void>() { @Override public Filter apply(final Filter value, final Void p) { if (value == null) { // Filter component did not match any attribute mappers. return c.getConfig().trueFilter(); } else if (value == c.getConfig().falseFilter()) { return c.getConfig().trueFilter(); } else if (value == c.getConfig().trueFilter()) { return c.getConfig().falseFilter(); if (value == null || value == alwaysFalse()) { return alwaysTrue(); } else if (value == alwaysTrue()) { return alwaysFalse(); } else { return Filter.not(value); } @@ -655,18 +653,15 @@ final Iterator<Filter> i = value.iterator(); while (i.hasNext()) { final Filter f = i.next(); if (f == null) { // Filter component did not match any attribute mappers. if (f == null || f == alwaysFalse()) { i.remove(); } else if (f == c.getConfig().falseFilter()) { i.remove(); } else if (f == c.getConfig().trueFilter()) { return c.getConfig().trueFilter(); } else if (f == alwaysTrue()) { return alwaysTrue(); } } switch (value.size()) { case 0: return c.getConfig().falseFilter(); return alwaysFalse(); case 1: return value.get(0); default: opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/ObjectAttributeMapper.java
@@ -16,6 +16,7 @@ package org.forgerock.opendj.rest2ldap; import static org.forgerock.opendj.rest2ldap.Utils.accumulate; import static org.forgerock.opendj.rest2ldap.Utils.toFilter; import static org.forgerock.opendj.rest2ldap.Utils.toLowerCase; import static org.forgerock.opendj.rest2ldap.Utils.transform; @@ -101,7 +102,7 @@ // Either the filter targeted the entire object (i.e. it was "/"), or it targeted // an unrecognized attribute within the object. Either way, the filter will // never match. h.handleResult(c.getConfig().falseFilter()); h.handleResult(toFilter(false)); } } opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Rest2LDAP.java
@@ -57,13 +57,11 @@ private final List<Attribute> additionalLDAPAttributes = new LinkedList<Attribute>(); private DN baseDN; // TODO: support template variables. private ConnectionFactory factory; private Filter falseFilter = Filter.present("1.1"); private MVCCStrategy mvccStrategy; private NameStrategy nameStrategy; private ReadOnUpdatePolicy readOnUpdatePolicy = USE_READ_ENTRY_CONTROLS; private final ObjectAttributeMapper rootMapper = new ObjectAttributeMapper(); private Schema schema = Schema.getDefaultSchema(); private Filter trueFilter = Filter.objectClassPresent(); Builder() { useEtagAttribute(); @@ -114,8 +112,7 @@ throw new IllegalStateException("No mappings provided"); } return new LDAPCollectionResourceProvider(baseDN, rootMapper, factory, nameStrategy, mvccStrategy, new Config(trueFilter, falseFilter, readOnUpdatePolicy, schema), additionalLDAPAttributes); mvccStrategy, new Config(readOnUpdatePolicy, schema), additionalLDAPAttributes); } public Builder factory(final ConnectionFactory factory) { @@ -125,19 +122,6 @@ } /** * Sets the absolute false filter which should be used when querying the * LDAP server. * * @param filter * The absolute false filter. * @return A reference to this builder. */ public Builder falseFilter(final Filter filter) { this.falseFilter = ensureNotNull(filter); return this; } /** * Sets the policy which should be used in order to read an entry before * it is deleted, or after it is added or modified. * @@ -165,19 +149,6 @@ return this; } /** * Sets the absolute true filter which should be used when querying the * LDAP server. * * @param filter * The absolute true filter. * @return A reference to this builder. */ public Builder trueFilter(final Filter filter) { this.trueFilter = ensureNotNull(filter); return this; } public Builder useClientDNNaming(final AttributeType attribute) { this.nameStrategy = new DNNameStrategy(attribute); return this; @@ -308,8 +279,8 @@ @Override SearchRequest createSearchRequest(final Context c, final DN baseDN, final String resourceId) { return newSearchRequest(baseDN.child(rdn(resourceId)), SearchScope.BASE_OBJECT, c .getConfig().trueFilter()); return newSearchRequest(baseDN.child(rdn(resourceId)), SearchScope.BASE_OBJECT, Filter .objectClassPresent()); } @Override @@ -406,12 +377,6 @@ * ... * }, * * // Additional options (all are optional). * "options" : { * "trueFilter" : "(objectClass=*)", * "falseFilter" : "(1.1=*)", * }, * * // The base DN beneath which LDAP entries are to be found. * "baseDN" : "ou=people,dc=example,dc=com", * opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/SimpleAttributeMapper.java
@@ -183,7 +183,7 @@ h.handleResult(toFilter(c, type, ldapAttributeName.toString(), valueAssertion)); } else { // This attribute mapper does not support partial filtering. h.handleResult(c.getConfig().falseFilter()); h.handleResult(toFilter(false)); } } opendj3/opendj-rest2ldap/src/main/java/org/forgerock/opendj/rest2ldap/Utils.java
@@ -214,6 +214,10 @@ return JSON_TO_BYTESTRING; } static Filter toFilter(final boolean value) { return value ? Filter.alwaysTrue() : Filter.alwaysFalse(); } static Filter toFilter(final Context c, final FilterType type, final String ldapAttribute, final Object valueAssertion) { final String v = String.valueOf(valueAssertion); @@ -245,7 +249,7 @@ break; case EXTENDED: default: filter = c.getConfig().falseFilter(); // Not supported. filter = toFilter(false); // Not supported. break; } return filter;