001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.juneau.uon; 018 019import static org.apache.juneau.common.utils.StringUtils.*; 020 021import org.apache.juneau.common.utils.*; 022 023/** 024 * Utility methods for the UON and UrlEncoding serializers and parsers. 025 * 026 * <h5 class='section'>See Also:</h5><ul> 027 * <li class='link'><a class="doclink" href="https://juneau.apache.org/docs/topics/UonBasics">UON Basics</a> 028 * </ul> 029 */ 030public class UonUtils { 031 032 private static final AsciiSet needsQuoteChars = AsciiSet.of("),=\n\t\r\b\f "); 033 private static final AsciiSet maybeNeedsQuotesFirstChar = AsciiSet.of("),=\n\t\r\b\f tfn+-.#0123456789"); 034 035 /** 036 * Returns <jk>true</jk> if the specified string needs to be quoted per UON notation. 037 * 038 * <p> 039 * For example, strings that start with '(' or '@' or look like boolean or numeric values need to be quoted. 040 * 041 * @param s The string to test. 042 * @return <jk>true</jk> if the specified string needs to be quoted per UON notation. 043 */ 044 public static boolean needsQuotes(String s) { 045 char c0 = s.isEmpty() ? 0 : s.charAt(0); 046 return ( 047 s.isEmpty() 048 || c0 == '@' 049 || c0 == '(' 050 || needsQuoteChars.contains(s) 051 || ( 052 maybeNeedsQuotesFirstChar.contains(c0) 053 && ( 054 "true".equals(s) 055 || "false".equals(s) 056 || "null".equals(s) 057 || isNumeric(s) 058 ) 059 ) 060 ); 061 } 062}