Added --update-ini option to set properties in existing ini files.
This commit is contained in:
Greg Wilkins 2016-12-07 20:54:12 +11:00
parent a4884f0c2d
commit 52f3f70f36
13 changed files with 168 additions and 3 deletions

View File

@ -38,8 +38,11 @@ import java.net.SocketTimeoutException;
import java.nio.file.Path;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import org.eclipse.jetty.start.Props.Prop;
import org.eclipse.jetty.start.config.CommandLineConfigSource;
import org.eclipse.jetty.start.config.ConfigSource;
/**
* Main start class.
@ -399,6 +402,32 @@ public class Main
doStop(args);
}
if (args.isUpdateIni())
{
for (ConfigSource config : baseHome.getConfigSources())
{
System.out.printf("ConfigSource %s%n",config.getId());
for (StartIni ini : config.getStartInis())
{
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;
}
}
}
}
}
}
// Check base directory
BaseBuilder baseBuilder = new BaseBuilder(baseHome,args);
if(baseBuilder.build())

View File

@ -61,9 +61,8 @@ import org.eclipse.jetty.start.config.CommandLineConfigSource;
public class Module implements Comparable<Module>
{
private static final String VERSION_UNSPECIFIED = "9.2";
private static Pattern MOD_NAME = Pattern.compile("^(.*)\\.mod",Pattern.CASE_INSENSITIVE);
private static Pattern SET_PROPERTY = Pattern.compile("^(#?)\\s*([^=\\s]+)=(.*)$");
static Pattern MOD_NAME = Pattern.compile("^(.*)\\.mod",Pattern.CASE_INSENSITIVE);
static Pattern SET_PROPERTY = Pattern.compile("^(#?)\\s*([^=\\s]+)=(.*)$");
/** The file of the module */
private final Path _path;

View File

@ -178,6 +178,8 @@ public class StartArgs
private boolean version = false;
private boolean dryRun = false;
private boolean createStartd = false;
private boolean updateIni = false;
private boolean exec = false;
private String exec_properties;
@ -786,6 +788,11 @@ public class StartArgs
return createStartd;
}
public boolean isUpdateIni()
{
return updateIni;
}
public void parse(ConfigSources sources)
{
ListIterator<ConfigSource> iter = sources.reverseListIterator();
@ -899,6 +906,13 @@ public class StartArgs
return;
}
if (arg.equals("--update-ini") || arg.equals("--update-inis"))
{
run = false;
updateIni = true;
return;
}
if ("--list-classpath".equals(arg) || "--version".equals(arg) || "-v".equals(arg) || "--info".equals(arg))
{
listClasspath = true;

View File

@ -18,8 +18,16 @@
package org.eclipse.jetty.start;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.regex.Matcher;
import org.eclipse.jetty.start.Props.Prop;
/**
* Simple Start .INI handler
@ -78,4 +86,40 @@ public class StartIni extends TextFile
{
return basedir;
}
public void update(BaseHome baseHome,Props props) throws IOException
{
String update = getFile().getFileName().toString();
update = update.substring(0,update.lastIndexOf("."));
String source = baseHome.toShortForm(getFile());
try (PrintWriter writer = new PrintWriter(Files.newBufferedWriter(getFile(),StandardCharsets.UTF_8,StandardOpenOption.TRUNCATE_EXISTING,StandardOpenOption.CREATE)))
{
for (String line : 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 = props.getProp(name);
if (p!=null && ("#".equals(m.group(1)) || !value.equals(p.value)))
{
StartLog.info("%-15s property updated %s=%s",update,name,p.value);
writer.printf("%s=%s%n",name,p.value);
}
else
{
writer.println(line);
}
}
else
{
writer.println(line);
}
}
}
StartLog.info("%-15s updated %s",update,source);
}
}

View File

@ -40,6 +40,7 @@ public class TextFile implements Iterable<String>
{
private final Path file;
private final List<String> lines = new ArrayList<>();
private final List<String> allLines = new ArrayList<>();
public TextFile(Path file) throws FileNotFoundException, IOException
{
@ -62,6 +63,8 @@ public class TextFile implements Iterable<String>
continue;
}
allLines.add(line);
if (line.charAt(0) == '#')
{
continue;
@ -106,6 +109,11 @@ public class TextFile implements Iterable<String>
return lines;
}
public List<String> getAllLines()
{
return allLines;
}
public void init()
{
}
@ -130,4 +138,10 @@ public class TextFile implements Iterable<String>
{
addUniqueLine(line);
}
@Override
public String toString()
{
return file.toString();
}
}

View File

@ -18,8 +18,12 @@
package org.eclipse.jetty.start.config;
import java.util.Collections;
import java.util.Set;
import org.eclipse.jetty.start.Props;
import org.eclipse.jetty.start.RawArgs;
import org.eclipse.jetty.start.StartIni;
/**
* A Configuration Source
@ -72,4 +76,9 @@ public interface ConfigSource
* @return the value of the property, or null if not found
*/
public String getProperty(String key);
public default Set<StartIni> getStartInis()
{
return Collections.emptySet();
}
}

