All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jboss.logmanager.config.ValueExpression Maven / Gradle / Ivy

There is a newer version: 1.3.3
Show newest version
/*
 * JBoss, Home of Professional Open Source.
 *
 * Copyright 2014 Red Hat, Inc., and individual contributors
 * as indicated by the @author tags.
 *
 * Licensed 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.jboss.logmanager.config;

import java.io.File;

/**
 * Represents a possible value expression. A value is said to be an expression if it matches a 
 * ${system.property:DEFAULT_VALUE} pattern.
 *
 * @author James R. Perkins
 */
public interface ValueExpression {

    final ValueExpression NULL_STRING_EXPRESSION = new ValueExpression() {
        @Override
        public String getResolvedValue() {
            return null;
        }

        @Override
        public boolean isExpression() {
            return false;
        }

        @Override
        public String getValue() {
            return null;
        }
    };

    final ValueExpression NULL_BOOLEAN_EXPRESSION = new ValueExpression() {
        @Override
        public Boolean getResolvedValue() {
            return null;
        }

        @Override
        public boolean isExpression() {
            return false;
        }

        @Override
        public String getValue() {
            return null;
        }
    };

    /**
     * The resolved value.
     * 

* If this is an {@link #isExpression() expression} the resolved value will be the value from a system property or * the default value from the expression if the system property is not set. *

* If this is not an {@link #isExpression() expression} the value returned will be the non-expression value * or {@code null} if allowed for the property. * * @return the resolved value */ T getResolvedValue(); /** * Checks whether this is an expression or not. * * @return {@code true} if this is an expression, otherwise {@code false} */ boolean isExpression(); /** * Gets the value of the value which may or may not be an {@link #isExpression() expression}. * * @return the value */ String getValue(); @Override String toString(); /** * Resolves the value expression from an expression. * * @param the value type */ public interface Resolver { /** * Resolves the value of an expression. * * @param expression the expression to parse * * @return the value expression */ ValueExpression resolve(String expression); } public static Resolver STRING_RESOLVER = new Resolver() { private static final int INITIAL = 0; private static final int GOT_DOLLAR = 1; private static final int GOT_OPEN_BRACE = 2; private static final int RESOLVED = 3; private static final int DEFAULT = 4; @Override public ValueExpression resolve(final String expression) { if (expression == null) return NULL_STRING_EXPRESSION; boolean isExpression = false; final StringBuilder builder = new StringBuilder(); final char[] chars = expression.toCharArray(); final int len = chars.length; int state = 0; int start = -1; int nameStart = -1; for (int i = 0; i < len; i++) { char ch = chars[i]; switch (state) { case INITIAL: { switch (ch) { case '$': { state = GOT_DOLLAR; continue; } default: { builder.append(ch); continue; } } // not reachable } case GOT_DOLLAR: { switch (ch) { case '$': { builder.append(ch); state = INITIAL; continue; } case '{': { start = i + 1; nameStart = start; state = GOT_OPEN_BRACE; continue; } default: { // invalid; emit and resume builder.append('$').append(ch); state = INITIAL; continue; } } // not reachable } case GOT_OPEN_BRACE: { switch (ch) { case ':': case '}': case ',': { final String name = expression.substring(nameStart, i).trim(); if ("/".equals(name)) { builder.append(File.separator); state = ch == '}' ? INITIAL : RESOLVED; continue; } else if (":".equals(name)) { builder.append(File.pathSeparator); state = ch == '}' ? INITIAL : RESOLVED; continue; } isExpression = true; String val = System.getProperty(name); if (val == null && name.startsWith("env.")) { val = System.getenv(name); } if (val != null) { builder.append(val); state = ch == '}' ? INITIAL : RESOLVED; continue; } else if (ch == ',') { nameStart = i + 1; continue; } else if (ch == ':') { start = i + 1; state = DEFAULT; continue; } else { builder.append(expression.substring(start - 2, i + 1)); state = INITIAL; continue; } } default: { continue; } } // not reachable } case RESOLVED: { if (ch == '}') { state = INITIAL; } continue; } case DEFAULT: { if (ch == '}') { state = INITIAL; builder.append(expression.substring(start, i)); } continue; } default: throw new IllegalStateException(); } } switch (state) { case GOT_DOLLAR: { builder.append('$'); break; } case DEFAULT: case GOT_OPEN_BRACE: { builder.append(expression.substring(start - 2)); break; } } final String resolvedValue = builder.toString(); if (isExpression) { return new ValueExpressionImpl(expression, resolvedValue); } return new ValueExpressionImpl(null, resolvedValue); } }; public static Resolver BOOLEAN_RESOLVER = new Resolver() { @Override public ValueExpression resolve(final String expression) { if (expression == null) return NULL_BOOLEAN_EXPRESSION; final ValueExpression stringResult = STRING_RESOLVER.resolve(expression); final Boolean value = stringResult.getResolvedValue() == null ? null : Boolean.valueOf(stringResult.getResolvedValue()); return new ValueExpressionImpl(expression, value); } }; }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy