package org.jdiameter.server.impl; import org.jdiameter.api.*; import org.jdiameter.client.api.IMessage; import org.jdiameter.client.api.controller.IPeer; import org.jdiameter.server.api.INetwork; import org.jdiameter.server.api.IRouter; import static org.jdiameter.server.impl.helpers.Parameters.*; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; public class RouterImpl extends org.jdiameter.client.impl.router.RouterImpl implements IRouter { protected INetwork net; private ConcurrentHashMap<String, Realm> network; public RouterImpl(Configuration config, MetaData metaData) { super(config, metaData); } protected void init() { network = new ConcurrentHashMap<String,Realm>(); } protected void loadConfiguration(Configuration config) { if (config.getChildren(RealmTable.ordinal()) != null) { for (Configuration items : config.getChildren(RealmTable.ordinal())) { if (items != null) { Configuration[] m = items.getChildren(RealmEntry.ordinal()); for (Configuration c : m) { try { String name = c.getStringValue(RealmName.ordinal(), ""); ApplicationId appId = null; { Configuration[] apps = c.getChildren(ApplicationId.ordinal()); if (apps != null) { for (Configuration a : apps) { if (a != null) { long vnd = a.getLongValue(VendorId.ordinal(), 0); long auth = a.getLongValue(AuthApplId.ordinal(), 0); long acc = a.getLongValue(AcctApplId.ordinal(), 0); if (auth != 0) { appId = org.jdiameter.api.ApplicationId.createByAuthAppId(vnd, auth); } else { appId = org.jdiameter.api.ApplicationId.createByAccAppId(vnd, acc); } break; } } } } String[] hosts = c.getStringValue(RealmHosts.ordinal(), (String) RealmHosts.defValue()).split(","); LocalAction locAction = LocalAction.valueOf(c.getStringValue(RealmLocalAction.ordinal(), "0")); boolean isDynamic = c.getBooleanValue(RealmEntryIsDynamic.ordinal(), false); long expirationTime = c.getLongValue(RealmEntryExpTime.ordinal(), 0); addRealm(name, appId, locAction, isDynamic, expirationTime, hosts); } catch (Exception e) { logger.warn("Can not append realm entry", e); } } } } } } protected IPeer getPeerPredProcessing(IMessage message, String destRealm, String destHost) { String localHost = metaData.getLocalPeer().getUri().getFQDN(); String localRealm = metaData.getLocalPeer().getRealmName(); // Check local host if ( (destHost == null && destRealm == null && hasLocalApp(message)) || (destHost == null && destRealm != null && destRealm.equals(localRealm) && hasLocalApp(message)) || (destHost != null && destHost.equals(localHost) && destRealm != null && destRealm.equals(localRealm) && hasLocalApp(message)) ) { return (IPeer) metaData.getLocalPeer(); } else { return null; } } public Realm addRealm(String name, ApplicationId applicationId, LocalAction localAction, boolean dynamic, long expirationTime, String... peers) { Realm realm = new RealmImpl(name, applicationId, localAction, dynamic, expirationTime, peers); network.put(name, realm); return realm; } public Realm remRealm(String name) { return network.remove(name); } public Set<Realm> getRealms() { return new TreeSet<Realm>(network.values()); } public void setNetWork(INetwork network) { net = network; } private boolean hasLocalApp(IMessage message) { return message != null && net.getListener(message) != null; } protected boolean checkRealm(String name) { return name == null ? false : network.containsKey(name); } protected Set<String> getRealmsName() { return network.keySet(); } protected String[] getRealmPeers(String key) { return network.get(key).getPeerHosts(); } }