Jetty 9.4.x #2279 start update params (#2285)

Jetty 9.4.x #2279 start update params (#2285):
* Cleanup and Unify param update logic #2279
* Cleanup system property source #2279
* Cleanup property source #2279
* Property cleanup for #2279
* Removed duplicate Prop and Property classes
* properties are only updated/set if value source is not from ?=

Signed-off-by: Greg Wilkins <gregw@webtide.com>
This commit is contained in:
Greg Wilkins 2018-03-07 16:33:28 +11:00 committed by GitHub
parent bcb9fa3b32
commit a128b87e3a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 126 additions and 173 deletions

View File

@ -39,7 +39,6 @@ import java.net.SocketTimeoutException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.regex.Matcher;
import org.eclipse.jetty.start.Props.Prop; import org.eclipse.jetty.start.Props.Prop;
import org.eclipse.jetty.start.config.CommandLineConfigSource; import org.eclipse.jetty.start.config.CommandLineConfigSource;
@ -295,18 +294,18 @@ public class Main
args.parse(baseHome.getConfigSources()); args.parse(baseHome.getConfigSources());
Props props = baseHome.getConfigSources().getProps(); Props props = baseHome.getConfigSources().getProps();
Props.Prop home = props.getProp(BaseHome.JETTY_HOME); Prop home = props.getProp(BaseHome.JETTY_HOME);
if (!args.getProperties().containsKey(BaseHome.JETTY_HOME)) if (!args.getProperties().containsKey(BaseHome.JETTY_HOME))
args.getProperties().setProperty(home); args.getProperties().setProperty(home);
args.getProperties().setProperty(BaseHome.JETTY_HOME+".uri", args.getProperties().setProperty(BaseHome.JETTY_HOME+".uri",
normalizeURI(baseHome.getHomePath().toUri().toString()), normalizeURI(baseHome.getHomePath().toUri().toString()),
home.origin); home.source);
Props.Prop base = props.getProp(BaseHome.JETTY_BASE); Prop base = props.getProp(BaseHome.JETTY_BASE);
if (!args.getProperties().containsKey(BaseHome.JETTY_BASE)) if (!args.getProperties().containsKey(BaseHome.JETTY_BASE))
args.getProperties().setProperty(base); args.getProperties().setProperty(base);
args.getProperties().setProperty(BaseHome.JETTY_BASE+".uri", args.getProperties().setProperty(BaseHome.JETTY_BASE+".uri",
normalizeURI(baseHome.getBasePath().toUri().toString()), normalizeURI(baseHome.getBasePath().toUri().toString()),
base.origin); base.source);
// ------------------------------------------------------------ // ------------------------------------------------------------
// 3) Module Registration // 3) Module Registration
@ -426,25 +425,8 @@ public class Main
{ {
for (ConfigSource config : baseHome.getConfigSources()) for (ConfigSource config : baseHome.getConfigSources())
{ {
System.out.printf("ConfigSource %s%n",config.getId());
for (StartIni ini : config.getStartInis()) for (StartIni ini : config.getStartInis())
{ ini.update(baseHome,args.getProperties());
for (String line : ini.getAllLines())
{
Matcher m = Module.SET_PROPERTY.matcher(line);
if (m.matches() && m.groupCount()==3)
{
String name = m.group(2);
String value = m.group(3);
Prop p = args.getProperties().getProp(name);
if (p!=null && ("#".equals(m.group(1)) || !value.equals(p.value)))
{
ini.update(baseHome,args.getProperties());
break;
}
}
}
}
} }
} }
@ -512,10 +494,10 @@ public class Main
private void doStop(StartArgs args) private void doStop(StartArgs args)
{ {
Props.Prop stopHostProp = args.getProperties().getProp("STOP.HOST", true); Prop stopHostProp = args.getProperties().getProp("STOP.HOST", true);
Props.Prop stopPortProp = args.getProperties().getProp("STOP.PORT", true); Prop stopPortProp = args.getProperties().getProp("STOP.PORT", true);
Props.Prop stopKeyProp = args.getProperties().getProp("STOP.KEY", true); Prop stopKeyProp = args.getProperties().getProp("STOP.KEY", true);
Props.Prop stopWaitProp = args.getProperties().getProp("STOP.WAIT", true); Prop stopWaitProp = args.getProperties().getProp("STOP.WAIT", true);
String stopHost = "127.0.0.1"; String stopHost = "127.0.0.1";
int stopPort = -1; int stopPort = -1;

View File

@ -37,7 +37,6 @@ import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.eclipse.jetty.start.Props.Prop; import org.eclipse.jetty.start.Props.Prop;
import org.eclipse.jetty.start.config.CommandLineConfigSource;
/** /**
* Represents a Module metadata, as defined in Jetty. * Represents a Module metadata, as defined in Jetty.
@ -527,9 +526,12 @@ public class Module implements Comparable<Module>
if (m.matches() && m.groupCount()==3) if (m.matches() && m.groupCount()==3)
{ {
String name = m.group(2); String name = m.group(2);
String value = m.group(3);
Prop p = props.getProp(name); Prop p = props.getProp(name);
if (p!=null && p.origin.startsWith(CommandLineConfigSource.ORIGIN_CMD_LINE))
if (p!=null && (p.source==null || !p.source.endsWith("?=")) && ("#".equals(m.group(1)) || !value.equals(p.value)))
{ {
System.err.printf("%s == %s :: %s%n",name,value,p.source);
StartLog.info("%-15s property set %s=%s",this._name,name,p.value); StartLog.info("%-15s property set %s=%s",this._name,name,p.value);
out.printf("%s=%s%n",name,p.value); out.printf("%s=%s%n",name,p.value);
} }

View File

@ -48,20 +48,13 @@ public final class Props implements Iterable<Prop>
{ {
public String key; public String key;
public String value; public String value;
public String origin; public String source;
public Prop overrides;
public Prop(String key, String value, String origin) public Prop(String key, String value, String source)
{ {
this.key = key; this.key = key;
this.value = value; this.value = value;
this.origin = origin; this.source = source;
}
public Prop(String key, String value, String origin, Prop overrides)
{
this(key,value,origin);
this.overrides = overrides;
} }
@Override @Override
@ -72,15 +65,12 @@ public final class Props implements Iterable<Prop>
builder.append(key); builder.append(key);
builder.append(", value="); builder.append(", value=");
builder.append(value); builder.append(value);
builder.append(", origin="); builder.append(", source=");
builder.append(origin); builder.append(source);
builder.append(", overrides=");
builder.append(overrides);
builder.append("]"); builder.append("]");
return builder.toString(); return builder.toString();
} }
} }
public static final String ORIGIN_SYSPROP = "<system-property>"; public static final String ORIGIN_SYSPROP = "<system-property>";
public static String getValue(String arg) public static String getValue(String arg)
@ -342,16 +332,7 @@ public final class Props implements Iterable<Prop>
public void setProperty(String key, String value, String origin) public void setProperty(String key, String value, String origin)
{ {
Prop prop = props.get(key); props.put(key,new Prop(key,value,origin));
if (prop == null)
{
prop = new Prop(key,value,origin);
}
else
{
prop = new Prop(key,value,origin,prop);
}
props.put(key,prop);
} }
public int size() public int size()

View File

@ -35,7 +35,6 @@ import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.Set; import java.util.Set;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.function.Function;
import org.eclipse.jetty.start.Props.Prop; import org.eclipse.jetty.start.Props.Prop;
import org.eclipse.jetty.start.config.ConfigSource; import org.eclipse.jetty.start.config.ConfigSource;
@ -123,9 +122,6 @@ public class StartArgs
/** Map of enabled modules to the source of where that activation occurred */ /** Map of enabled modules to the source of where that activation occurred */
Map<String, List<String>> sources = new HashMap<>(); Map<String, List<String>> sources = new HashMap<>();
/** Map of properties to where that property was declared */
private Map<String, String> propertySource = new HashMap<>();
/** List of all active [files] sections from enabled modules */ /** List of all active [files] sections from enabled modules */
private List<FileArg> files = new ArrayList<>(); private List<FileArg> files = new ArrayList<>();
@ -148,7 +144,7 @@ public class StartArgs
private List<Path> propertyFiles = new ArrayList<>(); private List<Path> propertyFiles = new ArrayList<>();
private Props properties = new Props(); private Props properties = new Props();
private Set<String> systemPropertyKeys = new HashSet<>(); private Map<String,String> systemPropertySource = new HashMap<>();
private List<String> rawLibs = new ArrayList<>(); private List<String> rawLibs = new ArrayList<>();
// jetty.base - build out commands // jetty.base - build out commands
@ -205,12 +201,6 @@ public class StartArgs
} }
} }
public void addSystemProperty(String key, String value)
{
this.systemPropertyKeys.add(key);
System.setProperty(key,value);
}
private void addUniqueXmlFile(String xmlRef, Path xmlfile) throws IOException private void addUniqueXmlFile(String xmlRef, Path xmlfile) throws IOException
{ {
if (!FS.canReadFile(xmlfile)) if (!FS.canReadFile(xmlfile))
@ -337,7 +327,7 @@ public class StartArgs
List<String> sortedKeys = new ArrayList<>(); List<String> sortedKeys = new ArrayList<>();
for (Prop prop : properties) for (Prop prop : properties)
{ {
if (prop.origin.equals(Props.ORIGIN_SYSPROP)) if (prop.source.equals(Props.ORIGIN_SYSPROP))
{ {
continue; // skip continue; // skip
} }
@ -369,16 +359,7 @@ public class StartArgs
{ {
System.out.printf(" %s = %s%n",key,prop.value); System.out.printf(" %s = %s%n",key,prop.value);
if (StartLog.isDebugEnabled()) if (StartLog.isDebugEnabled())
{ System.out.printf(" origin: %s%n",prop.source);
System.out.printf(" origin: %s%n",prop.origin);
while (prop.overrides != null)
{
prop = prop.overrides;
System.out.printf(" (overrides)%n");
System.out.printf(" %s = %s%n",key,prop.value);
System.out.printf(" origin: %s%n",prop.origin);
}
}
} }
} }
@ -388,26 +369,25 @@ public class StartArgs
System.out.println("System Properties:"); System.out.println("System Properties:");
System.out.println("------------------"); System.out.println("------------------");
if (systemPropertyKeys.isEmpty()) if (systemPropertySource.keySet().isEmpty())
{ {
System.out.println(" (no system properties specified)"); System.out.println(" (no system properties specified)");
return; return;
} }
List<String> sortedKeys = new ArrayList<>(); List<String> sortedKeys = new ArrayList<>();
sortedKeys.addAll(systemPropertyKeys); sortedKeys.addAll(systemPropertySource.keySet());
Collections.sort(sortedKeys); Collections.sort(sortedKeys);
for (String key : sortedKeys) for (String key : sortedKeys)
{ dumpSystemProperty(key);
String value = System.getProperty(key);
System.out.printf(" %s = %s%n",key,value);
}
} }
private void dumpSystemProperty(String key) private void dumpSystemProperty(String key)
{ {
System.out.printf(" %s = %s%n",key,System.getProperty(key)); String value = System.getProperty(key);
String source = systemPropertySource.get(key);
System.out.printf(" %s = %s (%s)%n",key,value,source);
} }
/** /**
@ -418,20 +398,20 @@ public class StartArgs
*/ */
private void ensureSystemPropertySet(String key) private void ensureSystemPropertySet(String key)
{ {
if (systemPropertyKeys.contains(key)) if (systemPropertySource.containsKey(key))
{ {
return; // done return; // done
} }
if (properties.containsKey(key)) if (properties.containsKey(key))
{ {
String val = properties.expand(properties.getString(key)); Prop prop = properties.getProp(key);
if (val == null) if (prop==null)
{ return; // no value set;
return; // no value to set
} String val = properties.expand(prop.value);
// setup system property // setup system property
systemPropertyKeys.add(key); systemPropertySource.put(key,"property:"+prop.source);
System.setProperty(key,val); System.setProperty(key,val);
} }
} }
@ -446,7 +426,7 @@ public class StartArgs
{ {
StartLog.debug("Expanding System Properties"); StartLog.debug("Expanding System Properties");
for (String key : systemPropertyKeys) for (String key : systemPropertySource.keySet())
{ {
String value = properties.getString(key); String value = properties.getString(key);
if (value!=null) if (value!=null)
@ -588,11 +568,8 @@ public class StartArgs
String key = assign[0]; String key = assign[0];
String value = assign.length==1?"":assign[1]; String value = assign.length==1?"":assign[1];
Property p = processProperty(key,value,"modules",k->{return System.getProperty(k);}); Prop p = processSystemProperty(key,value,null);
if (p!=null) cmd.addRawArg("-D"+p.key+"="+getProperties().expand(p.value));
{
cmd.addRawArg("-D"+p.key+"="+getProperties().expand(p.value));
}
} }
else else
{ {
@ -601,7 +578,7 @@ public class StartArgs
} }
// System Properties // System Properties
for (String propKey : systemPropertyKeys) for (String propKey : systemPropertySource.keySet())
{ {
String value = System.getProperty(propKey); String value = System.getProperty(propKey);
cmd.addEqualsArg("-D" + propKey,value); cmd.addEqualsArg("-D" + propKey,value);
@ -737,7 +714,7 @@ public class StartArgs
public boolean hasSystemProperties() public boolean hasSystemProperties()
{ {
for (String key : systemPropertyKeys) for (String key : systemPropertySource.keySet())
{ {
// ignored keys // ignored keys
if ("jetty.home".equals(key) || "jetty.base".equals(key) || "main.class".equals(key)) if ("jetty.home".equals(key) || "jetty.base".equals(key) || "main.class".equals(key))
@ -1096,13 +1073,10 @@ public class StartArgs
String key = assign[0]; String key = assign[0];
String value = assign.length==1?"":assign[1]; String value = assign.length==1?"":assign[1];
Property p = processProperty(key,value,source,k->{return System.getProperty(k);}); Prop p = processSystemProperty(key,value,source);
if (p!=null) systemPropertySource.put(p.key,p.source);
{ setProperty(p.key,p.value,p.source);
systemPropertyKeys.add(p.key); System.setProperty(p.key,p.value);
setProperty(p.key,p.value,p.source);
System.setProperty(p.key,p.value);
}
return; return;
} }
@ -1124,11 +1098,8 @@ public class StartArgs
String key = arg.substring(0,equals); String key = arg.substring(0,equals);
String value = arg.substring(equals + 1); String value = arg.substring(equals + 1);
Property p = processProperty(key,value,source,k->{return getProperties().getString(k);}); processAndSetProperty(key,value,source);
if (p!=null)
{
setProperty(p.key,p.value,p.source);
}
return; return;
} }
@ -1157,41 +1128,69 @@ public class StartArgs
throw new UsageException(UsageException.ERR_BAD_ARG,"Unrecognized argument: \"%s\" in %s",arg,source); throw new UsageException(UsageException.ERR_BAD_ARG,"Unrecognized argument: \"%s\" in %s",arg,source);
} }
protected Property processProperty(String key,String value,String source, Function<String, String> getter) protected Prop processSystemProperty(String key, String value, String source)
{ {
if (key.endsWith("+")) if (key.endsWith("+"))
{ {
key = key.substring(0,key.length() - 1); key = key.substring(0,key.length() - 1);
String orig = getter.apply(key); String orig = System.getProperty(key);
if (orig == null || orig.isEmpty()) if (orig == null || orig.isEmpty())
{ {
if (value.startsWith(",")) if (value.startsWith(","))
value = value.substring(1); value = value.substring(1);
} }
else
{
value = orig + value;
if (source!=null && systemPropertySource.containsKey(key))
source = systemPropertySource.get(key) + "," + source;
}
}
else if (key.endsWith("?"))
{
key = key.substring(0,key.length() - 1);
String preset = System.getProperty(key);
if (preset!=null)
{
value = preset;
source = systemPropertySource.get(key);
}
else if (source!=null)
source = source+"?=";
}
return new Prop(key, value, source);
}
protected void processAndSetProperty(String key,String value,String source)
{
if (key.endsWith("+"))
{
key = key.substring(0,key.length() - 1);
Prop orig = getProperties().getProp(key);
if (orig == null)
{
if (value.startsWith(","))
value = value.substring(1);
}
else else
{ {
value = orig + value; value = orig.value + value;
source = propertySource.get(key) + "," + source; source = orig.source + "," + source;
} }
} }
if (key.endsWith("?")) else if (key.endsWith("?"))
{ {
key = key.substring(0,key.length() - 1); key = key.substring(0,key.length() - 1);
String preset = getter.apply(key); Prop preset = getProperties().getProp(key);
if (preset!=null) if (preset!=null)
{ return;
if (source!=null)
source = source+"?="; source = source+"?=";
value = preset;
}
}
else if (propertySource.containsKey(key))
{
if (!propertySource.get(key).endsWith("[ini]"))
StartLog.warn("Property %s in %s already set in %s",key,source,propertySource.get(key));
propertySource.put(key,source);
} }
return new Property(key,value,source); setProperty(key,value,source);
} }
private void enableModules(String source, List<String> moduleNames) private void enableModules(String source, List<String> moduleNames)
@ -1303,22 +1302,4 @@ public class StartArgs
return builder.toString(); return builder.toString();
} }
static class Property
{
String key;
String value;
String source;
public Property(String key, String value, String source)
{
this.key = key;
this.value = value;
this.source = source;
}
@Override
public String toString()
{
return String.format("%s=%s(%s)",key,value,source);
}
}
} }

