package hudson.plugins.jabber.im.transport;
import hudson.Extension;
import hudson.model.User;
import hudson.plugins.im.DefaultIMMessageTarget;
import hudson.plugins.im.GroupChatIMMessageTarget;
import hudson.plugins.im.IMConnection;
import hudson.plugins.im.IMException;
import hudson.plugins.im.IMMessageTarget;
import hudson.plugins.im.IMMessageTargetConversionException;
import hudson.plugins.im.IMMessageTargetConverter;
import hudson.plugins.im.IMPublisher;
import hudson.plugins.im.tools.Assert;
import hudson.plugins.jabber.user.JabberUserProperty;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Publisher;
import java.util.List;
/**
* Jabber-specific implementation of the {@link IMPublisher}.
*
* @author Christoph Kutzinski
* @author Uwe Schaefer (original implementation)
*/
public class JabberPublisher extends IMPublisher
{
private static class JabberIMMessageTargetConverter implements IMMessageTargetConverter
{
private void checkValidity(final String f) throws IMMessageTargetConversionException {
// See: http://xmpp.org/rfcs/rfc3920.html#addressing
// obviously, there is no easy regexp to validate this.
// Additionally, we require the part before the @.
// So, just some very simple validation:
final int i = f.indexOf('@');
if (i == -1) {
throw new IMMessageTargetConversionException("Invalid input for target: '" + f + "'." +
"\nDoesn't contain a @.");
} else if (f.indexOf('@', i + 1) != -1)
{
throw new IMMessageTargetConversionException("Invalid input for target: '" + f + "'." +
"\nContains more than on @.");
}
}
@Override
public IMMessageTarget fromString(final String targetAsString) throws IMMessageTargetConversionException {
String f = targetAsString.trim();
if (f.length() > 0)
{
IMMessageTarget target;
if (f.startsWith("*")) {
f = f.substring(1);
// group chat
if (! f.contains("@")) {
f += "@conference." + JabberPublisher.DESCRIPTOR.getHostname();
}
target = new GroupChatIMMessageTarget(f);
} else if (f.contains("@conference.")) {
target = new GroupChatIMMessageTarget(f);
} else {
if (!f.contains("@")) {
f += "@" + JabberPublisher.DESCRIPTOR.getHostname();
}
target = new DefaultIMMessageTarget(f);
}
checkValidity(f);
return target;
}
else
{
return null;
}
}
/**
* {@inheritDoc}
*/
@Override
public String toString(final IMMessageTarget target) {
Assert.isNotNull(target, "Parameter 'target' must not be null.");
return target.toString();
}
}
@Extension
public static final JabberPublisherDescriptor DESCRIPTOR = new JabberPublisherDescriptor();
static final IMMessageTargetConverter CONVERTER = new JabberIMMessageTargetConverter();
public JabberPublisher(List<IMMessageTarget> targets, String notificationStrategy,
boolean notifyGroupChatsOnBuildStart,
boolean notifySuspects,
boolean notifyCulprits,
boolean notifyFixers,
boolean notifyUpstreamCommitters) throws IMMessageTargetConversionException
{
super(targets, notificationStrategy, notifyGroupChatsOnBuildStart,
notifySuspects, notifyCulprits, notifyFixers, notifyUpstreamCommitters);
}
@Override
public BuildStepDescriptor<Publisher> getDescriptor() {
return JabberPublisher.DESCRIPTOR;
}
@Override
protected IMConnection getIMConnection() throws IMException {
return JabberIMConnectionProvider.getInstance().currentConnection();
}
@Override
protected String getPluginName() {
return "Jabber notifier plugin";
}
@Override
protected String getConfiguredIMId(User user) {
JabberUserProperty jabberUserProperty = (JabberUserProperty) user.getProperties().get(JabberUserProperty.DESCRIPTOR);
if (jabberUserProperty != null) {
return jabberUserProperty.getJid();
}
return null;
}
@Override
public String getTargets() {
List<IMMessageTarget> notificationTargets = getNotificationTargets();
StringBuilder sb = new StringBuilder();
for (IMMessageTarget target : notificationTargets) {
if ((target instanceof GroupChatIMMessageTarget) && (! target.toString().contains("@conference."))) {
sb.append("*");
}
sb.append(getIMDescriptor().getIMMessageTargetConverter().toString(target));
sb.append(" ");
}
return sb.toString().trim();
}
// since Hudson 1.319:
public BuildStepMonitor getRequiredMonitorService() {
return BuildStepMonitor.BUILD;
}
}