View File

@ -28,7 +28,9 @@ import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.jetty.start.FS;
import org.eclipse.jetty.start.NaturalSort;
@ -75,6 +77,7 @@ public class DirConfigSource implements ConfigSource
private final int weight;
private final RawArgs args;
private final Props props;
private final Set<StartIni> startInis = new HashSet<>();
/**
* Create DirConfigSource with specified identifier and directory.
@ -109,6 +112,7 @@ public class DirConfigSource implements ConfigSource
if (FS.canReadFile(iniFile))
{
StartIni ini = new StartIni(iniFile);
startInis.add(ini);
args.addAll(ini.getLines(),iniFile);
parseAllArgs(ini.getLines(),iniFile.toString());
}
@ -149,6 +153,7 @@ public class DirConfigSource implements ConfigSource
{
StartLog.debug("Reading %s/start.d/%s - %s",id,diniFile.getFileName(),diniFile);
StartIni ini = new StartIni(diniFile);
startInis.add(ini);
args.addAll(ini.getLines(),diniFile);
parseAllArgs(ini.getLines(),diniFile.toString());
}
@ -156,6 +161,12 @@ public class DirConfigSource implements ConfigSource
}
}
@Override
public Set<StartIni> getStartInis()
{
return startInis;
}
private void parseAllArgs(List<String> lines, String origin)
{
for (String line : lines)

View File

@ -114,6 +114,10 @@ Module Management:
Note: not all modules have ini templates and thus may
be transitively enabled and not explicitly enabled in
a ini file.
--update-ini Scan all start.ini and start.d/*.ini files and update
any properties with values specified on the command
line. e.g. --update-ini jetty.http.port=8888
--create-startd Ensure that a start.d directory exists for use by
subsequent --add-to-start=*. If a start.ini file exists

View File

@ -12,6 +12,8 @@ PROP|main.prop=value0
PROP|name=value
PROP|name0=changed0
PROP|name1=changed1
PROP|property=value
PROP|property0=value0
# Files / Directories to create
EXISTS|start.d/parameterized.ini

View File

@ -12,6 +12,8 @@ PROP|main.prop=value0
PROP|name=value
PROP|name0=changed0
PROP|name1=changed1
PROP|property=value
PROP|property0=value0
# Files / Directories to create
EXISTS|start.d/parameterized.ini

View File

@ -0,0 +1,20 @@
## The XMLs we expect (order is important)
XML|${jetty.home}/etc/base.xml
XML|${jetty.home}/etc/main.xml
# The LIBs we expect (order is irrelevant)
LIB|${jetty.home}/lib/base.jar
LIB|${jetty.home}/lib/main.jar
LIB|${jetty.home}/lib/other.jar
# The Properties we expect (order is irrelevant)
PROP|main.prop=value0
PROP|name=value
PROP|name0=changed0
PROP|name1=changed1
PROP|property=value
PROP|property0=changed0
PROP|property1=changed1
# Files / Directories to create
EXISTS|start.d/parameterized.ini

View File

@ -0,0 +1,10 @@
--create-startd
other=value
name=changed
name0=changed0
name1=changed1
--add-to-start=parameterized
--update-ini
property0=changed0
property1=changed1

View File

@ -0,0 +1,7 @@
#p=v
property=value
#comment
property0=value0
#comment
#property1=value1