diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..13a5aff
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 9f3024e..02a139e 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,25 +1,15 @@
-#Wed Jan 28 11:03:00 CET 2015
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.compliance=1.7
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
+org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
+org.eclipse.jdt.core.compiler.problem.missingJavadocTags=error
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
diff --git a/src/org/epics/pvaccess/client/impl/remote/ChannelImpl.java b/src/org/epics/pvaccess/client/impl/remote/ChannelImpl.java
index 424b3ed..a7e2bed 100644
--- a/src/org/epics/pvaccess/client/impl/remote/ChannelImpl.java
+++ b/src/org/epics/pvaccess/client/impl/remote/ChannelImpl.java
@@ -51,6 +51,7 @@
import org.epics.pvaccess.impl.remote.TransportSender;
import org.epics.pvaccess.impl.remote.request.ResponseRequest;
import org.epics.pvaccess.impl.remote.request.SubscriptionRequest;
+import org.epics.pvaccess.impl.remote.utils.GUID;
import org.epics.pvdata.misc.SerializeHelper;
import org.epics.pvdata.misc.TimerFactory;
import org.epics.pvdata.misc.Timer.TimerCallback;
@@ -145,6 +146,11 @@ public class ChannelImpl implements Channel, SearchInstance, TransportClient, Tr
* User value used by SearchInstance.
*/
private final AtomicInteger userValue = new AtomicInteger();
+
+ /**
+ * GUID of the server hosting the channel.
+ */
+ private GUID serverGUID = null;
/* ****************** */
@@ -398,6 +404,8 @@ public synchronized void initiateSearch(boolean penalize)
private final static int STATIC_SEARCH_BASE_DELAY_SEC = 5;
private final static int STATIC_SEARCH_MAX_MULTIPLIER = 10;
+ private static final GUID dummyGUID = new GUID(new byte[12]);
+
@Override
public void callback() {
// TODO not in this timer thread !!!
@@ -408,7 +416,7 @@ public void callback() {
addressIndex = addresses.length*STATIC_SEARCH_MAX_MULTIPLIER;
// NOTE: calls channelConnectFailed() on failure
- searchResponse(PVAConstants.PVA_PROTOCOL_REVISION, addresses[ix]);
+ searchResponse(dummyGUID, PVAConstants.PVA_PROTOCOL_REVISION, addresses[ix]);
}
@Override
@@ -424,11 +432,8 @@ public AtomicInteger getUserValue() {
return userValue;
}
- /* (non-Javadoc)
- * @see org.epics.pvaccess.client.impl.remote.ChannelSearchManager.SearchInstance#searchResponse(byte, java.net.InetSocketAddress)
- */
@Override
- public synchronized void searchResponse(byte minorRevision, InetSocketAddress serverAddress) {
+ public synchronized void searchResponse(GUID guid, byte minorRevision, InetSocketAddress serverAddress) {
// channel is already automatically unregistered
Transport transport = getTransport();
@@ -436,7 +441,8 @@ public synchronized void searchResponse(byte minorRevision, InetSocketAddress se
{
// TODO use GUID to determine whether there are multiple servers with the same channel
// multiple defined PV or reconnect request (same server address)
- if (!transport.getRemoteAddress().equals(serverAddress))
+ if (!transport.getRemoteAddress().equals(serverAddress) &&
+ !guid.equals(serverGUID))
{
requester.message("More than one channel with name '" + name +
"' detected, connected to: " + transport.getRemoteAddress() + ", ignored: " + serverAddress, MessageType.warning);
@@ -451,6 +457,9 @@ public synchronized void searchResponse(byte minorRevision, InetSocketAddress se
return;
}
+ // remember GUID
+ serverGUID = guid;
+
// create channel
createChannel(transport);
}
diff --git a/src/org/epics/pvaccess/client/impl/remote/handlers/SearchResponseHandler.java b/src/org/epics/pvaccess/client/impl/remote/handlers/SearchResponseHandler.java
index e01fe6c..94560dc 100644
--- a/src/org/epics/pvaccess/client/impl/remote/handlers/SearchResponseHandler.java
+++ b/src/org/epics/pvaccess/client/impl/remote/handlers/SearchResponseHandler.java
@@ -23,6 +23,7 @@
import org.epics.pvaccess.client.impl.remote.ClientContextImpl;
import org.epics.pvaccess.client.impl.remote.search.ChannelSearchManager;
import org.epics.pvaccess.impl.remote.Transport;
+import org.epics.pvaccess.impl.remote.utils.GUID;
import org.epics.pvdata.misc.SerializeHelper;
@@ -83,13 +84,14 @@ public void handleResponse(InetSocketAddress responseFrom, Transport transport,
return;
// reads CIDs
+ final GUID serverGUID = new GUID(guid);
final ChannelSearchManager csm = context.getChannelSearchManager();
final int count = payloadBuffer.getShort() & 0xFFFF;
for (int i = 0; i < count; i++)
{
transport.ensureData(4);
final int cid = payloadBuffer.getInt();
- csm.searchResponse(cid, searchSequenceId, version, responseFrom);
+ csm.searchResponse(serverGUID, cid, searchSequenceId, version, responseFrom);
}
}
}
diff --git a/src/org/epics/pvaccess/client/impl/remote/search/ChannelSearchManager.java b/src/org/epics/pvaccess/client/impl/remote/search/ChannelSearchManager.java
index 2f386d1..d8d649c 100644
--- a/src/org/epics/pvaccess/client/impl/remote/search/ChannelSearchManager.java
+++ b/src/org/epics/pvaccess/client/impl/remote/search/ChannelSearchManager.java
@@ -16,6 +16,8 @@
import java.net.InetSocketAddress;
+import org.epics.pvaccess.impl.remote.utils.GUID;
+
/**
* @author Matej Sekoranja
* @version $Id$
@@ -49,12 +51,13 @@ public interface ChannelSearchManager {
/**
* Search response from server (channel found).
+ * @param guid server GUID.
* @param cid client channel ID.
* @param seqNo search sequence number.
* @param minorRevision server minor PVA revision.
* @param serverAddress server address.
*/
- public void searchResponse(int cid, int seqNo, byte minorRevision, InetSocketAddress serverAddress);
+ public void searchResponse(GUID guid, int cid, int seqNo, byte minorRevision, InetSocketAddress serverAddress);
/**
* Beacon anomaly detected.
diff --git a/src/org/epics/pvaccess/client/impl/remote/search/SearchInstance.java b/src/org/epics/pvaccess/client/impl/remote/search/SearchInstance.java
index 676c8d6..9615f8f 100644
--- a/src/org/epics/pvaccess/client/impl/remote/search/SearchInstance.java
+++ b/src/org/epics/pvaccess/client/impl/remote/search/SearchInstance.java
@@ -17,6 +17,8 @@
import java.net.InetSocketAddress;
import java.util.concurrent.atomic.AtomicInteger;
+import org.epics.pvaccess.impl.remote.utils.GUID;
+
public interface SearchInstance {
int getChannelID();
String getChannelName();
@@ -25,9 +27,10 @@ public interface SearchInstance {
/**
* Search response from server (channel found).
+ * @param guid server GUID
* @param minorRevision server minor PVA revision.
* @param serverAddress server address.
*/
// TODO make InetSocketAddress an URI or similar
- void searchResponse(byte minorRevision, InetSocketAddress serverAddress);
+ void searchResponse(GUID guid, byte minorRevision, InetSocketAddress serverAddress);
}
diff --git a/src/org/epics/pvaccess/client/impl/remote/search/SimpleChannelSearchManagerImpl.java b/src/org/epics/pvaccess/client/impl/remote/search/SimpleChannelSearchManagerImpl.java
index 54b3aba..5dae40f 100644
--- a/src/org/epics/pvaccess/client/impl/remote/search/SimpleChannelSearchManagerImpl.java
+++ b/src/org/epics/pvaccess/client/impl/remote/search/SimpleChannelSearchManagerImpl.java
@@ -26,6 +26,7 @@
import org.epics.pvaccess.impl.remote.ProtocolType;
import org.epics.pvaccess.impl.remote.TransportSendControl;
import org.epics.pvaccess.impl.remote.udp.BlockingUDPTransport.InetAddressType;
+import org.epics.pvaccess.impl.remote.utils.GUID;
import org.epics.pvaccess.util.InetAddressUtil;
import org.epics.pvaccess.util.IntHashMap;
import org.epics.pvdata.misc.SerializeHelper;
@@ -357,12 +358,13 @@ public void unregister(SearchInstance channel)
/**
* Search response from server (channel found).
+ * @param guid server GUID.
* @param cid client channel ID.
* @param seqNo search sequence number.
* @param minorRevision server minor PVA revision.
* @param serverAddress server address.
*/
- public void searchResponse(int cid, int seqNo, byte minorRevision, InetSocketAddress serverAddress)
+ public void searchResponse(GUID guid, int cid, int seqNo, byte minorRevision, InetSocketAddress serverAddress)
{
// first remove
SearchInstance si;
@@ -374,12 +376,12 @@ public void searchResponse(int cid, int seqNo, byte minorRevision, InetSocketAdd
// minor hack to enable duplicate reports
si = context.getChannel(cid);
if (si != null)
- si.searchResponse(minorRevision, serverAddress);
+ si.searchResponse(guid, minorRevision, serverAddress);
return;
}
// then notify SearchInstance
- si.searchResponse(minorRevision, serverAddress);
+ si.searchResponse(guid, minorRevision, serverAddress);
}
/**