diff --git a/impl/src/main/java/jakarta/faces/convert/UUIDConverter.java b/impl/src/main/java/jakarta/faces/convert/UUIDConverter.java new file mode 100644 index 0000000000..b25cd645ab --- /dev/null +++ b/impl/src/main/java/jakarta/faces/convert/UUIDConverter.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0, which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package jakarta.faces.convert; + +import java.util.UUID; + +import jakarta.faces.component.UIComponent; +import jakarta.faces.context.FacesContext; + +/** + *

+ * {@link Converter} implementation for java.util.UUID values. + *

+ * @since 4.1 + */ +public class UUIDConverter implements Converter { + + // ------------------------------------------------------ Manifest Constants + + /** + *

+ * The standard converter id for this converter. + *

+ */ + public static final String CONVERTER_ID = "jakarta.faces.UUID"; + + /** + *

+ * The message identifier of the {@link jakarta.faces.application.FacesMessage} to be created if the conversion to UUID fails. + * The message format string for this message may optionally include the following placeholders: + *

+ */ + public static final String UUID_ID = "jakarta.faces.converter.UUIDConverter.UUID"; + + /** + *

+ * The message identifier of the {@link jakarta.faces.application.FacesMessage} to be created if the conversion of the UUID value to String fails. + * The message format string for this message may optionally include the following placeholders: + *

+ */ + public static final String STRING_ID = "jakarta.faces.converter.STRING"; + + // ------------------------------------------------------- Converter Methods + + /** + * @throws ConverterException {@inheritDoc} + * @throws NullPointerException {@inheritDoc} + */ + @Override + public UUID getAsObject(FacesContext context, UIComponent component, String value) { + + if (context == null || component == null) { + throw new NullPointerException(); + } + + if (value == null || value.isBlank()) { + return null; + } + + try { + return UUID.fromString(value); + } catch (IllegalArgumentException e) { + throw new ConverterException(MessageFactory.getMessage(context, UUID_ID, value, "29573f55-4254-4afa-9ca6-6b5ae6c7ab6e", MessageFactory.getLabel(context, component)), e); + } catch (Exception e) { + throw new ConverterException(e); + } + } + + /** + * @throws ConverterException {@inheritDoc} + * @throws NullPointerException {@inheritDoc} + */ + @Override + public String getAsString(FacesContext context, UIComponent component, UUID value) { + + if (context == null || component == null) { + throw new NullPointerException(); + } + + if (value == null) { + return ""; + } + + try { + return value.toString(); + } catch (Exception e) { + throw new ConverterException(MessageFactory.getMessage(context, STRING_ID, value, MessageFactory.getLabel(context, component)), e); + } + } +} diff --git a/impl/src/main/resources/jakarta/faces/Messages.properties b/impl/src/main/resources/jakarta/faces/Messages.properties index c9e08d372c..b11e41bb78 100644 --- a/impl/src/main/resources/jakarta/faces/Messages.properties +++ b/impl/src/main/resources/jakarta/faces/Messages.properties @@ -65,6 +65,8 @@ jakarta.faces.converter.NumberConverter.PATTERN={2}: ''{0}'' is not a number pat jakarta.faces.converter.NumberConverter.PATTERN_detail={2}: ''{0}'' is not a number pattern. Example: {1} jakarta.faces.converter.ShortConverter.SHORT={2}: ''{0}'' must be a number consisting of one or more digits. jakarta.faces.converter.ShortConverter.SHORT_detail={2}: ''{0}'' must be a number between -32768 and 32767 Example: {1} +jakarta.faces.converter.UUIDConverter.UUID={2}: ''{0}'' must be a UUID. +jakarta.faces.converter.UUIDConverter.UUID_detail={2}: ''{0}'' must be a UUID. Example: {1} jakarta.faces.converter.STRING={1}: Could not convert ''{0}'' to a string. @@ -90,4 +92,3 @@ jakarta.faces.validator.RegexValidator.MATCH_EXCEPTION=Error in regular expressi jakarta.faces.validator.RegexValidator.MATCH_EXCEPTION_detail=Error in regular expression, ''{0}'' jakarta.faces.validator.BeanValidator.MESSAGE={0} -