/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, * add the following below this CDDL HEADER, with the fields enclosed * by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2009 Sun Microsystems, Inc. */ package org.opends.sdk.util; import org.opends.sdk.AttributeDescription; import org.opends.sdk.DN; import org.opends.sdk.schema.Schema; /** * Common {@link Function} implementations. */ public final class Functions { private static final class FixedFunction implements Function { private final Function function; private final P parameter; private FixedFunction(Function function, P p) { this.function = function; this.parameter = p; } /** * {@inheritDoc} */ public N apply(M value, Void p) { return function.apply(value, parameter); } } private static final Function BYTESTRING_TO_ATTRIBUTE_DESCRIPTION = new Function() { public AttributeDescription apply(ByteString value, Schema p) { // FIXME: what should we do if parsing fails? return AttributeDescription.valueOf(value.toString(), p); } }; private static final Function BYTESTRING_TO_BOOLEAN = new Function() { public Boolean apply(ByteString value, Void p) { String valueString = StaticUtils.toLowerCase(value.toString()); if (valueString.equals("true") || valueString.equals("yes") || valueString.equals("on") || valueString.equals("1")) { return Boolean.TRUE; } else if (valueString.equals("false") || valueString.equals("no") || valueString.equals("off") || valueString.equals("0")) { return Boolean.FALSE; } else { throw new NumberFormatException("Invalid boolean value \"" + valueString + "\""); } } }; private static final Function BYTESTRING_TO_DN = new Function() { public DN apply(ByteString value, Schema p) { // FIXME: what should we do if parsing fails? // FIXME: we should have a ByteString valueOf implementation. return DN.valueOf(value.toString(), p); } }; private static final Function BYTESTRING_TO_INTEGER = new Function() { public Integer apply(ByteString value, Void p) { // We do not use ByteString.toInt() as we are string based. return Integer.valueOf(value.toString()); } }; private static final Function BYTESTRING_TO_LONG = new Function() { public Long apply(ByteString value, Void p) { // We do not use ByteString.toLong() as we are string based. return Long.valueOf(value.toString()); } }; private static final Function BYTESTRING_TO_STRING = new Function() { public String apply(ByteString value, Void p) { return value.toString(); } }; private static final Function NORMALIZE_STRING = new Function() { public String apply(String value, Void p) { return StaticUtils.toLowerCase(value).trim(); } }; /** * Returns a function which which always invokes {@code function} with * {@code p}. * * @param * The type of input values transformed by this function. * @param * The type of output values return by this function. * @param

* The type of the additional parameter to this function's * {@code apply} method. Use {@link java.lang.Void} for * functions that do not need an additional parameter. * @param function * The function to wrap. * @param p * The parameter which will always be passed to {@code * function}. * @return A function which which always invokes {@code function} with * {@code p}. */ public static Function fixedFunction( Function function, P p) { return new FixedFunction(function, p); } /** * Returns a function which converts a {@code String} to lower case * using {@link StaticUtils#toLowerCase} and then trims it. * * @return A function which converts a {@code String} to lower case * using {@link StaticUtils#toLowerCase} and then trims it. */ public static Function normalizeString() { return NORMALIZE_STRING; } /** * Returns a function which parses the string representation of a * {@code ByteString} as an {@code AttributeDescription} using the * default schema. Invalid values will result in a {@code * LocalizedIllegalArgumentException}. * * @return A function which parses the string representation of a * {@code ByteString} as an {@code AttributeDescription}. */ public static Function valueToAttributeDescription() { return fixedFunction(BYTESTRING_TO_ATTRIBUTE_DESCRIPTION, Schema .getDefaultSchema()); } /** * Returns a function which parses the string representation of a * {@code ByteString} as an {@code AttributeDescription} using the * provided schema. Invalid values will result in a {@code * LocalizedIllegalArgumentException}. * * @param schema * The schema to use for decoding attribute descriptions. * @return A function which parses the string representation of a * {@code ByteString} as an {@code AttributeDescription}. */ public static Function valueToAttributeDescription( Schema schema) { return fixedFunction(BYTESTRING_TO_ATTRIBUTE_DESCRIPTION, schema); } /** * Returns a function which parses the string representation of a * {@code ByteString} to a {@code Boolean}. The function will accept * the values {@code 0}, {@code false}, {@code no}, {@code off}, * {@code 1}, {@code true}, {@code yes}, {@code on}. All other values * will result in a {@code NumberFormatException}. * * @return A function which transforms a {@code ByteString} to a * {@code Boolean}. */ public static Function valueToBoolean() { return BYTESTRING_TO_BOOLEAN; } /** * Returns a function which parses the string representation of a * {@code ByteString} as a {@code DN} using the default schema. * Invalid values will result in a {@code * LocalizedIllegalArgumentException}. * * @return A function which parses the string representation of a * {@code ByteString} as an {@code DN}. */ public static Function valueToDN() { return fixedFunction(BYTESTRING_TO_DN, Schema.getDefaultSchema()); } /** * Returns a function which parses the string representation of a * {@code ByteString} as a {@code DN} using the provided schema. * Invalid values will result in a {@code * LocalizedIllegalArgumentException}. * * @param schema * The schema to use for decoding DNs. * @return A function which parses the string representation of a * {@code ByteString} as an {@code DN}. */ public static Function valueToDN(Schema schema) { return fixedFunction(BYTESTRING_TO_DN, schema); } /** * Returns a function which parses the string representation of a * {@code ByteString} as an {@code Integer}. Invalid values will * result in a {@code NumberFormatException}. * * @return A function which parses the string representation of a * {@code ByteString} as an {@code Integer}. */ public static Function valueToInteger() { return BYTESTRING_TO_INTEGER; } /** * Returns a function which parses the string representation of a * {@code ByteString} as a {@code Long}. Invalid values will result in * a {@code NumberFormatException}. * * @return A function which parses the string representation of a * {@code ByteString} as a {@code Long}. */ public static Function valueToLong() { return BYTESTRING_TO_LONG; } /** * Returns a function which parses a {@code ByteString} as a UTF-8 * encoded {@code String}. * * @return A function which parses the string representation of a * {@code ByteString} as a UTF-8 encoded {@code String}. */ public static Function valueToString() { return BYTESTRING_TO_STRING; } // Prevent instantiation private Functions() { // Do nothing. } }