| | |
| | | |
| | | import java.util.Collection; |
| | | |
| | | import org.forgerock.json.resource.Context; |
| | | import org.forgerock.opendj.ldap.Connection; |
| | | import org.forgerock.opendj.ldap.ConnectionFactory; |
| | | import org.forgerock.opendj.ldap.DN; |
| | |
| | | import org.forgerock.opendj.ldap.responses.Result; |
| | | import org.forgerock.opendj.ldap.responses.SearchResultEntry; |
| | | import org.forgerock.opendj.ldap.responses.SearchResultReference; |
| | | import org.forgerock.resource.provider.Context; |
| | | |
| | | /** |
| | | * |
| | | */ |
| | | public final class EntryContainer { |
| | | // FIXME: make this configurable, also allow use of DN. |
| | | private static final String UUID_ATTRIBUTE = "entryUUID"; |
| | | |
| | | // FIXME: make this configurable. |
| | | private static final String ETAG_ATTRIBUTE = "etag"; |
| | | |
| | | private final ConnectionFactory factory; |
| | | private final DN baseDN; |
| | | |
| | | private abstract class AbstractRequestCompletionHandler<R, H extends ResultHandler<? super R>> |
| | | implements ResultHandler<R> { |
| | | final H resultHandler; |
| | | final Connection connection; |
| | | final H resultHandler; |
| | | |
| | | AbstractRequestCompletionHandler(final Connection connection, final H resultHandler) { |
| | | this.connection = connection; |
| | |
| | | |
| | | } |
| | | |
| | | public EntryContainer(DN baseDN, ConnectionFactory factory) { |
| | | // FIXME: make this configurable. |
| | | private static final String ETAG_ATTRIBUTE = "etag"; |
| | | |
| | | // FIXME: make this configurable, also allow use of DN. |
| | | private static final String UUID_ATTRIBUTE = "entryUUID"; |
| | | |
| | | private final DN baseDN; |
| | | |
| | | private final ConnectionFactory factory; |
| | | |
| | | public EntryContainer(final DN baseDN, final ConnectionFactory factory) { |
| | | this.baseDN = baseDN; |
| | | this.factory = factory; |
| | | } |
| | | |
| | | public void listEntries(final Context context, final SearchResultHandler handler) { |
| | | public String getEtagFromEntry(final Entry entry) { |
| | | return entry.parseAttribute(ETAG_ATTRIBUTE).asString(); |
| | | } |
| | | |
| | | public String getIDFromEntry(final Entry entry) { |
| | | return entry.parseAttribute(UUID_ATTRIBUTE).asString(); |
| | | } |
| | | |
| | | public void listEntries(final Context context, final Collection<String> attributes, |
| | | final SearchResultHandler handler) { |
| | | final String[] tmp = getSearchAttributes(attributes); |
| | | final ConnectionCompletionHandler<Result> outerHandler = |
| | | new ConnectionCompletionHandler<Result>(handler) { |
| | | |
| | |
| | | public void handleResult(final Connection connection) { |
| | | final SearchRequestCompletionHandler innerHandler = |
| | | new SearchRequestCompletionHandler(connection, handler); |
| | | SearchRequest request = |
| | | final SearchRequest request = |
| | | Requests.newSearchRequest(baseDN, SearchScope.SINGLE_LEVEL, Filter |
| | | .objectClassPresent(), UUID_ATTRIBUTE, ETAG_ATTRIBUTE); |
| | | .objectClassPresent(), tmp); |
| | | connection.searchAsync(request, null, innerHandler); |
| | | } |
| | | |
| | |
| | | |
| | | public void readEntry(final Context c, final String id, final Collection<String> attributes, |
| | | final ResultHandler<SearchResultEntry> handler) { |
| | | final String[] tmp = getSearchAttributes(attributes); |
| | | final ConnectionCompletionHandler<SearchResultEntry> outerHandler = |
| | | new ConnectionCompletionHandler<SearchResultEntry>(handler) { |
| | | |
| | |
| | | public void handleResult(final Connection connection) { |
| | | final RequestCompletionHandler<SearchResultEntry> innerHandler = |
| | | new RequestCompletionHandler<SearchResultEntry>(connection, handler); |
| | | // FIXME: who is responsible for adding the UUID and |
| | | // etag attributes to this search? |
| | | String[] tmp = attributes.toArray(new String[attributes.size() + 2]); |
| | | tmp[tmp.length - 2] = UUID_ATTRIBUTE; |
| | | tmp[tmp.length - 1] = ETAG_ATTRIBUTE; |
| | | |
| | | SearchRequest request = |
| | | final SearchRequest request = |
| | | Requests.newSearchRequest(baseDN, SearchScope.SINGLE_LEVEL, Filter |
| | | .equality(UUID_ATTRIBUTE, id), tmp); |
| | | connection.searchSingleEntryAsync(request, innerHandler); |
| | |
| | | factory.getConnectionAsync(outerHandler); |
| | | } |
| | | |
| | | public String getIDFromEntry(final Entry entry) { |
| | | return entry.parseAttribute(UUID_ATTRIBUTE).asString(); |
| | | } |
| | | |
| | | public String getEtagFromEntry(final Entry entry) { |
| | | return entry.parseAttribute(ETAG_ATTRIBUTE).asString(); |
| | | private String[] getSearchAttributes(final Collection<String> attributes) { |
| | | // FIXME: who is responsible for adding the UUID and etag attributes to |
| | | // this search? |
| | | final String[] tmp = attributes.toArray(new String[attributes.size() + 2]); |
| | | tmp[tmp.length - 2] = UUID_ATTRIBUTE; |
| | | tmp[tmp.length - 1] = ETAG_ATTRIBUTE; |
| | | return tmp; |
| | | } |
| | | |
| | | } |