package org.dcache.webadmin.model.dataaccess.communication.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import dmg.cells.nucleus.CellPath;
import org.dcache.webadmin.model.dataaccess.communication.CellMessageGenerator;
/**
* Used to send String messages (commands!) to cells and make response accessible
* @author jans
*/
public class StringCommandMessageGenerator implements CellMessageGenerator<String> {
private String _command;
private Set<CellMessageRequest<String>> _messageRequests =
new HashSet<>();
private static final Logger _log = LoggerFactory.getLogger(
StringCommandMessageGenerator.class);
public StringCommandMessageGenerator(Set<String> destinations, String command) {
_log.debug("Generating messages for {}", destinations);
_command = command;
createMessages(destinations);
}
private void createMessages(Set<String> destinations) {
for (String pool : destinations) {
StringCommandMessageRequest sendRequest = new StringCommandMessageRequest(pool,
_command);
_messageRequests.add(sendRequest);
}
}
@Override
public int getNumberOfMessages() {
return _messageRequests.size();
}
@Override
public Iterator<CellMessageRequest<String>> iterator() {
return _messageRequests.iterator();
}
private class StringCommandMessageRequest implements CellMessageRequest<String> {
private String _payload;
private String _destination;
private String _answer;
private boolean _sentSuccessfully;
public StringCommandMessageRequest(String destination, String command) {
_payload = command;
_destination = destination;
}
@Override
public String getPayload() {
_log.debug("getPayload for {}", _destination);
return _payload;
}
@Override
public Class<String> getPayloadType() {
return String.class;
}
@Override
public boolean isSuccessful() {
return _sentSuccessfully;
}
@Override
public void setSuccessful(boolean successful) {
_sentSuccessfully = successful;
}
@Override
public CellPath getDestination() {
return new CellPath(_destination);
}
@Override
public void setAnswer(Serializable answer) {
_answer = (String) answer;
}
@Override
public String getAnswer() {
return _answer;
}
}
}