summaryrefslogtreecommitdiffstats
path: root/kode/kwsdl/wscl/parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kode/kwsdl/wscl/parser.cpp')
-rw-r--r--kode/kwsdl/wscl/parser.cpp224
1 files changed, 224 insertions, 0 deletions
diff --git a/kode/kwsdl/wscl/parser.cpp b/kode/kwsdl/wscl/parser.cpp
new file mode 100644
index 000000000..129c3c3dc
--- /dev/null
+++ b/kode/kwsdl/wscl/parser.cpp
@@ -0,0 +1,224 @@
+/*
+ This file is part of KDE WSCL Parser
+
+ Copyright (c) 2005 Tobias Koenig <[email protected]>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+ */
+
+#include <qdom.h>
+
+#include "parser.h"
+
+using namespace WSCL;
+
+Parser::Parser()
+{
+}
+
+Parser::~Parser()
+{
+}
+
+void Parser::parse( const QString &xml )
+{
+ QDomDocument doc( "kwscl" );
+ QString errorMsg;
+ int errorLine, errorColumn;
+ bool ok = doc.setContent( xml, true, &errorMsg, &errorLine, &errorColumn );
+ if ( !ok ) {
+ qDebug( "Error parsing wscl (%d:%d) %s", errorLine, errorColumn, errorMsg.latin1() );
+ return;
+ }
+
+ QDomNodeList nodes = doc.elementsByTagName( "Conversation" );
+ if ( nodes.count() <= 0 ) {
+ qDebug( "No conversation tag found in wscl data" );
+ return;
+ }
+
+ QDomElement conversationElement = nodes.item( 0 ).toElement();
+
+ mConversation.setName( conversationElement.attribute( "name" ) );
+ mConversation.setVersion( conversationElement.attribute( "version" ) );
+ mConversation.setDescription( conversationElement.attribute( "description" ) );
+ mConversation.setNameSpace( conversationElement.attribute( "targetNamespace" ) );
+ mConversation.setSchema( conversationElement.attribute( "hrefSchema" ) );
+ mConversation.setInitialInteraction( conversationElement.attribute( "initialInteraction" ) );
+ mConversation.setFinalInteraction( conversationElement.attribute( "finalInteraction" ) );
+
+ QDomNode node = conversationElement.firstChild();
+ while ( !node.isNull() ) {
+ QDomElement element = node.toElement();
+ if ( !element.isNull() ) {
+ if ( element.tagName() == "ConversationInteractions" ) {
+ Interaction::List interactions;
+
+ QDomNode interactionNode = element.firstChild();
+ while ( !interactionNode.isNull() ) {
+ QDomElement interactionElement = interactionNode.toElement();
+ if ( !interactionElement.isNull() ) {
+ if ( interactionElement.tagName() != "Interaction" ) {
+ qDebug( "Expected tag name 'Interaction', got '%s'", interactionElement.tagName().latin1() );
+ continue;
+ }
+
+ Interaction interaction;
+ interaction.setId( interactionElement.attribute( "id" ) );
+ const QString type = interactionElement.attribute( "interactionType" );
+ if ( type == "ReceiveSend" )
+ interaction.setType( Interaction::ReceiveSend );
+ else if ( type == "SendReceive" )
+ interaction.setType( Interaction::SendReceive );
+ else if ( type == "Receive" )
+ interaction.setType( Interaction::Receive );
+ else if ( type == "Send" )
+ interaction.setType( Interaction::Send );
+ else if ( type == "Empty" )
+ interaction.setType( Interaction::Empty );
+ else
+ qDebug( "Unknown interaction type '%s'", type.latin1() );
+
+ XMLDocument::List inputDocuments;
+ XMLDocument::List outputDocuments;
+ XMLDocument inputDocument;
+ XMLDocument outputDocument;
+
+ QDomNode contentNode = interactionElement.firstChild();
+ while ( !contentNode.isNull() ) {
+ QDomElement contentElement = contentNode.toElement();
+ if ( !contentElement.isNull() ) {
+ const QString tagName = contentElement.tagName();
+ if ( tagName == "InboundXMLDocument" ) {
+ XMLDocument document;
+ document.setId( contentElement.attribute( "id" ) );
+ document.setSchema( contentElement.attribute( "hrefSchema" ) );
+
+ inputDocuments.append( document );
+ inputDocument = document;
+ } else if ( tagName == "OutboundXMLDocument" ) {
+ XMLDocument document;
+ document.setId( contentElement.attribute( "id" ) );
+ document.setSchema( contentElement.attribute( "hrefSchema" ) );
+
+ outputDocuments.append( document );
+ outputDocument = document;
+ }
+ }
+
+
+ contentNode = contentNode.nextSibling();
+ }
+
+ switch ( interaction.type() ) {
+ case Interaction::ReceiveSend:
+ {
+ ReceiveSendDocument document;
+ document.setInputDocument( inputDocument );
+ document.setOutputDocuments( outputDocuments );
+ interaction.setReceiveSendDocument( document );
+ }
+ break;
+ case Interaction::SendReceive:
+ {
+ SendReceiveDocument document;
+ document.setInputDocuments( inputDocuments );
+ document.setOutputDocument( outputDocument );
+ interaction.setSendReceiveDocument( document );
+ }
+ break;
+ case Interaction::Receive:
+ {
+ ReceiveDocument document;
+ document.setInputDocument( inputDocument );
+ interaction.setReceiveDocument( document );
+ }
+ break;
+ case Interaction::Send:
+ {
+ SendDocument document;
+ document.setOutputDocument( outputDocument );
+ interaction.setSendDocument( document );
+ }
+ break;
+ case Interaction::Empty:
+ default:
+ break;
+ }
+
+ interactions.append( interaction );
+ }
+
+ interactionNode = interactionNode.nextSibling();
+ }
+
+ mConversation.setInteractions( interactions );
+
+ } else if ( element.tagName() == "ConversationTransitions" ) {
+ Transition::List transitions;
+
+ QDomNode transitionNode = element.firstChild();
+ while ( !transitionNode.isNull() ) {
+ QDomElement transitionElement = transitionNode.toElement();
+ if ( !transitionElement.isNull() ) {
+ if ( transitionElement.tagName() != "Transition" ) {
+ qDebug( "Expected tag name 'Transition', got '%s'", transitionElement.tagName().latin1() );
+ continue;
+ }
+
+ Transition transition;
+
+ QDomNode contentNode = transitionElement.firstChild();
+ while ( !contentNode.isNull() ) {
+ QDomElement contentElement = contentNode.toElement();
+ if ( !contentElement.isNull() ) {
+ const QString tagName = contentElement.tagName();
+ if ( tagName == "SourceInteraction" )
+ transition.setSourceInteraction( contentElement.attribute( "href" ) );
+ else if ( tagName == "DestinationInteraction" )
+ transition.setDestinationInteraction( contentElement.attribute( "href" ) );
+ else if ( tagName == "SourceInteractionCondition" )
+ transition.setSourceInteractionCondition( contentElement.attribute( "href" ) );
+ else
+ qDebug( "Unknown transition element %s", tagName.latin1() );
+ }
+
+ contentNode = contentNode.nextSibling();
+ }
+
+ transitions.append( transition );
+ }
+
+ transitionNode = transitionNode.nextSibling();
+ }
+
+ mConversation.setTransitions( transitions );
+ }
+ }
+
+ node = node.nextSibling();
+ }
+}
+
+void Parser::reset()
+{
+ mConversation = Conversation();
+}
+
+Conversation Parser::conversation() const
+{
+ return mConversation;
+}