View File

@ -92,7 +92,9 @@ public class StartIni extends TextFile
update = update.substring(0,update.lastIndexOf(".")); update = update.substring(0,update.lastIndexOf("."));
String source = baseHome.toShortForm(getFile()); String source = baseHome.toShortForm(getFile());
try (PrintWriter writer = new PrintWriter(Files.newBufferedWriter(getFile(),StandardCharsets.UTF_8,StandardOpenOption.TRUNCATE_EXISTING,StandardOpenOption.CREATE))) PrintWriter writer = null;
try
{ {
for (String line : getAllLines()) for (String line : getAllLines())
{ {
@ -102,23 +104,42 @@ public class StartIni extends TextFile
String name = m.group(2); String name = m.group(2);
String value = m.group(3); String value = m.group(3);
Prop p = props.getProp(name); Prop p = props.getProp(name);
if (p!=null && ("#".equals(m.group(1)) || !value.equals(p.value)))
if (p!=null && (p.source==null || !p.source.endsWith("?=")) && ("#".equals(m.group(1)) || !value.equals(p.value)))
{ {
if (writer==null)
{
writer = new PrintWriter(Files.newBufferedWriter(getFile(),StandardCharsets.UTF_8,StandardOpenOption.TRUNCATE_EXISTING,StandardOpenOption.CREATE));
for (String l : getAllLines())
{
if (line.equals(l))
break;
writer.println(l);
}
}
StartLog.info("%-15s property updated %s=%s",update,name,p.value); StartLog.info("%-15s property updated %s=%s",update,name,p.value);
writer.printf("%s=%s%n",name,p.value); writer.printf("%s=%s%n",name,p.value);
} }
else else if (writer!=null)
{ {
writer.println(line); writer.println(line);
} }
} }
else else if (writer!=null)
{ {
writer.println(line); writer.println(line);
} }
} }
} }
finally
{
if (writer!=null)
{
StartLog.info("%-15s updated %s",update,source);
writer.close();
}
}
StartLog.info("%-15s updated %s",update,source);
} }
} }

