You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by th...@apache.org on 2012/04/12 19:39:09 UTC

svn commit: r1325398 - in /river/jtsk/skunk/easystart: src-extra/org/apache/river/extra/easystart/ src-extra/org/apache/river/extra/easystart/config/ src-extra/org/apache/river/extra/easystart/config/settings/ test/src/org/apache/river/extra/easystart/

Author: thobbs
Date: Thu Apr 12 17:39:08 2012
New Revision: 1325398

URL: http://svn.apache.org/viewvc?rev=1325398&view=rev
Log:
Started tidy up of easy config code.  Lookupservice config is starting to look better.

Added:
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/ConfigurationFactory.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/EasyConfiguration.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/ClasspathSetting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/CodebaseSetting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/DefaultOptions.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/GroupedSetting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/Options.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/PolicySetting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/ServerExporterSetting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/Setting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/SettingsFactory.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/start.config
Removed:
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/ClasspathSetting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/CodebaseSetting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/GroupedSetting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/Options.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/PolicySetting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/ServerExporterSetting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/Setting.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/start.config
    river/jtsk/skunk/easystart/test/src/org/apache/river/extra/easystart/GroupEncapsulatorTest.java
Modified:
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartLookupService.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartMahaloService.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartOutriggerService.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/JavaSpaceConfiguration.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/LookupServiceConfiguration.java
    river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/TransactionServiceConfiguration.java

Modified: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartLookupService.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartLookupService.java?rev=1325398&r1=1325397&r2=1325398&view=diff
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartLookupService.java (original)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartLookupService.java Thu Apr 12 17:39:08 2012
@@ -22,11 +22,11 @@ import java.io.File;
 import java.io.IOException;
 import java.util.logging.Logger;
 
-import org.apache.river.extra.easystart.config.LookupServiceConfiguration;
-
-import net.jini.config.Configuration;
 import net.jini.config.ConfigurationException;
 
+import org.apache.river.extra.easystart.config.ConfigurationFactory;
+import org.apache.river.extra.easystart.config.LookupServiceConfiguration;
+import org.apache.river.extra.easystart.config.settings.DefaultOptions;
 
 import com.sun.jini.start.ServiceStarter;
 
