http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/rpc/ServerRpcProvider.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/box/server/rpc/ServerRpcProvider.java 
b/src/org/waveprotocol/box/server/rpc/ServerRpcProvider.java
index deaf01b..9beb2b5 100755
--- a/src/org/waveprotocol/box/server/rpc/ServerRpcProvider.java
+++ b/src/org/waveprotocol/box/server/rpc/ServerRpcProvider.java
@@ -26,7 +26,6 @@ import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Singleton;
-import com.google.inject.name.Named;
 import com.google.inject.servlet.GuiceFilter;
 import com.google.inject.servlet.GuiceServletContextListener;
 import com.google.inject.servlet.ServletModule;
@@ -35,60 +34,38 @@ import com.google.protobuf.Descriptors.MethodDescriptor;
 import com.google.protobuf.Message;
 import com.google.protobuf.RpcCallback;
 import com.google.protobuf.Service;
-
+import com.typesafe.config.Config;
 import org.apache.commons.lang.StringUtils;
 import org.atmosphere.cache.UUIDBroadcasterCache;
 import org.atmosphere.config.service.AtmosphereHandlerService;
-import org.atmosphere.cpr.AtmosphereHandler;
-import org.atmosphere.cpr.AtmosphereResource;
-import org.atmosphere.cpr.AtmosphereResourceEvent;
-import org.atmosphere.cpr.AtmosphereResourceSession;
-import org.atmosphere.cpr.AtmosphereResourceSessionFactory;
-import org.atmosphere.cpr.AtmosphereResponse;
+import org.atmosphere.cpr.*;
 import org.atmosphere.guice.AtmosphereGuiceServlet;
 import org.atmosphere.util.IOUtils;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.nio.SelectChannelConnector;
 import org.eclipse.jetty.server.session.HashSessionManager;
 import org.eclipse.jetty.servlet.DefaultServlet;
 import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.server.nio.SelectChannelConnector;
 import org.eclipse.jetty.servlets.GzipFilter;
 import org.eclipse.jetty.util.resource.ResourceCollection;
 import org.eclipse.jetty.util.ssl.SslContextFactory;
 import org.eclipse.jetty.webapp.WebAppContext;
-import org.eclipse.jetty.websocket.servlet.ServletUpgradeRequest;
-import org.eclipse.jetty.websocket.servlet.ServletUpgradeResponse;
-import org.eclipse.jetty.websocket.servlet.WebSocketCreator;
-import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
-import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
+import org.eclipse.jetty.websocket.servlet.*;
 import org.waveprotocol.box.common.comms.WaveClientRpc.ProtocolAuthenticate;
 import 
org.waveprotocol.box.common.comms.WaveClientRpc.ProtocolAuthenticationResult;
-import org.waveprotocol.box.server.CoreSettings;
 import org.waveprotocol.box.server.authentication.SessionManager;
+import 
org.waveprotocol.box.server.executor.ExecutorAnnotations.ClientServerExecutor;
 import org.waveprotocol.box.server.persistence.file.FileUtils;
 import org.waveprotocol.box.server.rpc.atmosphere.AtmosphereChannel;
 import org.waveprotocol.box.server.rpc.atmosphere.AtmosphereClientInterceptor;
-import 
org.waveprotocol.box.server.executor.ExecutorAnnotations.ClientServerExecutor;
 import org.waveprotocol.box.server.util.NetUtils;
+import org.waveprotocol.box.stat.Timer;
+import org.waveprotocol.box.stat.Timing;
 import org.waveprotocol.wave.model.util.Pair;
 import org.waveprotocol.wave.model.wave.ParticipantId;
 import org.waveprotocol.wave.util.logging.Log;
-import org.waveprotocol.box.stat.Timer;
-import org.waveprotocol.box.stat.Timing;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.net.SocketAddress;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Executor;
 
 import javax.annotation.Nullable;
 import javax.servlet.DispatcherType;