View File

@ -142,7 +142,7 @@ public class ConfigurationAssert
"jetty.home.uri".equals(name) || "jetty.home.uri".equals(name) ||
"jetty.base.uri".equals(name) || "jetty.base.uri".equals(name) ||
"user.dir".equals(name) || "user.dir".equals(name) ||
prop.origin.equals(Props.ORIGIN_SYSPROP) || prop.source.equals(Props.ORIGIN_SYSPROP) ||
name.startsWith("java.")) name.startsWith("java."))
{ {
// strip these out from assertion, to make assertions easier. // strip these out from assertion, to make assertions easier.

View File

@ -20,7 +20,6 @@ package org.eclipse.jetty.start;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
@ -36,7 +35,7 @@ public class PropsTest
assertThat(prefix,prop,notNullValue()); assertThat(prefix,prop,notNullValue());
assertThat(prefix + ".key",prop.key,is(expectedKey)); assertThat(prefix + ".key",prop.key,is(expectedKey));
assertThat(prefix + ".value",prop.value,is(expectedValue)); assertThat(prefix + ".value",prop.value,is(expectedValue));
assertThat(prefix + ".origin",prop.origin,is(expectedOrigin)); assertThat(prefix + ".origin",prop.source,is(expectedOrigin));
} }
@Test @Test
@ -49,7 +48,6 @@ public class PropsTest
Prop prop = props.getProp("java.io.tmpdir"); Prop prop = props.getProp("java.io.tmpdir");
assertProp("System Prop",prop,"java.io.tmpdir",expected,Props.ORIGIN_SYSPROP); assertProp("System Prop",prop,"java.io.tmpdir",expected,Props.ORIGIN_SYSPROP);
assertThat("System Prop.overrides",prop.overrides,nullValue());
} }
@Test @Test
@ -63,25 +61,6 @@ public class PropsTest
Prop prop = props.getProp("name"); Prop prop = props.getProp("name");
assertProp(prefix,prop,"name","jetty",FROM_TEST); assertProp(prefix,prop,"name","jetty",FROM_TEST);
assertThat(prefix + ".overrides",prop.overrides,nullValue());
}
@Test
public void testOverride()
{
Props props = new Props();
props.setProperty("name","jetty",FROM_TEST);
props.setProperty("name","altjetty","(Alt-Jetty)");
String prefix = "Overriden";
assertThat(prefix,props.getString("name"),is("altjetty"));
Prop prop = props.getProp("name");
assertProp(prefix,prop,"name","altjetty","(Alt-Jetty)");
Prop older = prop.overrides;
assertThat(prefix + ".overrides",older,notNullValue());
assertProp(prefix + ".overridden",older,"name","jetty",FROM_TEST);
assertThat(prefix + ".overridden",older.overrides,nullValue());
} }
@Test @Test

