Commit 4b98b442 authored by Guus der Kinderen's avatar Guus der Kinderen

OF-1496: Store providers, rather than their provided data.

parent 4093e410
...@@ -69,26 +69,42 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene ...@@ -69,26 +69,42 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
private Map<String, DiscoInfoProvider> entities = new HashMap<>(); private Map<String, DiscoInfoProvider> entities = new HashMap<>();
private Set<String> localServerFeatures = new CopyOnWriteArraySet<>(); private Set<String> localServerFeatures = new CopyOnWriteArraySet<>();
private Cache<String, Set<NodeID>> serverFeatures; private Cache<String, Set<NodeID>> serverFeatures;
private List<Element> serverIdentities = new ArrayList<>(); private List<ServerIdentitiesProvider> serverIdentityProviders = new ArrayList<>();
private Map<String, DiscoInfoProvider> serverNodeProviders = new ConcurrentHashMap<>(); private Map<String, DiscoInfoProvider> serverNodeProviders = new ConcurrentHashMap<>();
private IQHandlerInfo info; private IQHandlerInfo info;
private List<Element> anonymousUserIdentities = new ArrayList<>(); private List<UserIdentitiesProvider> anonymousUserIdentityProviders = new ArrayList<>();
private List<Element> registeredUserIdentities = new ArrayList<>(); private List<UserIdentitiesProvider> registeredUserIdentityProviders = new ArrayList<>();
public IQDiscoInfoHandler() { public IQDiscoInfoHandler() {
super("XMPP Disco Info Handler"); super("XMPP Disco Info Handler");
info = new IQHandlerInfo("query", NAMESPACE_DISCO_INFO); info = new IQHandlerInfo("query", NAMESPACE_DISCO_INFO);
// Initialize the user identity and features collections (optimization to avoid creating
// the same objects for each response) anonymousUserIdentityProviders.add( new UserIdentitiesProvider()
Element userIdentity = DocumentHelper.createElement("identity"); {
userIdentity.addAttribute("category", "account"); @Override
userIdentity.addAttribute("type", "anonymous"); public Iterator<Element> getIdentities()
anonymousUserIdentities.add(userIdentity); {
userIdentity = DocumentHelper.createElement("identity"); final Element userIdentity = DocumentHelper.createElement( "identity" );
userIdentity.addAttribute("category", "account"); userIdentity.addAttribute( "category", "account" );
userIdentity.addAttribute("type", "registered"); userIdentity.addAttribute( "type", "anonymous" );
registeredUserIdentities.add(userIdentity);
return Collections.singleton( userIdentity ).iterator();
}
} );
registeredUserIdentityProviders.add( new UserIdentitiesProvider()
{
@Override
public Iterator<Element> getIdentities()
{
final Element userIdentity = DocumentHelper.createElement( "identity" );
userIdentity.addAttribute( "category", "account" );
userIdentity.addAttribute( "type", "registered" );
return Collections.singleton( userIdentity ).iterator();
}
} );
} }
@Override @Override
...@@ -258,27 +274,56 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene ...@@ -258,27 +274,56 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
} }
/** /**
* Adds the "discoverable" identities provided by the provider. This information will be used whenever a disco for * Adds the "discoverable" identities provided by the provider whenever a disco for info is made against the server.
* info is made against the server.
* *
* @param provider The provider of identities. * @param provider The provider of identities.
*/ */
public void addServerIdentitiesProvider(ServerIdentitiesProvider provider) { public void addServerIdentitiesProvider(ServerIdentitiesProvider provider) {
for (Iterator<Element> it = provider.getIdentities(); it.hasNext();) { if ( provider == null )
serverIdentities.add(it.next()); {
throw new NullPointerException( "Argument 'provider' cannot be null." );
} }
serverIdentityProviders.add( provider );
} }
/** /**
* Adds the "discoverable" user identities provided by the provider. This information will be used whenever a disco * Removes this provider of identities.
* for info is made against users of the server. *
* @param provider The provider of identities.
*/
public void removeServerIdentitiesProvider(ServerIdentitiesProvider provider) {
if ( provider == null )
{
throw new NullPointerException( "Argument 'provider' cannot be null." );
}
serverIdentityProviders.remove( provider );
}
/**
* Adds the "discoverable" user identities provided by the provider whenever a disco for info is made against users
* of the server.
* *
* @param provider The provider of user identities. * @param provider The provider of user identities.
*/ */
public void addUserIdentitiesProvider(UserIdentitiesProvider provider) { public void addUserIdentitiesProvider(UserIdentitiesProvider provider) {
for (Iterator<Element> it = provider.getIdentities(); it.hasNext();) { if ( provider == null )
registeredUserIdentities.add( it.next() ); {
throw new NullPointerException( "Argument 'provider' cannot be null." );
} }
registeredUserIdentityProviders.add( provider );
}
/**
* Removes this provider of user identities.
*
* @param provider The provider of identities.
*/
public void removeUserIdentitiesProvider(UserIdentitiesProvider provider) {
if ( provider == null )
{
throw new NullPointerException( "Argument 'provider' cannot be null." );
}
registeredUserIdentityProviders.remove( provider );
} }
/** /**
...@@ -419,7 +464,6 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene ...@@ -419,7 +464,6 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
*/ */
private DiscoInfoProvider getServerInfoProvider() { private DiscoInfoProvider getServerInfoProvider() {
return new DiscoInfoProvider() { return new DiscoInfoProvider() {
final ArrayList<Element> identities = new ArrayList<>();
@Override @Override
public Iterator<Element> getIdentities(String name, String node, JID senderJID) { public Iterator<Element> getIdentities(String name, String node, JID senderJID) {
...@@ -429,20 +473,20 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene ...@@ -429,20 +473,20 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
} }
if (name == null || name.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) { if (name == null || name.equals(XMPPServer.getInstance().getServerInfo().getXMPPDomain())) {
// Answer identity of the server // Answer identity of the server
synchronized (identities) { final ArrayList<Element> identities = new ArrayList<>();
if (identities.isEmpty()) { final Element identity = DocumentHelper.createElement("identity");
Element identity = DocumentHelper.createElement("identity"); identity.addAttribute("category", "server");
identity.addAttribute("category", "server"); identity.addAttribute("name", JiveGlobals.getProperty("xmpp.server.name", "Openfire Server"));
identity.addAttribute("name", JiveGlobals.getProperty( identity.addAttribute("type", "im");
"xmpp.server.name", "Openfire Server")); identities.add(identity);
identity.addAttribute("type", "im");
// Include identities from modules that implement ServerIdentitiesProvider
identities.add(identity); for (ServerIdentitiesProvider provider : serverIdentityProviders )
{
// Include identities from modules that implement ServerIdentitiesProvider final Iterator<Element> iterator = provider.getIdentities();
for (Element identityElement : serverIdentities) { while ( iterator.hasNext() )
identities.add(identityElement); {
} identities.add( iterator.next() );
} }
} }
return identities.iterator(); return identities.iterator();
...@@ -453,12 +497,30 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene ...@@ -453,12 +497,30 @@ public class IQDiscoInfoHandler extends IQHandler implements ClusterEventListene
else { else {
if (SessionManager.getInstance().isAnonymousRoute(name)) { if (SessionManager.getInstance().isAnonymousRoute(name)) {
// Answer identity of an anonymous user. // Answer identity of an anonymous user.
return anonymousUserIdentities.iterator(); final Set<Element> result = new HashSet<>();
for ( final UserIdentitiesProvider provider : anonymousUserIdentityProviders )
{
final Iterator<Element> identities = provider.getIdentities();
while ( identities.hasNext() )
{
result.add( identities.next() );
}
}
return result.iterator();
} }
else { else {
// Answer identity of a registered user. // Answer identity of a registered user.
// Note: We know that this user exists because #hasInfo returned true // Note: We know that this user exists because #hasInfo returned true
return registeredUserIdentities.iterator(); final Set<Element> result = new HashSet<>();
for ( final UserIdentitiesProvider provider : registeredUserIdentityProviders )
{
final Iterator<Element> identities = provider.getIdentities();
while ( identities.hasNext() )
{
result.add( identities.next() );
}
}
return result.iterator();
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment