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); } /**