From commits-return-7671-archive-asf-public=cust-asf.ponee.io@openwebbeans.apache.org Fri Sep 21 10:01:19 2018 Return-Path: X-Original-To: archive-asf-public@cust-asf.ponee.io Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx-eu-01.ponee.io (Postfix) with SMTP id 6C9DC180656 for ; Fri, 21 Sep 2018 10:01:18 +0200 (CEST) Received: (qmail 25678 invoked by uid 500); 21 Sep 2018 08:01:17 -0000 Mailing-List: contact commits-help@openwebbeans.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openwebbeans.apache.org Delivered-To: mailing list commits@openwebbeans.apache.org Received: (qmail 25667 invoked by uid 99); 21 Sep 2018 08:01:17 -0000 Received: from Unknown (HELO svn01-us-west.apache.org) (209.188.14.144) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 21 Sep 2018 08:01:17 +0000 Received: from svn01-us-west.apache.org (localhost [127.0.0.1]) by svn01-us-west.apache.org (ASF Mail Server at svn01-us-west.apache.org) with ESMTP id 4FF4C3A0292 for ; Fri, 21 Sep 2018 08:01:16 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1841549 - in /openwebbeans/meecrowave/trunk/meecrowave-core: ./ src/main/java/org/apache/meecrowave/ src/main/java/org/apache/meecrowave/lang/ src/test/java/org/apache/meecrowave/lang/ Date: Fri, 21 Sep 2018 08:01:15 -0000 To: commits@openwebbeans.apache.org From: rmannibucau@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20180921080116.4FF4C3A0292@svn01-us-west.apache.org> Author: rmannibucau Date: Fri Sep 21 08:01:15 2018 New Revision: 1841549 URL: http://svn.apache.org/viewvc?rev=1841549&view=rev Log: MEECROWAVE-150 dropping commons-lang/text + dropping some not needed directory creation Added: openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/lang/ openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/lang/Substitutor.java openwebbeans/meecrowave/trunk/meecrowave-core/src/test/java/org/apache/meecrowave/lang/ openwebbeans/meecrowave/trunk/meecrowave-core/src/test/java/org/apache/meecrowave/lang/SubstitutorTest.java Modified: openwebbeans/meecrowave/trunk/meecrowave-core/pom.xml openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/Meecrowave.java Modified: openwebbeans/meecrowave/trunk/meecrowave-core/pom.xml URL: http://svn.apache.org/viewvc/openwebbeans/meecrowave/trunk/meecrowave-core/pom.xml?rev=1841549&r1=1841548&r2=1841549&view=diff ============================================================================== --- openwebbeans/meecrowave/trunk/meecrowave-core/pom.xml (original) +++ openwebbeans/meecrowave/trunk/meecrowave-core/pom.xml Fri Sep 21 08:01:15 2018 @@ -50,11 +50,6 @@ true - org.apache.commons - commons-text - 1.4 - - org.apache.xbean xbean-reflect ${xbean.version} Modified: openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/Meecrowave.java URL: http://svn.apache.org/viewvc/openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/Meecrowave.java?rev=1841549&r1=1841548&r2=1841549&view=diff ============================================================================== --- openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/Meecrowave.java (original) +++ openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/Meecrowave.java Fri Sep 21 08:01:15 2018 @@ -19,6 +19,7 @@ package org.apache.meecrowave; import static java.util.Collections.emptyList; +import static java.util.Collections.emptyMap; import static java.util.Collections.emptySet; import static java.util.Comparator.comparing; import static java.util.Locale.ROOT; @@ -63,7 +64,6 @@ import java.util.concurrent.atomic.Atomi import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.function.Function; -import java.util.logging.Logger; import java.util.stream.Stream; import java.util.stream.StreamSupport; @@ -99,8 +99,6 @@ import org.apache.catalina.session.Stand import org.apache.catalina.startup.Catalina; import org.apache.catalina.startup.MeecrowaveContextConfig; import org.apache.catalina.startup.Tomcat; -import org.apache.commons.text.StrLookup; -import org.apache.commons.text.StrSubstitutor; import org.apache.coyote.http2.Http2Protocol; import org.apache.cxf.BusFactory; import org.apache.johnzon.core.BufferStrategy; @@ -109,6 +107,7 @@ import org.apache.meecrowave.api.StopLis import org.apache.meecrowave.cxf.ConfigurableBus; import org.apache.meecrowave.cxf.CxfCdiAutoSetup; import org.apache.meecrowave.io.IO; +import org.apache.meecrowave.lang.Substitutor; import org.apache.meecrowave.logging.jul.Log4j2Logger; import org.apache.meecrowave.logging.log4j2.Log4j2Shutdown; import org.apache.meecrowave.logging.openwebbeans.Log4j2LoggerFactory; @@ -465,10 +464,6 @@ public class Meecrowave implements AutoC { // setup base = new File(newBaseDir()); - final File conf = createDirectory(base, "conf"); - createDirectory(base, "lib"); - createDirectory(base, "logs"); - // create the temp dir folder. File tempDir; if (configuration.getTempDir() == null || configuration.getTempDir().length() == 0) { @@ -482,16 +477,16 @@ public class Meecrowave implements AutoC try { workDir = createDirectory(base, "work"); - } catch (IllegalStateException ise) { + } catch (final IllegalStateException ise) { // in case we could not create that directory we create it in the temp dir folder workDir = createDirectory(tempDir, "work"); } - synchronize(conf, configuration.conf); + synchronize(new File(base, "conf"), configuration.conf); } final Properties props = configuration.properties; - StrSubstitutor substitutor = null; + Substitutor substitutor = null; for (final String s : props.stringPropertyNames()) { final String v = props.getProperty(s); if (v != null && v.contains("${")) { @@ -500,7 +495,7 @@ public class Meecrowave implements AutoC placeHolders.put("meecrowave.embedded.http", Integer.toString(configuration.httpPort)); placeHolders.put("meecrowave.embedded.https", Integer.toString(configuration.httpsPort)); placeHolders.put("meecrowave.embedded.stop", Integer.toString(configuration.stopPort)); - substitutor = new StrSubstitutor(placeHolders); + substitutor = new Substitutor(placeHolders); } props.put(s, substitutor.replace(v)); } @@ -585,9 +580,9 @@ public class Meecrowave implements AutoC try { final File webapps = createDirectory(base, "webapps"); host.setAppBase(webapps.getAbsolutePath()); - } catch (IllegalStateException ise) { - Logger.getLogger(this.getClass().getName()).info("Could not create Tomcat AppBase directory (webapps) in " + - new File(base, "webapps").getAbsolutePath() + " . This is only a problem if you deploy WARs!"); + } catch (final IllegalStateException ise) { + // never an issue since the webapps are deployed being put in webapps - so no dynamic folder + // or through their path - so don't need webapps folder } host.setUnpackWARs(true); // forced for now cause OWB doesn't support war:file:// urls @@ -653,6 +648,9 @@ public class Meecrowave implements AutoC httpsConnector.addUpgradeProtocol(new Http2Protocol()); } final List buildSslHostConfig = buildSslHostConfig(); + if (!buildSslHostConfig.isEmpty()) { + createDirectory(base, "conf"); + } buildSslHostConfig.forEach(sslHostConf -> { if (isCertificateFromClasspath(sslHostConf.getCertificateKeystoreFile())) { copyCertificateToConfDir(sslHostConf.getCertificateKeystoreFile()); @@ -1081,6 +1079,8 @@ public class Meecrowave implements AutoC for (final Map.Entry u : urls.entrySet()) { try (final InputStream is = u.getValue().openStream()) { final File to = new File(base, u.getKey()); + final File parentFile = to.getParentFile(); + createDirectory(parentFile.getParentFile(), parentFile.getName()); try (final OutputStream os = new FileOutputStream(to)) { IO.copy(is, os); } @@ -2123,13 +2123,13 @@ public class Meecrowave implements AutoC public void loadFromProperties(final Properties config) { // filtering properties with system properties or themself - final StrSubstitutor strSubstitutor = new StrSubstitutor(new StrLookup() { + final Substitutor strSubstitutor = new Substitutor(emptyMap()) { @Override - public String lookup(final String key) { + public String getOrDefault(final String key, final String or) { final String property = System.getProperty(key); - return property == null ? config.getProperty(key) : null; + return property == null ? config.getProperty(key, or) : or; } - }); + }; final ValueTransformers transformers = getExtension(ValueTransformers.class); for (final String key : config.stringPropertyNames()) { Added: openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/lang/Substitutor.java URL: http://svn.apache.org/viewvc/openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/lang/Substitutor.java?rev=1841549&view=auto ============================================================================== --- openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/lang/Substitutor.java (added) +++ openwebbeans/meecrowave/trunk/meecrowave-core/src/main/java/org/apache/meecrowave/lang/Substitutor.java Fri Sep 21 08:01:15 2018 @@ -0,0 +1,176 @@ +/* + * 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.meecrowave.lang; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +// forked from commons-text but no need to bring a dep only for < 200 LOC +public class Substitutor { + private static final char ESCAPE = '$'; + private static final char[] PREFIX = "${".toCharArray(); + private static final char[] SUFFIX = "}".toCharArray(); + private static final char[] VALUE_DELIMITER = ":-".toCharArray(); + + private final Map valueMap; + + public Substitutor(final Map valueMap) { + this.valueMap = valueMap; + } + + public String replace(final String source) { + if (source == null) { + return null; + } + final StringBuilder builder = new StringBuilder(source); + if (substitute(builder, 0, source.length(), null) <= 0) { + return source; + } + return replace(builder.toString()); + } + + private int substitute(final StringBuilder buf, final int offset, final int length, List priorVariables) { + final boolean top = priorVariables == null; + boolean altered = false; + int lengthChange = 0; + char[] chars = buf.toString().toCharArray(); + int bufEnd = offset + length; + int pos = offset; + while (pos < bufEnd) { + final int startMatchLen = isMatch(PREFIX, chars, pos, bufEnd); + if (startMatchLen == 0) { + pos++; + } else { + if (pos > offset && chars[pos - 1] == ESCAPE) { + buf.deleteCharAt(pos - 1); + chars = buf.toString().toCharArray(); + lengthChange--; + altered = true; + bufEnd--; + } else { + final int startPos = pos; + pos += startMatchLen; + int endMatchLen; + while (pos < bufEnd) { + endMatchLen = isMatch(SUFFIX, chars, pos, bufEnd); + if (endMatchLen == 0) { + pos++; + } else { + String varNameExpr = new String(chars, startPos + + startMatchLen, pos - startPos + - startMatchLen); + pos += endMatchLen; + final int endPos = pos; + + String varName = varNameExpr; + String varDefaultValue = null; + + final char[] varNameExprChars = varNameExpr.toCharArray(); + for (int i = 0; i < varNameExprChars.length; i++) { + if (isMatch(PREFIX, varNameExprChars, i, varNameExprChars.length) != 0) { + break; + } + final int match = isMatch(VALUE_DELIMITER, varNameExprChars, i, varNameExprChars.length); + if (match != 0) { + varName = varNameExpr.substring(0, i); + varDefaultValue = varNameExpr.substring(i + match); + break; + } + } + + if (priorVariables == null) { + priorVariables = new ArrayList<>(); + priorVariables.add(new String(chars, + offset, length)); + } + + checkCyclicSubstitution(varName, priorVariables); + priorVariables.add(varName); + + final String varValue = getOrDefault(varName, varDefaultValue); + if (varValue != null) { + final int varLen = varValue.length(); + buf.replace(startPos, endPos, varValue); + altered = true; + int change = substitute(buf, startPos, varLen, priorVariables); + change = change + varLen - (endPos - startPos); + pos += change; + bufEnd += change; + lengthChange += change; + chars = buf.toString().toCharArray(); + } + + priorVariables.remove(priorVariables.size() - 1); + break; + } + } + } + } + } + if (top) { + return altered ? 1 : 0; + } + return lengthChange; + } + + protected String getOrDefault(final String varName, final String varDefaultValue) { + return valueMap.getOrDefault(varName, varDefaultValue); + } + + private int isMatch(final char[] chars, final char[] buffer, int pos, + final int bufferEnd) { + final int len = chars.length; + if (pos + len > bufferEnd) { + return 0; + } + for (int i = 0; i < chars.length; i++, pos++) { + if (chars[i] != buffer[pos]) { + return 0; + } + } + return len; + } + + private void checkCyclicSubstitution(final String varName, final List priorVariables) { + if (!priorVariables.contains(varName)) { + return; + } + final StringBuilder buf = new StringBuilder(256); + buf.append("Infinite loop in property interpolation of "); + buf.append(priorVariables.remove(0)); + buf.append(": "); + appendWithSeparators(buf, priorVariables); + throw new IllegalStateException(buf.toString()); + } + + private void appendWithSeparators(final StringBuilder builder, final Collection iterable) { + if (iterable != null && !iterable.isEmpty()) { + final Iterator it = iterable.iterator(); + while (it.hasNext()) { + builder.append(it.next()); + if (it.hasNext()) { + builder.append("->"); + } + } + } + } +} Added: openwebbeans/meecrowave/trunk/meecrowave-core/src/test/java/org/apache/meecrowave/lang/SubstitutorTest.java URL: http://svn.apache.org/viewvc/openwebbeans/meecrowave/trunk/meecrowave-core/src/test/java/org/apache/meecrowave/lang/SubstitutorTest.java?rev=1841549&view=auto ============================================================================== --- openwebbeans/meecrowave/trunk/meecrowave-core/src/test/java/org/apache/meecrowave/lang/SubstitutorTest.java (added) +++ openwebbeans/meecrowave/trunk/meecrowave-core/src/test/java/org/apache/meecrowave/lang/SubstitutorTest.java Fri Sep 21 08:01:15 2018 @@ -0,0 +1,58 @@ +/* + * 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.meecrowave.lang; + +import static java.util.Collections.emptyMap; +import static java.util.Collections.singletonMap; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +public class SubstitutorTest { + + @Test + public void noSubstitute() { + assertEquals("${foo}", new Substitutor(emptyMap()).replace("${foo}")); + } + + @Test + public void substitute() { + assertEquals("bar", new Substitutor(singletonMap("foo", "bar")).replace("${foo}")); + } + + @Test + public void defaultValue() { + assertEquals("or", new Substitutor(emptyMap()).replace("${foo:-or}")); + } + + @Test + public void nested() { + assertEquals("bar", new Substitutor(singletonMap("foo", "bar")).replace("${any:-${foo}}")); + } + + @Test + public void twiceNested() { + assertEquals("bar", new Substitutor(singletonMap("other", "bar")).replace("${any:-${foo:-${other}}}")); + } + + @Test + public void composed() { + assertEquals("pref-bar-suff", new Substitutor(singletonMap("foo", "bar")).replace("pref-${foo}-suff")); + } +}