in dsml/engine/src/main/java/org/apache/directory/api/dsmlv2/engine/Dsmlv2Engine.java [281:530]
protected void processDSML( OutputStream outStream ) throws IOException
{
BufferedWriter respWriter = null;
if ( outStream != null )
{
respWriter = new BufferedWriter( new OutputStreamWriter( outStream, StandardCharsets.UTF_8 ) );
if ( generateSoapResp )
{
respWriter.write( "<Envelope " );
Namespace soapNs = new Namespace( null, "http://www.w3.org/2001/12/soap-envelope" );
soapNs.write( respWriter );
respWriter.write( "><Body>" );
}
}
// Binding to LDAP Server
try
{
bind( 1 );
}
catch ( Exception e )
{
if ( LOG.isWarnEnabled() )
{
LOG.warn( I18n.msg( I18n.MSG_02002_FAILED_TO_BIND ), e );
}
// Unable to connect to server
// We create a new ErrorResponse and return the XML response.
ErrorResponse errorResponse = new ErrorResponse( 0, ErrorResponseType.COULD_NOT_CONNECT, e
.getLocalizedMessage() );
batchResponse.addResponse( errorResponse );
if ( respWriter != null )
{
respWriter.write( batchResponse.toDsml() );
if ( generateSoapResp )
{
respWriter.write( BODY_ENVELOPE );
}
respWriter.flush();
}
return;
}
// Processing BatchRequest:
// - Parsing and Getting BatchRequest
// - Getting and registering options from BatchRequest
try
{
processBatchRequest();
}
catch ( XmlPullParserException e )
{
// We create a new ErrorResponse and return the XML response.
ErrorResponse errorResponse = new ErrorResponse( 0, ErrorResponseType.MALFORMED_REQUEST, I18n.err(
I18n.ERR_02003_LINE_COLUMN, e.getLocalizedMessage(), e.getLineNumber(), e.getColumnNumber() ) );
batchResponse.addResponse( errorResponse );
if ( respWriter != null )
{
respWriter.write( batchResponse.toDsml() );
if ( generateSoapResp )
{
respWriter.write( BODY_ENVELOPE );
}
respWriter.flush();
}
return;
}
String batchResponseTag = null;
if ( respWriter != null )
{
StringBuilder sb = new StringBuilder();
sb.append( "<batchResponse " );
sb.append( ParserUtils.DSML_NAMESPACE.asXML() );
// a space to separate the namespace declarations
sb.append( " " );
sb.append( ParserUtils.XSD_NAMESPACE.asXML() );
// a space to separate the namespace declarations
sb.append( " " );
sb.append( ParserUtils.XSI_NAMESPACE.asXML() );
sb.append( " requestID=\"" );
sb.append( batchRequest.getRequestID() );
sb.append( "\">" );
batchResponseTag = sb.toString();
}
// Processing each request:
// - Getting a new request
// - Checking if the request is well formed
// - Sending the request to the server
// - Getting and converting reponse(s) as XML
// - Looping until last request
DsmlDecorator<? extends Request> request = null;
try
{
request = parser.getNextRequest();
}
catch ( XmlPullParserException e )
{
if ( LOG.isWarnEnabled() )
{
LOG.warn( I18n.msg( I18n.MSG_02000_FAILED_GETTING_NEXT_REQUEST ), e );
}
int reqId = 0;
// We create a new ErrorResponse and return the XML response.
ErrorResponse errorResponse = new ErrorResponse( reqId, ErrorResponseType.MALFORMED_REQUEST, I18n.err(
I18n.ERR_02003_LINE_COLUMN, e.getLocalizedMessage(), e.getLineNumber(), e.getColumnNumber() ) );
batchResponse.addResponse( errorResponse );
if ( respWriter != null )
{
respWriter.write( batchResponse.toDsml() );
if ( generateSoapResp )
{
respWriter.write( BODY_ENVELOPE );
}
respWriter.flush();
}
return;
}
// We can now write the tag, as we don't have an error
if ( respWriter != null )
{
respWriter.write( batchResponseTag );
}
// (Request == null when there's no more request to process)
while ( request != null )
{
// Checking the request has a requestID attribute if Processing = Parallel and ResponseOrder = Unordered
if ( ( batchRequest.getProcessing().equals( Processing.PARALLEL ) )
&& ( batchRequest.getResponseOrder().equals( ResponseOrder.UNORDERED ) )
&& ( request.getDecorated().getMessageId() <= 0 ) )
{
// Then we have to send an errorResponse
ErrorResponse errorResponse = new ErrorResponse( 0, ErrorResponseType.MALFORMED_REQUEST, I18n
.err( I18n.ERR_02004_MISSING_REQUEST_ID ) );
if ( respWriter != null )
{
writeResponse( respWriter, errorResponse );
}
else
{
batchResponse.addResponse( errorResponse );
}
break;
}
try
{
processRequest( request, respWriter );
}
catch ( Exception e )
{
if ( LOG.isWarnEnabled() )
{
LOG.warn( I18n.msg( I18n.MSG_02001_FAILED_PROCESSING_REQUEST ), e );
}
// We create a new ErrorResponse and return the XML response.
ErrorResponse errorResponse = new ErrorResponse( request.getDecorated().getMessageId(),
ErrorResponseType.GATEWAY_INTERNAL_ERROR, I18n.err(
I18n.ERR_02005_INTERNAL_ERROR, e.getMessage() ) );
if ( respWriter != null )
{
writeResponse( respWriter, errorResponse );
}
else
{
batchResponse.addResponse( errorResponse );
}
break;
}
// Checking if we need to exit processing (if an error has occurred if onError == Exit)
if ( exit )
{
break;
}
// Getting next request
try
{
request = parser.getNextRequest();
}
catch ( XmlPullParserException e )
{
// We create a new ErrorResponse and return the XML response.
ErrorResponse errorResponse = new ErrorResponse( 0, ErrorResponseType.MALFORMED_REQUEST, I18n.err(
I18n.ERR_02003_LINE_COLUMN, e.getLocalizedMessage(), e.getLineNumber(), e.getColumnNumber() ) );
if ( respWriter != null )
{
writeResponse( respWriter, errorResponse );
}
else
{
batchResponse.addResponse( errorResponse );
}
break;
}
}
if ( respWriter != null )
{
respWriter.write( "</batchResponse>" );
if ( generateSoapResp )
{
respWriter.write( BODY_ENVELOPE );
}
respWriter.flush();
}
}