You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@etch.apache.org by sc...@apache.org on 2009/03/25 22:48:00 UTC

svn commit: r758444 - in /incubator/etch/branches/config/services/config: example/ example/src/main/java/org/apache/etch/services/config/example/ src/main/java/org/apache/etch/services/config/

Author: sccomer
Date: Wed Mar 25 21:47:49 2009
New Revision: 758444

URL: http://svn.apache.org/viewvc?rev=758444&view=rev
Log:
better examples in sequence.

Added:
    incubator/etch/branches/config/services/config/example/local2.yml
    incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener1.java   (with props)
    incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener2.java   (with props)
    incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener3.java   (with props)
    incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener4.java
      - copied, changed from r757878, incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener.java
Removed:
    incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener.java
Modified:
    incubator/etch/branches/config/services/config/example/local.yml
    incubator/etch/branches/config/services/config/src/main/java/org/apache/etch/services/config/YamlConfig.java

Modified: incubator/etch/branches/config/services/config/example/local.yml
URL: http://svn.apache.org/viewvc/incubator/etch/branches/config/services/config/example/local.yml?rev=758444&r1=758443&r2=758444&view=diff
==============================================================================
--- incubator/etch/branches/config/services/config/example/local.yml (original)
+++ incubator/etch/branches/config/services/config/example/local.yml Wed Mar 25 21:47:49 2009
@@ -1 +1,2 @@
 configUri: tcp://localhost:4001/services/config/example/remote?TcpTransport.reconnectDelay=4000
+blah: 2
\ No newline at end of file

Added: incubator/etch/branches/config/services/config/example/local2.yml
URL: http://svn.apache.org/viewvc/incubator/etch/branches/config/services/config/example/local2.yml?rev=758444&view=auto
==============================================================================
--- incubator/etch/branches/config/services/config/example/local2.yml (added)
+++ incubator/etch/branches/config/services/config/example/local2.yml Wed Mar 25 21:47:49 2009
@@ -0,0 +1 @@
+listenUri: tcp://0.0.0.0:4002

Added: incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener1.java
URL: http://svn.apache.org/viewvc/incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener1.java?rev=758444&view=auto
==============================================================================
--- incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener1.java (added)
+++ incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener1.java Wed Mar 25 21:47:49 2009
@@ -0,0 +1,60 @@
+/*
+ * $Id$
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.etch.services.config.example;
+
+import org.apache.etch.bindings.java.support.ServerFactory;
+import org.apache.etch.util.core.io.Transport;
+
+/**
+ * Main program for ConfigExampleServer. This program makes a listener to accept
+ * connections from MainConfigExampleClient. This is a standard generic etch
+ * listener.
+ */
+public class MainConfigExampleListener1 implements
+	ConfigExampleHelper.ConfigExampleServerFactory
+{
+	/**
+	 * Main program for ConfigExampleServer.
+	 * 
+	 * @param args command line arguments.
+	 * @throws Exception
+	 */
+	public static void main( String[] args ) throws Exception
+	{
+		// Define the listener uri.
+		String uri = "tcp://0.0.0.0:4002";
+		System.out.println( "listen uri = " + uri );
+
+		// Create the listener stack.
+		ServerFactory listener = ConfigExampleHelper.newListener( uri, null,
+			new MainConfigExampleListener1() );
+		System.out.println( "listener created " + listener );
+
+		// Start the listener stack.
+		listener.transportControl( Transport.START_AND_WAIT_UP, 4000 );
+		System.out.println( "listener started " + listener );
+	}
+
+	public ConfigExampleServer newConfigExampleServer(
+		RemoteConfigExampleClient client )
+	{
+		return new ImplConfigExampleServer( client );
+	}
+}

