/*
* Copyright 2008-2016 MongoDB, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mongodb.connection;
import com.mongodb.ServerAddress;
import com.mongodb.event.ServerListener;
import org.bson.types.ObjectId;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.mongodb.connection.ServerConnectionState.CONNECTED;
public class TestClusterableServerFactory implements ClusterableServerFactory {
private final Map<ServerAddress, TestServer> addressToServerMap = new HashMap<ServerAddress, TestServer>();
@Override
public ClusterableServer create(final ServerAddress serverAddress, final ServerListener serverListener) {
addressToServerMap.put(serverAddress, new TestServer(serverAddress, serverListener));
return addressToServerMap.get(serverAddress);
}
@Override
public ServerSettings getSettings() {
return ServerSettings.builder().build();
}
public TestServer getServer(final ServerAddress serverAddress) {
return addressToServerMap.get(serverAddress);
}
public void sendNotification(final ServerAddress serverAddress, final ServerDescription serverDescription) {
getServer(serverAddress).sendNotification(serverDescription);
}
public void sendNotification(final ServerAddress serverAddress, final ServerType serverType, final List<ServerAddress> hosts) {
sendNotification(serverAddress, serverType, hosts, "test");
}
public void sendNotification(final ServerAddress serverAddress, final ServerType serverType, final List<ServerAddress> hosts,
final ServerAddress trueAddress) {
sendNotification(serverAddress, serverType, hosts, "test", trueAddress);
}
public void sendNotification(final ServerAddress serverAddress, final ServerType serverType, final List<ServerAddress> hosts,
final ObjectId electionId) {
sendNotification(serverAddress, serverType, hosts, "test", electionId);
}
public void sendNotification(final ServerAddress serverAddress, final ServerType serverType, final List<ServerAddress> hosts,
final List<ServerAddress> passives) {
getServer(serverAddress).sendNotification(getBuilder(serverAddress,
serverType,
hosts,
passives,
true,
"test",
null,
null).build());
}
public void sendNotification(final ServerAddress serverAddress, final ServerType serverType, final List<ServerAddress> hosts,
final String setName) {
sendNotification(serverAddress, serverType, hosts, setName, (ObjectId) null);
}
public void sendNotification(final ServerAddress serverAddress, final ServerType serverType, final List<ServerAddress> hosts,
final String setName, final ServerAddress trueAddress) {
sendNotification(serverAddress, serverType, hosts, setName, null, trueAddress);
}
public void sendNotification(final ServerAddress serverAddress, final ServerType serverType, final List<ServerAddress> hosts,
final String setName, final ObjectId electionId) {
getServer(serverAddress).sendNotification(getBuilder(serverAddress, serverType, hosts, Collections.<ServerAddress>emptyList(),
true, setName, electionId, null)
.build());
}
public void sendNotification(final ServerAddress serverAddress, final ServerType serverType, final List<ServerAddress> hosts,
final String setName, final ObjectId electionId, final ServerAddress trueAddress) {
getServer(serverAddress).sendNotification(getBuilder(serverAddress, serverType, hosts, Collections.<ServerAddress>emptyList(),
true, setName, electionId, trueAddress)
.build());
}
public void sendNotification(final ServerAddress serverAddress, final ServerType serverType, final List<ServerAddress> hosts,
final boolean ok) {
getServer(serverAddress).sendNotification(getBuilder(serverAddress, serverType, hosts, Collections.<ServerAddress>emptyList(),
ok, null, null, null)
.build());
}
public ServerDescription getDescription(final ServerAddress server) {
return getServer(server).getDescription();
}
public Set<ServerDescription> getDescriptions(final ServerAddress... servers) {
Set<ServerDescription> serverDescriptions = new HashSet<ServerDescription>();
for (ServerAddress cur : servers) {
serverDescriptions.add(getServer(cur).getDescription());
}
return serverDescriptions;
}
private ServerDescription.Builder getBuilder(final ServerAddress serverAddress, final ServerType serverType,
final List<ServerAddress> hosts, final List<ServerAddress> passives, final boolean ok,
final String setName, final ObjectId electionId, final ServerAddress trueAddress) {
Set<String> hostsSet = new HashSet<String>();
for (ServerAddress cur : hosts) {
hostsSet.add(cur.toString());
}
Set<String> passivesSet = new HashSet<String>();
for (ServerAddress cur : passives) {
passivesSet.add(cur.toString());
}
return ServerDescription.builder()
.address(serverAddress)
.type(serverType)
.ok(ok)
.state(CONNECTED)
.canonicalAddress(trueAddress == null ? serverAddress.toString() : trueAddress.toString())
.hosts(hostsSet)
.passives(passivesSet)
.setName(setName)
.electionId(electionId)
.setVersion(1);
}
}