From 0f56762ce87856392025f6ad79f9204aad4e1260 Mon Sep 17 00:00:00 2001
From: Joakim Erdfelt
Date: Wed, 12 Aug 2009 20:14:54 +0000
Subject: [PATCH] Adding dynamic OPTIONS options discovery.
* Adding new dynamic classpath section identifier using syntax discussed
on irc. [=path_to_dir/*]
git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@704 7e9141cc-0065-0410-87d8-b60c137991c4
---
.../java/org/eclipse/jetty/start/Config.java | 73 +++++++++++++++----
.../org/eclipse/jetty/start/start.config | 9 +--
2 files changed, 63 insertions(+), 19 deletions(-)
diff --git a/jetty-start/src/main/java/org/eclipse/jetty/start/Config.java b/jetty-start/src/main/java/org/eclipse/jetty/start/Config.java
index c4a2e367861..8bcb36ea933 100644
--- a/jetty-start/src/main/java/org/eclipse/jetty/start/Config.java
+++ b/jetty-start/src/main/java/org/eclipse/jetty/start/Config.java
@@ -18,6 +18,7 @@ package org.eclipse.jetty.start;
import java.io.BufferedReader;
import java.io.File;
+import java.io.FileFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -120,6 +121,11 @@ import java.util.TreeSet;
*
*
*
+ * Note: a special discovered section identifier [=path_to_directory/*]
is allowed to auto-create section
+ * IDs, based on directory names found in the path specified in the "path_to_directory/" part of the identifier.
+ *
+ *
+ *
* Clauses after a section header will only be included if they match one of the tags in the options property. By
* default options are set to "default,*" or the OPTIONS property may be used to pass in a list of tags, eg. :
*
@@ -554,15 +560,26 @@ public class Config
// handle options
if (trim.startsWith("[") && trim.endsWith("]"))
{
- sections = Arrays.asList(trim.substring(1,trim.length() - 1).split(","));
- // Ensure section classpaths exist
- for (String sectionId : sections)
+ String identifier = trim.substring(1,trim.length() - 1);
+ if (identifier.charAt(0) == '=')
{
- if (!_classpaths.containsKey(sectionId))
+ // Special case: dynamic/discovered option section identifier.
+ processDynamicSectionIdentifier(identifier.substring(1));
+ }
+ else
+ {
+ // Normal case: section identifier (possibly separated by commas)
+ sections = Arrays.asList(identifier.split(","));
+ // Ensure section classpaths exist
+ for (String sectionId : sections)
{
- _classpaths.put(sectionId,new Classpath());
+ if (!_classpaths.containsKey(sectionId))
+ {
+ _classpaths.put(sectionId,new Classpath());
+ }
}
}
+ continue;
}
try
@@ -803,6 +820,37 @@ public class Config
}
}
+ private void processDynamicSectionIdentifier(String dynamicPathId) throws IOException
+ {
+ if (!dynamicPathId.endsWith("/*"))
+ {
+ String msg = "Dynamic Section IDs must end in \"/*\" to work. Ignoring: [=" + dynamicPathId + "]";
+ System.err.println(msg);
+ throw new IOException(msg);
+ }
+
+ String rawPath = fixPath(dynamicPathId.substring(0,dynamicPathId.length() - 1));
+ File parentDir = new File(expand(rawPath));
+ debug("Adding dynamic section entries based on path: " + parentDir);
+ File dirs[] = parentDir.listFiles(new FileFilter()
+ {
+ public boolean accept(File path)
+ {
+ return path.isDirectory();
+ }
+ });
+
+ List sections = new ArrayList();
+ for (File dir : dirs)
+ {
+ sections.clear();
+ sections.add("All");
+ String id = dir.getName();
+ sections.add(id);
+ addJars(sections,dir,false);
+ }
+ }
+
private String fixPath(String path)
{
return path.replace('/',File.separatorChar);
@@ -842,7 +890,7 @@ public class Config
String ids[] = value.split(",");
for (String id : ids)
{
- _activeOptions.add(id);
+ addActiveOption(id);
}
}
_properties.put(name,value);
@@ -866,23 +914,22 @@ public class Config
public void addActiveOption(String option)
{
- _activeOptions.add(option);
- setProperty("OPTIONS",join(_activeOptions,","));
+ if (!_activeOptions.contains(option))
+ {
+ _activeOptions.add(option);
+ }
+ _properties.put("OPTIONS",join(_activeOptions,","));
}
public Set getActiveOptions()
{
- if (!_activeOptions.isEmpty())
- {
- _activeOptions.add("*");
- }
return _activeOptions;
}
public void removeActiveOption(String option)
{
_activeOptions.remove(option);
- setProperty("OPTIONS",join(_activeOptions,","));
+ _properties.put("OPTIONS",join(_activeOptions,","));
}
private String join(Collection> coll, String delim)
diff --git a/jetty-start/src/main/resources/org/eclipse/jetty/start/start.config b/jetty-start/src/main/resources/org/eclipse/jetty/start/start.config
index ecfda3f3173..e439654e3b1 100644
--- a/jetty-start/src/main/resources/org/eclipse/jetty/start/start.config
+++ b/jetty-start/src/main/resources/org/eclipse/jetty/start/start.config
@@ -76,6 +76,7 @@ ${start.class}.class property start.class
$(jetty.home)/etc/jetty.xml nargs == 0
./jetty-server/src/main/config/etc/jetty.xml nargs == 0 AND ! exists $(jetty.home)/etc/jetty.xml
+# Default OPTIONS if not specified on the command line
OPTIONS~=default,* ! property OPTIONS
# Add a ext lib directory if it is there
@@ -125,12 +126,6 @@ $(jetty.home)/lib/jetty-jmx-$(version).jar
[All,ajp]
$(jetty.home)/lib/jetty-ajp-$(version).jar ! available org.eclipse.jetty.ajp.Ajp13Connection
-[All,slf4j]
-$(jetty.home)/lib/slf4j/** exists $(jetty.home)/lib/slf4j
-
-[All,jsp,jsp-2.1]
-$(jetty.home)/lib/jsp-2.1/** exists $(jetty.home)/lib/jsp-2.1
-
[All,plus]
$(jetty.home)/lib/jetty-jndi-${version}.jar ! available org.eclipse.jetty.jndi.ContextFactory
$(jetty.home)/lib/jetty-jndi/** exists $(jetty.home)/lib/jetty-jndi
@@ -148,4 +143,6 @@ $(jetty.home)/lib/jetty-client-$(version).jar
$(jetty.home)/lib/security/jetty-policy-$(version).jar ! available org.eclipse.jetty.policy.JettyPolicy
$(jetty.home)/lib/security/jetty.policy always
+# Add all other sub-directories in /lib/ as options in a dynamic way
+[=$(jetty.home)/lib/*]