Propchange: incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener1.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener1.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener2.java
URL: http://svn.apache.org/viewvc/incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener2.java?rev=758444&view=auto
==============================================================================
--- incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener2.java (added)
+++ incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener2.java Wed Mar 25 21:47:49 2009
@@ -0,0 +1,70 @@
+/*
+ * $Id$
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.etch.services.config.example;
+
+import org.apache.etch.bindings.java.support.ServerFactory;
+import org.apache.etch.services.config.ConfigurationServer;
+import org.apache.etch.services.config.YamlConfig;
+import org.apache.etch.util.core.io.Transport;
+
+/**
+ * Main program for ConfigExampleServer. This program makes a listener to accept
+ * connections from MainConfigExampleClient. This is a standard etch listener
+ * modified to load the listen uri from a local config file at startup.
+ */
+public class MainConfigExampleListener2 implements
+	ConfigExampleHelper.ConfigExampleServerFactory
+{
+	private static final String LOCAL = "services/config/example/local2";
+
+	private static final String LISTEN_URI = "listenUri";
+
+	/**
+	 * Main program for ConfigExampleServer.
+	 * 
+	 * @param args command line arguments.
+	 * @throws Exception
+	 */
+	public static void main( String[] args ) throws Exception
+	{
+		// Open the local config file.
+		ConfigurationServer local = new YamlConfig( null, LOCAL );
+		System.out.println( "loaded local configuration named '" + LOCAL + "'" );
+
+		// Get the listener uri from the config file.
+		String uri = local.getStringPath( local.getRoot(), LISTEN_URI );
+		System.out.println( "listen uri = " + uri );
+
+		// Create the listener stack.
+		ServerFactory listener = ConfigExampleHelper.newListener( uri, null,
+			new MainConfigExampleListener2() );
+		System.out.println( "listener created " + listener );
+
+		// Start the listener stack.
+		listener.transportControl( Transport.START_AND_WAIT_UP, 4000 );
+		System.out.println( "listener started " + listener );
+	}
+
+	public ConfigExampleServer newConfigExampleServer(
+		RemoteConfigExampleClient client )
+	{
+		return new ImplConfigExampleServer( client );
+	}
+}

