/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.cxf.jaxrs.ext.search.ldap; import java.util.Collections; import java.util.Map; import org.apache.cxf.jaxrs.ext.search.ConditionType; import org.apache.cxf.jaxrs.ext.search.PrimitiveStatement; import org.apache.cxf.jaxrs.ext.search.SearchCondition; import org.apache.cxf.jaxrs.ext.search.visitor.AbstractUntypedSearchConditionVisitor; /** * Initial Implementation of http://tools.ietf.org/html/rfc4515 */ public class LdapQueryVisitor<T> extends AbstractUntypedSearchConditionVisitor<T, String> { public LdapQueryVisitor() { this(Collections.<String, String>emptyMap()); } public LdapQueryVisitor(Map<String, String> fieldMap) { super(fieldMap); } public void visit(SearchCondition<T> sc) { StringBuilder sb = getStringBuilder(); if (sb == null) { sb = new StringBuilder(); } PrimitiveStatement statement = sc.getStatement(); if (statement != null) { if (statement.getProperty() != null) { String name = getRealPropertyName(statement.getProperty()); String rvalStr = getPropertyValue(name, statement.getValue()); validatePropertyValue(name, rvalStr); sb.append("("); if (sc.getConditionType() == ConditionType.NOT_EQUALS) { sb.append("!"); } String ldapOperator = conditionTypeToLdapOperator(sc.getConditionType()); sb.append(name).append(ldapOperator).append(rvalStr); sb.append(")"); } } else { sb.append("("); if (sc.getConditionType() == ConditionType.AND) { sb.append("&"); } else { sb.append("|"); } for (SearchCondition<T> condition : sc.getSearchConditions()) { saveStringBuilder(sb); condition.accept(this); sb = getStringBuilder(); } sb.append(")"); } saveStringBuilder(sb); } public static String conditionTypeToLdapOperator(ConditionType ct) { String op; switch (ct) { case EQUALS: case NOT_EQUALS: op = "="; break; case GREATER_THAN: case GREATER_OR_EQUALS: op = ">="; break; case LESS_THAN: case LESS_OR_EQUALS: op = "<="; break; default: String msg = String.format("Condition type %s is not supported", ct.name()); throw new RuntimeException(msg); } return op; } }