Synchronize access to superclass members.

This commit is contained in:
akwizgran
2011-10-06 18:16:08 +01:00
parent 42e586abc4
commit 7a994114ff
3 changed files with 28 additions and 21 deletions

View File

@@ -17,6 +17,7 @@ public abstract class AbstractPlugin implements TransportPlugin {
protected final Executor executor;
// These fields should be accessed with this's lock held
protected Map<String, String> localProperties = null;
protected Map<ContactId, Map<String, String>> remoteProperties = null;
protected Map<String, String> config = null;
@@ -27,7 +28,7 @@ public abstract class AbstractPlugin implements TransportPlugin {
this.executor = executor;
}
protected void start(Map<String, String> localProperties,
protected synchronized void start(Map<String, String> localProperties,
Map<ContactId, Map<String, String>> remoteProperties,
Map<String, String> config) throws InvalidPropertiesException,
InvalidConfigException {

View File

@@ -24,7 +24,7 @@ public class SimpleSocketPlugin extends SocketPlugin {
super(executor);
this.pollingInterval = pollingInterval;
}
public TransportId getId() {
return id;
}
@@ -39,33 +39,18 @@ public class SimpleSocketPlugin extends SocketPlugin {
@Override
protected SocketAddress getLocalSocketAddress() {
assert localProperties != null;
assert started && localProperties != null;
return createSocketAddress(localProperties);
}
@Override
protected SocketAddress getSocketAddress(ContactId c) {
assert remoteProperties != null;
assert started && remoteProperties != null;
Map<String, String> properties = remoteProperties.get(c);
if(properties == null) return null;
return createSocketAddress(properties);
}
@Override
protected void setLocalSocketAddress(SocketAddress s) {
assert localProperties != null;
if(!(s instanceof InetSocketAddress))
throw new IllegalArgumentException();
InetSocketAddress i = (InetSocketAddress) s;
String host = i.getAddress().getHostAddress();
String port = String.valueOf(i.getPort());
// FIXME: Special handling for private IP addresses?
Map<String, String> m = new TreeMap<String, String>(localProperties);
m.put("host", host);
m.put("port", port);
callback.setLocalProperties(m);
}
private SocketAddress createSocketAddress(Map<String, String> properties) {
assert properties != null;
String host = properties.get("host");
@@ -80,13 +65,30 @@ public class SimpleSocketPlugin extends SocketPlugin {
return new InetSocketAddress(host, port);
}
@Override
protected void setLocalSocketAddress(SocketAddress s) {
assert started && localProperties != null;
if(!(s instanceof InetSocketAddress))
throw new IllegalArgumentException();
InetSocketAddress i = (InetSocketAddress) s;
String host = i.getAddress().getHostAddress();
String port = String.valueOf(i.getPort());
// FIXME: Special handling for private IP addresses?
Map<String, String> m = new TreeMap<String, String>(localProperties);
m.put("host", host);
m.put("port", port);
callback.setLocalProperties(m);
}
@Override
protected Socket createClientSocket() throws IOException {
assert started;
return new Socket();
}
@Override
protected ServerSocket createServerSocket() throws IOException {
assert started;
return new ServerSocket();
}
}

View File

@@ -18,6 +18,7 @@ import net.sf.briar.plugins.AbstractPlugin;
abstract class SocketPlugin extends AbstractPlugin
implements StreamTransportPlugin {
// These fields should be accessed with this's lock held
protected StreamTransportCallback callback = null;
protected ServerSocket socket = null;
@@ -135,7 +136,7 @@ implements StreamTransportPlugin {
public synchronized void poll() {
if(!shouldPoll()) throw new UnsupportedOperationException();
if(!started) throw new IllegalStateException();
if(!started) return;
for(ContactId c : remoteProperties.keySet()) {
executor.execute(createConnector(c));
}
@@ -177,6 +178,9 @@ implements StreamTransportPlugin {
}
public StreamTransportConnection createConnection(ContactId c) {
return started ? createAndConnectSocket(c) : null;
synchronized(this) {
if(!started) return null;
}
return createAndConnectSocket(c);
}
}