package org.limewire.ui.swing.friends.settings; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import javax.swing.Icon; import org.jdesktop.swingx.icon.EmptyIcon; import org.limewire.friend.api.RosterEvent; import org.limewire.io.UnresolvedIpPort; import org.limewire.listener.EventListener; import org.limewire.util.StringUtils; /** * Stores all the information required to log into an XMPP server and * describe the server in the UI. */ class FriendAccountConfigurationImpl implements FriendAccountConfiguration { private final String resource; private final boolean isDebugEnabled; private final boolean modifyUser; private final boolean requiresDomain; private final Icon icon; private final Icon largeIcon; private volatile String serviceName; private volatile String label; private volatile String username; /** * The canoncial user name in lower case including the domain name. */ private volatile String canonicalId; private volatile String password; private final List<UnresolvedIpPort> defaultServers; private final Type type; /** * Synchronized, since accessed by the core in different threads. */ private final Map<String, Object> attributes = Collections.synchronizedMap(new HashMap<String, Object>()); /** Constructs an XMPPAccountConfiguration with the following parameters. */ public FriendAccountConfigurationImpl(boolean requireDomain, String serviceName, String label, Icon icon, Icon largeIcon, String resource, List<UnresolvedIpPort> defaultServers, Type type) { this(requireDomain, serviceName, label, icon, largeIcon, resource, defaultServers, true, type); } /** Constructs a basic XMPPAccountConfiguration that cannot modify the serviceName. */ public FriendAccountConfigurationImpl(String serviceName, String label, String resource, Type type, Icon smallIcon, Icon largeIcon) { this(false, serviceName, label, smallIcon, largeIcon, resource, UnresolvedIpPort.EMPTY_LIST, false, type); } private FriendAccountConfigurationImpl(boolean requireDomain, String serviceName, String label, Icon icon, Icon largeIcon, String resource, List<UnresolvedIpPort> defaultServers, boolean modifyUser, Type type) { this.resource = resource; this.modifyUser = modifyUser; this.type = type; this.isDebugEnabled = false; this.requiresDomain = requireDomain; this.serviceName = serviceName; this.label = label; this.icon = icon != null ? icon : new EmptyIcon(16, 16); this.largeIcon = largeIcon != null ? largeIcon : new EmptyIcon(28, 28); this.username = ""; this.canonicalId = ""; this.password = ""; this.defaultServers = defaultServers; } @Override public boolean isDebugEnabled() { return isDebugEnabled; } @Override public String getServiceName() { return serviceName; } @Override public void setServiceName(String serviceName) { this.serviceName = serviceName; } @Override public String getLabel() { return label; } @Override public void setLabel(String label) { this.label = label; } @Override public Icon getIcon() { return icon; } @Override public String getUserInputLocalID() { return username; } @Override public void setUsername(String username) { setCanonicalIdFromUsername(username); if(modifyUser) { // Some servers expect the domain to be included, others don't int at = username.indexOf('@'); if(requiresDomain && at == -1) username += "@" + getServiceName(); // Guess the domain else if(!requiresDomain && at > -1) username = username.substring(0, at); // Strip the domain } this.username = username; } void setCanonicalIdFromUsername(String username) { int at = username.indexOf('@'); if (at != -1) { this.canonicalId = username.toLowerCase(Locale.US); } else { this.canonicalId = (username + "@" + getServiceName()).toLowerCase(Locale.US); } } @Override public String getPassword() { return password; } @Override public void setPassword(String password) { this.password = password; } @Override public boolean storePassword() { return true; } @Override public String getResource() { return resource; } @Override public String getCanonicalizedLocalID() { return canonicalId; } @Override public String getNetworkName() { return serviceName; } @Override public Type getType() { return type; } @Override public EventListener<RosterEvent> getRosterListener() { return null; } @Override public String toString() { return StringUtils.toStringBlacklist(this, password); } @Override public List<UnresolvedIpPort> getDefaultServers() { return defaultServers; } @Override public Object getAttribute(String key) { return attributes.get(key); } @Override public void setAttribute(String key, Object property) { attributes.put(key, property); } @Override public Icon getLargeIcon() { return largeIcon; } }