Propchange: incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener2.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener2.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener3.java
URL: http://svn.apache.org/viewvc/incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener3.java?rev=758444&view=auto
==============================================================================
--- incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener3.java (added)
+++ incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener3.java Wed Mar 25 21:47:49 2009
@@ -0,0 +1,110 @@
+/*
+ * $Id$
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.etch.services.config.example;
+
+import org.apache.etch.bindings.java.support.ServerFactory;
+import org.apache.etch.services.config.ConfigurationClient;
+import org.apache.etch.services.config.ConfigurationServer;
+import org.apache.etch.services.config.YamlConfig;
+import org.apache.etch.services.config.example.ConfigExampleHelper.ConfigExampleServerFactory;
+import org.apache.etch.util.core.io.Transport;
+
+/**
+ * Main program for ConfigExampleServer. This program makes a listener to accept
+ * connections from MainConfigExampleClient. This is a standard etch listener
+ * modified to load the listen uri from a local config file at startup and
+ * whenever the file changes.
+ */
+public class MainConfigExampleListener3 implements
+	ConfigExampleServerFactory
+{
+	private static final String LOCAL = "services/config/example/local2";
+
+	private static final String LISTEN_URI = "listenUri";
+
+	/**
+	 * Main program for ConfigExampleServer.
+	 * 
+	 * @param args command line arguments.
+	 * @throws Exception
+	 */
+	public static void main( String[] args ) throws Exception
+	{
+		// Create the server session factory.
+		factory = new MainConfigExampleListener3();
+		
+		// Open the local config file.
+		local = new YamlConfig( new MyLocalConfigurationClient(), LOCAL );
+		System.out.println( "loaded local configuration named '" + LOCAL + "'" );
+
+		// Subscribe to changes in the local config file.
+		local.subscribe( local.getRoot() );
+		System.out.println( "subscribed to changes in '" + LOCAL + "'" );
+	}
+	
+	private static ConfigExampleServerFactory factory;
+	
+	private static ConfigurationServer local;
+	
+	private static class MyLocalConfigurationClient implements
+		ConfigurationClient
+	{
+		public void configValuesChanged( Object[] updated )
+		{
+			try
+			{
+				String uri = local.getStringPath( local.getRoot(), LISTEN_URI );
+				System.out.println( "listen uri = " + uri );
+				resetListener( uri );
+			}
+			catch ( Exception e )
+			{
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private static void resetListener( String listenUri ) throws Exception
+	{
+		// Stop any old listener.
+		if (listener != null)
+		{
+			System.out.println( "stopping listener " + listener );
+			listener.transportControl( Transport.STOP_AND_WAIT_DOWN, 4000 );
+			listener = null;
+		}
+		
+		// Create the listener stack.
+		listener = ConfigExampleHelper.newListener( listenUri, null, factory );
+		System.out.println( "listener created " + listener );
+
+		// Start the listener stack.
+		listener.transportControl( Transport.START_AND_WAIT_UP, 4000 );
+		System.out.println( "listener started " + listener );
+	}
+	
+	private static ServerFactory listener;
+
+	public ConfigExampleServer newConfigExampleServer(
+		RemoteConfigExampleClient client )
+	{
+		return new ImplConfigExampleServer( client );
+	}
+}

Propchange: incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener3.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener3.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Copied: incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener4.java (from r757878, incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener.java)
URL: http://svn.apache.org/viewvc/incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener4.java?p2=incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener4.java&p1=incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener.java&r1=757878&r2=758444&rev=758444&view=diff
==============================================================================
--- incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener.java (original)
+++ incubator/etch/branches/config/services/config/example/src/main/java/org/apache/etch/services/config/example/MainConfigExampleListener4.java Wed Mar 25 21:47:49 2009
@@ -1,21 +1,20 @@
-/* $Id$
- *
- * 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.
+/*
+ * $Id$
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
  */
 
 package org.apache.etch.services.config.example;
@@ -37,10 +36,12 @@
  * Main program for ConfigExampleServer. This program makes a listener to accept
  * connections from MainConfigExampleClient.
  */
-public class MainConfigExampleListener implements ConfigExampleServerFactory
+public class MainConfigExampleListener4 implements ConfigExampleServerFactory
 {
 	private static final String LOCAL = "services/config/example/local";
+
 	private static final String CONFIG_URI = "configUri";
+
 	private static final String LISTEN_URI = "listenUri";
 
 	/**
@@ -51,68 +52,67 @@
 	 */
 	public static void main( String[] args ) throws Exception
 	{
-		// use our local configuration to find our remote configuration service
-		// and keep us updated if it changes.
+		// Create the server session factory.
+		factory = new MainConfigExampleListener4();
+		
+		// Create the config client factory.
+		configClientFactory = new MyConfigurationClientFactory();
 		
+		// Open the local config file.
 		local = new YamlConfig( new MyLocalConfigurationClient(), LOCAL );
-		System.out.println( "loaded local configuration named '"+LOCAL+"'" );
-		configUriId = local.getConfigPath( local.getRoot(), CONFIG_URI );
-		System.out.println( "subscribing to local "+CONFIG_URI );
-		local.subscribe( configUriId );
+		System.out.println( "loaded local configuration named '" + LOCAL + "'" );
+
+		// Subscribe to changes in the local config file.
+		local.subscribe( local.getRoot() );
+		System.out.println( "subscribed to changes in '" + LOCAL + "'" );
 	}
+
+	private static ConfigExampleServerFactory factory;
 	
+	private static ConfigurationClientFactory configClientFactory;
+
 	private static ConfigurationServer local;
-	
-	private static Object configUriId;
-	
-	private static class MyLocalConfigurationClient implements ConfigurationClient
+
+	private static class MyLocalConfigurationClient implements
+		ConfigurationClient
 	{
 		public void configValuesChanged( Object[] updated )
 		{
-			for (Object id: updated)
+			try
 			{
-				if (id.equals( configUriId ))
-				{
-					try
-					{
-						configUriChanged();
-					}
-					catch ( Exception e )
-					{
-						e.printStackTrace();
-					}
-					continue;
-				}
+				String configUri = local.getStringPath( local.getRoot(), CONFIG_URI );
+				System.out.println( "local " + CONFIG_URI + " changed: " + configUri );
+				configUriChanged( configUri );
+			}
+			catch ( Exception e )
+			{
+				e.printStackTrace();
 			}
 		}
 	}
-	
-	private static void configUriChanged() throws Exception
+
+	private static void configUriChanged( String configUri ) throws Exception
 	{
-		configUri = local.getString( configUriId );
-		System.out.println( "local "+CONFIG_URI+" changed: "+configUri );
-		
-		RemoteConfigurationServer s = server;
-		if (s != null)
+		if (server != null)
 		{
-			System.out.println( "shutting down remote config service connection" );
+			System.out.println( "stopping remote config service" );
+			server._stopAndWaitDown( 4000 );
 			server = null;
-			s._stop();
-			s = null;
 		}
+
+		server = ConfigurationHelper.newServer( configUri, null, configClientFactory );
+		configName = new URL( configUri ).getUri();
 		
-		server = ConfigurationHelper.newServer( configUri, null,
-			new MyConfigurationClientFactory() );
-		System.out.println( "starting remote config service connection" );
+		System.out.println( "starting remote config service connection "+server );
 		server._start();
 	}
-	
-	private static String configUri;
-	
+
 	private static RemoteConfigurationServer server;
 	
-	private static class MyConfigurationClientFactory
-		implements ConfigurationClientFactory
+	private static String configName;
+
+	private static class MyConfigurationClientFactory implements
+		ConfigurationClientFactory
 	{
 		public ConfigurationClient newConfigurationClient(
 			RemoteConfigurationServer server ) throws Exception
@@ -120,14 +120,15 @@
 			return new MyRemoteConfigurationClient( server );
 		}
 	}
-	
-	private static class MyRemoteConfigurationClient extends BaseConfigurationClient
+
+	private static class MyRemoteConfigurationClient extends
+		BaseConfigurationClient
 	{
 		public MyRemoteConfigurationClient( RemoteConfigurationServer server )
 		{
 			this.server = server;
 		}
-		
+
 		private final RemoteConfigurationServer server;
 
 		@Override
@@ -136,71 +137,59 @@
 			if (event == Session.UP)
 			{
 				System.out.println( "remote config service connection is up" );
-				String name = new URL( configUri ).getUri();
-				System.out.println( "loading remote configuration named '"+name+"'" );
-				Object root = server.loadConfig( name );
-				System.out.println( "loaded remote configuration named '"+name+"'" );
-				listenUriId = server.getConfigPath( root, LISTEN_URI );
-				System.out.println( "subscribing to remote "+LISTEN_URI );
-				server.subscribe( listenUriId );
+				
+				System.out.println( "loading remote configuration named '"
+					+ configName + "'" );
+				root = server.loadConfig( configName );
+				System.out.println( "loaded remote configuration named '"
+					+ configName + "'" );
+				
+				System.out.println( "subscribing to remote configuration" );
+				server.subscribe( root );
 			}
 		}
 		
-		private Object listenUriId;
-		
+		private Object root;
+
 		@Override
 		public void configValuesChanged( Object[] updated )
 		{
-			for (Object id: updated)
+			try
 			{
-				if (id.equals( listenUriId ))
-				{
-					try
-					{
-						listenUriChanged();
-					}
-					catch ( Exception e )
-					{
-						e.printStackTrace();
-					}
-					continue;
-				}
+				String uri = server.getStringPath( root, LISTEN_URI );
+				System.out.println( "listen uri = " + uri );
+				resetListener( uri );
+			}
+			catch ( Exception e )
+			{
+				e.printStackTrace();
 			}
-		}
-
-		private void listenUriChanged() throws Exception
-		{
-			String listenUri = server.getString( listenUriId );
-			System.out.println( "remote "+LISTEN_URI+" changed: "+listenUri );
-			resetListener( listenUri );
 		}
 	}
 
 	private static void resetListener( String listenUri ) throws Exception
 	{
-		ServerFactory l = listener;
-		if (l != null)
+		// Stop any old listener.
+		if (listener != null)
 		{
-			System.out.println( "stopping listener "+l );
+			System.out.println( "stopping listener " + listener );
+			listener.transportControl( Transport.STOP_AND_WAIT_DOWN, 4000 );
 			listener = null;
-			l.transportControl( Transport.STOP, null );
-			l = null;
 		}
-		
+
+		// Create the listener stack.
 		listener = ConfigExampleHelper.newListener( listenUri, null, factory );
+		System.out.println( "listener created " + listener );
 		
 		// Start the Listener
 		listener.transportControl( Transport.START_AND_WAIT_UP, 4000 );
-		System.out.println( "started listener "+listener );
+		System.out.println( "listener started " + listener );
 	}
-	
+
 	private static ServerFactory listener;
-	
-	private final static MainConfigExampleListener factory =
-		new MainConfigExampleListener();
 
 	public ConfigExampleServer newConfigExampleServer(
-		RemoteConfigExampleClient client ) throws Exception
+		RemoteConfigExampleClient client )
 	{
 		return new ImplConfigExampleServer( client );
 	}

Modified: incubator/etch/branches/config/services/config/src/main/java/org/apache/etch/services/config/YamlConfig.java
URL: http://svn.apache.org/viewvc/incubator/etch/branches/config/services/config/src/main/java/org/apache/etch/services/config/YamlConfig.java?rev=758444&r1=758443&r2=758444&view=diff
==============================================================================
--- incubator/etch/branches/config/services/config/src/main/java/org/apache/etch/services/config/YamlConfig.java (original)
+++ incubator/etch/branches/config/services/config/src/main/java/org/apache/etch/services/config/YamlConfig.java Wed Mar 25 21:47:49 2009
@@ -678,12 +678,13 @@
 			
 			if (t1 == t0)
 			{
+				List<Integer> changeSet = new ArrayList<Integer>();
+				
 				synchronized (subs)
 				{
 					List<Conf> newConfigs = new ArrayList<Conf>( configs );
 					Set<Integer> newSubs = Collections.synchronizedSet(
 						new HashSet<Integer>( subs ) );
-					List<Integer> changeSet = new ArrayList<Integer>();
 
 					updateObject( newConfigs, newSubs, changeSet, 0,
 						null, null, o );
@@ -693,7 +694,7 @@
 					subs = newSubs;
 				}
 				
-				// TODO notify about changeSet
+				fireConfigValuesChanged( changeSet.toArray() );
 			}
 		}
 	}
@@ -729,12 +730,13 @@
 	}
 
 	private void updateObject( List<Conf> newConfigs, Set<Integer> newSubs,
-		List<Integer> changeSet, int id, Integer parent, Object nameOrIndex,
+		List<Integer> changeSet, int iid, Integer parent, Object nameOrIndex,
 		Object value )
 	{
+		// TODO implement this.
 		if (true) return;
 		
-		Conf c = getConf0( id );
+		Conf c = getConf0( iid );
 		
 		Assertion.check( (parent == null && c.parent == null) ||
 			(parent != null && c.parent != null && parent.equals( c.parent )),