@@ -96,6 +73,12 @@ import javax.servlet.Filter;
 import javax.servlet.ServletContextListener;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpSession;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executor;
 
 /**
  * ServerRpcProvider can provide instances of type Service over an incoming
@@ -177,7 +160,7 @@ public class ServerRpcProvider {
 
     @Override
     protected void sendMessage(int sequenceNo, Message message) {
-      atmosphereChannel.sendMessage(sequenceNo, message);;
+      atmosphereChannel.sendMessage(sequenceNo, message);
     }
 
     public AtmosphereChannel getAtmosphereChannel() {
@@ -191,7 +174,7 @@ public class ServerRpcProvider {
 
   static abstract class Connection implements ProtoCallback {
     private final Map<Integer, ServerRpcController> activeRpcs =
-        new ConcurrentHashMap<Integer, ServerRpcController>();
+        new ConcurrentHashMap<>();
 
     // The logged in user.
     // Note: Due to this bug:
@@ -204,7 +187,7 @@ public class ServerRpcProvider {
     /**
      * @param loggedInUser The currently logged in user, or null if no user is
      *        logged in.
-     * @param provider
+     * @param provider the provider
      */
     public Connection(ParticipantId loggedInUser, ServerRpcProvider provider) {
       this.loggedInUser = loggedInUser;
@@ -225,8 +208,7 @@ public class ServerRpcProvider {
 
     private ParticipantId authenticate(String token) {
       HttpSession session = provider.sessionManager.getSessionFromToken(token);
-      ParticipantId user = provider.sessionManager.getLoggedInUser(session);
-      return user;
+      return provider.sessionManager.getLoggedInUser(session);
     }
 
     @Override
@@ -278,8 +260,7 @@ public class ServerRpcProvider {
                       if (message instanceof Rpc.RpcFinished
                           || 
!serviceMethod.method.getOptions().getExtension(Rpc.isStreamingRpc)) {
                         // This RPC is over - remove it from the map.
-                        boolean failed = message instanceof Rpc.RpcFinished
-                            ? ((Rpc.RpcFinished) message).getFailed() : false;
+                        boolean failed = message instanceof Rpc.RpcFinished && 
((Rpc.RpcFinished) message).getFailed();
                         LOG.fine("RPC " + sequenceNo + " is now finished, 
failed = " + failed);
                         if (failed) {
                           LOG.info("error = " + ((Rpc.RpcFinished) 
message).getErrorText());
@@ -340,18 +321,19 @@ public class ServerRpcProvider {
   }
 
   @Inject
-  public ServerRpcProvider(@Named(CoreSettings.HTTP_FRONTEND_ADDRESSES) 
List<String> httpAddresses,
-      @Named(CoreSettings.HTTP_WEBSOCKET_PUBLIC_ADDRESS) String 
websocketAddress,
-      @Named(CoreSettings.RESOURCE_BASES) List<String> resourceBases,
-      SessionManager sessionManager, org.eclipse.jetty.server.SessionManager 
jettySessionManager,
-      @Named(CoreSettings.SESSIONS_STORE_DIRECTORY) String sessionStoreDir,
-      @Named(CoreSettings.ENABLE_SSL) boolean sslEnabled,
-      @Named(CoreSettings.SSL_KEYSTORE_PATH) String sslKeystorePath,
-      @Named(CoreSettings.SSL_KEYSTORE_PASSWORD) String sslKeystorePassword,
-      @ClientServerExecutor Executor executorService) {
-    this(parseAddressList(httpAddresses, websocketAddress), resourceBases
-        .toArray(new String[0]), sessionManager, jettySessionManager, 
sessionStoreDir,
-        sslEnabled, sslKeystorePath, sslKeystorePassword, executorService);
+  public ServerRpcProvider(Config config,
+                           SessionManager sessionManager, 
org.eclipse.jetty.server.SessionManager jettySessionManager,
+                           @ClientServerExecutor Executor executorService) {
+    this(parseAddressList(config.getStringList("core.http_frontend_addresses"),
+                    config.getString("core.http_websocket_public_address")),
+            config.getStringList("core.resource_bases").toArray(new String[0]),
+            sessionManager,
+            jettySessionManager,
+            config.getString("core.sessions_store_directory"),
+            config.getBoolean("security.enable_ssl"),
+            config.getString("security.ssl_keystore_path"),
+            config.getString("security.ssl_keystore_password"),
+            executorService);
   }
 
   public void startWebSocketServer(final Injector injector) {
@@ -382,13 +364,12 @@ public class ServerRpcProvider {
     addWebSocketServlets();
 
     try {
-      final Injector parentInjector = injector;
 
-      final ServletModule servletModule = getServletModule(parentInjector);
+      final ServletModule servletModule = getServletModule();
 
       ServletContextListener contextListener = new 
GuiceServletContextListener() {
 
-        private final Injector childInjector = 
parentInjector.createChildInjector(servletModule);
+        private final Injector childInjector = 
injector.createChildInjector(servletModule);
 
         @Override
         protected Injector getInjector() {
@@ -444,7 +425,7 @@ public class ServerRpcProvider {
     addServlet("/webclient/*", DefaultServlet.class);
   }
 
-  public ServletModule getServletModule(final Injector injector) {
+  public ServletModule getServletModule() {
 
     return new ServletModule() {
       @Override
@@ -474,7 +455,7 @@ public class ServerRpcProvider {
     } else {
       Set<InetSocketAddress> addresses = Sets.newHashSet();
       // We add the websocketAddress as another listening address.
-      ArrayList<String> mergedAddressList = new ArrayList<String>(addressList);
+      ArrayList<String> mergedAddressList = new ArrayList<>(addressList);
       if (!StringUtils.isEmpty(websocketAddress)) {
         mergedAddressList.add(websocketAddress);
       }
@@ -496,7 +477,7 @@ public class ServerRpcProvider {
           }
         }
       }
-      return addresses.toArray(new InetSocketAddress[0]);
+      return addresses.toArray(new InetSocketAddress[addresses.size()]);
     }
   }
 
@@ -555,13 +536,11 @@ public class ServerRpcProvider {
     final int websocketMaxMessageSize;
 
     @Inject
-    public WaveWebSocketServlet(ServerRpcProvider provider,
-        @Named(CoreSettings.WEBSOCKET_MAX_IDLE_TIME) int websocketMaxIdleTime,
-        @Named(CoreSettings.WEBSOCKET_MAX_MESSAGE_SIZE) int 
websocketMaxMessageSize) {
+    public WaveWebSocketServlet(ServerRpcProvider provider, Config config) {
       super();
       this.provider = provider;
-      this.websocketMaxIdleTime= websocketMaxIdleTime;
-      this.websocketMaxMessageSize = websocketMaxMessageSize;
+      this.websocketMaxIdleTime = 
config.getInt("network.websocket_max_idle_time");
+      this.websocketMaxMessageSize = 
config.getInt("network.websocket_max_message_size");
     }
 
     @SuppressWarnings("cast")
@@ -669,7 +648,7 @@ public class ServerRpcProvider {
 
           LOG.fine("SEND MESSAGE ARRAY " + event.getMessage().toString());
 
-          List<Object> list = Arrays.asList(event.getMessage());
+          List<Object> list = Collections.singletonList(event.getMessage());
 
           
response.getOutputStream().write(MSG_SEPARATOR.getBytes(MSG_CHARSET));
           for (Object object : list) {
@@ -819,7 +798,7 @@ public class ServerRpcProvider {
     if (initParams != null) {
       servletHolder.setInitParameters(initParams);
     }
-    servletRegistry.add(new Pair<String, ServletHolder>(urlPattern, 
servletHolder));
+    servletRegistry.add(Pair.of(urlPattern, servletHolder));
     return servletHolder;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/rpc/UserRegistrationServlet.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/box/server/rpc/UserRegistrationServlet.java 
b/src/org/waveprotocol/box/server/rpc/UserRegistrationServlet.java
index 0b858a9..d973812 100644
--- a/src/org/waveprotocol/box/server/rpc/UserRegistrationServlet.java
+++ b/src/org/waveprotocol/box/server/rpc/UserRegistrationServlet.java
@@ -22,8 +22,8 @@ package org.waveprotocol.box.server.rpc;
 import com.google.gxp.base.GxpContext;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
-
-import org.waveprotocol.box.server.CoreSettings;
+import com.typesafe.config.Config;
+import org.waveprotocol.box.server.CoreSettingsNames;
 import 
org.waveprotocol.box.server.authentication.HttpRequestBasedCallbackHandler;
 import org.waveprotocol.box.server.authentication.PasswordDigest;
 import org.waveprotocol.box.server.gxp.UserRegistrationPage;
@@ -33,13 +33,12 @@ import org.waveprotocol.box.server.util.RegistrationUtil;
 import org.waveprotocol.wave.model.wave.InvalidParticipantAddress;
 import org.waveprotocol.wave.model.wave.ParticipantId;
 
-import java.io.IOException;
-import java.util.Locale;
-
 import javax.inject.Singleton;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.Locale;
 
 /**
  * The user registration servlet allows new users to register accounts.
@@ -57,15 +56,17 @@ public final class UserRegistrationServlet extends 
HttpServlet {
   private final String analyticsAccount;
 
   @Inject
-  public UserRegistrationServlet(AccountStore accountStore,
-      @Named(CoreSettings.WAVE_SERVER_DOMAIN) String domain, WelcomeRobot 
welcomeBot,
-      @Named(CoreSettings.DISABLE_REGISTRATION) boolean registrationDisabled,
-      @Named(CoreSettings.ANALYTICS_ACCOUNT) String analyticsAccount) {
+  public UserRegistrationServlet(
+    AccountStore accountStore,
+    @Named(CoreSettingsNames.WAVE_SERVER_DOMAIN) String domain,
+    Config config,
+    WelcomeRobot welcomeBot) {
+
     this.accountStore = accountStore;
     this.domain = domain;
     this.welcomeBot = welcomeBot;
-    this.registrationDisabled = registrationDisabled;
-    this.analyticsAccount = analyticsAccount;
+    this.registrationDisabled = 
config.getBoolean("administration.disable_registration");
+    this.analyticsAccount = 
config.getString("administration.analytics_account");
   }
 
   @Override
@@ -101,7 +102,7 @@ public final class UserRegistrationServlet extends 
HttpServlet {
    * returns a string containing an error message. On success, returns null.
    */
   private String tryCreateUser(String username, String password) {
-    ParticipantId id = null;
+    ParticipantId id;
     try {
       id = RegistrationUtil.checkNewUsername(domain, username);
     } catch (InvalidParticipantAddress exception) {
@@ -119,7 +120,7 @@ public final class UserRegistrationServlet extends 
HttpServlet {
 
     if (!RegistrationUtil.createAccountIfMissing(accountStore, id,
           new PasswordDigest(password.toCharArray()), welcomeBot)) {
-      return "An unexpected error occured while trying to create the account";
+      return "An unexpected error occurred while trying to create the account";
     }
 
     return null;

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/rpc/WaveClientServlet.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/box/server/rpc/WaveClientServlet.java 
b/src/org/waveprotocol/box/server/rpc/WaveClientServlet.java
index 37bb8de..00f635a 100644
--- a/src/org/waveprotocol/box/server/rpc/WaveClientServlet.java
+++ b/src/org/waveprotocol/box/server/rpc/WaveClientServlet.java
@@ -23,35 +23,33 @@ import com.google.common.collect.Maps;
 import com.google.gxp.base.GxpContext;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
-
+import com.typesafe.config.Config;
 import org.apache.commons.lang.StringUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
 import org.waveprotocol.box.common.SessionConstants;
-import org.waveprotocol.box.server.CoreSettings;
+import org.waveprotocol.box.server.CoreSettingsNames;
+import org.waveprotocol.box.server.account.AccountData;
 import org.waveprotocol.box.server.authentication.SessionManager;
 import org.waveprotocol.box.server.gxp.TopBar;
 import org.waveprotocol.box.server.gxp.WaveClientPage;
 import org.waveprotocol.box.server.util.RandomBase64Generator;
-import org.waveprotocol.box.server.account.AccountData;
 import org.waveprotocol.box.server.util.UrlParameters;
 import org.waveprotocol.wave.client.util.ClientFlagsBase;
 import org.waveprotocol.wave.common.bootstrap.FlagConstants;
 import org.waveprotocol.wave.model.wave.ParticipantId;
 import org.waveprotocol.wave.util.logging.Log;
 
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-
 import javax.inject.Singleton;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
 
 /**
  * The HTTP servlet for serving a wave client along with content generated on
@@ -76,7 +74,6 @@ public class WaveClientServlet extends HttpServlet {
   private final String domain;
   private final String analyticsAccount;
   private final SessionManager sessionManager;
-  private final String websocketAddress;
   private final String websocketPresentedAddress;
 
   /**
@@ -84,18 +81,17 @@ public class WaveClientServlet extends HttpServlet {
    */
   @Inject
   public WaveClientServlet(
-      @Named(CoreSettings.WAVE_SERVER_DOMAIN) String domain,
-      @Named(CoreSettings.HTTP_FRONTEND_ADDRESSES) List<String> httpAddresses,
-      @Named(CoreSettings.HTTP_WEBSOCKET_PUBLIC_ADDRESS) String 
websocketAddress,
-      @Named(CoreSettings.HTTP_WEBSOCKET_PRESENTED_ADDRESS) String 
websocketPresentedAddress,
-      @Named(CoreSettings.ANALYTICS_ACCOUNT) String analyticsAccount,
+      @Named(CoreSettingsNames.WAVE_SERVER_DOMAIN) String domain,
+      Config config,
       SessionManager sessionManager) {
+    List<String> httpAddresses = 
config.getStringList("core.http_frontend_addresses");
+    String websocketAddress = 
config.getString("core.http_websocket_public_address");
+    String websocketPresentedAddress = 
config.getString("core.http_websocket_presented_address");
     this.domain = domain;
-    this.websocketAddress = StringUtils.isEmpty(websocketAddress) ?
-        httpAddresses.get(0) : websocketAddress;
+    String websocketAddress1 = StringUtils.isEmpty(websocketAddress) ? 
httpAddresses.get(0) : websocketAddress;
     this.websocketPresentedAddress = 
StringUtils.isEmpty(websocketPresentedAddress) ?
-        this.websocketAddress : websocketPresentedAddress;
-    this.analyticsAccount = analyticsAccount;
+                                             websocketAddress1 : 
websocketPresentedAddress;
+    this.analyticsAccount = 
config.getString("administration.analytics_account");
     this.sessionManager = sessionManager;
   }
 
@@ -174,10 +170,9 @@ public class WaveClientServlet extends HttpServlet {
             }
 
             // Ignore the flag on any exception
-          } catch (SecurityException ex) {
+          } catch (SecurityException | NumberFormatException ignored) {
           } catch (NoSuchMethodException ex) {
             LOG.warning("Failed to find the flag [" + name + "] in 
ClientFlagsBase.");
-          } catch (NumberFormatException ex) {
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/waveserver/CertificateManagerImpl.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/box/server/waveserver/CertificateManagerImpl.java 
b/src/org/waveprotocol/box/server/waveserver/CertificateManagerImpl.java
index 75569bc..911576c 100644
--- a/src/org/waveprotocol/box/server/waveserver/CertificateManagerImpl.java
+++ b/src/org/waveprotocol/box/server/waveserver/CertificateManagerImpl.java
@@ -20,33 +20,21 @@
 package org.waveprotocol.box.server.waveserver;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ArrayListMultimap;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Multimap;
+import com.google.common.collect.*;
 import com.google.inject.Inject;
-import com.google.inject.name.Named;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
-
+import com.typesafe.config.Config;
 import org.apache.commons.codec.binary.Hex;
-import org.waveprotocol.box.server.CoreSettings;
 import org.waveprotocol.box.server.common.CoreWaveletOperationSerializer;
-import org.waveprotocol.wave.crypto.CertPathStore;
-import org.waveprotocol.wave.crypto.SignatureException;
-import org.waveprotocol.wave.crypto.SignerInfo;
-import org.waveprotocol.wave.crypto.UnknownSignerException;
-import org.waveprotocol.wave.crypto.WaveSignatureVerifier;
-import org.waveprotocol.wave.federation.FederationErrors;
-import org.waveprotocol.wave.federation.WaveletFederationProvider;
+import org.waveprotocol.wave.crypto.*;
 import org.waveprotocol.wave.federation.FederationErrorProto.FederationError;
+import org.waveprotocol.wave.federation.FederationErrors;
 import org.waveprotocol.wave.federation.Proto.ProtocolSignature;
 import org.waveprotocol.wave.federation.Proto.ProtocolSignedDelta;
 import org.waveprotocol.wave.federation.Proto.ProtocolSignerInfo;
 import org.waveprotocol.wave.federation.Proto.ProtocolWaveletDelta;
+import org.waveprotocol.wave.federation.WaveletFederationProvider;
 import 
org.waveprotocol.wave.federation.WaveletFederationProvider.DeltaSignerInfoResponseListener;
 import org.waveprotocol.wave.model.id.WaveletName;
 import org.waveprotocol.wave.model.version.HashedVersion;
@@ -79,10 +67,9 @@ public class CertificateManagerImpl implements 
CertificateManager {
       signerInfoRequests;
 
   @Inject
-  public CertificateManagerImpl(
-      @Named(CoreSettings.WAVESERVER_DISABLE_VERIFICATION) boolean 
disableVerfication,
-      SignatureHandler signer, WaveSignatureVerifier verifier, CertPathStore 
certPathStore) {
-    this.disableVerfication = disableVerfication;
+  public CertificateManagerImpl(Config config, SignatureHandler signer,
+    WaveSignatureVerifier verifier, CertPathStore certPathStore) {
+    this.disableVerfication = 
config.getBoolean("federation.waveserver_disable_verification");
     this.waveSigner = signer;
     // for now, we just support a single signer
     this.localDomains = ImmutableSet.of(signer.getDomain());
@@ -92,7 +79,7 @@ public class CertificateManagerImpl implements 
CertificateManager {
 
     if (disableVerfication) {
       LOG.warning("** SIGNATURE VERIFICATION DISABLED ** "
-          + "see flag \"" + CoreSettings.WAVESERVER_DISABLE_VERIFICATION + 
"\"");
+          + "see configuration federation.waveserver_disable_verification");
     }
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/waveserver/LucenePerUserWaveViewHandlerImpl.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/box/server/waveserver/LucenePerUserWaveViewHandlerImpl.java
 
b/src/org/waveprotocol/box/server/waveserver/LucenePerUserWaveViewHandlerImpl.java
index 02aa58b..dc114cd 100644
--- 
a/src/org/waveprotocol/box/server/waveserver/LucenePerUserWaveViewHandlerImpl.java
+++ 
b/src/org/waveprotocol/box/server/waveserver/LucenePerUserWaveViewHandlerImpl.java
@@ -19,11 +19,6 @@
 
 package org.waveprotocol.box.server.waveserver;
 
-import static org.waveprotocol.box.server.waveserver.IndexFieldType.LMT;
-import static org.waveprotocol.box.server.waveserver.IndexFieldType.WAVEID;
-import static org.waveprotocol.box.server.waveserver.IndexFieldType.WAVELETID;
-import static org.waveprotocol.box.server.waveserver.IndexFieldType.WITH;
-
 import com.google.common.base.Preconditions;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
@@ -32,31 +27,19 @@ import 
com.google.common.util.concurrent.ListenableFutureTask;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.google.inject.name.Named;
-
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
-import org.apache.lucene.index.CorruptIndexException;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.IndexWriterConfig;
 import org.apache.lucene.index.IndexWriterConfig.OpenMode;
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.*;
 import org.apache.lucene.search.BooleanClause.Occur;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.NRTManager;
-import org.apache.lucene.search.NRTManagerReopenThread;
-import org.apache.lucene.search.ScoreDoc;
-import org.apache.lucene.search.SearcherManager;
-import org.apache.lucene.search.SearcherWarmer;
-import org.apache.lucene.search.Sort;
-import org.apache.lucene.search.SortField;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.TopDocs;
 import org.apache.lucene.store.AlreadyClosedException;
 import org.apache.lucene.util.Version;
-import org.waveprotocol.box.server.CoreSettings;
+import org.waveprotocol.box.server.CoreSettingsNames;
+import org.waveprotocol.box.server.executor.ExecutorAnnotations.IndexExecutor;
 import org.waveprotocol.box.server.persistence.lucene.IndexDirectory;
 import org.waveprotocol.wave.model.id.WaveId;
 import org.waveprotocol.wave.model.id.WaveletId;
@@ -69,11 +52,10 @@ import java.io.Closeable;
 import java.io.IOException;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
-import java.util.concurrent.ScheduledExecutorService;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import org.waveprotocol.box.server.executor.ExecutorAnnotations.IndexExecutor;
+import static org.waveprotocol.box.server.waveserver.IndexFieldType.*;
 
 /**
  * Lucene based implementation of {@link PerUserWaveViewHandler}.
@@ -122,7 +104,6 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
   private static final int MAX_WAVES = 10000;
 
   private final StandardAnalyzer analyzer;
-  private final TextCollator textCollator;
   private final IndexWriter indexWriter;
   private final NRTManager nrtManager;
   private final NRTManagerReopenThread nrtManagerReopenThread;
@@ -132,18 +113,17 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
 
   @Inject
   public LucenePerUserWaveViewHandlerImpl(IndexDirectory directory,
-      ReadableWaveletDataProvider waveletProvider, TextCollator textCollator,
-      @Named(CoreSettings.WAVE_SERVER_DOMAIN) final String waveDomain,
-      @IndexExecutor Executor executor) {
-    this.textCollator = textCollator;
+                                          ReadableWaveletDataProvider 
waveletProvider,
+                                          
@Named(CoreSettingsNames.WAVE_SERVER_DOMAIN) String domain,
+                                          @IndexExecutor Executor executor) {
     this.waveletProvider = waveletProvider;
     this.executor = executor;
     analyzer = new StandardAnalyzer(LUCENE_VERSION);
     try {
-      IndexWriterConfig config = new IndexWriterConfig(LUCENE_VERSION, 
analyzer);
-      config.setOpenMode(OpenMode.CREATE_OR_APPEND);
-      indexWriter = new IndexWriter(directory.getDirectory(), config);
-      nrtManager = new NRTManager(indexWriter, new 
WaveSearchWarmer(waveDomain));
+      IndexWriterConfig indexConfig = new IndexWriterConfig(LUCENE_VERSION, 
analyzer);
+      indexConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
+      indexWriter = new IndexWriter(directory.getDirectory(), indexConfig);
+      nrtManager = new NRTManager(indexWriter, new WaveSearchWarmer(domain));
     } catch (IOException ex) {
       throw new IndexException(ex);
     }
@@ -191,7 +171,7 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
     Preconditions.checkNotNull(waveletName);
     Preconditions.checkNotNull(participant);
 
-    ListenableFutureTask<Void> task = ListenableFutureTask.<Void>create(new 
Callable<Void>() {
+    ListenableFutureTask<Void> task = ListenableFutureTask.create(new 
Callable<Void>() {
 
       @Override
       public Void call() throws Exception {
@@ -216,7 +196,7 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
     Preconditions.checkNotNull(waveletName);
     Preconditions.checkNotNull(participant);
 
-    ListenableFutureTask<Void> task = ListenableFutureTask.<Void>create(new 
Callable<Void>() {
+    ListenableFutureTask<Void> task = ListenableFutureTask.create(new 
Callable<Void>() {
 
       @Override
       public Void call() throws Exception {
@@ -225,9 +205,6 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
           waveletData = waveletProvider.getReadableWaveletData(waveletName);
           try {
             removeParticipantfromIndex(waveletData, participant, nrtManager);
-          } catch (CorruptIndexException e) {
-            LOG.log(Level.SEVERE, "Failed to update index for " + waveletName, 
e);
-            throw e;
           } catch (IOException e) {
             LOG.log(Level.SEVERE, "Failed to update index for " + waveletName, 
e);
             throw e;
@@ -247,7 +224,7 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
   public ListenableFuture<Void> onWaveInit(final WaveletName waveletName) {
     Preconditions.checkNotNull(waveletName);
 
-    ListenableFutureTask<Void> task = ListenableFutureTask.<Void>create(new 
Callable<Void>() {
+    ListenableFutureTask<Void> task = ListenableFutureTask.create(new 
Callable<Void>() {
 
       @Override
       public Void call() throws Exception {
@@ -271,24 +248,21 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
     try {
       // TODO (Yuri Z): Update documents instead of totally removing and 
adding.
       removeIndex(wavelet, nrtManager);
-      addIndex(wavelet, indexWriter, nrtManager, textCollator);
+      addIndex(wavelet, nrtManager);
       indexWriter.commit();
-    } catch (CorruptIndexException e) {
-      throw new IndexException(String.valueOf(wavelet.getWaveletId()), e);
     } catch (IOException e) {
       throw new IndexException(String.valueOf(wavelet.getWaveletId()), e);
     }
   }
 
-  private static void addIndex(ReadableWaveletData wavelet, IndexWriter 
indexWriter,
-      NRTManager nrtManager, TextCollator textCollator) throws 
CorruptIndexException, IOException {
+  private static void addIndex(ReadableWaveletData wavelet,
+      NRTManager nrtManager) throws IOException {
     Document doc = new Document();
-    addWaveletFieldsToIndex(wavelet, textCollator, doc);
+    addWaveletFieldsToIndex(wavelet, doc);
     nrtManager.addDocument(doc);
   }
 
-  private static void addWaveletFieldsToIndex(ReadableWaveletData wavelet,
-      TextCollator textCollator, Document doc) {
+  private static void addWaveletFieldsToIndex(ReadableWaveletData wavelet, 
Document doc) {
     doc.add(new Field(WAVEID.toString(), wavelet.getWaveId().serialise(), 
Field.Store.YES,
         Field.Index.NOT_ANALYZED));
     doc.add(new Field(WAVELETID.toString(), 
wavelet.getWaveletId().serialise(), Field.Store.YES,
@@ -302,7 +276,7 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
   }
 
   private static void removeIndex(ReadableWaveletData wavelet, NRTManager 
nrtManager)
-      throws CorruptIndexException, IOException {
+      throws IOException {
     BooleanQuery query = new BooleanQuery();
     query.add(new TermQuery(new Term(WAVEID.toString(), 
wavelet.getWaveId().serialise())),
         BooleanClause.Occur.MUST);
@@ -312,7 +286,7 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
   }
 
   private static void removeParticipantfromIndex(ReadableWaveletData wavelet,
-      ParticipantId participant, NRTManager nrtManager) throws 
CorruptIndexException, IOException {
+      ParticipantId participant, NRTManager nrtManager) throws IOException {
     BooleanQuery query = new BooleanQuery();
     Term waveIdTerm = new Term(WAVEID.toString(), 
wavelet.getWaveId().serialise());
     query.add(new TermQuery(waveIdTerm), BooleanClause.Occur.MUST);
@@ -343,7 +317,6 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
       } catch (IOException e) {
         LOG.log(Level.WARNING, "Failed to close searcher. ", e);
       }
-      indexSearcher = null;
     }
   }
 
@@ -373,7 +346,6 @@ public class LucenePerUserWaveViewHandlerImpl implements 
PerUserWaveViewHandler,
       } catch (IOException e) {
         LOG.log(Level.WARNING, "Failed to close searcher. " + user, e);
       }
-      indexSearcher = null;
     }
     return userWavesViewMap;
   }

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/waveserver/NonSigningSignatureHandler.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/box/server/waveserver/NonSigningSignatureHandler.java 
b/src/org/waveprotocol/box/server/waveserver/NonSigningSignatureHandler.java
index e87b6bf..8ad816e 100644
--- a/src/org/waveprotocol/box/server/waveserver/NonSigningSignatureHandler.java
+++ b/src/org/waveprotocol/box/server/waveserver/NonSigningSignatureHandler.java
@@ -24,7 +24,7 @@ import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.google.inject.name.Named;
 
-import org.waveprotocol.box.server.CoreSettings;
+import org.waveprotocol.box.server.CoreSettingsNames;
 import org.waveprotocol.wave.crypto.SignerInfo;
 import org.waveprotocol.wave.federation.Proto.ProtocolSignature;
 import org.waveprotocol.wave.federation.Proto.ProtocolWaveletDelta;
@@ -45,7 +45,7 @@ public class NonSigningSignatureHandler implements 
SignatureHandler {
 
     @Inject
     public NonSigningSignatureHandlerProvider(
-        @Named(CoreSettings.WAVE_SERVER_DOMAIN) String waveDomain) {
+        @Named(CoreSettingsNames.WAVE_SERVER_DOMAIN) String waveDomain) {
       this.waveDomain = waveDomain;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/waveserver/SigningSignatureHandler.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/box/server/waveserver/SigningSignatureHandler.java 
b/src/org/waveprotocol/box/server/waveserver/SigningSignatureHandler.java
index 7133808..f9e6cbf 100644
--- a/src/org/waveprotocol/box/server/waveserver/SigningSignatureHandler.java
+++ b/src/org/waveprotocol/box/server/waveserver/SigningSignatureHandler.java
@@ -26,13 +26,11 @@ import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.ProvisionException;
 import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-
+import com.typesafe.config.Config;
 import org.waveprotocol.wave.crypto.SignatureException;
 import org.waveprotocol.wave.crypto.SignerInfo;
 import org.waveprotocol.wave.crypto.WaveSigner;
 import org.waveprotocol.wave.crypto.WaveSignerFactory;
-import org.waveprotocol.wave.federation.FederationSettings;
 import org.waveprotocol.wave.federation.Proto.ProtocolSignature;
 import org.waveprotocol.wave.federation.Proto.ProtocolWaveletDelta;
 
@@ -58,23 +56,14 @@ public class SigningSignatureHandler implements 
SignatureHandler {
     private SigningSignatureHandler signer = null;
 
     /**
-     * Public constructor.
-     * @param privateKey file name that has the PKCS#8-PEM-encoded private key.
-     * @param certs list of file names that have the certificates of this 
signer.
-     *   The first file name must have the signer's target certificate. The
-     *   certificates can be DER or PEM encoded.
-     * @param certDomain the domain for which the certificate was issued.
      * @param factory A {@link WaveSignerFactory}.
+     * @param config the configuration.
      */
     @Inject
-    public SigningSignatureHandlerProvider(
-        @Named(FederationSettings.CERTIFICATE_PRIVATE_KEY) String privateKey,
-        @Named(FederationSettings.CERTIFICATE_FILES) List<String> certs,
-        @Named(FederationSettings.CERTIFICATE_DOMAIN) String certDomain,
-        WaveSignerFactory factory) {
-      this.privateKey = privateKey;
-      this.certs = certs;
-      this.certDomain = certDomain;
+    public SigningSignatureHandlerProvider(WaveSignerFactory factory, Config 
config) {
+      this.privateKey = config.getString("federation.certificate_private_key");
+      this.certs = config.getStringList("federation.certificate_files");
+      this.certDomain = config.getString("federation.certificate_domain");
       this.waveSignerFactory = factory;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/waveserver/SimpleSearchProviderImpl.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/box/server/waveserver/SimpleSearchProviderImpl.java 
b/src/org/waveprotocol/box/server/waveserver/SimpleSearchProviderImpl.java
index 9884daf..53f35c9 100644
--- a/src/org/waveprotocol/box/server/waveserver/SimpleSearchProviderImpl.java
+++ b/src/org/waveprotocol/box/server/waveserver/SimpleSearchProviderImpl.java
@@ -27,7 +27,7 @@ import com.google.inject.Inject;
 import com.google.inject.name.Named;
 import com.google.wave.api.SearchResult;
 
-import org.waveprotocol.box.server.CoreSettings;
+import org.waveprotocol.box.server.CoreSettingsNames;
 import 
org.waveprotocol.box.server.waveserver.QueryHelper.InvalidQueryException;
 import org.waveprotocol.wave.model.id.WaveId;
 import org.waveprotocol.wave.model.id.WaveletId;
@@ -55,7 +55,7 @@ public class SimpleSearchProviderImpl extends 
AbstractSearchProviderImpl {
   private final PerUserWaveViewProvider waveViewProvider;
 
   @Inject
-  public SimpleSearchProviderImpl(@Named(CoreSettings.WAVE_SERVER_DOMAIN) 
final String waveDomain,
+  public SimpleSearchProviderImpl(@Named(CoreSettingsNames.WAVE_SERVER_DOMAIN) 
final String waveDomain,
       WaveDigester digester, final WaveMap waveMap, PerUserWaveViewProvider 
userWaveViewProvider) {
     super(waveDomain, digester, waveMap);
     this.waveViewProvider = userWaveViewProvider;

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/waveserver/SolrSearchProviderImpl.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/box/server/waveserver/SolrSearchProviderImpl.java 
b/src/org/waveprotocol/box/server/waveserver/SolrSearchProviderImpl.java
index a46dc93..66ff288 100644
--- a/src/org/waveprotocol/box/server/waveserver/SolrSearchProviderImpl.java
+++ b/src/org/waveprotocol/box/server/waveserver/SolrSearchProviderImpl.java
@@ -27,16 +27,12 @@ import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.google.inject.Inject;
-import com.google.inject.name.Named;
 import com.google.wave.api.SearchResult;
-
+import com.typesafe.config.Config;
 import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
 import org.apache.commons.httpclient.URI;
-import org.apache.commons.httpclient.URIException;
 import org.apache.commons.httpclient.methods.GetMethod;
 import org.apache.http.HttpStatus;
-import org.waveprotocol.box.server.CoreSettings;
 import org.waveprotocol.box.stat.Timed;
 import org.waveprotocol.wave.model.id.WaveId;
 import org.waveprotocol.wave.model.id.WaveletId;
@@ -49,7 +45,6 @@ import org.waveprotocol.wave.util.logging.Log;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.regex.Pattern;
@@ -106,11 +101,9 @@ public class SolrSearchProviderImpl extends 
AbstractSearchProviderImpl {
     }};
 
   @Inject
-  public SolrSearchProviderImpl(WaveDigester digester, WaveMap waveMap,
-      @Named(CoreSettings.WAVE_SERVER_DOMAIN) String waveDomain,
-      @Named(CoreSettings.SOLR_BASE_URL) String solrUrl) {
-    super(waveDomain, digester, waveMap);
-    solrBaseUrl = solrUrl;
+  public SolrSearchProviderImpl(WaveDigester digester, WaveMap waveMap, Config 
config) {
+    super(config.getString("core.wave_server_domain"), digester, waveMap);
+    solrBaseUrl = config.getString("core.solr_base_url");
   }
 
   @Timed
@@ -199,13 +192,12 @@ public class SolrSearchProviderImpl extends 
AbstractSearchProviderImpl {
 
   private void addSearchResultsToCurrentWaveView(
       LinkedHashMultimap<WaveId, WaveletId> currentUserWavesView, JsonArray 
docsJson) {
-    Iterator<JsonElement> docJsonIterator = docsJson.iterator();
-    while (docJsonIterator.hasNext()) {
-      JsonObject docJson = docJsonIterator.next().getAsJsonObject();
+    for (JsonElement aDocsJson : docsJson) {
+      JsonObject docJson = aDocsJson.getAsJsonObject();
 
       WaveId waveId = 
WaveId.deserialise(docJson.getAsJsonPrimitive(WAVE_ID).getAsString());
       WaveletId waveletId =
-          
WaveletId.deserialise(docJson.getAsJsonPrimitive(WAVELET_ID).getAsString());
+              
WaveletId.deserialise(docJson.getAsJsonPrimitive(WAVELET_ID).getAsString());
       currentUserWavesView.put(waveId, waveletId);
     }
   }
@@ -213,8 +205,7 @@ public class SolrSearchProviderImpl extends 
AbstractSearchProviderImpl {
   private static JsonArray extractDocsJson(InputStreamReader isr) {
     JsonObject json = new JsonParser().parse(isr).getAsJsonObject();
     JsonObject responseJson = json.getAsJsonObject("response");
-    JsonArray docsJson = responseJson.getAsJsonArray("docs");
-    return docsJson;
+    return responseJson.getAsJsonArray("docs");
   }
 
   private String buildCurrentSolrQuery(int start, int rows, String fq) {
@@ -223,8 +214,7 @@ public class SolrSearchProviderImpl extends 
AbstractSearchProviderImpl {
   }
 
   private JsonArray sendSearchRequest(String solrQuery,
-      Function<InputStreamReader, JsonArray> function) throws URIException, 
IOException,
-      HttpException {
+      Function<InputStreamReader, JsonArray> function) throws IOException {
     JsonArray docsJson;
     GetMethod getMethod = new GetMethod();
     HttpClient httpClient = new HttpClient();

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java 
b/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java
index 5403b5f..2af772a 100644
--- a/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java
+++ b/src/org/waveprotocol/box/server/waveserver/SolrWaveIndexerImpl.java
@@ -29,8 +29,7 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonPrimitive;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-
+import com.typesafe.config.Config;
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.URI;
 import org.apache.commons.httpclient.methods.GetMethod;
@@ -40,7 +39,6 @@ import 
org.apache.commons.httpclient.methods.StringRequestEntity;
 import org.apache.http.HttpStatus;
 import org.waveprotocol.box.common.DeltaSequence;
 import org.waveprotocol.box.common.Snippets;
-import org.waveprotocol.box.server.CoreSettings;
 import org.waveprotocol.box.server.executor.ExecutorAnnotations.SolrExecutor;
 import org.waveprotocol.box.server.robots.util.ConversationUtil;
 import org.waveprotocol.box.stat.Timed;
@@ -78,12 +76,11 @@ public class SolrWaveIndexerImpl extends 
AbstractWaveIndexer implements WaveBus.
   public SolrWaveIndexerImpl(WaveMap waveMap, WaveletProvider waveletProvider,
       ReadableWaveletDataProvider waveletDataProvider, ConversationUtil 
conversationUtil,
       WaveletNotificationDispatcher notificationDispatcher,
-      @Named(CoreSettings.SOLR_BASE_URL) String solrUrl,
+      Config config,
       @SolrExecutor Executor solrExecutor) {
     super(waveMap, waveletProvider);
-
     executor = solrExecutor;
-    solrBaseUrl = solrUrl;
+    solrBaseUrl = config.getString("core.solr_base_url");
     this.waveletDataProvider = waveletDataProvider;
     notificationDispatcher.subscribe(this);
   }
@@ -258,7 +255,7 @@ public class SolrWaveIndexerImpl extends 
AbstractWaveIndexer implements WaveBus.
   }
 
   @Override
-  public synchronized void remakeIndex() throws WaveletStateException, 
WaveServerException {
+  public synchronized void remakeIndex() throws WaveServerException {
 
     /*-
      * To fully rebuild the index, need to delete everything first

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/waveserver/WaveMap.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/box/server/waveserver/WaveMap.java 
b/src/org/waveprotocol/box/server/waveserver/WaveMap.java
index 09ee788..b2fa769 100644
--- a/src/org/waveprotocol/box/server/waveserver/WaveMap.java
+++ b/src/org/waveprotocol/box/server/waveserver/WaveMap.java
@@ -28,9 +28,9 @@ import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListenableFutureTask;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
-
 import org.waveprotocol.box.common.ExceptionalIterator;
-import org.waveprotocol.box.server.CoreSettings;
+import org.waveprotocol.box.server.CoreSettingsNames;
+import org.waveprotocol.box.server.executor.ExecutorAnnotations.LookupExecutor;
 import org.waveprotocol.box.server.persistence.PersistenceException;
 import org.waveprotocol.wave.model.id.WaveId;
 import org.waveprotocol.wave.model.id.WaveletId;
@@ -41,7 +41,6 @@ import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executor;
-import org.waveprotocol.box.server.executor.ExecutorAnnotations.LookupExecutor;
 
 /**
  * A collection of wavelets, local and remote, held in memory.
@@ -57,13 +56,13 @@ public class WaveMap {
   private static ListenableFuture<ImmutableSet<WaveletId>> lookupWavelets(
       final WaveId waveId, final WaveletStore<?> waveletStore, Executor 
lookupExecutor) {
     ListenableFutureTask<ImmutableSet<WaveletId>> task =
-        ListenableFutureTask.<ImmutableSet<WaveletId>>create(
-            new Callable<ImmutableSet<WaveletId>>() {
-              @Override
-              public ImmutableSet<WaveletId> call() throws 
PersistenceException {
-                return waveletStore.lookup(waveId);
-              }
-            });
+        ListenableFutureTask.create(
+           new Callable<ImmutableSet<WaveletId>>() {
+             @Override
+             public ImmutableSet<WaveletId> call() throws PersistenceException 
{
+               return waveletStore.lookup(waveId);
+             }
+           });
     lookupExecutor.execute(task);
     return task;
   }
@@ -74,10 +73,9 @@ public class WaveMap {
   @Inject
   public WaveMap(final DeltaAndSnapshotStore waveletStore,
       final WaveletNotificationSubscriber notifiee,
-      WaveBus dispatcher,
       final LocalWaveletContainer.Factory localFactory,
       final RemoteWaveletContainer.Factory remoteFactory,
-      @Named(CoreSettings.WAVE_SERVER_DOMAIN) final String waveDomain,
+                 @Named(CoreSettingsNames.WAVE_SERVER_DOMAIN) final String 
waveDomain,
       @LookupExecutor final Executor lookupExecutor) {
     // NOTE(anorth): DeltaAndSnapshotStore is more specific than necessary, but
     // helps Guice out.
@@ -157,12 +155,8 @@ public class WaveMap {
     WaveletContainer waveletContainer = null;
     try {
       waveletContainer = getRemoteWavelet(waveletName);
-    } catch (WaveletStateException e) {
+    } catch (WaveletStateException | NullPointerException e) {
       // Ignored.
-    } catch (NullPointerException e) {
-      // This is a fairly normal case of it being a local-only wave.
-      // Yet this only seems to appear in the test suite.
-      // Continuing is completely harmless here.
     }
 
     if (waveletContainer == null) {

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/box/server/waveserver/WaveServerModule.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/box/server/waveserver/WaveServerModule.java 
b/src/org/waveprotocol/box/server/waveserver/WaveServerModule.java
index 5743594..41d60bf 100644
--- a/src/org/waveprotocol/box/server/waveserver/WaveServerModule.java
+++ b/src/org/waveprotocol/box/server/waveserver/WaveServerModule.java
@@ -20,29 +20,17 @@
 package org.waveprotocol.box.server.waveserver;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.cache.CacheBuilder;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListenableFutureTask;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Provides;
 import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import com.google.inject.name.Names;
-
-import org.waveprotocol.box.server.CoreSettings;
+import com.typesafe.config.Config;
+import 
org.waveprotocol.box.server.executor.ExecutorAnnotations.StorageContinuationExecutor;
+import 
org.waveprotocol.box.server.executor.ExecutorAnnotations.WaveletLoadExecutor;
 import org.waveprotocol.box.server.persistence.PersistenceException;
-import org.waveprotocol.wave.crypto.CachedCertPathValidator;
-import org.waveprotocol.wave.crypto.CertPathStore;
-import org.waveprotocol.wave.crypto.DefaultCacheImpl;
-import org.waveprotocol.wave.crypto.DefaultTimeSource;
-import org.waveprotocol.wave.crypto.DefaultTrustRootsProvider;
-import org.waveprotocol.wave.crypto.DisabledCertPathValidator;
-import org.waveprotocol.wave.crypto.TimeSource;
-import org.waveprotocol.wave.crypto.TrustRootsProvider;
-import org.waveprotocol.wave.crypto.VerifiedCertChainCache;
-import org.waveprotocol.wave.crypto.WaveCertPathValidator;
-import org.waveprotocol.wave.crypto.WaveSignatureVerifier;
+import org.waveprotocol.wave.crypto.*;
 import org.waveprotocol.wave.model.id.IdURIEncoderDecoder;
 import org.waveprotocol.wave.model.id.WaveletName;
 import org.waveprotocol.wave.model.version.HashedVersionFactory;
@@ -51,9 +39,6 @@ import org.waveprotocol.wave.util.escapers.jvm.JavaUrlCodec;
 
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-import 
org.waveprotocol.box.server.executor.ExecutorAnnotations.StorageContinuationExecutor;
-import 
org.waveprotocol.box.server.executor.ExecutorAnnotations.WaveletLoadExecutor;
 
 /**
  * Guice Module for the prototype Server.
@@ -70,10 +55,10 @@ public class WaveServerModule extends AbstractModule {
 
 
   @Inject
-  WaveServerModule(@Named(CoreSettings.ENABLE_FEDERATION) boolean 
enableFederation,
+  WaveServerModule(Config config,
       @WaveletLoadExecutor Executor waveletLoadExecutor,
       @StorageContinuationExecutor Executor storageContinuationExecutor) {
-    this.enableFederation = enableFederation;
+    this.enableFederation = config.getBoolean("federation.enable_federation");
     this.waveletLoadExecutor = waveletLoadExecutor;
     this.storageContinuationExecutor = storageContinuationExecutor;
   }
@@ -142,18 +127,18 @@ public class WaveServerModule extends AbstractModule {
     };
   }
 
-  @Provides
-  @SuppressWarnings("unused")
-  private WaveCertPathValidator provideWaveCertPathValidator(
-      @Named(CoreSettings.WAVESERVER_DISABLE_SIGNER_VERIFICATION) boolean 
disableSignerVerification,
-      TimeSource timeSource, VerifiedCertChainCache certCache,
-      TrustRootsProvider trustRootsProvider) {
-    if (disableSignerVerification) {
-      return new DisabledCertPathValidator();
-    } else {
-      return new CachedCertPathValidator(certCache, timeSource, 
trustRootsProvider);
+    @Provides
+    @SuppressWarnings("unused")
+    private WaveCertPathValidator provideWaveCertPathValidator(Config config,
+       TimeSource timeSource,
+       VerifiedCertChainCache certCache,
+       TrustRootsProvider trustRootsProvider) {
+        if 
(config.getBoolean("federation.waveserver_disable_signer_verification")) {
+            return new DisabledCertPathValidator();
+        } else {
+            return new CachedCertPathValidator(certCache, timeSource, 
trustRootsProvider);
+        }
     }
-  }
 
   /**
    * Returns a future whose result is the state of the wavelet after it has 
been
@@ -164,14 +149,14 @@ public class WaveServerModule extends AbstractModule {
   static ListenableFuture<DeltaStoreBasedWaveletState> 
loadWaveletState(Executor executor,
       final DeltaStore deltaStore, final WaveletName waveletName, final 
Executor persistExecutor) {
     ListenableFutureTask<DeltaStoreBasedWaveletState> task =
-        ListenableFutureTask.<DeltaStoreBasedWaveletState>create(
-            new Callable<DeltaStoreBasedWaveletState>() {
-              @Override
-              public DeltaStoreBasedWaveletState call() throws 
PersistenceException {
-                return 
DeltaStoreBasedWaveletState.create(deltaStore.open(waveletName),
-                    persistExecutor);
-              }
-            });
+        ListenableFutureTask.create(
+           new Callable<DeltaStoreBasedWaveletState>() {
+             @Override
+             public DeltaStoreBasedWaveletState call() throws 
PersistenceException {
+               return 
DeltaStoreBasedWaveletState.create(deltaStore.open(waveletName),
+                                                                
persistExecutor);
+             }
+           });
     executor.execute(task);
     return task;
   }

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/wave/federation/FederationSettings.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/wave/federation/FederationSettings.java 
b/src/org/waveprotocol/wave/federation/FederationSettings.java
deleted file mode 100644
index bad3199..0000000
--- a/src/org/waveprotocol/wave/federation/FederationSettings.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * 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.waveprotocol.wave.federation;
-
-import org.waveprotocol.wave.util.settings.Setting;
-
-import java.util.List;
-
-/**
- * Settings specific to federation.
- */
-@SuppressWarnings("unused") // We inject them by the name of their flag
-public class FederationSettings {
-  public static final String XMPP_SERVER_HOSTNAME = "xmpp_server_hostname";
-  public static final String XMPP_SERVER_SECRET = "xmpp_server_secret";
-  public static final String XMPP_COMPONENT_NAME = "xmpp_component_name";
-  public static final String XMPP_SERVER_COMPONENT_PORT = 
"xmpp_server_component_port";
-  public static final String XMPP_SERVER_IP = "xmpp_server_ip";
-  public static final String XMPP_SERVER_DESCRIPTION = 
"xmpp_server_description";
-  public static final String XMPP_DISCO_FAILED_EXPIRY_SECS = 
"xmpp_disco_failed_expiry_secs";
-  public static final String XMPP_DISCO_SUCCESSFUL_EXPIRY_SECS = 
"xmpp_disco_successful_expiry_secs";
-  public static final String XMPP_JID = "xmpp_jid";
-
-  public static final String CERTIFICATE_PRIVATE_KEY = 
"certificate_private_key";
-  public static final String CERTIFICATE_FILES = "certificate_files";
-  public static final String CERTIFICATE_DOMAIN = "certificate_domain";
-
-  @Setting(name = XMPP_SERVER_HOSTNAME)
-  private static String xmppServerHostname;
-
-  @Setting(name = XMPP_SERVER_SECRET)
-  private static String xmppServerSecret;
-
-  @Setting(name = XMPP_COMPONENT_NAME)
-  private static String xmppComponentName;
-
-  @Setting(name = XMPP_SERVER_COMPONENT_PORT)
-  private static int xmppServerPort;
-
-  @Setting(name = XMPP_SERVER_IP)
-  private static String xmppServerIp;
-
-  @Setting(name = XMPP_SERVER_DESCRIPTION)
-  private static String xmppServerDescription;
-
-  // default value is 5 minutes
-  @Setting(name = XMPP_DISCO_FAILED_EXPIRY_SECS, defaultValue = "300")
-  private static int xmppDiscoFailedExpirySecs;
-
-  // default value is 2 hours
-  @Setting(name = XMPP_DISCO_SUCCESSFUL_EXPIRY_SECS, defaultValue = "7200")
-  private static int xmppDiscoSuccessfulExpirySecs;
-
-  @Setting(name = XMPP_JID)
-  private static String xmppJid;
-
-  @Setting(name = CERTIFICATE_PRIVATE_KEY)
-  private static String certificatePrivKey;
-
-  @Setting(name = CERTIFICATE_FILES, description = "comma separated WITH NO 
SPACES.")
-  private static List<String> certificateFiles;
-
-  @Setting(name = CERTIFICATE_DOMAIN)
-  private static String certificateDomain;
-}

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/wave/federation/xmpp/ComponentPacketTransport.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/wave/federation/xmpp/ComponentPacketTransport.java 
b/src/org/waveprotocol/wave/federation/xmpp/ComponentPacketTransport.java
index bd7b06d..a98dbbc 100644
--- a/src/org/waveprotocol/wave/federation/xmpp/ComponentPacketTransport.java
+++ b/src/org/waveprotocol/wave/federation/xmpp/ComponentPacketTransport.java
@@ -20,10 +20,8 @@
 package org.waveprotocol.wave.federation.xmpp;
 
 import com.google.inject.Inject;
-import com.google.inject.name.Named;
-
+import com.typesafe.config.Config;
 import org.jivesoftware.whack.ExternalComponentManager;
-import org.waveprotocol.wave.federation.FederationSettings;
 import org.xmpp.component.Component;
 import org.xmpp.component.ComponentException;
 import org.xmpp.component.ComponentManager;
@@ -64,20 +62,15 @@ public class ComponentPacketTransport implements Component, 
OutgoingPacketTransp
   private boolean connected = false;
 
   @Inject
-  public ComponentPacketTransport(IncomingPacketHandler handler,
-      @Named(FederationSettings.XMPP_COMPONENT_NAME) String componentName,
-      @Named(FederationSettings.XMPP_SERVER_HOSTNAME) String serverDomain,
-      @Named(FederationSettings.XMPP_SERVER_SECRET) String serverSecret,
-      @Named(FederationSettings.XMPP_SERVER_IP) String serverAddress,
-      @Named(FederationSettings.XMPP_SERVER_COMPONENT_PORT) int serverPort) {
+  public ComponentPacketTransport(IncomingPacketHandler handler, Config 
config) {
     this.handler = handler;
-    this.componentName = componentName;
-    this.serverDomain = serverDomain;
-    this.serverSecret = serverSecret;
-    this.serverAddress = serverAddress;
-    this.serverPort = serverPort;
+    this.componentName = config.getString("federation.xmpp_component_name");
+    this.serverDomain = config.getString("federation.xmpp_server_hostname");
+    this.serverSecret = config.getString("federation.xmpp_server_secret");
+    this.serverAddress = config.getString("federation.xmpp_server_ip");
+    this.serverPort = config.getInt("federation.xmpp_server_component_port");
 
-    queuedPackets = new LinkedList<Packet>();
+    queuedPackets = new LinkedList<>();
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/wave/federation/xmpp/RemoteDisco.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/wave/federation/xmpp/RemoteDisco.java 
b/src/org/waveprotocol/wave/federation/xmpp/RemoteDisco.java
index 1ea43c5..b6d5868 100644
--- a/src/org/waveprotocol/wave/federation/xmpp/RemoteDisco.java
+++ b/src/org/waveprotocol/wave/federation/xmpp/RemoteDisco.java
@@ -67,8 +67,8 @@ public class RemoteDisco {
   static final int DISCO_INFO_TIMEOUT = 20;
 
   private final long creationTimeMillis;
-  private final int failExpirySecs;
-  private final int successExpirySecs;
+  private final long failExpirySecs;
+  private final long successExpirySecs;
 
   enum Status {
     INIT, PENDING, COMPLETE
@@ -113,8 +113,8 @@ public class RemoteDisco {
    * @param failExpirySecs    how long to keep alive a failed disco result
    * @param successExpirySecs how long to keep alive a successful disco result
    */
-  public RemoteDisco(XmppManager manager, String remoteDomain, int 
failExpirySecs,
-                     int successExpirySecs) {
+  public RemoteDisco(XmppManager manager, String remoteDomain, long 
failExpirySecs,
+                     long successExpirySecs) {
     this.manager = manager;
     status = new AtomicReference<Status>(Status.INIT);
     pending = new ConcurrentLinkedQueue<SuccessFailCallback<String, String>>();

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/wave/federation/xmpp/XmppDisco.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/wave/federation/xmpp/XmppDisco.java 
b/src/org/waveprotocol/wave/federation/xmpp/XmppDisco.java
index 79148f5..3e03ef7 100644
--- a/src/org/waveprotocol/wave/federation/xmpp/XmppDisco.java
+++ b/src/org/waveprotocol/wave/federation/xmpp/XmppDisco.java
@@ -20,29 +20,23 @@
 package org.waveprotocol.wave.federation.xmpp;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
-import com.google.common.collect.MapMaker;
 import com.google.inject.Inject;
-import com.google.inject.name.Named;
+import com.typesafe.config.Config;
+import org.dom4j.Element;
+import org.waveprotocol.wave.federation.FederationErrorProto.FederationError;
+import org.waveprotocol.wave.federation.FederationErrors;
+import org.xmpp.packet.IQ;
 
-import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import org.dom4j.Element;
-import org.xmpp.packet.IQ;
-
-import org.waveprotocol.wave.federation.FederationErrorProto.FederationError;
-import org.waveprotocol.wave.federation.FederationErrors;
-import org.waveprotocol.wave.federation.FederationSettings;
-
 /**
  * Implementation of XMPP Discovery. Provides public methods to respond to 
incoming disco requests
  * (via {@link XmppManager}), as well as outgoing disco via {{@link 
#discoverRemoteJid}.
@@ -55,14 +49,11 @@ public class XmppDisco {
   @SuppressWarnings("unused")
   private static final Logger LOG = 
Logger.getLogger(XmppDisco.class.getCanonicalName());
 
-  static final String DISCO_INFO_CATEGORY = "collaboration";
-  static final String DISCO_INFO_TYPE = "google-wave";
-
   // This tracks the number of disco attempts started.
   public static final LoadingCache<String, AtomicLong> statDiscoStarted =
       CacheBuilder.newBuilder().build(new CacheLoader<String, AtomicLong>() {
             @Override
-            public AtomicLong load(String domain) {
+            public AtomicLong load(@SuppressWarnings("NullableProblems") 
String domain) {
               return new AtomicLong();
             }
           });
@@ -71,29 +62,29 @@ public class XmppDisco {
   private final String serverDescription;
 
   private XmppManager manager = null;
-  private static int DISCO_EXPIRATION_HOURS = 6;
   // Accessed by XmppFederationHostForDomain.
-  final int failExpirySecs;
-  final int successExpirySecs;
+  final long failExpirySecs;
+  final long successExpirySecs;
+  final long discoExpirationHours;
+  final String discoInfoCategory;
+  final String discoInfoType;
 
   /**
    * Constructor. Note that {@link #setManager} must be called before this 
class is ready to use.
-   *
-   * @param serverDescription the name of this server - passed in from flags
-   * @param failExpirySecs    how long to cache failed disco results
-   * @param successExpirySecs how long to cache successful disco results
    */
   @Inject
-  public XmppDisco(@Named(FederationSettings.XMPP_SERVER_DESCRIPTION) String 
serverDescription,
-      @Named(FederationSettings.XMPP_DISCO_FAILED_EXPIRY_SECS) final int 
failExpirySecs,
-      @Named(FederationSettings.XMPP_DISCO_SUCCESSFUL_EXPIRY_SECS) final int 
successExpirySecs) {
-    this.serverDescription = serverDescription;
-    this.failExpirySecs = failExpirySecs;
-    this.successExpirySecs = successExpirySecs;
-
+  public XmppDisco(Config config) {
+    this.serverDescription = 
config.getString("federation.xmpp_server_description");
+    this.discoInfoCategory = 
config.getString("federation.disco_info_category");
+    this.discoInfoType = config.getString("federation.disco_info_type");
+    this.failExpirySecs = 
config.getDuration("federation.xmpp_disco_failed_expiry", TimeUnit.SECONDS);
+    this.successExpirySecs = 
config.getDuration("federation.xmpp_disco_successful_expiry", TimeUnit.SECONDS);
+    this.discoExpirationHours = 
config.getDuration("federation.disco_expiration", TimeUnit.HOURS);
+
+    //noinspection NullableProblems
     discoRequests =
         CacheBuilder.newBuilder().expireAfterWrite(
-        DISCO_EXPIRATION_HOURS, TimeUnit.HOURS).build(
+                discoExpirationHours, TimeUnit.HOURS).build(
         new CacheLoader<String, RemoteDisco>() {
 
           @Override
@@ -125,9 +116,9 @@ public class XmppDisco {
     Element query = response.setChildElement("query", 
XmppNamespace.NAMESPACE_DISCO_INFO);
 
     query.addElement("identity")
-        .addAttribute("category", DISCO_INFO_CATEGORY)
-        .addAttribute("type", DISCO_INFO_TYPE)
-        .addAttribute("name", serverDescription);
+        .addAttribute("category", discoInfoCategory)
+        .addAttribute("type", discoInfoType)
+      .addAttribute("name", serverDescription);
 
     query.addElement("feature")
         .addAttribute("var", XmppNamespace.NAMESPACE_WAVE_SERVER);

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/wave/federation/xmpp/XmppFederationHost.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/wave/federation/xmpp/XmppFederationHost.java 
b/src/org/waveprotocol/wave/federation/xmpp/XmppFederationHost.java
index 7194584..09c76d1 100644
--- a/src/org/waveprotocol/wave/federation/xmpp/XmppFederationHost.java
+++ b/src/org/waveprotocol/wave/federation/xmpp/XmppFederationHost.java
@@ -23,23 +23,21 @@ import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.inject.Inject;
-import com.google.inject.name.Named;
 import com.google.protobuf.ByteString;
 import com.google.protobuf.InvalidProtocolBufferException;
-
+import com.typesafe.config.Config;
 import org.dom4j.Element;
+import org.waveprotocol.wave.federation.FederationErrorProto.FederationError;
 import org.waveprotocol.wave.federation.FederationErrors;
 import org.waveprotocol.wave.federation.FederationHostBridge;
-import org.waveprotocol.wave.federation.FederationSettings;
-import org.waveprotocol.wave.federation.WaveletFederationListener;
-import org.waveprotocol.wave.federation.WaveletFederationProvider;
-import org.waveprotocol.wave.federation.FederationErrorProto.FederationError;
 import org.waveprotocol.wave.federation.Proto.ProtocolHashedVersion;
 import org.waveprotocol.wave.federation.Proto.ProtocolSignedDelta;
 import org.waveprotocol.wave.federation.Proto.ProtocolSignerInfo;
+import org.waveprotocol.wave.federation.WaveletFederationListener;
+import org.waveprotocol.wave.federation.WaveletFederationProvider;
 import org.waveprotocol.wave.federation.xmpp.XmppUtil.UnknownSignerType;
-import org.waveprotocol.wave.model.id.WaveletName;
 import org.waveprotocol.wave.model.id.URIEncoderDecoder.EncodingException;
+import org.waveprotocol.wave.model.id.WaveletName;
 import org.xmpp.packet.IQ;
 
 import java.util.List;
@@ -56,21 +54,13 @@ public class XmppFederationHost implements 
WaveletFederationListener.Factory {
   private static final Logger LOG = 
Logger.getLogger(XmppFederationHost.class.getCanonicalName());
 
   private final WaveletFederationProvider waveletProvider;
-  private final XmppDisco disco;
-  private final String jid;
 
   private XmppManager manager = null;
 
   // A map of update listeners. There is one per remote domain we are sending 
updates to.
   // The name 'listener' refers to them listening for updates from the 
waveserver to send to the
   // network.
-  private final LoadingCache<String, WaveletFederationListener> listeners =
-      CacheBuilder.newBuilder().build(new CacheLoader<String, 
WaveletFederationListener>() {
-    @Override
-    public WaveletFederationListener load(String domain) {
-      return new XmppFederationHostForDomain(domain, manager, disco, jid);
-    }
-  });
+  private final LoadingCache<String, WaveletFederationListener> listeners;
 
   /**
    * Constructor. Note that {@link #setManager} must be called before this 
class
@@ -78,15 +68,18 @@ public class XmppFederationHost implements 
WaveletFederationListener.Factory {
    *
    * @param waveletProvider used for communicating back to the Host part of the
    *        wavelet server.
-   * @param disco           used for discovery
-   * @param jid             this server's local JID
+   * @param disco used for discovery
    */
   @Inject
   public XmppFederationHost(@FederationHostBridge WaveletFederationProvider 
waveletProvider,
-      XmppDisco disco, @Named(FederationSettings.XMPP_JID) String jid) {
+      final XmppDisco disco, final Config config) {
     this.waveletProvider = waveletProvider;
-    this.disco = disco;
-    this.jid = jid;
+    listeners = CacheBuilder.newBuilder().build(new CacheLoader<String, 
WaveletFederationListener>() {
+      @Override
+      public WaveletFederationListener 
load(@SuppressWarnings("NullableProblems") String domain) {
+        return new XmppFederationHostForDomain(domain, manager, disco, config);
+      }
+    });
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/wave/federation/xmpp/XmppFederationHostForDomain.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/wave/federation/xmpp/XmppFederationHostForDomain.java 
b/src/org/waveprotocol/wave/federation/xmpp/XmppFederationHostForDomain.java
index 2b077f3..d809b33 100644
--- a/src/org/waveprotocol/wave/federation/xmpp/XmppFederationHostForDomain.java
+++ b/src/org/waveprotocol/wave/federation/xmpp/XmppFederationHostForDomain.java
@@ -20,17 +20,15 @@
 package org.waveprotocol.wave.federation.xmpp;
 
 import com.google.inject.Inject;
-import com.google.inject.name.Named;
 import com.google.protobuf.ByteString;
-
+import com.typesafe.config.Config;
 import org.dom4j.Element;
-import org.waveprotocol.wave.federation.FederationErrors;
-import org.waveprotocol.wave.federation.FederationSettings;
-import org.waveprotocol.wave.federation.WaveletFederationListener;
 import org.waveprotocol.wave.federation.FederationErrorProto.FederationError;
+import org.waveprotocol.wave.federation.FederationErrors;
 import org.waveprotocol.wave.federation.Proto.ProtocolHashedVersion;
-import org.waveprotocol.wave.model.id.WaveletName;
+import org.waveprotocol.wave.federation.WaveletFederationListener;
 import org.waveprotocol.wave.model.id.URIEncoderDecoder.EncodingException;
+import org.waveprotocol.wave.model.id.WaveletName;
 import org.xmpp.packet.Message;
 import org.xmpp.packet.Packet;
 
@@ -58,10 +56,10 @@ class XmppFederationHostForDomain implements 
WaveletFederationListener {
 
   @Inject
   public XmppFederationHostForDomain(final String domain, XmppManager manager,
-      XmppDisco disco, @Named(FederationSettings.XMPP_JID) String jid) {
+      XmppDisco disco, Config config) {
     this.remoteDomain = domain;
     this.manager = manager;
-    this.jid = jid;
+    this.jid = config.getString("federation.xmpp_jid");
     this.disco = disco;
   }
 

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/wave/federation/xmpp/XmppFederationRemote.java
----------------------------------------------------------------------
diff --git 
a/src/org/waveprotocol/wave/federation/xmpp/XmppFederationRemote.java 
b/src/org/waveprotocol/wave/federation/xmpp/XmppFederationRemote.java
index c2d8a55..a28bd72 100644
--- a/src/org/waveprotocol/wave/federation/xmpp/XmppFederationRemote.java
+++ b/src/org/waveprotocol/wave/federation/xmpp/XmppFederationRemote.java
@@ -23,24 +23,22 @@ import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.inject.Inject;
-import com.google.inject.name.Named;
 import com.google.protobuf.ByteString;
-
+import com.typesafe.config.Config;
 import org.apache.commons.codec.binary.Base64;
 import org.dom4j.Attribute;
 import org.dom4j.Element;
+import org.waveprotocol.wave.federation.FederationErrorProto.FederationError;
 import org.waveprotocol.wave.federation.FederationErrors;
 import org.waveprotocol.wave.federation.FederationRemoteBridge;
-import org.waveprotocol.wave.federation.FederationSettings;
-import org.waveprotocol.wave.federation.WaveletFederationListener;
-import org.waveprotocol.wave.federation.WaveletFederationProvider;
-import org.waveprotocol.wave.federation.FederationErrorProto.FederationError;
 import org.waveprotocol.wave.federation.Proto.ProtocolHashedVersion;
 import org.waveprotocol.wave.federation.Proto.ProtocolSignedDelta;
 import org.waveprotocol.wave.federation.Proto.ProtocolSignerInfo;
+import org.waveprotocol.wave.federation.WaveletFederationListener;
+import org.waveprotocol.wave.federation.WaveletFederationProvider;
 import org.waveprotocol.wave.federation.xmpp.XmppUtil.UnknownSignerType;
-import org.waveprotocol.wave.model.id.WaveletName;
 import org.waveprotocol.wave.model.id.URIEncoderDecoder.EncodingException;
+import org.waveprotocol.wave.model.id.WaveletName;
 import org.xmpp.packet.IQ;
 import org.xmpp.packet.Message;
 import org.xmpp.packet.Packet;
@@ -77,10 +75,10 @@ public class XmppFederationRemote implements 
WaveletFederationProvider {
   @Inject
   public XmppFederationRemote(
       @FederationRemoteBridge WaveletFederationListener.Factory 
updatesListenerFactory,
-      XmppDisco disco, @Named(FederationSettings.XMPP_JID) String jid) {
+      XmppDisco disco, Config config) {
     this.updatesListenerFactory = updatesListenerFactory;
     this.disco = disco;
-    this.jid = jid;
+    this.jid = config.getString("federation.xmpp_jid");
   }
 
   /**
@@ -531,30 +529,35 @@ public class XmppFederationRemote implements 
WaveletFederationProvider {
       for (Element itemElement : (List<Element>) items.elements()) {
         for (Element element : (List<Element>) itemElement.elements()) {
           String elementName = element.getQName().getName();
-          if (elementName.equals("applied-delta")) {
-            String deltaBody = element.getText();
-            
deltaList.add(ByteString.copyFrom(Base64.decodeBase64(deltaBody.getBytes())));
-          } else if (elementName.equals("commit-notice")) {
-            Attribute commitVersion = element.attribute("version");
-            if (commitVersion != null) {
-              try {
-                lastCommittedVersion = 
Long.parseLong(commitVersion.getValue());
-              } catch (NumberFormatException e) {
-                lastCommittedVersion = -1;
+          switch (elementName) {
+            case "applied-delta":
+              String deltaBody = element.getText();
+              
deltaList.add(ByteString.copyFrom(Base64.decodeBase64(deltaBody.getBytes())));
+              break;
+            case "commit-notice":
+              Attribute commitVersion = element.attribute("version");
+              if (commitVersion != null) {
+                try {
+                  lastCommittedVersion = 
Long.parseLong(commitVersion.getValue());
+                } catch (NumberFormatException e) {
+                  lastCommittedVersion = -1;
+                }
               }
-            }
-          } else if (elementName.equals("history-truncated")) {
-            Attribute truncVersion = element.attribute("version");
-            if (truncVersion != null) {
-              try {
-                versionTruncatedAt = Long.parseLong(truncVersion.getValue());
-              } catch (NumberFormatException e) {
-                versionTruncatedAt = -1;
+              break;
+            case "history-truncated":
+              Attribute truncVersion = element.attribute("version");
+              if (truncVersion != null) {
+                try {
+                  versionTruncatedAt = Long.parseLong(truncVersion.getValue());
+                } catch (NumberFormatException e) {
+                  versionTruncatedAt = -1;
+                }
               }
-            }
-          } else {
-            listener.onFailure(FederationErrors.badRequest(
-                "Bad response packet: " + historyResponse));
+              break;
+            default:
+              listener.onFailure(FederationErrors.badRequest(
+                      "Bad response packet: " + historyResponse));
+              break;
           }
         }
       }

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/wave/federation/xmpp/XmppManager.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/wave/federation/xmpp/XmppManager.java 
b/src/org/waveprotocol/wave/federation/xmpp/XmppManager.java
index 4dad3b6..e0f2fb7 100644
--- a/src/org/waveprotocol/wave/federation/xmpp/XmppManager.java
+++ b/src/org/waveprotocol/wave/federation/xmpp/XmppManager.java
@@ -23,22 +23,16 @@ import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.MapMaker;
 import com.google.inject.Inject;
-import com.google.inject.name.Named;
-
+import com.typesafe.config.Config;
 import org.dom4j.Element;
 import org.waveprotocol.wave.federation.FederationErrorProto.FederationError;
 import org.waveprotocol.wave.federation.FederationErrors;
-import org.waveprotocol.wave.federation.FederationSettings;
 import org.xmpp.packet.IQ;
 import org.xmpp.packet.Message;
 import org.xmpp.packet.Packet;
 import org.xmpp.packet.PacketError;
 
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -120,12 +114,12 @@ public class XmppManager implements IncomingPacketHandler 
{
 
   @Inject
   public XmppManager(XmppFederationHost host, XmppFederationRemote remote, 
XmppDisco disco,
-      OutgoingPacketTransport transport, @Named(FederationSettings.XMPP_JID) 
String jid) {
+      OutgoingPacketTransport transport, Config config) {
     this.host = host;
     this.remote = remote;
     this.disco = disco;
     this.transport = transport;
-    this.jid = jid;
+    this.jid = config.getString("federation.xmpp_jid");
 
     // Configure all related objects with this manager. Eventually, this should
     // be replaced by better Guice interface bindings.
@@ -328,12 +322,16 @@ public class XmppManager implements IncomingPacketHandler 
{
         sendErrorResponse(iq, FederationError.Code.BAD_REQUEST, "Unhandled 
pubsub request");
       }
     } else if (!isIQSet) {
-      if (namespace.equals(XmppNamespace.NAMESPACE_DISCO_INFO)) {
-        disco.processDiscoInfoGet(iq, responseCallback);
-      } else if (namespace.equals(XmppNamespace.NAMESPACE_DISCO_ITEMS)) {
-        disco.processDiscoItemsGet(iq, responseCallback);
-      } else {
-        sendErrorResponse(iq, FederationError.Code.BAD_REQUEST, "Unhandled IQ 
get");
+      switch (namespace) {
+        case XmppNamespace.NAMESPACE_DISCO_INFO:
+          disco.processDiscoInfoGet(iq, responseCallback);
+          break;
+        case XmppNamespace.NAMESPACE_DISCO_ITEMS:
+          disco.processDiscoItemsGet(iq, responseCallback);
+          break;
+        default:
+          sendErrorResponse(iq, FederationError.Code.BAD_REQUEST, "Unhandled 
IQ get");
+          break;
       }
     } else {
       sendErrorResponse(iq, FederationError.Code.BAD_REQUEST, "Unhandled IQ 
set");

http://git-wip-us.apache.org/repos/asf/incubator-wave/blob/80369760/src/org/waveprotocol/wave/util/settings/Setting.java
----------------------------------------------------------------------
diff --git a/src/org/waveprotocol/wave/util/settings/Setting.java 
b/src/org/waveprotocol/wave/util/settings/Setting.java
deleted file mode 100644
index 6fad10f..0000000
--- a/src/org/waveprotocol/wave/util/settings/Setting.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * 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.waveprotocol.wave.util.settings;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * A setting descriptor. All settings are mandatory unless explicitly specified
- * otherwise.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target(ElementType.FIELD)
-public @interface Setting {
-  String name();
-  String description() default "";
-  String defaultValue() default "";
-}

Reply via email to