This is an automated email from the ASF dual-hosted git repository.
ralaoui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mina-vysper.git
The following commit(s) were added to refs/heads/master by this push:
new cdc4c53 Remove getComponentStanzaProcessor from the
ServerRuntimeContext
cdc4c53 is described below
commit cdc4c534c4b44a433b8aea2e02313b2686f43384
Author: Réda Housni Alaoui <[email protected]>
AuthorDate: Sat Aug 24 22:50:59 2019 +0200
Remove getComponentStanzaProcessor from the ServerRuntimeContext
---
...pringCompatibleDefaultServerRuntimeContext.java | 6 +-
.../DeliveringInternalInboundStanzaRelay.java | 18 +-
.../handler/DiscoInfoIQHandler.java | 2 +-
.../handler/DiscoItemIQHandler.java | 2 +-
.../xmpp/server/AlterableComponentRegistry.java | 31 ++++
.../vysper/xmpp/server/ComponentRegistry.java | 32 ++++
.../xmpp/server/DefaultServerRuntimeContext.java | 143 +++++++++------
.../vysper/xmpp/server/ServerRuntimeContext.java | 2 +-
.../xmpp/server/SimpleComponentRegistry.java | 66 +++++++
.../org/apache/vysper/xmpp/server/XMPPServer.java | 87 +++++----
.../stanzasession/StanzaSessionTestCase.java | 7 +-
...eliveringInteralInboundStanzaRelayTestCase.java | 27 ++-
.../handler/DiscoInfoIQHandlerTestCase.java | 204 +++++++++++----------
.../handler/ExtendedDiscoInfoTestCase.java | 3 +-
.../ProtocolWorkerStateAwarenessTestCase.java | 3 +-
...faultServerRuntimeContextEventListenerTest.java | 3 +-
16 files changed, 407 insertions(+), 229 deletions(-)
diff --git
a/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
b/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
index 4fc5e26..44876a2 100644
---
a/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
+++
b/server/core/src/main/java/org/apache/vysper/spring/SpringCompatibleDefaultServerRuntimeContext.java
@@ -28,6 +28,7 @@ import
org.apache.vysper.xmpp.delivery.failure.DeliveryFailureStrategy;
import org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
import org.apache.vysper.xmpp.modules.Module;
import org.apache.vysper.xmpp.protocol.HandlerDictionary;
+import org.apache.vysper.xmpp.server.AlterableComponentRegistry;
import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
import org.apache.vysper.xmpp.server.ServerFeatures;
import org.apache.vysper.xmpp.stanza.Stanza;
@@ -63,8 +64,9 @@ public class SpringCompatibleDefaultServerRuntimeContext
extends DefaultServerRu
}
public SpringCompatibleDefaultServerRuntimeContext(Entity serverEntity,
ServerFeatures serverFeatures,
- List<HandlerDictionary> dictionaries, ResourceRegistry
resourceRegistry) {
- super(serverEntity, new StanzaRelayHull(), serverFeatures,
dictionaries, resourceRegistry);
+ List<HandlerDictionary> dictionaries, ResourceRegistry
resourceRegistry,
+ AlterableComponentRegistry componentRegistry) {
+ super(serverEntity, new StanzaRelayHull(), componentRegistry,
resourceRegistry, serverFeatures, dictionaries);
}
public void setStanzaRelay(StanzaRelay stanzaRelay) {
diff --git
a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
index fca397b..49fb761 100644
---
a/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
+++
b/server/core/src/main/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInternalInboundStanzaRelay.java
@@ -19,6 +19,8 @@
*/
package org.apache.vysper.xmpp.delivery.inbound;
+import static java.util.Objects.requireNonNull;
+
import java.io.IOException;
import java.io.Writer;
import java.util.List;
@@ -49,9 +51,11 @@ import org.apache.vysper.xmpp.protocol.SessionStateHolder;
import org.apache.vysper.xmpp.protocol.StanzaHandler;
import org.apache.vysper.xmpp.protocol.StanzaProcessor;
import org.apache.vysper.xmpp.protocol.worker.InboundStanzaProtocolWorker;
+import org.apache.vysper.xmpp.server.ComponentRegistry;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.SimpleComponentRegistry;
import org.apache.vysper.xmpp.server.resources.ManagedThreadPool;
import org.apache.vysper.xmpp.server.resources.ManagedThreadPoolUtil;
import org.apache.vysper.xmpp.stanza.IQStanza;
@@ -94,6 +98,8 @@ public class DeliveringInternalInboundStanzaRelay implements
StanzaRelay, Manage
private InboundStanzaProtocolWorker inboundStanzaProtocolWorker;
+ private final ComponentRegistry componentRegistry;
+
private static final Integer PRIO_THRESHOLD = 0;
protected ResourceRegistry resourceRegistry;
@@ -115,15 +121,18 @@ public class DeliveringInternalInboundStanzaRelay
implements StanzaRelay, Manage
protected long lastDumpTimestamp = 0;
public DeliveringInternalInboundStanzaRelay(Entity serverEntity,
ResourceRegistry resourceRegistry,
- StorageProviderRegistry storageProviderRegistry) {
- this(serverEntity, resourceRegistry,
storageProviderRegistry.retrieve(AccountManagement.class),
+ StorageProviderRegistry storageProviderRegistry, ComponentRegistry
componentRegistry) {
+ this(serverEntity, resourceRegistry, componentRegistry,
+ storageProviderRegistry.retrieve(AccountManagement.class),
storageProviderRegistry.retrieve(OfflineStorageProvider.class));
}
public DeliveringInternalInboundStanzaRelay(Entity serverEntity,
ResourceRegistry resourceRegistry,
- AccountManagement accountVerification, OfflineStanzaReceiver
offlineStanzaReceiver) {
+ ComponentRegistry componentRegistry, AccountManagement
accountVerification,
+ OfflineStanzaReceiver offlineStanzaReceiver) {
this.serverEntity = serverEntity;
this.resourceRegistry = resourceRegistry;
+ this.componentRegistry = requireNonNull(componentRegistry);
this.accountVerification = accountVerification;
this.offlineStanzaReceiver = offlineStanzaReceiver;
int coreThreadCount = 10;
@@ -134,6 +143,7 @@ public class DeliveringInternalInboundStanzaRelay
implements StanzaRelay, Manage
}
/* package */ DeliveringInternalInboundStanzaRelay(ExecutorService
executor) {
+ this.componentRegistry = null;
this.executor = executor;
}
@@ -269,7 +279,7 @@ public class DeliveringInternalInboundStanzaRelay
implements StanzaRelay, Manage
new ServiceNotAvailableException("unsupported
domain " + receiverDomain));
}
- StanzaProcessor processor =
serverRuntimeContext.getComponentStanzaProcessor(receiver);
+ StanzaProcessor processor =
componentRegistry.getComponentStanzaProcessor(receiver);
if (processor == null) {
return new RelayResult(new
ServiceNotAvailableException(
"cannot retrieve component stanza processor
for" + receiverDomain));
diff --git
a/server/core/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandler.java
b/server/core/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandler.java
index 0834b8d..a498704 100644
---
a/server/core/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandler.java
+++
b/server/core/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandler.java
@@ -98,7 +98,7 @@ public class DiscoInfoIQHandler extends DefaultIQHandler {
Entity serverEntity = serverRuntimeContext.getServerEntity();
if (to == null || to.equals(serverEntity)) {
isServerInfoRequest = true; // this can only be meant to query the
server
- } else if (serverRuntimeContext.getComponentStanzaProcessor(to) !=
null) {
+ } else if (serverRuntimeContext.hasComponentStanzaProcessor(to)) {
isComponentInfoRequest = true; // this is a query to a component
} else if (!to.isNodeSet()) {
isServerInfoRequest = serverEntity.equals(to);
diff --git
a/server/core/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoItemIQHandler.java
b/server/core/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoItemIQHandler.java
index 4f87614..0ba4b32 100644
---
a/server/core/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoItemIQHandler.java
+++
b/server/core/src/main/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoItemIQHandler.java
@@ -91,7 +91,7 @@ public class DiscoItemIQHandler extends DefaultIQHandler {
isServerInfoRequest = true; // this can only be meant to query the
server
} else if (!to.isNodeSet()) {
isServerInfoRequest =
serverRuntimeContext.getServerEntity().equals(to);
- isComponentInfoRequest =
serverRuntimeContext.getComponentStanzaProcessor(to) != null;
+ isComponentInfoRequest =
serverRuntimeContext.hasComponentStanzaProcessor(to);
if (!isServerInfoRequest && !isComponentInfoRequest) {
return
Collections.singletonList(ServerErrorResponses.getStanzaError(StanzaErrorCondition.ITEM_NOT_FOUND,
stanza,
StanzaErrorType.CANCEL,
diff --git
a/server/core/src/main/java/org/apache/vysper/xmpp/server/AlterableComponentRegistry.java
b/server/core/src/main/java/org/apache/vysper/xmpp/server/AlterableComponentRegistry.java
new file mode 100644
index 0000000..f4ff214
--- /dev/null
+++
b/server/core/src/main/java/org/apache/vysper/xmpp/server/AlterableComponentRegistry.java
@@ -0,0 +1,31 @@
+/*
+ * 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.vysper.xmpp.server;
+
+import org.apache.vysper.xmpp.server.components.Component;
+
+/**
+ * @author Réda Housni Alaoui
+ */
+public interface AlterableComponentRegistry extends ComponentRegistry {
+
+ void registerComponent(Component component);
+
+}
diff --git
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentRegistry.java
b/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentRegistry.java
new file mode 100644
index 0000000..cd97b55
--- /dev/null
+++
b/server/core/src/main/java/org/apache/vysper/xmpp/server/ComponentRegistry.java
@@ -0,0 +1,32 @@
+/*
+ * 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.vysper.xmpp.server;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
+
+/**
+ * @author Réda Housni Alaoui
+ */
+public interface ComponentRegistry {
+
+ StanzaProcessor getComponentStanzaProcessor(Entity entity);
+
+}
diff --git
a/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
b/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
index 93ff22d..83b1edb 100644
---
a/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
+++
b/server/core/src/main/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContext.java
@@ -20,6 +20,8 @@
package org.apache.vysper.xmpp.server;
+import static java.util.Objects.requireNonNull;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@@ -34,7 +36,6 @@ import org.apache.vysper.storage.OpenStorageProviderRegistry;
import org.apache.vysper.storage.StorageProvider;
import org.apache.vysper.storage.StorageProviderRegistry;
import org.apache.vysper.xmpp.addressing.Entity;
-import org.apache.vysper.xmpp.addressing.EntityUtils;
import org.apache.vysper.xmpp.authentication.UserAuthentication;
import org.apache.vysper.xmpp.cryptography.TLSContextFactory;
import org.apache.vysper.xmpp.delivery.StanzaRelay;
@@ -83,7 +84,7 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
/**
* feature configuration
*/
- private ServerFeatures serverFeatures = new ServerFeatures();
+ private final ServerFeatures serverFeatures;
/**
* the Secure Socket Engine in use
@@ -93,17 +94,19 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
/**
* generates unique session ids
*/
- private UUIDGenerator sessionIdGenerator = new JVMBuiltinUUIDGenerator();
+ private final UUIDGenerator sessionIdGenerator = new
JVMBuiltinUUIDGenerator();
// basic services the server is using...
/**
- * 'input stream': receives stanzas issued by client sessions to be
handled by the server
+ * 'input stream': receives stanzas issued by client sessions to be
handled by
+ * the server
*/
private final StanzaProcessor stanzaProcessor;
/**
- * 'output stream': receives stanzas issued by a session, which are going
to other sessions/servers
+ * 'output stream': receives stanzas issued by a session, which are going
to
+ * other sessions/servers
*/
private final StanzaRelay stanzaRelay;
@@ -118,34 +121,42 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
private LatestPresenceCache presenceCache = new SimplePresenceCache();
private final XMPPServerConnectorRegistry serverConnectorRegistry;
-
+
/**
* holds the storage services
*/
private StorageProviderRegistry storageProviderRegistry = new
OpenStorageProviderRegistry();
/**
- * collection of all other services, which are mostly add-ons to the
minimal setup
+ * collection of all other services, which are mostly add-ons to the
minimal
+ * setup
*/
private final Map<String, ServerRuntimeContextService>
serverRuntimeContextServiceMap = new HashMap<String,
ServerRuntimeContextService>();
private List<Module> modules = new ArrayList<Module>();
-
+
/**
- * map of all registered components, index by the subdomain they are
registered for
+ * map of all registered components, index by the subdomain they are
registered
+ * for
*/
- protected final Map<String, Component> componentMap = new HashMap<String,
Component>();
-
+ private final AlterableComponentRegistry componentRegistry;
+
private final SimpleEventBus eventBus;
- public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay
stanzaRelay) {
+ public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay
stanzaRelay,
+ AlterableComponentRegistry componentRegistry, ResourceRegistry
resourceRegistry,
+ ServerFeatures serverFeatures, List<HandlerDictionary>
dictionaries) {
this.serverEntity = serverEntity;
this.stanzaRelay = stanzaRelay;
this.stanzaProcessor = new ProtocolWorker(stanzaRelay);
- this.resourceRegistry = new DefaultResourceRegistry();
+ this.componentRegistry = requireNonNull(componentRegistry);
this.serverConnectorRegistry = new
DefaultXMPPServerConnectorRegistry(this, stanzaRelay);
this.stanzaHandlerLookup = new StanzaHandlerLookup(this);
this.eventBus = new SimpleEventBus();
+ this.serverFeatures = serverFeatures;
+ this.resourceRegistry = resourceRegistry;
+
+ addDictionaries(dictionaries);
}
public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay
stanzaRelay,
@@ -154,18 +165,15 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
this.storageProviderRegistry = storageProviderRegistry;
}
- public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay
stanzaRelay, ServerFeatures serverFeatures,
- List<HandlerDictionary> dictionaries, ResourceRegistry
resourceRegistry) {
- this(serverEntity, stanzaRelay);
- this.serverFeatures = serverFeatures;
- this.resourceRegistry = resourceRegistry;
-
- addDictionaries(dictionaries);
+ public DefaultServerRuntimeContext(Entity serverEntity, StanzaRelay
stanzaRelay) {
+ this(serverEntity, stanzaRelay, new
SimpleComponentRegistry(serverEntity), new DefaultResourceRegistry(),
+ new ServerFeatures(), Collections.emptyList());
}
/**
- * change the presence cache implementation. this is a setter intended to
be used at
- * initialisation time. (thus, this method is not part of
ServerRuntimeContext.
+ * change the presence cache implementation. this is a setter intended to
be
+ * used at initialisation time. (thus, this method is not part of
+ * ServerRuntimeContext.
*
* @param presenceCache
*/
@@ -173,22 +181,27 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
this.presenceCache = presenceCache;
}
+ @Override
public StanzaHandler getHandler(Stanza stanza) {
return stanzaHandlerLookup.getHandler(stanza);
}
+ @Override
public String getNextSessionId() {
return sessionIdGenerator.create();
}
+ @Override
public Entity getServerEntity() {
return serverEntity;
}
+ @Override
public String getDefaultXMLLang() {
return "en_US"; // TODO must be configurable as of RFC3920
}
+ @Override
public StanzaProcessor getStanzaProcessor() {
return stanzaProcessor;
}
@@ -197,10 +210,12 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
return stanzaRelay;
}
+ @Override
public ServerFeatures getServerFeatures() {
return serverFeatures;
}
+ @Override
public XMPPServerConnectorRegistry getServerConnectorRegistry() {
return serverConnectorRegistry;
}
@@ -223,29 +238,36 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
}
}
+ @Override
public SSLContext getSslContext() {
return sslContext;
}
/**
- * @deprecated use {@link #getStorageProvider(Class)} with {@link
UserAuthentication}.class instead
+ * @deprecated use {@link #getStorageProvider(Class)} with
+ * {@link UserAuthentication}.class instead
*/
+ @Override
public UserAuthentication getUserAuthentication() {
- return (UserAuthentication)
storageProviderRegistry.retrieve(UserAuthentication.class);
+ return storageProviderRegistry.retrieve(UserAuthentication.class);
}
+ @Override
public ResourceRegistry getResourceRegistry() {
return resourceRegistry;
}
+ @Override
public LatestPresenceCache getPresenceCache() {
return presenceCache;
}
/**
* add a runtime service. makes the service dynamically discoverable at
runtime.
+ *
* @param service
*/
+ @Override
public void
registerServerRuntimeContextService(ServerRuntimeContextService service) {
if (service == null)
throw new IllegalStateException("service must not be null");
@@ -256,10 +278,11 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
}
/**
- * retrieves a previously registered runtime context service. The
RosterManager is a good example of such a service.
- * This allows for modules, extensions and other services to discover
their dependencies at runtime.
- *
- * @see
org.apache.vysper.xmpp.server.DefaultServerRuntimeContext#getStorageProvider(Class)
+ * retrieves a previously registered runtime context service. The
RosterManager
+ * is a good example of such a service. This allows for modules,
extensions and
+ * other services to discover their dependencies at runtime.
+ *
+ * @see
org.apache.vysper.xmpp.server.DefaultServerRuntimeContext#getStorageProvider(Class)
* @param name
* @return
*/
@@ -270,6 +293,7 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
/**
* adds a whole set of storage providers at once to the system.
+ *
* @param storageProviderRegistry
*/
public void setStorageProviderRegistry(StorageProviderRegistry
storageProviderRegistry) {
@@ -279,26 +303,31 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
}
/**
- * retrieves a particular storage provider.
+ * retrieves a particular storage provider.
+ *
* @param clazz
* @return
*/
+ @Override
public <T extends StorageProvider> T getStorageProvider(Class<T> clazz) {
return storageProviderRegistry.retrieve(clazz);
}
/**
- * adds and initializes a list of Modules. A module extends the server's
functionality by adding an
- * XMPP extension ('XEP') to it. (More) Modules can be added at runtime.
- * This approach has an advantage over adding modules one by one, in that
it allows for a better
- * dependency management: all modules from the list to first discover each
other before initialize()
- * get's called for every one of them.
- *
+ * adds and initializes a list of Modules. A module extends the server's
+ * functionality by adding an XMPP extension ('XEP') to it. (More) Modules
can
+ * be added at runtime. This approach has an advantage over adding modules
one
+ * by one, in that it allows for a better dependency management: all
modules
+ * from the list to first discover each other before initialize() get's
called
+ * for every one of them.
+ *
* @see
org.apache.vysper.xmpp.server.DefaultServerRuntimeContext#registerServerRuntimeContextService(org.apache.vysper.xmpp.modules.ServerRuntimeContextService)
- * @see
org.apache.vysper.xmpp.server.DefaultServerRuntimeContext#getServerRuntimeContextService(String)
+ * @see
org.apache.vysper.xmpp.server.DefaultServerRuntimeContext#getServerRuntimeContextService(String)
* @see org.apache.vysper.xmpp.modules.Module
- * @param modules List of modules
+ * @param modules
+ * List of modules
*/
+ @Override
public void addModules(List<Module> modules) {
for (Module module : modules) {
addModuleInternal(module);
@@ -309,12 +338,15 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
}
/**
- * adds and initializes a single Module. a module extends the server's
functionality by adding an
- * XMPP extension ('XEP') to it.
+ * adds and initializes a single Module. a module extends the server's
+ * functionality by adding an XMPP extension ('XEP') to it.
+ *
* @see org.apache.vysper.xmpp.modules.Module
- * @see DefaultServerRuntimeContext#addModules(java.util.List) for adding
a number of modules at once
+ * @see DefaultServerRuntimeContext#addModules(java.util.List) for adding a
+ * number of modules at once
* @param module
*/
+ @Override
public void addModule(Module module) {
addModuleInternal(module);
module.initialize(this);
@@ -329,7 +361,7 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
for (ServerRuntimeContextService serverRuntimeContextService :
serviceList) {
registerServerRuntimeContextService(serverRuntimeContextService);
- // if a storage service, also register there
+ // if a storage service, also register there
if (serverRuntimeContextService instanceof StorageProvider) {
StorageProvider storageProvider = (StorageProvider)
serverRuntimeContextService;
storageProviderRegistry.add(storageProvider);
@@ -351,17 +383,20 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
if (module instanceof Component) {
registerComponent((Component) module);
}
-
+
modules.add(module);
}
-
+
+ @Override
public List<Module> getModules() {
return Collections.unmodifiableList(modules);
}
+ @Override
public <T> T getModule(Class<T> clazz) {
- for(Module module : modules) {
- if(module.getClass().equals(clazz)) return (T) module;
+ for (Module module : modules) {
+ if (module.getClass().equals(clazz))
+ return (T) module;
}
return null;
}
@@ -371,21 +406,14 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
return eventBus;
}
+ @Override
public void registerComponent(Component component) {
- componentMap.put(component.getSubdomain(), component);
+ componentRegistry.registerComponent(component);
}
- public StanzaProcessor getComponentStanzaProcessor(Entity entity) {
- String serverDomain = getServerEntity().getDomain();
- if (!EntityUtils.isAddressingServerComponent(entity,
getServerEntity())) {
- return null;
- }
- String domain = entity.getDomain();
- String subdomain = domain.replace("." + serverDomain, "");
- Component component = componentMap.get(subdomain);
- if (component == null)
- return null;
- return component.getStanzaProcessor();
+ @Override
+ public boolean hasComponentStanzaProcessor(Entity entity) {
+ return componentRegistry.getComponentStanzaProcessor(entity) != null;
}
@Override
@@ -393,5 +421,4 @@ public class DefaultServerRuntimeContext implements
ServerRuntimeContext, Module
return new ComponentStanzaProcessor(stanzaRelay);
}
-
}
diff --git
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
b/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
index a7897f4..9a1563b 100644
---
a/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
+++
b/server/core/src/main/java/org/apache/vysper/xmpp/server/ServerRuntimeContext.java
@@ -74,7 +74,7 @@ public interface ServerRuntimeContext {
void registerComponent(Component component);
- StanzaProcessor getComponentStanzaProcessor(Entity entity);
+ boolean hasComponentStanzaProcessor(Entity entity);
ComponentStanzaProcessor createComponentStanzaProcessor();
diff --git
a/server/core/src/main/java/org/apache/vysper/xmpp/server/SimpleComponentRegistry.java
b/server/core/src/main/java/org/apache/vysper/xmpp/server/SimpleComponentRegistry.java
new file mode 100644
index 0000000..d2df521
--- /dev/null
+++
b/server/core/src/main/java/org/apache/vysper/xmpp/server/SimpleComponentRegistry.java
@@ -0,0 +1,66 @@
+/*
+ * 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.vysper.xmpp.server;
+
+import org.apache.vysper.xmpp.addressing.Entity;
+import org.apache.vysper.xmpp.addressing.EntityUtils;
+import org.apache.vysper.xmpp.protocol.StanzaProcessor;
+import org.apache.vysper.xmpp.server.components.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * @author Réda Housni Alaoui
+ */
+public class SimpleComponentRegistry implements AlterableComponentRegistry {
+
+ private final Entity serverEntity;
+
+ /**
+ * map of all registered components, index by the subdomain they are
registered for
+ */
+ private final Map<String, Component> componentMap = new HashMap<>();
+
+ public SimpleComponentRegistry(Entity serverEntity) {
+ this.serverEntity = requireNonNull(serverEntity);
+ }
+
+ @Override
+ public void registerComponent(Component component){
+ componentMap.put(component.getSubdomain(), component);
+ }
+
+ @Override
+ public StanzaProcessor getComponentStanzaProcessor(Entity entity) {
+ String serverDomain = serverEntity.getDomain();
+ if (!EntityUtils.isAddressingServerComponent(entity,
serverEntity)) {
+ return null;
+ }
+ String domain = entity.getDomain();
+ String subdomain = domain.replace("." + serverDomain, "");
+ Component component = componentMap.get(subdomain);
+ if (component == null)
+ return null;
+ return component.getStanzaProcessor();
+ }
+}
diff --git
a/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
b/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
index 664624d..5268bc9 100644
--- a/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
+++ b/server/core/src/main/java/org/apache/vysper/xmpp/server/XMPPServer.java
@@ -51,8 +51,7 @@ import
org.apache.vysper.xmpp.state.resourcebinding.DefaultResourceRegistry;
import org.apache.vysper.xmpp.state.resourcebinding.ResourceRegistry;
/**
- * this class is able to boot a standalone XMPP server.
- * <code>
+ * this class is able to boot a standalone XMPP server. <code>
* XMPPServer server = new XMPPServer("vysper.org");
*
* server.addEndpoint(...); // add endpoints, at least one
@@ -69,10 +68,10 @@ public class XMPPServer {
private String serverDomain;
- private ServerRuntimeContext serverRuntimeContext;
+ private DefaultServerRuntimeContext serverRuntimeContext;
private StorageProviderRegistry storageProviderRegistry;
-
+
private StanzaRelayBroker stanzaRelayBroker;
private InputStream tlsCertificate;
@@ -84,9 +83,9 @@ public class XMPPServer {
private final List<Endpoint> endpoints = new ArrayList<Endpoint>();
private final List<Module> initialModules = new ArrayList<Module>();
-
+
private int maxInternalRelayThreads = -1;
-
+
private int maxExternalRelayThreads = -1;
public XMPPServer(String domain) {
@@ -94,7 +93,8 @@ public class XMPPServer {
throw new IllegalArgumentException("server domain cannot be blank,
empty or NULL");
}
if (!domain.equals(domain.toLowerCase())) {
- throw new IllegalArgumentException("server domain must be given in
all lower-case letters, but was: " + domain);
+ throw new IllegalArgumentException(
+ "server domain must be given in all lower-case letters,
but was: " + domain);
}
try {
EntityImpl.parse(domain);
@@ -105,7 +105,7 @@ public class XMPPServer {
// default list of SASL mechanisms
saslMechanisms.add(new Plain());
-
+
// add default modules
initialModules.add(new ServiceDiscoveryModule());
initialModules.add(new RosterModule());
@@ -126,13 +126,13 @@ public class XMPPServer {
}
public void setTLSCertificateInfo(InputStream certificate, String
password) {
- setTLSCertificateInfo(certificate, password, null);
+ setTLSCertificateInfo(certificate, password, null);
}
public void setTLSCertificateInfo(InputStream certificate, String
password, String keyStoreType) {
- tlsCertificate = certificate;
- tlsCertificatePassword = password;
- tlsKeyStoreType = keyStoreType;
+ tlsCertificate = certificate;
+ tlsCertificatePassword = password;
+ tlsKeyStoreType = keyStoreType;
}
public void setMaxInternalRelayThreads(int maxInternalRelayThreads) {
@@ -154,7 +154,7 @@ public class XMPPServer {
TrustManagerFactory trustManagerFactory = null; // default, check
certificates strictly
if (!serverFeatures.isCheckingFederationServerCertificates()) {
- // switch to accepting *any* certificate
+ // switch to accepting *any* certificate
trustManagerFactory = new NonCheckingX509TrustManagerFactory();
}
@@ -164,8 +164,8 @@ public class XMPPServer {
InputStreamBasedTLSContextFactory tlsContextFactory = new
InputStreamBasedTLSContextFactory(tlsCertificate);
tlsContextFactory.setPassword(tlsCertificatePassword);
tlsContextFactory.setTrustManagerFactory(trustManagerFactory);
- if(tlsKeyStoreType != null) {
- tlsContextFactory.setKeyStoreType(tlsKeyStoreType);
+ if (tlsKeyStoreType != null) {
+ tlsContextFactory.setKeyStoreType(tlsKeyStoreType);
}
List<HandlerDictionary> dictionaries = new
ArrayList<HandlerDictionary>();
@@ -175,22 +175,29 @@ public class XMPPServer {
EntityImpl serverEntity = new EntityImpl(null, serverDomain, null);
- AccountManagement accountManagement = storageProviderRegistry
- .retrieve(AccountManagement.class);
+ AccountManagement accountManagement =
storageProviderRegistry.retrieve(AccountManagement.class);
OfflineStanzaReceiver offlineReceiver =
storageProviderRegistry.retrieve(OfflineStorageProvider.class);
- DeliveringInternalInboundStanzaRelay internalStanzaRelay = new
DeliveringInternalInboundStanzaRelay(serverEntity,
- resourceRegistry, accountManagement,offlineReceiver);
+
+ AlterableComponentRegistry componentRegistry = new
SimpleComponentRegistry(serverEntity);
+
+ DeliveringInternalInboundStanzaRelay internalStanzaRelay = new
DeliveringInternalInboundStanzaRelay(
+ serverEntity, resourceRegistry, componentRegistry,
accountManagement, offlineReceiver);
DeliveringExternalInboundStanzaRelay externalStanzaRelay = new
DeliveringExternalInboundStanzaRelay();
-
- if (maxInternalRelayThreads >= 0)
internalStanzaRelay.setMaxThreadCount(maxInternalRelayThreads);
- if (maxExternalRelayThreads >= 0)
externalStanzaRelay.setMaxThreadCount(maxExternalRelayThreads);
+
+ if (maxInternalRelayThreads >= 0)
+ internalStanzaRelay.setMaxThreadCount(maxInternalRelayThreads);
+ if (maxExternalRelayThreads >= 0)
+ externalStanzaRelay.setMaxThreadCount(maxExternalRelayThreads);
stanzaRelayBroker = new StanzaRelayBroker();
stanzaRelayBroker.setInternalRelay(internalStanzaRelay);
stanzaRelayBroker.setExternalRelay(externalStanzaRelay);
- serverRuntimeContext = createServerRuntimeContext(serverFeatures,
tlsContextFactory, dictionaries,
- resourceRegistry, serverEntity);
+ serverRuntimeContext = new DefaultServerRuntimeContext(serverEntity,
stanzaRelayBroker, componentRegistry,
+ resourceRegistry, serverFeatures, dictionaries);
+
serverRuntimeContext.setStorageProviderRegistry(storageProviderRegistry);
+ serverRuntimeContext.setTlsContextFactory(tlsContextFactory);
+
for (Module module : initialModules) {
serverRuntimeContext.addModule(module);
}
@@ -200,28 +207,18 @@ public class XMPPServer {
internalStanzaRelay.setStanzaRelay(stanzaRelayBroker);
externalStanzaRelay.setServerRuntimeContext(serverRuntimeContext);
- final LogStorageProvider logStorageProvider =
- (LogStorageProvider)
this.storageProviderRegistry.retrieve(LogStorageProvider.class);
- if (logStorageProvider != null)
internalStanzaRelay.setLogStorageProvider(logStorageProvider);
+ final LogStorageProvider logStorageProvider =
this.storageProviderRegistry.retrieve(LogStorageProvider.class);
+ if (logStorageProvider != null)
+ internalStanzaRelay.setLogStorageProvider(logStorageProvider);
- if (endpoints.size() == 0) throw new IllegalStateException("server
must have at least one endpoint");
+ if (endpoints.size() == 0)
+ throw new IllegalStateException("server must have at least one
endpoint");
for (Endpoint endpoint : endpoints) {
endpoint.setServerRuntimeContext(serverRuntimeContext);
endpoint.start();
}
}
- protected ServerRuntimeContext createServerRuntimeContext(ServerFeatures
serverFeatures,
- InputStreamBasedTLSContextFactory tlsContextFactory,
List<HandlerDictionary> dictionaries,
- ResourceRegistry resourceRegistry, EntityImpl serverEntity) {
- DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(serverEntity,
- stanzaRelayBroker, serverFeatures, dictionaries,
resourceRegistry);
-
serverRuntimeContext.setStorageProviderRegistry(storageProviderRegistry);
- serverRuntimeContext.setTlsContextFactory(tlsContextFactory);
-
- return serverRuntimeContext;
- }
-
protected ServerFeatures createServerFeatures() {
return new ServerFeatures();
}
@@ -230,21 +227,21 @@ public class XMPPServer {
for (Endpoint endpoint : endpoints) {
endpoint.stop();
}
-
- for(Module module : serverRuntimeContext.getModules()) {
+
+ for (Module module : serverRuntimeContext.getModules()) {
try {
module.close();
- } catch(RuntimeException e) {
+ } catch (RuntimeException e) {
// ignore
}
}
-
+
stanzaRelayBroker.stop();
serverRuntimeContext.getServerConnectorRegistry().close();
}
public void addModule(Module module) {
- if(serverRuntimeContext != null) {
+ if (serverRuntimeContext != null) {
serverRuntimeContext.addModule(module);
} else {
initialModules.add(module);
@@ -259,7 +256,7 @@ public class XMPPServer {
dictionaries.add(new
org.apache.vysper.xmpp.modules.core.session.SessionStanzaDictionary());
dictionaries.add(new
org.apache.vysper.xmpp.modules.core.compatibility.jabber_iq_auth.JabberIQAuthDictionary());
}
-
+
public ServerRuntimeContext getServerRuntimeContext() {
return serverRuntimeContext;
}
diff --git
a/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
b/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
index 30e505a..e0af08c 100644
---
a/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
+++
b/server/core/src/test/java/org/apache/vysper/stanzasession/StanzaSessionTestCase.java
@@ -24,11 +24,13 @@ import java.util.List;
import junit.framework.TestCase;
+import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.addressing.EntityImpl;
import org.apache.vysper.xmpp.delivery.StanzaRelayBroker;
import org.apache.vysper.xmpp.protocol.HandlerDictionary;
import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
import org.apache.vysper.xmpp.server.ServerFeatures;
+import org.apache.vysper.xmpp.server.SimpleComponentRegistry;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
import org.apache.vysper.xmpp.state.resourcebinding.DefaultResourceRegistry;
@@ -53,8 +55,9 @@ public class StanzaSessionTestCase extends TestCase {
dictionaries.add(new
org.apache.vysper.xmpp.modules.core.compatibility.jabber_iq_auth.JabberIQAuthDictionary());
dictionaries.add(new
org.apache.vysper.xmpp.modules.roster.RosterDictionary());
- DefaultServerRuntimeContext serverContext = new
DefaultServerRuntimeContext(new EntityImpl(null, "test", null),
- relay, new ServerFeatures(), dictionaries, new
DefaultResourceRegistry());
+ Entity serverEntity = new EntityImpl(null, "test", null);
+ DefaultServerRuntimeContext serverContext = new
DefaultServerRuntimeContext(serverEntity,
+ relay, new SimpleComponentRegistry(serverEntity), new
DefaultResourceRegistry(), new ServerFeatures(), dictionaries);
relay.setServerRuntimeContext(serverContext);
diff --git
a/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInteralInboundStanzaRelayTestCase.java
b/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInteralInboundStanzaRelayTestCase.java
index 6b9e4b1..05c42eb 100644
---
a/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInteralInboundStanzaRelayTestCase.java
+++
b/server/core/src/test/java/org/apache/vysper/xmpp/delivery/inbound/DeliveringInteralInboundStanzaRelayTestCase.java
@@ -19,6 +19,8 @@
*/
package org.apache.vysper.xmpp.delivery.inbound;
+import static org.mockito.Mockito.mock;
+
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -34,6 +36,7 @@ import
org.apache.vysper.xmpp.delivery.failure.IgnoreFailureStrategy;
import org.apache.vysper.xmpp.delivery.failure.ServiceNotAvailableException;
import org.apache.vysper.xmpp.server.DefaultServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionState;
+import org.apache.vysper.xmpp.server.SimpleComponentRegistry;
import org.apache.vysper.xmpp.server.TestSessionContext;
import org.apache.vysper.xmpp.stanza.Stanza;
import org.apache.vysper.xmpp.stanza.StanzaBuilder;
@@ -44,8 +47,6 @@ import
org.apache.vysper.xmpp.state.resourcebinding.ResourceRegistry;
import junit.framework.Assert;
import junit.framework.TestCase;
-import static org.mockito.Mockito.mock;
-
/**
*/
public class DeliveringInteralInboundStanzaRelayTestCase extends TestCase {
@@ -73,18 +74,22 @@ public class DeliveringInteralInboundStanzaRelayTestCase
extends TestCase {
; // empty
}
}
+
+ private Entity serverEntity;
@Override
protected void setUp() throws Exception {
super.setUp();
accountVerification = new AccountVerificationMock();
- stanzaRelay = new
DeliveringInternalInboundStanzaRelay(EntityImpl.parse("vysper.org"),
resourceRegistry,
- accountVerification, null);
+ serverEntity = EntityImpl.parse("vysper.org");
+ stanzaRelay = new DeliveringInternalInboundStanzaRelay(serverEntity,
resourceRegistry,
+ new SimpleComponentRegistry(serverEntity),
accountVerification, null);
}
public void testSimpleRelay() throws EntityFormatException,
XMLSemanticError, DeliveryException {
- DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(null, mock(StanzaRelay.class));
+ DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(serverEntity,
+ mock(StanzaRelay.class));
stanzaRelay.setServerRuntimeContext(serverRuntimeContext);
stanzaRelay.setStanzaRelay(stanzaRelay);
@@ -123,7 +128,8 @@ public class DeliveringInteralInboundStanzaRelayTestCase
extends TestCase {
public void testRelayToTwoRecepients_DeliverToALL()
throws EntityFormatException, XMLSemanticError, DeliveryException,
BindException {
- DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(null, mock(StanzaRelay.class));
+ DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(serverEntity,
+ mock(StanzaRelay.class));
// !! DeliverMessageToHighestPriorityResourcesOnly = FALSE
serverRuntimeContext.getServerFeatures().setDeliverMessageToHighestPriorityResourcesOnly(false);
@@ -157,7 +163,8 @@ public class DeliveringInteralInboundStanzaRelayTestCase
extends TestCase {
public void testRelayToTwoRecepients_DeliverToHIGHEST()
throws EntityFormatException, XMLSemanticError, DeliveryException,
BindException {
- DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(null, mock(StanzaRelay.class));
+ DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(serverEntity,
+ mock(StanzaRelay.class));
// !! DeliverMessageToHighestPriorityResourcesOnly = TRUE
serverRuntimeContext.getServerFeatures().setDeliverMessageToHighestPriorityResourcesOnly(true);
@@ -216,7 +223,8 @@ public class DeliveringInteralInboundStanzaRelayTestCase
extends TestCase {
public void testSequentialDeliveryOneThread() throws DeliveryException,
XMLSemanticError, EntityFormatException {
- DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(null, mock(StanzaRelay.class));
+ DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(serverEntity,
+ mock(StanzaRelay.class));
stanzaRelay.setServerRuntimeContext(serverRuntimeContext);
stanzaRelay.setStanzaRelay(stanzaRelay);
@@ -239,7 +247,8 @@ public class DeliveringInteralInboundStanzaRelayTestCase
extends TestCase {
public void testSequentialDeliveryManyThreads() throws DeliveryException,
XMLSemanticError, EntityFormatException {
- DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(null, mock(StanzaRelay.class));
+ DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(serverEntity,
+ mock(StanzaRelay.class));
stanzaRelay.setServerRuntimeContext(serverRuntimeContext);
stanzaRelay.setStanzaRelay(stanzaRelay);
diff --git
a/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandlerTestCase.java
b/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandlerTestCase.java
index 7e7beea..8a005e5 100644
---
a/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandlerTestCase.java
+++
b/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/DiscoInfoIQHandlerTestCase.java
@@ -22,8 +22,6 @@ package
org.apache.vysper.xmpp.modules.servicediscovery.handler;
import java.util.Arrays;
import java.util.List;
-import junit.framework.Assert;
-
import org.apache.vysper.StanzaAssert;
import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.addressing.EntityImpl;
@@ -40,7 +38,6 @@ import
org.apache.vysper.xmpp.protocol.ResponseStanzaContainerImpl;
import org.apache.vysper.xmpp.protocol.StanzaBroker;
import org.apache.vysper.xmpp.server.ServerRuntimeContext;
import org.apache.vysper.xmpp.server.SessionContext;
-import org.apache.vysper.xmpp.server.components.ComponentStanzaProcessor;
import org.apache.vysper.xmpp.stanza.IQStanza;
import org.apache.vysper.xmpp.stanza.IQStanzaType;
import org.apache.vysper.xmpp.stanza.Stanza;
@@ -52,31 +49,42 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
+import junit.framework.Assert;
+
/**
*/
public class DiscoInfoIQHandlerTestCase extends Mockito {
private static final Entity FROM =
EntityImpl.parseUnchecked("[email protected]");
+
private static final Entity SERVER =
EntityImpl.parseUnchecked("vysper.org");
+
private static final Entity COMPONENT =
EntityImpl.parseUnchecked("comp.vysper.org");
+
private static final Entity USER =
EntityImpl.parseUnchecked("[email protected]");
+
private static final Entity USER_WITH_RESOURCE =
EntityImpl.parseUnchecked("[email protected]/res1");
-
+
private ServerRuntimeContext serverRuntimeContext =
mock(ServerRuntimeContext.class);
+
private SessionContext sessionContext = mock(SessionContext.class);
+
private ServiceCollector serviceCollector = mock(ServiceCollector.class);
+
private StanzaBroker stanzaBroker = mock(StanzaBroker.class);
+
private StanzaWriter stanzaWriter = mock(StanzaWriter.class);
private IQStanza stanza = (IQStanza) IQStanza.getWrapper(buildStanza());
-
+
private DiscoInfoIQHandler handler = new DiscoInfoIQHandler();
-
- private ComponentStanzaProcessor componentStanzaProcessor =
mock(ComponentStanzaProcessor.class);
+
private Feature feature = new Feature("foo");
+
private Identity identity = new Identity("bar", "fez");
+
private List<InfoElement> infoElements = Arrays.asList(feature, identity);
-
+
private Stanza buildStanza() {
return buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "query",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO);
}
@@ -84,15 +92,12 @@ public class DiscoInfoIQHandlerTestCase extends Mockito {
private Stanza buildStanza(String name, String namespaceUri) {
return buildStanza(name, namespaceUri, "query",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO);
}
-
+
private Stanza buildStanza(String name, String namespaceUri, String
innerName, String innerNamespaceUri) {
- return new StanzaBuilder(name, namespaceUri)
- .addAttribute("type", "get")
- .addAttribute("id", "1")
- .startInnerElement(innerName, innerNamespaceUri)
- .build();
+ return new StanzaBuilder(name, namespaceUri).addAttribute("type",
"get").addAttribute("id", "1")
+ .startInnerElement(innerName, innerNamespaceUri).build();
}
-
+
@Test
public void nameMustBeIq() {
Assert.assertEquals("iq", handler.getName());
@@ -127,10 +132,11 @@ public class DiscoInfoIQHandlerTestCase extends Mockito {
public void verifyInvalidInnerNamespace() {
Assert.assertFalse(handler.verify(buildStanza("iq",
NamespaceURIs.JABBER_CLIENT, "query", "dummy")));
}
-
+
@Test
public void verifyInvalidInnerName() {
- Assert.assertFalse(handler.verify(buildStanza("iq",
NamespaceURIs.JABBER_CLIENT, "dummy",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO)));
+ Assert.assertFalse(handler.verify(
+ buildStanza("iq", NamespaceURIs.JABBER_CLIENT, "dummy",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO)));
}
@Test
@@ -138,7 +144,7 @@ public class DiscoInfoIQHandlerTestCase extends Mockito {
Stanza stanza = new StanzaBuilder("iq",
NamespaceURIs.JABBER_CLIENT).build();
Assert.assertFalse(handler.verify(stanza));
}
-
+
@Test
public void verifyValidStanza() {
Assert.assertTrue(handler.verify(stanza));
@@ -148,12 +154,13 @@ public class DiscoInfoIQHandlerTestCase extends Mockito {
public void sessionIsRequired() {
Assert.assertTrue(handler.isSessionRequired());
}
-
+
@Before
public void before() {
-
when(serverRuntimeContext.getServerRuntimeContextService(ServiceDiscoveryRequestListenerRegistry.SERVICE_DISCOVERY_REQUEST_LISTENER_REGISTRY))
- .thenReturn(serviceCollector);
-
+ when(serverRuntimeContext.getServerRuntimeContextService(
+
ServiceDiscoveryRequestListenerRegistry.SERVICE_DISCOVERY_REQUEST_LISTENER_REGISTRY))
+ .thenReturn(serviceCollector);
+
when(serverRuntimeContext.getServerEntity()).thenReturn(SERVER);
when(sessionContext.getResponseWriter()).thenReturn(stanzaWriter);
}
@@ -161,9 +168,9 @@ public class DiscoInfoIQHandlerTestCase extends Mockito {
@Test
public void handleGetToServer() throws Exception {
IQStanza stanza = createRequest(SERVER);
-
+
when(serviceCollector.processServerInfoRequest(any(InfoRequest.class))).thenReturn(infoElements);
-
+
List<Stanza> responses = handler.handleGet(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
StanzaAssert.assertEquals(createExpectedResponse(SERVER), response);
@@ -172,67 +179,69 @@ public class DiscoInfoIQHandlerTestCase extends Mockito {
@Test
public void handleGetToExistingComponent() throws Exception {
IQStanza stanza = createRequest(COMPONENT);
-
-
when(serverRuntimeContext.getComponentStanzaProcessor(COMPONENT)).thenReturn(componentStanzaProcessor);
-
-
when(serviceCollector.processComponentInfoRequest(any(InfoRequest.class),
eq(stanzaBroker))).thenReturn(infoElements);
+
+
when(serverRuntimeContext.hasComponentStanzaProcessor(COMPONENT)).thenReturn(true);
+
+
when(serviceCollector.processComponentInfoRequest(any(InfoRequest.class),
eq(stanzaBroker)))
+ .thenReturn(infoElements);
List<Stanza> responses = handler.handleGet(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
StanzaAssert.assertEquals(createExpectedResponse(COMPONENT), response);
}
@Test
public void handleGetToUser() throws Exception {
IQStanza stanza = createRequest(USER);
-
+
when(serviceCollector.processInfoRequest(any(InfoRequest.class))).thenReturn(infoElements);
List<Stanza> responses = handler.handleGet(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
StanzaAssert.assertEquals(createExpectedResponse(USER), response);
}
@Test
public void handleGetToUserWithResource() throws Exception {
when(sessionContext.getInitiatingEntity()).thenReturn(FROM);
-
+
IQStanza stanza = createRequest(USER_WITH_RESOURCE);
-
+
List<Stanza> responses = handler.handleGet(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
Assert.assertNull(response);
-
+
verify(stanzaBroker).write(eq(USER_WITH_RESOURCE), eq(stanza),
any(DeliveryFailureStrategy.class));
}
-
+
@Test
public void handleGetToUserWithResourceInbound() throws Exception {
when(sessionContext.getInitiatingEntity()).thenReturn(USER);
-
+
IQStanza stanza = createRequest(USER_WITH_RESOURCE);
-
+
List<Stanza> responses = handler.handleGet(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
Assert.assertNull(response);
-
+
verify(stanzaWriter).write(stanza);
}
-
+
@Test
public void handleGetToNonExistingComponent() throws Exception {
IQStanza stanza = createRequest(COMPONENT);
-
-
when(serverRuntimeContext.getComponentStanzaProcessor(COMPONENT)).thenReturn(null);
-
when(serviceCollector.processComponentInfoRequest(any(InfoRequest.class),
eq(stanzaBroker))).thenReturn(infoElements);
-
+
+
when(serverRuntimeContext.hasComponentStanzaProcessor(COMPONENT)).thenReturn(false);
+
when(serviceCollector.processComponentInfoRequest(any(InfoRequest.class),
eq(stanzaBroker)))
+ .thenReturn(infoElements);
+
List<Stanza> responses = handler.handleGet(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
Stanza expected = createErrorResponse(COMPONENT, "item-not-found");
StanzaAssert.assertEquals(expected, response);
@@ -241,125 +250,118 @@ public class DiscoInfoIQHandlerTestCase extends Mockito
{
@Test
public void handleGetNoServiceCollector() throws Exception {
IQStanza stanza = createRequest(SERVER);
-
-
when(serverRuntimeContext.getServerRuntimeContextService(ServiceDiscoveryRequestListenerRegistry.SERVICE_DISCOVERY_REQUEST_LISTENER_REGISTRY))
- .thenReturn(null);
-
+
+ when(serverRuntimeContext.getServerRuntimeContextService(
+
ServiceDiscoveryRequestListenerRegistry.SERVICE_DISCOVERY_REQUEST_LISTENER_REGISTRY)).thenReturn(null);
+
List<Stanza> responses = handler.handleGet(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
Stanza expected = createErrorResponse(SERVER, "internal-server-error");
-
+
StanzaAssert.assertEquals(expected, response);
}
-
+
@Test
public void handleGetToServerWithException() throws Exception {
IQStanza stanza = createRequest(SERVER);
-
-
when(serviceCollector.processServerInfoRequest(any(InfoRequest.class))).thenThrow(new
ServiceDiscoveryRequestException(StanzaErrorCondition.INTERNAL_SERVER_ERROR));
-
+
+ when(serviceCollector.processServerInfoRequest(any(InfoRequest.class)))
+ .thenThrow(new
ServiceDiscoveryRequestException(StanzaErrorCondition.INTERNAL_SERVER_ERROR));
+
List<Stanza> responses = handler.handleGet(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
Stanza expected = createErrorResponse(SERVER, "internal-server-error");
-
+
StanzaAssert.assertEquals(expected, response);
}
-
+
@Test
public void handleGetToComponentWithException() throws Exception {
IQStanza stanza = createRequest(COMPONENT);
-
-
when(serverRuntimeContext.getComponentStanzaProcessor(COMPONENT)).thenReturn(componentStanzaProcessor);
-
when(serviceCollector.processComponentInfoRequest(any(InfoRequest.class),
eq(stanzaBroker))).thenThrow(new
ServiceDiscoveryRequestException(StanzaErrorCondition.INTERNAL_SERVER_ERROR));
-
+
+
when(serverRuntimeContext.hasComponentStanzaProcessor(COMPONENT)).thenReturn(true);
+
when(serviceCollector.processComponentInfoRequest(any(InfoRequest.class),
eq(stanzaBroker)))
+ .thenThrow(new
ServiceDiscoveryRequestException(StanzaErrorCondition.INTERNAL_SERVER_ERROR));
+
List<Stanza> responses = handler.handleGet(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
Stanza expected = createErrorResponse(COMPONENT,
"internal-server-error");
-
+
StanzaAssert.assertEquals(expected, response);
}
-
+
@Test
public void handleGetToUserWithException() throws Exception {
IQStanza stanza = createRequest(USER);
-
-
when(serviceCollector.processInfoRequest(any(InfoRequest.class))).thenThrow(new
ServiceDiscoveryRequestException(StanzaErrorCondition.INTERNAL_SERVER_ERROR));
-
+
+ when(serviceCollector.processInfoRequest(any(InfoRequest.class)))
+ .thenThrow(new
ServiceDiscoveryRequestException(StanzaErrorCondition.INTERNAL_SERVER_ERROR));
+
List<Stanza> responses = handler.handleGet(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
Stanza expected = createErrorResponse(SERVER, "internal-server-error");
-
+
StanzaAssert.assertEquals(expected, response);
}
-
+
@Test
public void handleResultToUser() throws Exception {
when(sessionContext.getInitiatingEntity()).thenReturn(FROM);
-
+
IQStanza stanza = createRequest(USER, IQStanzaType.RESULT);
List<Stanza> responses = handler.handleResult(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
Assert.assertNull(response);
-
+
verify(stanzaBroker).write(eq(USER), eq(stanza),
any(DeliveryFailureStrategy.class));
}
-
+
@Test
public void handleResultToUserInbound() throws Exception {
when(sessionContext.getInitiatingEntity()).thenReturn(USER);
-
+
IQStanza stanza = createRequest(USER, IQStanzaType.RESULT);
List<Stanza> responses = handler.handleResult(stanza,
serverRuntimeContext, sessionContext, stanzaBroker);
Stanza response = new
ResponseStanzaContainerImpl(responses).getUniqueResponseStanza();
-
+
Assert.assertNull(response);
-
+
verify(stanzaWriter).write(stanza);
}
-
+
private Stanza createErrorResponse(Entity from, String error) {
Stanza expected = StanzaBuilder.createIQStanza(from, FROM,
IQStanzaType.ERROR, "id1")
- .startInnerElement("query",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO)
- .addAttribute("node", "n")
- .endInnerElement()
- .startInnerElement("error", NamespaceURIs.JABBER_CLIENT)
- .addAttribute("type", "cancel")
- .startInnerElement(error,
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS)
- .build();
+ .startInnerElement("query",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO).addAttribute("node", "n")
+ .endInnerElement().startInnerElement("error",
NamespaceURIs.JABBER_CLIENT)
+ .addAttribute("type", "cancel")
+ .startInnerElement(error,
NamespaceURIs.URN_IETF_PARAMS_XML_NS_XMPP_STANZAS).build();
return expected;
}
-
+
private IQStanza createRequest(Entity to) {
return createRequest(to, IQStanzaType.GET);
}
-
+
private IQStanza createRequest(Entity to, IQStanzaType type) {
IQStanza stanza = (IQStanza)
XMPPCoreStanza.getWrapper(StanzaBuilder.createIQStanza(FROM, to, type, "id1")
- .startInnerElement("query",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO)
- .addAttribute("node", "n")
+ .startInnerElement("query",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO).addAttribute("node", "n")
.build());
return stanza;
}
private Stanza createExpectedResponse(Entity from) {
Stanza expected = StanzaBuilder.createIQStanza(from, FROM,
IQStanzaType.RESULT, "id1")
- .startInnerElement("query",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO)
- .addAttribute("node", "n")
- .startInnerElement("feature",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO)
- .addAttribute("var", "foo")
- .endInnerElement()
- .startInnerElement("identity",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO)
- .addAttribute("category", "bar")
- .addAttribute("type", "fez")
- .endInnerElement()
- .build();
+ .startInnerElement("query",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO).addAttribute("node", "n")
+ .startInnerElement("feature",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO).addAttribute("var", "foo")
+ .endInnerElement().startInnerElement("identity",
NamespaceURIs.XEP0030_SERVICE_DISCOVERY_INFO)
+ .addAttribute("category", "bar").addAttribute("type",
"fez").endInnerElement().build();
return expected;
}
}
diff --git
a/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/ExtendedDiscoInfoTestCase.java
b/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/ExtendedDiscoInfoTestCase.java
index cb3c96c..0a41b4d 100644
---
a/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/ExtendedDiscoInfoTestCase.java
+++
b/server/core/src/test/java/org/apache/vysper/xmpp/modules/servicediscovery/handler/ExtendedDiscoInfoTestCase.java
@@ -78,8 +78,7 @@ public class ExtendedDiscoInfoTestCase extends TestCase {
}
});
- DefaultServerRuntimeContext runtimeContext = new
DefaultServerRuntimeContext(EntityImpl.parse("vysper.org"),
- mock(StanzaRelay.class));
+ DefaultServerRuntimeContext runtimeContext = new
DefaultServerRuntimeContext(EntityImpl.parse("vysper.org"),
mock(StanzaRelay.class));
runtimeContext.registerServerRuntimeContextService(serviceCollector);
DiscoInfoIQHandler infoIQHandler = new DiscoInfoIQHandler();
diff --git
a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java
b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java
index 15c4c0f..f31cf4e 100644
---
a/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java
+++
b/server/core/src/test/java/org/apache/vysper/xmpp/protocol/ProtocolWorkerStateAwarenessTestCase.java
@@ -49,8 +49,7 @@ public class ProtocolWorkerStateAwarenessTestCase extends
TestCase {
Entity serverEnitity = new EntityImpl(null, "vysper-server.org", null);
StanzaReceiverRelay receiverRelay = new StanzaReceiverRelay();
protocolWorker = new ProtocolWorker(receiverRelay);
- DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(serverEnitity,
- receiverRelay);
+ DefaultServerRuntimeContext serverRuntimeContext = new
DefaultServerRuntimeContext(serverEnitity, receiverRelay);
receiverRelay.setServerRuntimeContext(serverRuntimeContext);
serverRuntimeContext.addDictionary(new BaseStreamStanzaDictionary());
sessionStateHolder = new SessionStateHolder();
diff --git
a/server/core/src/test/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContextEventListenerTest.java
b/server/core/src/test/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContextEventListenerTest.java
index 374830f..fe767c0 100644
---
a/server/core/src/test/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContextEventListenerTest.java
+++
b/server/core/src/test/java/org/apache/vysper/xmpp/server/DefaultServerRuntimeContextEventListenerTest.java
@@ -24,6 +24,7 @@ import java.util.Optional;
import org.apache.vysper.event.EventListenerDictionary;
import org.apache.vysper.event.EventListenerMock;
import org.apache.vysper.event.SimpleEventListenerDictionary;
+import org.apache.vysper.xmpp.addressing.Entity;
import org.apache.vysper.xmpp.delivery.StanzaRelay;
import org.apache.vysper.xmpp.modules.DefaultModule;
import org.junit.Before;
@@ -46,7 +47,7 @@ public class DefaultServerRuntimeContextEventListenerTest {
EventListenerDictionary listenerDictionary =
SimpleEventListenerDictionary.builder()
.register(Event.class, eventListener).build();
- tested = new DefaultServerRuntimeContext(null,
mock(StanzaRelay.class));
+ tested = new DefaultServerRuntimeContext(mock(Entity.class),
mock(StanzaRelay.class));
tested.addModule(new MyModule(listenerDictionary));
}