View File

@ -12,6 +12,7 @@ PROP|main.prop=value0
PROP|name=value PROP|name=value
PROP|name0=changed0 PROP|name0=changed0
PROP|name1=changed1 PROP|name1=changed1
PROP|name2=two
PROP|property=value PROP|property=value
PROP|property0=value0 PROP|property0=value0

View File

@ -12,6 +12,7 @@ PROP|main.prop=value0
PROP|name=value PROP|name=value
PROP|name0=changed0 PROP|name0=changed0
PROP|name1=changed1 PROP|name1=changed1
PROP|name2=two
PROP|property=value PROP|property=value
PROP|property0=value0 PROP|property0=value0

View File

@ -10,8 +10,9 @@ LIB|${jetty.home}/lib/other.jar
# The Properties we expect (order is irrelevant) # The Properties we expect (order is irrelevant)
PROP|main.prop=value0 PROP|main.prop=value0
PROP|name=value PROP|name=value
PROP|name0=changed0 PROP|name0=updated0
PROP|name1=changed1 PROP|name1=changed1
PROP|name2=two
PROP|property=value PROP|property=value
PROP|property0=changed0 PROP|property0=changed0
PROP|property1=changed1 PROP|property1=changed1

View File

@ -8,3 +8,4 @@ name1=changed1
--update-ini --update-ini
property0=changed0 property0=changed0
property1=changed1 property1=changed1
name0=updated0

View File

@ -4,7 +4,10 @@ main
[ini] [ini]
name=value name=value
name0?=default
name2?=two
[ini-template] [ini-template]
name0=value0 name0=value0
# name1=value1 # name1=value1
# name2=too