@@ -52,15 +52,15 @@ public class StartLookupService {
 		log.info("Using RIVER_HOME="+RIVER_HOME);
 		log.info("Using HTTP_PORT="+HTTP_PORT);
 		
-		final String riverHome = "/home/tom/projects/river/easystart";
-		final String pathToConfig = "/home/tom/projects/river/easystart/src-extra/empty.config";
-		final String pathToPolicy = "/home/tom/projects/river/easystart/src-extra/outrigger.policy";
+//		final String riverHome = "/home/tom/projects/river/easystart";
+//		final String pathToConfig = "/home/tom/projects/river/easystart/src-extra/empty.config";
+//		final String pathToPolicy = "/home/tom/projects/river/easystart/src-extra/outrigger.policy";
 		
 		//this works because these files are in river-extras.jar which is on the CP
 //		final String pathToConfig = "empty.config";
 //		final String pathToPolicy = "outrigger.policy";
 		
-		final String classpath = "/home/tom/projects/river/easystart/lib/reggie.jar";
+//		final String classpath = "/home/tom/projects/river/easystart/lib/reggie.jar";
 		
 //		LookupServiceConfiguration config = new LookupServiceConfiguration(8080,
 //				riverHome,
@@ -85,8 +85,17 @@ public class StartLookupService {
 //		Configuration config = vcb.createConfiguration();
 		
 //		Configuration config = new ConventionalLookupServiceConfiguration(new String[0]);
-		Configuration config = LookupServiceConfiguration.config();
-		ServiceStarter.main(config);
+//		Configuration config = LookupServiceConfiguration.config();
+		
+		DefaultOptions options = new DefaultOptions();
+		
+		ConfigurationFactory configFac = new ConfigurationFactory(options);
+		LookupServiceConfiguration config = configFac.lookupServiceConfig();
+		config.addMemberGroup("Lester").addMemberGroup("Jeff");
+		config.addLookupGroup("Sarah").addLookupGroup("Chuck");
+		config.setRiverPort(4160);
+		
+		ServiceStarter.main(config.riverConfig());
 		
 	}
 

Modified: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartMahaloService.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartMahaloService.java?rev=1325398&r1=1325397&r2=1325398&view=diff
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartMahaloService.java (original)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartMahaloService.java Thu Apr 12 17:39:08 2012
@@ -22,13 +22,8 @@ import java.io.File;
 import java.io.IOException;
 import java.util.logging.Logger;
 
-import net.jini.config.Configuration;
 import net.jini.config.ConfigurationException;
 
-import org.apache.river.extra.easystart.config.TransactionServiceConfiguration;
-
-import com.sun.jini.start.ServiceStarter;
-
 public class StartMahaloService {
 
 
@@ -51,8 +46,8 @@ public class StartMahaloService {
 		log.info("Using RIVER_HOME="+RIVER_HOME);
 		log.info("Using HTTP_PORT="+HTTP_PORT);
 		
-		Configuration config = TransactionServiceConfiguration.config();
-		ServiceStarter.main(config);
+//		Configuration config = TransactionServiceConfiguration.config();
+//		ServiceStarter.main(config);
 	}
 
 	private static void validateArgs(String[] args) {

Modified: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartOutriggerService.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartOutriggerService.java?rev=1325398&r1=1325397&r2=1325398&view=diff
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartOutriggerService.java (original)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/StartOutriggerService.java Thu Apr 12 17:39:08 2012
@@ -22,13 +22,8 @@ import java.io.File;
 import java.io.IOException;
 import java.util.logging.Logger;
 
-import net.jini.config.Configuration;
 import net.jini.config.ConfigurationException;
 
-import org.apache.river.extra.easystart.config.JavaSpaceConfiguration;
-
-import com.sun.jini.start.ServiceStarter;
-
 public class StartOutriggerService {
 
 
@@ -67,8 +62,8 @@ public class StartOutriggerService {
 //		config.addLookupGroup("Lester");
 //		config.addLookupGroup("Jeff");
 		
-		Configuration config = JavaSpaceConfiguration.config();
-		ServiceStarter.main(config);
+//		Configuration config = JavaSpaceConfiguration.config();
+//		ServiceStarter.main(config);
 	}
 
 	private static void validateArgs(String[] args) {

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/ConfigurationFactory.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/ConfigurationFactory.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/ConfigurationFactory.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,33 @@
+package org.apache.river.extra.easystart.config;
+
+import org.apache.river.extra.easystart.config.settings.DefaultOptions;
+
+public class ConfigurationFactory {
+
+	private final DefaultOptions options;
+	
+	public ConfigurationFactory(DefaultOptions options) {
+		this.options = (DefaultOptions) options.clone();
+	}
+	
+
+	public LookupServiceConfiguration lookupServiceConfig() {
+		return new LookupServiceConfiguration(options);
+		
+//		opts.PACKAGE_NAME.setOverride("com.sun.jini.reggie");
+////	opts.RIVER_HOME;  - no override for this
+//	opts.HTTP_PORT.setOverride("8080");
+//	opts.JINI_PORT.setOverride("4160");
+////	opts.MEMBER_GROUPS.add("Lester").add("Jeff");
+//	opts.MEMBER_GROUPS.add("Chuck").add("Sarah");
+////	opts.LOOKUP_GROUPS.add("Chuck").add("Sarah");
+//	opts.SERVICE_IMPL.setOverride("com.sun.jini.reggie.TransientRegistrarImpl");
+//	opts.CODEBASE.add("reggie-dl.jar").add("jsk-dl.jar");
+//	opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/reggie.jar");
+//	opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/jini-ext.jar");
+////	opts.POLICY.setOverride("secure.policy");
+////	opts.SERVER_EXPORTER.asJeriExporter("localhost", 4161);
+		
+	}
+	
+}

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/EasyConfiguration.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/EasyConfiguration.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/EasyConfiguration.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/EasyConfiguration.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,20 @@
+package org.apache.river.extra.easystart.config;
+
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
+
+import net.jini.config.ConfigurationException;
+import net.jini.config.ConfigurationFile;
+
+import org.apache.river.extra.easystart.config.settings.Setting;
+
+public abstract class EasyConfiguration extends ConfigurationFile {
+
+	private final Map<String, Setting> defaults = new HashMap<String, Setting>();
+	
+	protected EasyConfiguration(Reader reader, String[] options) throws ConfigurationException {
+		super(reader, options);
+	}
+
+}

Modified: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/JavaSpaceConfiguration.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/JavaSpaceConfiguration.java?rev=1325398&r1=1325397&r2=1325398&view=diff
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/JavaSpaceConfiguration.java (original)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/JavaSpaceConfiguration.java Thu Apr 12 17:39:08 2012
@@ -1,89 +1,80 @@
 package org.apache.river.extra.easystart.config;
 
-import java.io.IOException;
 import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.Properties;
 import java.util.logging.Logger;
 
 import net.jini.config.ConfigurationException;
 import net.jini.config.ConfigurationFile;
 
-import org.apache.river.config.builder.VelocityConfigurationBuilder;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-
 public class JavaSpaceConfiguration extends ConfigurationFile {
 
 	private static final Logger LOGGER = Logger.getLogger(JavaSpaceConfiguration.class.getName());
 	
-	public static JavaSpaceConfiguration config() throws IOException, ConfigurationException {
-		
-		Options opts = new Options();
-		opts.PACKAGE_NAME.setOverride("com.sun.jini.outrigger");
-//		opts.RIVER_HOME;  - no override for this
-		opts.HTTP_PORT.setOverride("8080");
-//		opts.JINI_PORT.setOverride("4160");
-//		opts.MEMBER_GROUPS.add("Lester").add("Jeff");
-		opts.LOOKUP_GROUPS.add("Chuck").add("Sarah");
-		opts.SERVICE_IMPL.setOverride("com.sun.jini.outrigger.TransientOutriggerImpl");
-		opts.CODEBASE.add("outrigger-dl.jar").add("jsk-dl.jar");
-		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/outrigger.jar");
-//		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/jini-ext.jar");
-//		opts.POLICY.setOverride("secure.policy");
-//		opts.SERVER_EXPORTER.asJeriExporter("localhost", 4161);
-		
-		Properties p = new Properties();
-		p.load( VelocityConfigurationBuilder.class.getResourceAsStream("velocity.properties") );
-		VelocityEngine ve = new VelocityEngine(p);
-		VelocityContext context = new VelocityContext();
-		
-		StringBuilder options = new StringBuilder();
-		StringBuilder defaults = new StringBuilder();
-		String key = opts.PACKAGE_NAME.getOverride()+'.';
-		for(Setting setting : opts.OPTIONS) {
-			String format = setting.getFormatter();
-			if(setting.isServiceDescription()) {
-	        	
-	        	String name = key + setting.getName();
-	        	
-	        	options
-	        		.append(",\"")
-	        		.append(name)
-	        		.append('=')
-	        		.append(String.format(format, setting.getOverride()))
-	        		.append("\"\n");
-	        	
-	        	defaults
-	        		.append(setting.getName())
-	        		.append('=')
-	        		.append(String.format(format, setting.getDefault()))
-	        		.append(";\n");
-			} else {
-	        	context.put(setting.getName(),
-				String.format(format, setting.getOverride()));
-			}
-		}
-		
-        context.put("defaults", defaults.toString());
-        context.put("options", options.toString());
-        
-        Template template = ve.getTemplate( Options.class.getResource("start.config").toExternalForm() );
-        
-        StringWriter sw = new StringWriter();
-
-        template.merge(context, sw);
-        
-        String s = sw.toString();
-        
-        LOGGER.warning(s);
-        
-        StringReader sr = new StringReader(s);
-        
-        return new JavaSpaceConfiguration(sr, new String[0]);//opts.getOptionsArray());
-	}
+//	public static JavaSpaceConfiguration config() throws IOException, ConfigurationException {
+//		
+//		Options opts = new Options();
+//		opts.PACKAGE_NAME.setOverride("com.sun.jini.outrigger");
+////		opts.RIVER_HOME;  - no override for this
+//		opts.HTTP_PORT.setOverride("8080");
+////		opts.JINI_PORT.setOverride("4160");
+////		opts.MEMBER_GROUPS.add("Lester").add("Jeff");
+//		opts.LOOKUP_GROUPS.add("Chuck").add("Sarah");
+//		opts.SERVICE_IMPL.setOverride("com.sun.jini.outrigger.TransientOutriggerImpl");
+//		opts.CODEBASE.add("outrigger-dl.jar").add("jsk-dl.jar");
+//		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/outrigger.jar");
+////		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/jini-ext.jar");
+////		opts.POLICY.setOverride("secure.policy");
+////		opts.SERVER_EXPORTER.asJeriExporter("localhost", 4161);
+//		
+//		Properties p = new Properties();
+//		p.load( VelocityConfigurationBuilder.class.getResourceAsStream("velocity.properties") );
+//		VelocityEngine ve = new VelocityEngine(p);
+//		VelocityContext context = new VelocityContext();
+//		
+//		StringBuilder options = new StringBuilder();
+//		StringBuilder defaults = new StringBuilder();
+//		String key = opts.PACKAGE_NAME.getOverride()+'.';
+//		for(Setting setting : opts.OPTIONS) {
+//			String format = setting.getFormatter();
+//			if(setting.isServiceDescription()) {
+//	        	
+//	        	String name = key + setting.getName();
+//	        	
+//	        	options
+//	        		.append(",\"")
+//	        		.append(name)
+//	        		.append('=')
+//	        		.append(String.format(format, setting.getOverride()))
+//	        		.append("\"\n");
+//	        	
+//	        	defaults
+//	        		.append(setting.getName())
+//	        		.append('=')
+//	        		.append(String.format(format, setting.getDefault()))
+//	        		.append(";\n");
+//			} else {
+//	        	context.put(setting.getName(),
+//				String.format(format, setting.getOverride()));
+//			}
+//		}
+//		
+//        context.put("defaults", defaults.toString());
+//        context.put("options", options.toString());
+//        
+//        Template template = ve.getTemplate( Options.class.getResource("start.config").toExternalForm() );
+//        
+//        StringWriter sw = new StringWriter();
+//
+//        template.merge(context, sw);
+//        
+//        String s = sw.toString();
+//        
+//        LOGGER.warning(s);
+//        
+//        StringReader sr = new StringReader(s);
+//        
+//        return new JavaSpaceConfiguration(sr, new String[0]);//opts.getOptionsArray());
+//	}
 	
 	private JavaSpaceConfiguration(Reader reader, String[] options) throws ConfigurationException {
 		super(reader,options);

Modified: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/LookupServiceConfiguration.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/LookupServiceConfiguration.java?rev=1325398&r1=1325397&r2=1325398&view=diff
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/LookupServiceConfiguration.java (original)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/LookupServiceConfiguration.java Thu Apr 12 17:39:08 2012
@@ -1,41 +1,64 @@
 package org.apache.river.extra.easystart.config;
 
 import java.io.IOException;
-import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.Properties;
 import java.util.logging.Logger;
 
+import net.jini.config.Configuration;
 import net.jini.config.ConfigurationException;
 import net.jini.config.ConfigurationFile;
 
 import org.apache.river.config.builder.VelocityConfigurationBuilder;
+import org.apache.river.extra.easystart.config.settings.DefaultOptions;
+import org.apache.river.extra.easystart.config.settings.GroupedSetting;
+import org.apache.river.extra.easystart.config.settings.Options;
+import org.apache.river.extra.easystart.config.settings.Setting;
 import org.apache.velocity.Template;
 import org.apache.velocity.VelocityContext;
 import org.apache.velocity.app.VelocityEngine;
 
-public class LookupServiceConfiguration extends ConfigurationFile {
+public class LookupServiceConfiguration {
 
-	private static final Logger LOGGER = Logger.getLogger(LookupServiceConfiguration.class.getName());
+	private final DefaultOptions options;
 	
-	public static LookupServiceConfiguration config() throws IOException, ConfigurationException {
-		
-		Options opts = new Options();
-		opts.PACKAGE_NAME.setOverride("com.sun.jini.reggie");
-//		opts.RIVER_HOME;  - no override for this
-		opts.HTTP_PORT.setOverride("8080");
-		opts.JINI_PORT.setOverride("4160");
-//		opts.MEMBER_GROUPS.add("Lester").add("Jeff");
-		opts.MEMBER_GROUPS.add("Chuck").add("Sarah");
-//		opts.LOOKUP_GROUPS.add("Chuck").add("Sarah");
-		opts.SERVICE_IMPL.setOverride("com.sun.jini.reggie.TransientRegistrarImpl");
-		opts.CODEBASE.add("reggie-dl.jar").add("jsk-dl.jar");
-		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/reggie.jar");
-		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/jini-ext.jar");
-//		opts.POLICY.setOverride("secure.policy");
-//		opts.SERVER_EXPORTER.asJeriExporter("localhost", 4161);
+	public LookupServiceConfiguration(DefaultOptions opts) {
+		this.options = opts;
 		
+		this.options.get(DefaultOptions.PACKAGE_NAME).setOverride("com.sun.jini.reggie");
+		this.options.get(DefaultOptions.SERVICE_IMPL).setOverride("com.sun.jini.reggie.TransientRegistrarImpl");
+		this.options.getGrouped(DefaultOptions.CODEBASE).add("reggie-dl.jar").add("jsk-dl.jar");
+		this.options.getGrouped(DefaultOptions.CLASSPATH).add(opts.get(DefaultOptions.RIVER_HOME).getOverride()+"/lib/reggie.jar");
+		this.options.getGrouped(DefaultOptions.CLASSPATH).add(opts.get(DefaultOptions.RIVER_HOME).getOverride()+"/lib/jini-ext.jar");
+	}
+
+	private static final Logger LOGGER = Logger.getLogger(LookupServiceConfiguration.class.getName());
+
+	public LookupServiceConfiguration addMemberGroup(String grp) {
+		getGroupSetting(Options.MEMBER_GROUP).add(grp);
+		return this;
+	}
+
+	public LookupServiceConfiguration addLookupGroup(String grp) {
+		getGroupSetting(Options.LOOKUP_GROUP).add(grp);
+		return this;
+	}
+
+	public LookupServiceConfiguration setRiverPort(int port) {
+		getSetting(Options.RIVER_PORT).setOverride(String.valueOf(port));
+		return this;
+	}
+	
+	private Setting getSetting(String key) {
+		return options.get(key);
+	}
+
+	private GroupedSetting getGroupSetting(String key) {
+		return (GroupedSetting) options.get(key);
+	}
+	
+	public Configuration riverConfig() throws ConfigurationException, IOException {
 		Properties p = new Properties();
 		p.load( VelocityConfigurationBuilder.class.getResourceAsStream("velocity.properties") );
 		VelocityEngine ve = new VelocityEngine(p);
@@ -43,8 +66,8 @@ public class LookupServiceConfiguration 
 		
 		StringBuilder options = new StringBuilder();
 		StringBuilder defaults = new StringBuilder();
-		String key = opts.PACKAGE_NAME.getOverride()+'.';
-		for(Setting setting : opts.OPTIONS) {
+		String key = this.options.get(Options.PACKAGE_NAME).getOverride()+'.';
+		for(Setting setting : this.options.getOptions()) {
 			String format = setting.getFormatter();
 			if(setting.isServiceDescription()) {
 	        	
@@ -83,25 +106,79 @@ public class LookupServiceConfiguration 
         
         StringReader sr = new StringReader(s);
         
-        return new LookupServiceConfiguration(sr, new String[0]);//opts.getOptionsArray());
+        return new ConfigurationFile(sr, new String[0]);//opts.getOptionsArray());
 	}
 	
-	private LookupServiceConfiguration(Reader reader, String[] options) throws ConfigurationException {
-		super(reader,options);
-	}
+//	public static LookupServiceConfiguration config() throws IOException, ConfigurationException {
+//		
+//		Options opts = new Options();
+//		opts.PACKAGE_NAME.setOverride("com.sun.jini.reggie");
+////		opts.RIVER_HOME;  - no override for this
+//		opts.HTTP_PORT.setOverride("8080");
+//		opts.JINI_PORT.setOverride("4160");
+////		opts.MEMBER_GROUPS.add("Lester").add("Jeff");
+//		opts.MEMBER_GROUPS.add("Chuck").add("Sarah");
+////		opts.LOOKUP_GROUPS.add("Chuck").add("Sarah");
+//		opts.SERVICE_IMPL.setOverride("com.sun.jini.reggie.TransientRegistrarImpl");
+//		opts.CODEBASE.add("reggie-dl.jar").add("jsk-dl.jar");
+//		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/reggie.jar");
+//		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/jini-ext.jar");
+////		opts.POLICY.setOverride("secure.policy");
+////		opts.SERVER_EXPORTER.asJeriExporter("localhost", 4161);
+//		
+//		Properties p = new Properties();
+//		p.load( VelocityConfigurationBuilder.class.getResourceAsStream("velocity.properties") );
+//		VelocityEngine ve = new VelocityEngine(p);
+//		VelocityContext context = new VelocityContext();
+//		
+//		StringBuilder options = new StringBuilder();
+//		StringBuilder defaults = new StringBuilder();
+//		String key = opts.PACKAGE_NAME.getOverride()+'.';
+//		for(Setting setting : opts.OPTIONS) {
+//			String format = setting.getFormatter();
+//			if(setting.isServiceDescription()) {
+//	        	
+//	        	String name = key + setting.getName();
+//	        	
+//	        	options
+//	        		.append(",\"")
+//	        		.append(name)
+//	        		.append('=')
+//	        		.append(String.format(format, setting.getOverride()))
+//	        		.append("\"\n");
+//	        	
+//	        	defaults
+//	        		.append(setting.getName())
+//	        		.append('=')
+//	        		.append(String.format(format, setting.getDefault()))
+//	        		.append(";\n");
+//			} else {
+//	        	context.put(setting.getName(),
+//				String.format(format, setting.getOverride()));
+//			}
+//		}
+//		
+//        context.put("defaults", defaults.toString());
+//        context.put("options", options.toString());
+//        
+//        Template template = ve.getTemplate( Options.class.getResource("start.config").toExternalForm() );
+//        
+//        StringWriter sw = new StringWriter();
+//
+//        template.merge(context, sw);
+//        
+//        String s = sw.toString();
+//        
+//        LOGGER.warning(s);
+//        
+//        StringReader sr = new StringReader(s);
+//        
+//        return new LookupServiceConfiguration(sr, new String[0]);//opts.getOptionsArray());
+//	}
 	
-//	public ConventionalLookupServiceConfiguration(String[] options) throws ConfigurationException {
-//		super(fileReader(), options);
+//	LookupServiceConfiguration(Reader reader, String[] options) throws ConfigurationException {
+//		super(reader,options);
 //	}
+	
 
-	@Override
-	public Object getEntry(String component, String name, Class type,
-			Object defaultValue) throws ConfigurationException {
-		if("initialMemberGroups".equals(name)) {
-//			return new String[0];
-			return super.getEntry(component, name, type, defaultValue);
-		} else {
-			return super.getEntry(component, name, type, defaultValue);
-		}
-	}
 }

Modified: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/TransactionServiceConfiguration.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/TransactionServiceConfiguration.java?rev=1325398&r1=1325397&r2=1325398&view=diff
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/TransactionServiceConfiguration.java (original)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/TransactionServiceConfiguration.java Thu Apr 12 17:39:08 2012
@@ -1,89 +1,80 @@
 package org.apache.river.extra.easystart.config;
 
-import java.io.IOException;
 import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.Properties;
 import java.util.logging.Logger;
 
 import net.jini.config.ConfigurationException;
 import net.jini.config.ConfigurationFile;
 
-import org.apache.river.config.builder.VelocityConfigurationBuilder;
-import org.apache.velocity.Template;
-import org.apache.velocity.VelocityContext;
-import org.apache.velocity.app.VelocityEngine;
-
 public class TransactionServiceConfiguration extends ConfigurationFile {
 
 	private static final Logger LOGGER = Logger.getLogger(TransactionServiceConfiguration.class.getName());
 	
-	public static TransactionServiceConfiguration config() throws IOException, ConfigurationException {
-		
-		Options opts = new Options();
-		opts.PACKAGE_NAME.setOverride("com.sun.jini.mahalo");
-//		opts.RIVER_HOME;  - no override for this
-		opts.HTTP_PORT.setOverride("8080");
-//		opts.JINI_PORT.setOverride("4160");
-//		opts.MEMBER_GROUPS.add("Lester").add("Jeff");
-		opts.LOOKUP_GROUPS.add("Chuck").add("Sarah");
-		opts.SERVICE_IMPL.setOverride("com.sun.jini.mahalo.TransientMahaloImpl");
-		opts.CODEBASE.add("mahalo-dl.jar").add("jsk-dl.jar");
-		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/mahalo.jar");
-//		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/jini-ext.jar");
-//		opts.POLICY.setOverride("secure.policy");
-//		opts.SERVER_EXPORTER.asJeriExporter("localhost", 4161);
-		
-		Properties p = new Properties();
-		p.load( VelocityConfigurationBuilder.class.getResourceAsStream("velocity.properties") );
-		VelocityEngine ve = new VelocityEngine(p);
-		VelocityContext context = new VelocityContext();
-		
-		StringBuilder options = new StringBuilder();
-		StringBuilder defaults = new StringBuilder();
-		String key = opts.PACKAGE_NAME.getOverride()+'.';
-		for(Setting setting : opts.OPTIONS) {
-			String format = setting.getFormatter();
-			if(setting.isServiceDescription()) {
-	        	
-	        	String name = key + setting.getName();
-	        	
-	        	options
-	        		.append(",\"")
-	        		.append(name)
-	        		.append('=')
-	        		.append(String.format(format, setting.getOverride()))
-	        		.append("\"\n");
-	        	
-	        	defaults
-	        		.append(setting.getName())
-	        		.append('=')
-	        		.append(String.format(format, setting.getDefault()))
-	        		.append(";\n");
-			} else {
-	        	context.put(setting.getName(),
-				String.format(format, setting.getOverride()));
-			}
-		}
-		
-        context.put("defaults", defaults.toString());
-        context.put("options", options.toString());
-        
-        Template template = ve.getTemplate( Options.class.getResource("start.config").toExternalForm() );
-        
-        StringWriter sw = new StringWriter();
-
-        template.merge(context, sw);
-        
-        String s = sw.toString();
-        
-        LOGGER.warning(s);
-        
-        StringReader sr = new StringReader(s);
-        
-        return new TransactionServiceConfiguration(sr, new String[0]);//opts.getOptionsArray());
-	}
+//	public static TransactionServiceConfiguration config() throws IOException, ConfigurationException {
+//		
+//		Options opts = new Options();
+//		opts.PACKAGE_NAME.setOverride("com.sun.jini.mahalo");
+////		opts.RIVER_HOME;  - no override for this
+//		opts.HTTP_PORT.setOverride("8080");
+////		opts.JINI_PORT.setOverride("4160");
+////		opts.MEMBER_GROUPS.add("Lester").add("Jeff");
+//		opts.LOOKUP_GROUPS.add("Chuck").add("Sarah");
+//		opts.SERVICE_IMPL.setOverride("com.sun.jini.mahalo.TransientMahaloImpl");
+//		opts.CODEBASE.add("mahalo-dl.jar").add("jsk-dl.jar");
+//		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/mahalo.jar");
+////		opts.CLASSPATH.add(opts.RIVER_HOME.getOverride()+"/lib/jini-ext.jar");
+////		opts.POLICY.setOverride("secure.policy");
+////		opts.SERVER_EXPORTER.asJeriExporter("localhost", 4161);
+//		
+//		Properties p = new Properties();
+//		p.load( VelocityConfigurationBuilder.class.getResourceAsStream("velocity.properties") );
+//		VelocityEngine ve = new VelocityEngine(p);
+//		VelocityContext context = new VelocityContext();
+//		
+//		StringBuilder options = new StringBuilder();
+//		StringBuilder defaults = new StringBuilder();
+//		String key = opts.PACKAGE_NAME.getOverride()+'.';
+//		for(Setting setting : opts.OPTIONS) {
+//			String format = setting.getFormatter();
+//			if(setting.isServiceDescription()) {
+//	        	
+//	        	String name = key + setting.getName();
+//	        	
+//	        	options
+//	        		.append(",\"")
+//	        		.append(name)
+//	        		.append('=')
+//	        		.append(String.format(format, setting.getOverride()))
+//	        		.append("\"\n");
+//	        	
+//	        	defaults
+//	        		.append(setting.getName())
+//	        		.append('=')
+//	        		.append(String.format(format, setting.getDefault()))
+//	        		.append(";\n");
+//			} else {
+//	        	context.put(setting.getName(),
+//				String.format(format, setting.getOverride()));
+//			}
+//		}
+//		
+//        context.put("defaults", defaults.toString());
+//        context.put("options", options.toString());
+//        
+//        Template template = ve.getTemplate( Options.class.getResource("start.config").toExternalForm() );
+//        
+//        StringWriter sw = new StringWriter();
+//
+//        template.merge(context, sw);
+//        
+//        String s = sw.toString();
+//        
+//        LOGGER.warning(s);
+//        
+//        StringReader sr = new StringReader(s);
+//        
+//        return new TransactionServiceConfiguration(sr, new String[0]);//opts.getOptionsArray());
+//	}
 	
 	private TransactionServiceConfiguration(Reader reader, String[] options) throws ConfigurationException {
 		super(reader,options);

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/ClasspathSetting.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/ClasspathSetting.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/ClasspathSetting.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/ClasspathSetting.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,46 @@
+package org.apache.river.extra.easystart.config.settings;
+
+import java.util.List;
+
+public class ClasspathSetting extends GroupedSetting {
+
+	protected ClasspathSetting(String name, 
+						      List<String> defaults,
+						      String format, 
+						      String elementFormat, 
+						      boolean serviceDescription) {
+		super(name, defaults, format, elementFormat, serviceDescription);
+	}
+
+	@Override
+	protected String formatAsArray(List<String> items) {
+		StringBuilder sb = new StringBuilder();
+		sb
+			.append("ConfigUtil.concat(")
+			.append('\n')
+			.append("new Object[] {")
+			.append('\n');
+		for(int i=0 ; i<items.size() ; i++) {
+			sb.append('"').append(items.get(i)).append('"');
+			if(i < items.size()-1) {
+				sb.append(",java.io.File.pathSeparator,");
+			}
+		}
+		sb.append(" })");
+		
+		return String.format(super.getFormatter(), sb.toString());
+	}
+	
+	@Override
+	public Object clone() {
+		GroupedSetting clone = new ClasspathSetting(super.name, 
+												   super.defaults, 
+												   super.format, 
+												   this.elementFormat, 
+												   super.isServiceDescription());
+		for(String override : this.overrides) {
+			clone.add(override);
+		}
+		return clone;
+	}
+}

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/CodebaseSetting.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/CodebaseSetting.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/CodebaseSetting.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/CodebaseSetting.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,60 @@
+package org.apache.river.extra.easystart.config.settings;
+
+import java.util.List;
+
+public class CodebaseSetting extends GroupedSetting {
+
+	private final Setting httpPort;
+	private final Setting httpServer;
+	
+	protected CodebaseSetting(String name, 
+							  Setting httpPort,
+							  Setting httpServer,
+						      List<String> defaults,
+						      String format, 
+						      String elementFormat, 
+						      boolean serviceDescription) {
+		super(name, defaults, format, elementFormat, serviceDescription);
+
+		this.httpPort = httpPort;
+		this.httpServer = httpServer;
+	}
+
+	@Override
+	protected String formatAsArray(List<String> items) {
+		StringBuilder sb = new StringBuilder();
+		sb
+			.append("ConfigUtil.concat(")
+			.append('\n')
+			.append("new Object[] {")
+			.append('\n');
+		for(String item : items) {
+			sb
+				.append("\"http://\", ")
+				.append(httpServer.getOverride())
+				.append(", \":")
+				.append(httpPort.getOverride())
+				.append('/')
+				.append(item)
+				.append("\", \" \",\n");
+		}
+		sb.append(" })");
+		
+		return sb.toString();
+	}
+	
+	@Override
+	public Object clone() {
+		GroupedSetting clone = new CodebaseSetting(super.name, 
+												   this.httpPort,
+												   this.httpServer,
+												   super.defaults, 
+												   super.format, 
+												   this.elementFormat, 
+												   super.isServiceDescription());
+		for(String override : this.overrides) {
+			clone.add(override);
+		}
+		return clone;
+	}
+}

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/DefaultOptions.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/DefaultOptions.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/DefaultOptions.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/DefaultOptions.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,107 @@
+package org.apache.river.extra.easystart.config.settings;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.logging.Logger;
+
+public class DefaultOptions implements Cloneable {
+
+	private static final Logger LOGGER = Logger.getLogger(Options.class.getName());
+
+	public static final String NO_FORMAT = "%s";
+	public static final String STRING_FORMAT = "\"%s\"";
+	public static final String ESCAPED_STRING_FORMAT = "\\\"%s\\\"";
+	public static final String INTEGER_FORMAT = "%s";
+	
+	private static final String RIVER_HOME_ENV_NAME = "RIVER_HOME";
+
+	public static final String MEMBER_GROUP = "initialMemberGroups";
+	public static final String LOOKUP_GROUP = "initialLookupGroups";
+	public static final String RIVER_PORT = "initialUnicastDiscoveryPort";
+	public static final String PACKAGE_NAME = "servicePackageName";
+	public static final String SERVICE_IMPL = "serviceImpl";
+	public static final String CODEBASE = "codebase";
+	public static final String CLASSPATH = "classpath";
+	public static final String RIVER_HOME = "riverHome";
+	
+	private static String RIVER_HOME_DIR;
+	static {
+		RIVER_HOME_DIR = (String) System.getProperties().get(RIVER_HOME_ENV_NAME);
+		if(null == RIVER_HOME_DIR) {
+			LOGGER.severe(RIVER_HOME_ENV_NAME+" has not been set");
+			RIVER_HOME_DIR = ".";
+		} else {
+			LOGGER.severe("Using "+RIVER_HOME_ENV_NAME+"="+RIVER_HOME_DIR);
+		}
+	}
+	
+	private final Map<String, Setting> options = new HashMap<String, Setting>();
+	
+	public DefaultOptions() {
+		options.put(RIVER_HOME, new Setting(RIVER_HOME, RIVER_HOME_DIR, STRING_FORMAT, false));
+		options.put("servicePackageName", new Setting("servicePackageName", "org.apache.river", NO_FORMAT, false));
+		options.put(RIVER_PORT, new Setting(RIVER_PORT, "4160", INTEGER_FORMAT, true));
+		options.put("httpPort", new Setting("httpPort", "8080", INTEGER_FORMAT, false));
+		options.put(MEMBER_GROUP, new GroupedSetting(MEMBER_GROUP,
+														new LinkedList<String>(),
+														NO_FORMAT, 
+														ESCAPED_STRING_FORMAT, 
+														true));
+		options.put(LOOKUP_GROUP, new GroupedSetting(LOOKUP_GROUP,
+															  new LinkedList<String>(),
+															  NO_FORMAT, 
+															  ESCAPED_STRING_FORMAT, 
+															  true));
+		options.put(SERVICE_IMPL, new Setting(SERVICE_IMPL, "", STRING_FORMAT, false));
+		options.put("httpServer", new Setting("httpServer",
+												 "ConfigUtil.getHostName()",
+												 NO_FORMAT,
+												 false));
+		options.put(CODEBASE, new CodebaseSetting(CODEBASE,
+				options.get("httpPort"),
+				options.get("httpServer"),
+				Collections.<String>emptyList(), 
+				NO_FORMAT, 
+				STRING_FORMAT, 
+				false));
+		options.put(CLASSPATH, new ClasspathSetting(CLASSPATH,
+																Collections.<String>emptyList(), 
+																NO_FORMAT, 
+																STRING_FORMAT, 
+																false));
+		
+		options.put("policy", new PolicySetting("policy",
+												  options.get("riverHome"),
+												  "src-extra/policy.all",
+												  STRING_FORMAT,
+												  false));
+		options.put("serverExporter", new ServerExporterSetting());
+	}
+	
+	private DefaultOptions(Map<String, Setting> opts) {
+		for(String key : opts.keySet()) {
+			options.put(key, (Setting)opts.get(key).clone());
+		}
+	}
+	
+	public Setting get(String key) {
+		return options.get(key);
+	}
+	
+	public GroupedSetting getGrouped(String key) {
+		return (GroupedSetting) get(key);
+	}
+	
+	public Collection<Setting> getOptions() {
+		return options.values();
+	}
+	
+	@Override
+	public Object clone() {
+		return new DefaultOptions(this.options);
+	}
+	
+}

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/GroupedSetting.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/GroupedSetting.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/GroupedSetting.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/GroupedSetting.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,72 @@
+package org.apache.river.extra.easystart.config.settings;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public class GroupedSetting extends Setting {
+
+	protected final String elementFormat;
+	protected final List<String> defaults;
+	protected final List<String> overrides = new LinkedList<String>();
+
+	private volatile boolean overriden = false;
+
+	protected GroupedSetting(String name, 
+							 List<String> defaults, 
+							 String format,
+							 String elementFormat,
+							 boolean serviceDescription) {
+		super(name, "", format, serviceDescription);
+		this.elementFormat = elementFormat;
+		this.defaults = defaults;
+		overrides.addAll(defaults);
+	}
+
+	/**
+	 * Not too worried about concurrency issues right now, heavy duty locking 
+	 * etc for this little used code seems overkill right now.
+	 * 
+	 * @param s
+	 * @return
+	 */
+	public GroupedSetting add(String s) {
+		if (!overriden) {
+			overriden = true;
+			overrides.clear();
+		}
+		overrides.add(s);
+		return this;
+	}
+
+	@Override
+	public String getDefault() {
+		return formatAsArray(defaults);
+	}
+	
+	@Override
+	public String getOverride() {
+		return formatAsArray(overrides);
+	}
+	
+	protected String formatAsArray(List<String> items) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("new String[] { ");
+		for(String item : items) {
+			sb
+				.append(String.format(this.elementFormat, item))
+				.append(", ");
+		}
+		sb.append(" }");
+		
+		return sb.toString();
+	}
+	
+	@Override
+	public Object clone() {
+		GroupedSetting clone = new GroupedSetting(super.name, this.defaults, super.format, this.elementFormat, super.isServiceDescription());
+		for(String override : this.overrides) {
+			clone.add(override);
+		}
+		return clone;
+	}
+}

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/Options.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/Options.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/Options.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/Options.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,174 @@
+package org.apache.river.extra.easystart.config.settings;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Logger;
+
+public class Options implements Cloneable {
+
+	private static final Logger LOGGER = Logger.getLogger(Options.class.getName());
+
+	public static final String NO_FORMAT = "%s";
+	public static final String STRING_FORMAT = "\"%s\"";
+	public static final String ESCAPED_STRING_FORMAT = "\\\"%s\\\"";
+	public static final String INTEGER_FORMAT = "%s";
+	
+	private static final String RIVER_HOME_ENV_NAME = "RIVER_HOME";
+
+	public static final String MEMBER_GROUP = "initialMemberGroups";
+	public static final String LOOKUP_GROUP = "initialLookupGroups";
+	public static final String RIVER_PORT = "initialUnicastDiscoveryPort";
+	public static final String PACKAGE_NAME = "servicePackageName";
+	
+	
+	private static String RIVER_HOME_DIR;
+	static {
+		RIVER_HOME_DIR = (String) System.getProperties().get(RIVER_HOME_ENV_NAME);
+		if(null == RIVER_HOME_DIR) {
+			LOGGER.severe(RIVER_HOME_ENV_NAME+" has not been set");
+			RIVER_HOME_DIR = ".";
+		} else {
+			LOGGER.severe("Using "+RIVER_HOME_ENV_NAME+"="+RIVER_HOME_DIR);
+		}
+	}
+	
+	private final Setting RIVER_HOME = new Setting("riverHome", RIVER_HOME_DIR, STRING_FORMAT, false);
+	private final Setting PACKAGE_NAME_SETTING = new Setting("servicePackageName", "org.apache.river", NO_FORMAT, false);
+	
+	private final Setting JINI_PORT = new Setting(RIVER_PORT, "4160", INTEGER_FORMAT, true);
+	private final Setting HTTP_PORT = new Setting("httpPort", "8080", INTEGER_FORMAT, false);
+	
+	private final GroupedSetting MEMBER_GROUPS = new GroupedSetting(MEMBER_GROUP,
+															new LinkedList<String>(),
+															NO_FORMAT, 
+															ESCAPED_STRING_FORMAT, 
+															true);
+	
+	private final GroupedSetting LOOKUP_GROUPS = new GroupedSetting(LOOKUP_GROUP,
+														  new LinkedList<String>(),
+														  NO_FORMAT, 
+														  ESCAPED_STRING_FORMAT, 
+														  true);
+	
+	private final Setting SERVICE_IMPL = new Setting("serviceImpl",
+											  "",
+											  STRING_FORMAT,
+											  false);
+	
+	private final Setting HTTP_SERVER = new Setting("httpServer",
+											 "ConfigUtil.getHostName()",
+											 NO_FORMAT,
+											 false);
+	
+	private final CodebaseSetting CODEBASE = new CodebaseSetting("codebase",
+			HTTP_PORT,
+			HTTP_SERVER,
+			Collections.<String>emptyList(), 
+			NO_FORMAT, 
+			NO_FORMAT, 
+			false);
+	
+	private final ClasspathSetting CLASSPATH = new ClasspathSetting("classpath",
+															Collections.<String>emptyList(), 
+															NO_FORMAT, 
+															NO_FORMAT, 
+															false);
+	
+	private final Setting POLICY = new PolicySetting("policy",
+											  RIVER_HOME,
+											  "src-extra/policy.all",
+											  STRING_FORMAT,
+											  false);
+	
+	private final ServerExporterSetting SERVER_EXPORTER = new ServerExporterSetting();
+	
+	private final Setting[] OPTIONS = new Setting[] {
+			RIVER_HOME,
+			PACKAGE_NAME_SETTING,
+			JINI_PORT,
+			HTTP_PORT,
+			MEMBER_GROUPS,
+			LOOKUP_GROUPS,
+			SERVICE_IMPL,
+			HTTP_SERVER,
+			CODEBASE,
+			CLASSPATH,
+			POLICY,
+			SERVER_EXPORTER
+	};
+	
+	private final Map<String, Setting> map = new HashMap<String, Setting>();
+	{
+		for(Setting setting : OPTIONS) {
+			map.put(setting.getName(), setting);
+		}
+	}
+
+	public void applyDefaults(List<Setting> defaults) {
+		for(Setting setting : defaults) {
+			Setting original = map.get(setting.getName());
+			if(null != original) {
+				original.setOverride(setting.getOverride());
+			} else {
+				map.put(setting.getName(), setting);
+			}
+		}
+	}
+
+	public Setting get(String key) {
+		return map.get(key);
+	}
+
+	public Collection<Setting> getOptions() {
+		return map.values();
+	}
+	
+//	private static final String RIVER_HOME = "RIVER_HOME";
+//	private static final String RIVER_HOME_DIR;
+//	static {
+//		RIVER_HOME_DIR = (String) System.getProperties().get(RIVER_HOME);
+//		if(null == RIVER_HOME_DIR) {
+//			LOGGER.severe(RIVER_HOME+" has not been set");
+//		} else {
+//			LOGGER.severe("Using "+RIVER_HOME+"="+RIVER_HOME_DIR);
+//		}
+//		
+//	}
+//	
+//	private String group = "grp";
+//	private String httpPort = "80";
+//	private int jiniPort = 4160;
+//	private String packageName = "";
+//	
+//	public String getRiverHome() {
+//		return RIVER_HOME_DIR;
+//	}
+//	
+//	public void setGroup(String g) { this.group = g; }
+//	public String getGroup() { return this.group; }
+//
+//	public void setHttpPort(String port) { this.httpPort = port; }
+//	public String getHttpPort() { return this.httpPort; }
+//	
+//	public void setJiniPort(int port) { this.jiniPort = port; }
+//	public int getJiniPort() { return this.jiniPort; }
+//
+//	public String[] getOptionsArray() {
+//		return new String[] {
+//				getRiverHome()+"src-extra/empty.config",
+//				"com.sun.jini.reggie.initialMemberGroups = new String[] {\""+ group+"\"}",
+//				"com.sun.jini.reggie.initialUnicastDiscoveryPort = "+jiniPort
+//		};
+//	}
+//
+//	public void setPackageName(String packageName) {
+//		this.packageName = packageName;
+//	}
+//	public String getPackageName() {
+//		return this.packageName;
+//	}
+}

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/PolicySetting.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/PolicySetting.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/PolicySetting.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/PolicySetting.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,40 @@
+package org.apache.river.extra.easystart.config.settings;
+
+import java.io.File;
+
+public class PolicySetting extends Setting {
+
+	private final Setting riverHome;
+	
+	protected PolicySetting(String name, 
+							Setting riverHome,
+							String defaultValue, 
+							String format,
+							boolean serviceDescription) {
+		super(name, defaultValue, format, serviceDescription);
+		this.riverHome = riverHome;
+	}
+
+	@Override
+	public String getDefault() {
+		if(null == riverHome) {
+			return super.getDefault();
+		} else {
+			return riverHome.getOverride() + File.separator + super.getDefault();
+		}
+	}
+	
+	@Override
+	public String getOverride() {
+		if(null == riverHome) {
+			return super.getOverride();
+		} else {
+			return riverHome.getOverride() + File.separator + super.getOverride();
+		}
+	}
+	
+	@Override
+	public Object clone() {
+		return new PolicySetting(this.name, this.riverHome, this.defaultValue, this.format, this.serviceDescription);
+	}
+}

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/ServerExporterSetting.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/ServerExporterSetting.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/ServerExporterSetting.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/ServerExporterSetting.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,35 @@
+package org.apache.river.extra.easystart.config.settings;
+
+public class ServerExporterSetting extends Setting {
+
+	private static final String JRMP_STRING = "new net.jini.jrmp.JrmpExporter()";
+	
+	protected ServerExporterSetting() {
+		super("serverExporter", JRMP_STRING, Options.NO_FORMAT, true);
+	}
+
+	public void asJrmpExporter() {
+		setOverride(JRMP_STRING);
+	}
+	
+	public void asJeriExporter(String registryHost, int registryPort) {
+		String registryEndpoint = String.format("net.jini.jeri.tcp.TcpServerEndpoint.getInstance(%s,%d)",stringToLiteral(registryHost),registryPort); 
+		setOverride("new net.jini.jeri.BasicJeriExporter("
+					+registryEndpoint
+					+", new net.jini.jeri.BasicILFactory())");
+	}
+	
+	@Override
+	public Object clone() {
+		ServerExporterSetting clone = new ServerExporterSetting();
+		clone.setOverride(this.getOverride());
+		return clone;
+	}
+	
+    private String stringToLiteral(String s) {
+        if( s == null ) {
+            return "null" ;
+        }
+        return String.format("\\\"%s\\\"",s);
+    }
+}

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/Setting.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/Setting.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/Setting.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/Setting.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,59 @@
+package org.apache.river.extra.easystart.config.settings;
+
+
+/**
+ * This is an enum-like class which encapsulates some default options when
+ * using River services.
+ * 
+ * It is not an enum, on purpose, in order to allow other users to easily
+ * extend and replace as required.
+ * 
+ * @author Tom Hobbs
+ *
+ */
+public class Setting implements Cloneable {
+
+	protected final String name, defaultValue, format;
+	protected final boolean serviceDescription;
+	protected String override;
+	
+	protected Setting(String name, String defaultValue, String format, boolean serviceDescription) {
+		this.name = name;
+		this.defaultValue = defaultValue;
+		this.format = format;
+		this.serviceDescription = serviceDescription;
+		
+		this.override = defaultValue;
+	}
+	
+	public String getName() {
+		return this.name;
+	}
+	
+	public String getDefault() {
+		return defaultValue;
+	}
+	
+	public String getFormatter() {
+		return format;
+	}
+	
+	public boolean isServiceDescription() {
+		return serviceDescription;
+	}
+	
+	public void setOverride(String override) {
+		this.override = override;
+	}
+	
+	public String getOverride() {
+		return this.override;
+	}
+	
+	@Override
+	public Object clone() {
+		Setting clone = new Setting(this.name, this.defaultValue, this.format, this.serviceDescription);
+		clone.setOverride(this.override);
+		return clone;
+	}
+}

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/SettingsFactory.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/SettingsFactory.java?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/SettingsFactory.java (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/SettingsFactory.java Thu Apr 12 17:39:08 2012
@@ -0,0 +1,12 @@
+package org.apache.river.extra.easystart.config.settings;
+
+public class SettingsFactory {
+
+	
+	public void setRiverHome(String r) {}
+	public void setHttpHost(String h) {}
+	public void setHttpPort(String p) {}
+	public void setRiverPort(String p) {}
+	public void setPolicy(String p) {}
+	
+}

Added: river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/start.config
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/start.config?rev=1325398&view=auto
==============================================================================
--- river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/start.config (added)
+++ river/jtsk/skunk/easystart/src-extra/org/apache/river/extra/easystart/config/settings/start.config Thu Apr 12 17:39:08 2012
@@ -0,0 +1,55 @@
+/*
+ * 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.
+ */
+
+import net.jini.jrmp.JrmpExporter;
+
+import com.sun.jini.config.ConfigUtil;
+import com.sun.jini.start.NonActivatableServiceDescriptor;
+import com.sun.jini.start.ServiceDescriptor;
+
+com.sun.jini.start {
+
+    private static codebase = ${codebase};
+        
+    //private static policy = ${riverHome}+"/src-extra/policy.all";
+    private static policy = ${policy};
+    private static classpath = ${classpath};
+    
+    static serviceDescriptors = new ServiceDescriptor[] {
+	new NonActivatableServiceDescriptor(
+	    codebase, 
+	    policy, 
+	    classpath,
+	    ${serviceImpl},
+	    new String[] { 
+	    "-"
+	    //overrides
+	    ${options}
+	    //overrides end
+	    }
+	    )
+    };
+}
+
+${servicePackageName} {
+
+//defaults
+	${defaults}
+//defaults end
+
+}