package org.jboss.seam.remoting; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import java.util.Set; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Observes; import javax.enterprise.inject.Instance; import javax.inject.Inject; import org.jboss.seam.international.status.Message; import org.jboss.seam.international.status.Messages; import org.jboss.solder.core.Requires; /** * This event observer writes any queued messages to the response header. It requires the Seam International * module to be present. * * @author Shane Bryzak * */ @ApplicationScoped @Requires("org.jboss.seam.international.status.Messages") public class MessageMarshaller { private static final byte[] MESSAGES_TAG_OPEN = "<msgs>".getBytes(); private static final byte[] MESSAGES_TAG_CLOSE = "</msgs>".getBytes(); private static final byte[] MESSAGE_TAG_OPEN = "<m".getBytes(); private static final byte[] ATTRIB_LEVEL = " lvl=\"".getBytes(); private static final byte[] ATTRIB_TARGETS = " tgt=\"".getBytes(); private static final byte TAG_CLOSE = '>'; private static final byte[] MESSAGE_TAG_CLOSE = "</m>".getBytes(); private static final byte DOUBLE_QUOTE = '"'; public static void marshalMessages(@Observes WriteHeaderEvent event, Messages msgs) throws IOException { Set<Message> messages = msgs.getAll(); if (!messages.isEmpty()) { OutputStream out = event.getOutputStream(); out.write(MESSAGES_TAG_OPEN); for (Message m : messages) { out.write(MESSAGE_TAG_OPEN); out.write(ATTRIB_LEVEL); out.write(m.getLevel().name().getBytes()); out.write(DOUBLE_QUOTE); if (m.getTargets() != null) { out.write(ATTRIB_TARGETS); out.write(m.getTargets().getBytes()); out.write(DOUBLE_QUOTE); } out.write(TAG_CLOSE); out.write(URLEncoder.encode(m.getText(), "UTF-8").replace( "+", "%20").getBytes()); out.write(MESSAGE_TAG_CLOSE); } out.write(MESSAGES_TAG_CLOSE); } } }