TransitionList
PolicyDocumentClass::getTransitions(const QString& patternName) const
{
    TransitionList list;

    // get DOM node of the given pattern //
    QDomNode patternNode = getPatternNode(patternName);

    // check for each child: if it is a transition -> add to list //
    QDomNode node = patternNode.firstChild();
    while(!node.isNull()) {

        // if tagName == "transition" -> add a transition object to the list //
        if (node.toElement().tagName() == XML_TAG_TRANSITION) {

            QString message = node.toElement().attribute("message");
            QString target  = node.toElement().attribute("target");

            Transition transition(message, target);
            list.push_back(transition);
        }

        node = node.nextSibling();
    }

    return list;
}
Пример #2
0
TransitionList AnnotationMatcher::buildTransitions( const text::Node & node, const Context & context ) const {
	TransitionList transitions;

	for ( uint i = 0, sz = node.getTransitions().size(); i < sz; ++ i )
		if ( matchTransition( *node.getTransition( i ), context ) )
			transitions.push_back( node.getTransition( i ) );

	return transitions;
}
void
PatternWidgetClass::drawArrows(QPainter * p)
{
  PolicyViewClass& daddy = getView();

  p->setPen(darkGreen);
  
  // get list with transitions //
  TransitionList transitionList = getDocument().getTransitions(patternName);

  const int Zeilenabstand=10;
  int DrawX1, DrawX2, DrawY1, DrawY2,OldDrawX1, OldDrawX2, OldDrawY1, OldDrawY2,i;
  // show all transitions //
  OldDrawX1=-1;
  OldDrawX2=-1;
  OldDrawY1=-1;
  OldDrawY2=-1;
  
  QMap<QString, int> map;
  for (TransitionList::iterator it = transitionList.begin(); 
       it != transitionList.end(); ++it ) {
    QString message = it->getMessage();
    QString target  = it->getTarget();
    map[target] = map[target] + 1;
    
    int x2 = getDocument().getX(target);
    int y2 = getDocument().getY(target);

    if (daddy.childX(this) < x2) { 
      DrawX1 = daddy.childX(this)+width(); 
      DrawY1 = daddy.childY(this);  
      DrawX2 = x2;  
      DrawY2 = y2; 
    }

    else { 
      DrawX1 = daddy.childX(this);
      DrawY1 = daddy.childY(this)+height(); 
      DrawX2 = x2+width();    
      DrawY2 = y2+PATTERN_NAME_HEIGHT +
	BEHAVIOUR_NAME_HEIGHT * getDocument().getNumBehaviours(target) +
	2*frameWidth(); 
    } 
    
    drawArrow(p, DrawX1, DrawY1, DrawX2, DrawY2, 10);
    i=map[target]-1;
    p->drawText( (DrawX1+DrawX2)/2, (DrawY1+DrawY2)/2+i*Zeilenabstand, message);
    
  }
}
Пример #4
0
static void processCompoundPattern( const PatternMatchState & state, TransitionList & newTransitions ) {
	const Node & currentNode = state.getCurrentNode();

	if ( state.isComplete() ) { // Сопоставление завершено
		Match::AttributesMap attributes;

		state.context.addAttributes( attributes, state.getAlternative().getBindings() ); // Строим набор аттрибутов

		for ( uint i = 0; i < newTransitions.size(); ++ i ) {
			Match & match = static_cast<Match&>( *newTransitions[i] );

			if ( match.equals( state.getAlternative().getPattern(), state.startNode, currentNode, attributes ) ) {
				match.addVariant( state.releaseVariant() );
				return; // Если сопоставление уже было найдено
			}
		}

		newTransitions.push_back( new Match( state.startNode, currentNode, state.getAlternative().getPattern(), state.releaseVariant(), attributes ) ); // TODO Optimize

		return;
	}

	ChainList chains;

	if ( const AnnotationMatcher * curMatcher = dynamic_cast<const AnnotationMatcher *>( &state.getCurrentMatcher() ) ) {
		TransitionList nextTransitions = curMatcher->buildTransitions( currentNode, state.context );

		for ( uint i = 0, sz = nextTransitions.size(); i < sz; ++ i ) {
			PatternMatchState temp_state( state, nextTransitions[ i ], i == sz );
			processCompoundPattern( temp_state, newTransitions );
		}
	} else {
		const AnnotationChainMatcher & chainMatcher = static_cast<const AnnotationChainMatcher &>( state.getCurrentMatcher() );

		chains.clear();
		chainMatcher.buildChains( state.getCurrentNode(), state.context, chains );

		for ( uint i = 0, sz = chains.size(); i < sz; ++ i ) {
			PatternMatchState temp_state( state, chains[i].first, chains[i].second, i == sz - 1  );
			processCompoundPattern( temp_state, newTransitions);
		}
	}
}
Пример #5
0
TransitionList PatternMatcher::buildTransitions( const text::Node & node, const Context & context ) const {
	TransitionList newTransitions;

	if ( node.text.isMatchesReady( pattern ) ) {
		uint start = node.getTokenCount() + node.getWordCount();
		uint end = node.getTransitionCount();

		for ( uint i = start; i < end; ++ i ) // Перебираем все сопоставления из текущей вершины
			if ( matchTransition( *node.getTransition( i ), context ) )
				newTransitions.push_back( node.getTransition( i ) );
	} else {
		for ( uint i = 0; i < pattern.alternatives.size(); ++ i ) {
			PatternMatchState state( pattern, pattern.alternatives[i], node );
			processCompoundPattern( state, newTransitions );
		}
	}

	return newTransitions;
}
Пример #6
0
void Normalization::appendToString( std::string & str, const TransitionList & transitions ) const {
	for ( uint i = 0; i < transitions.size(); ++ i )
		appendToString( str, *transitions[ i ] );
}