use of org.apache.axiom.om.OMOutputFormat in project webservices-axiom by apache.
the class TestRootPartStreaming method runTest.
@Override
protected void runTest() throws Throwable {
OMFactory factory = metaFactory.getOMFactory();
// Programmatically create the message
OMElement orgRoot = factory.createOMElement("root", null);
for (int i = 0; i < 10000; i++) {
factory.createOMElement("child", null, orgRoot).setText("Some text content");
}
// Serialize the message as XOP even if there will be no attachment parts
OMOutputFormat format = new OMOutputFormat();
format.setDoOptimize(true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
orgRoot.serialize(baos, format);
// Parse the message and monitor the number of bytes read
InstrumentedInputStream in = new InstrumentedInputStream(new ByteArrayInputStream(baos.toByteArray()));
OMXMLParserWrapper builder = OMXMLBuilderFactory.createOMBuilder(factory, StAXParserConfiguration.DEFAULT, MultipartBody.builder().setInputStream(in).setContentType(format.getContentType()).build());
OMElement root = builder.getDocumentElement();
long count1 = in.getCount();
XMLStreamReader reader = root.getXMLStreamReader(false);
while (reader.hasNext()) {
reader.next();
}
long count2 = in.getCount();
// We expect that after requesting the document element, only a small part (corresponding to
// the size of the parser buffer) should have been read:
assertTrue(count1 < count2 / 2);
}
use of org.apache.axiom.om.OMOutputFormat in project webservices-axiom by apache.
the class TestSerializeUTF16 method runTest.
@Override
protected void runTest(OMDocument document) throws Throwable {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OMOutputFormat format = new OMOutputFormat();
format.setCharSetEncoding("UTF-16");
document.serializeAndConsume(baos, format);
String xmlDocument = new String(baos.toByteArray(), "UTF-16");
assertThat(xmlDocument).startsWith("<?xml version=\"1.0\" encoding=\"UTF-16\"?>");
}
use of org.apache.axiom.om.OMOutputFormat in project webservices-axiom by apache.
the class PushOMDataSourceReader method proceed.
@Override
public boolean proceed() throws StreamException {
// TODO: we might want to unwrap the NamespaceRepairingFilter (and some other filters) here
XmlHandler handler = this.handler;
OMOutputFormat format = null;
XmlHandler current = handler;
while (current instanceof XmlHandlerWrapper) {
if (current instanceof XmlDeclarationRewriterHandler) {
format = ((XmlDeclarationRewriterHandler) current).getFormat();
break;
}
current = ((XmlHandlerWrapper) current).getParent();
}
if (format == null) {
// This is for the OMSourcedElement expansion case
format = new OMOutputFormat();
format.setDoOptimize(true);
handler = new PushOMDataSourceXOPHandler(handler);
}
try {
XMLStreamWriter writer = new XmlHandlerStreamWriter(handler, null, AxiomXMLStreamWriterExtensionFactory.INSTANCE);
// Seed the namespace context with the namespace context from the parent
OMContainer parent = root.getParent();
if (parent instanceof OMElement) {
for (Iterator<OMNamespace> it = ((OMElement) parent).getNamespacesInScope(); it.hasNext(); ) {
OMNamespace ns = it.next();
writer.setPrefix(ns.getPrefix(), ns.getNamespaceURI());
}
}
handler.startFragment();
dataSource.serialize(new MTOMXMLStreamWriterImpl(new PushOMDataSourceStreamWriter(writer), format));
handler.completed();
} catch (XMLStreamException ex) {
Throwable cause = ex.getCause();
if (cause instanceof StreamException) {
throw (StreamException) cause;
} else {
throw new StreamException(ex);
}
}
return true;
}
use of org.apache.axiom.om.OMOutputFormat in project webservices-axiom by apache.
the class AbstractOMDataSource method getXMLBytes.
@Override
public final byte[] getXMLBytes(String encoding) throws UnsupportedEncodingException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OMOutputFormat format = new OMOutputFormat();
format.setCharSetEncoding(encoding);
try {
serialize(baos, format);
} catch (XMLStreamException ex) {
throw new OMException(ex);
}
return baos.toByteArray();
}
use of org.apache.axiom.om.OMOutputFormat in project wso2-axis2-transports by wso2.
the class RabbitMQMessageSender method publish.
/**
* Perform the creation of exchange/queue and the Outputstream
*
* @param message the RabbitMQ AMQP message
* @param msgContext the Axis2 MessageContext
*/
public void publish(RabbitMQMessage message, MessageContext msgContext) throws AxisRabbitMQException, IOException {
String exchangeName = null;
AMQP.BasicProperties basicProperties = null;
byte[] messageBody = null;
if (rmqChannel.isOpen()) {
String queueName = properties.get(RabbitMQConstants.QUEUE_NAME);
String routeKey = properties.get(RabbitMQConstants.QUEUE_ROUTING_KEY);
exchangeName = properties.get(RabbitMQConstants.EXCHANGE_NAME);
String exchangeType = properties.get(RabbitMQConstants.EXCHANGE_TYPE);
String replyTo = properties.get(RabbitMQConstants.REPLY_TO_NAME);
String correlationID = properties.get(RabbitMQConstants.CORRELATION_ID);
String queueAutoDeclareStr = properties.get(RabbitMQConstants.QUEUE_AUTODECLARE);
String exchangeAutoDeclareStr = properties.get(RabbitMQConstants.EXCHANGE_AUTODECLARE);
boolean queueAutoDeclare = true;
boolean exchangeAutoDeclare = true;
if (!StringUtils.isEmpty(queueAutoDeclareStr)) {
queueAutoDeclare = Boolean.parseBoolean(queueAutoDeclareStr);
}
if (!StringUtils.isEmpty(exchangeAutoDeclareStr)) {
exchangeAutoDeclare = Boolean.parseBoolean(exchangeAutoDeclareStr);
}
message.setReplyTo(replyTo);
if (StringUtils.isEmpty(correlationID)) {
// if reply-to is enabled a correlationID must be available. If not specified, use messageID
correlationID = message.getMessageId();
}
if (!StringUtils.isEmpty(correlationID)) {
message.setCorrelationId(correlationID);
}
if (queueName == null || queueName.equals("")) {
log.debug("No queue name is specified");
}
if (routeKey == null && !"x-consistent-hash".equals(exchangeType)) {
if (queueName == null || queueName.equals("")) {
log.debug("Routing key is not specified");
} else {
log.debug("Routing key is not specified. Using queue name as the routing key.");
routeKey = queueName;
}
}
// read publish properties corr id and route key from message context
Object prRouteKey = msgContext.getProperty(RabbitMQConstants.QUEUE_ROUTING_KEY);
Object prCorrId = msgContext.getProperty(RabbitMQConstants.CORRELATION_ID).toString();
if (prRouteKey != null) {
routeKey = prRouteKey.toString();
log.debug("Specifying routing key from axis2 properties");
}
if (prCorrId != null) {
message.setCorrelationId(prCorrId.toString());
log.debug("Specifying correlation id from axis2 properties");
}
// Declaring the queue
if (queueAutoDeclare && queueName != null && !queueName.equals("")) {
RabbitMQUtils.declareQueue(rmqChannel, queueName, properties);
}
// Declaring the exchange
if (exchangeAutoDeclare && exchangeName != null && !exchangeName.equals("")) {
RabbitMQUtils.declareExchange(rmqChannel, exchangeName, properties);
if (queueName != null && !"x-consistent-hash".equals(exchangeType)) {
// Create bind between the queue and exchange with the routeKey
try {
rmqChannel.getChannel().queueBind(queueName, exchangeName, routeKey);
} catch (IOException e) {
handleException("Error occurred while creating the bind between the queue: " + queueName + " & exchange: " + exchangeName + " with route-key " + routeKey, e);
}
}
}
AMQP.BasicProperties.Builder builder = buildBasicProperties(message);
String deliveryModeString = properties.get(RabbitMQConstants.QUEUE_DELIVERY_MODE);
int deliveryMode = RabbitMQConstants.DEFAULT_DELIVERY_MODE;
if (deliveryModeString != null) {
deliveryMode = Integer.parseInt(deliveryModeString);
}
builder.deliveryMode(deliveryMode);
if (!StringUtils.isEmpty(replyTo)) {
builder.replyTo(replyTo);
}
basicProperties = builder.build();
OMOutputFormat format = BaseUtils.getOMOutputFormat(msgContext);
MessageFormatter messageFormatter = null;
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
messageFormatter = MessageProcessorSelector.getMessageFormatter(msgContext);
} catch (AxisFault axisFault) {
throw new AxisRabbitMQException("Unable to get the message formatter to use", axisFault);
}
// given. Queue/exchange creation, bindings should be done at the broker
try {
// x-consistent-hash type
if (exchangeType != null && exchangeType.equals("x-consistent-hash")) {
routeKey = UUID.randomUUID().toString();
}
} catch (UnsupportedCharsetException ex) {
handleException("Unsupported encoding " + format.getCharSetEncoding(), ex);
}
try {
messageFormatter.writeTo(msgContext, format, out, false);
messageBody = out.toByteArray();
} catch (IOException e) {
handleException("IO Error while creating BytesMessage", e);
} finally {
if (out != null) {
out.close();
}
}
try {
/**
* Check for parameter on confirmed delivery in RabbitMq to ensure reliable delivery.
* Can be enabled by setting the parameter "rabbitmq.confirm.delivery" to "true" in broker URL.
*/
boolean isConfirmedDeliveryEnabled = Boolean.parseBoolean(properties.get(RabbitMQConstants.CONFIRMED_DELIVERY));
if (isConfirmedDeliveryEnabled) {
rmqChannel.getChannel().confirmSelect();
}
if (exchangeName != null && exchangeName != "") {
rmqChannel.getChannel().basicPublish(exchangeName, routeKey, basicProperties, messageBody);
} else {
rmqChannel.getChannel().basicPublish("", routeKey, basicProperties, messageBody);
}
if (isConfirmedDeliveryEnabled) {
rmqChannel.getChannel().waitForConfirmsOrDie();
}
} catch (IOException e) {
handleException("Error while publishing the message", e);
} catch (InterruptedException e) {
handleException("InterruptedException while waiting for AMQP message confirm :", e);
}
} else {
handleException("Channel cannot be created");
}
}
Aggregations