/*
* $Revision: 2523 $
*
* last checkin:
* $Author: gutwenger $
* $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
***************************************************************/
/** \file
* \brief Implementation of auxiliary classes OgmlAttributeValue,
* OgmlAttribute and OgmlTag.
*
* \author Christian Wolf and Bernd Zey
*
* \par License:
* This file is part of the Open Graph Drawing Framework (OGDF).
*
* \par
* Copyright (C)
* See README.txt in the root directory of the OGDF installation for details.
*
* \par
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* Version 2 or 3 as published by the Free Software Foundation;
* see the file LICENSE.txt included in the packaging of this file
* for details.
*
* \par
* This program 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 General Public License for more details.
*
* \par
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* \see http://www.gnu.org/copyleft/gpl.html
***************************************************************/
#ifdef _MSC_VER
#pragma once
#endif
//KK: Commented out the constraint stuff using //o
//CG: compound graph stuff has been removed with commit 2465
#ifndef OGDF_OGML_PARSER_H
#define OGDF_OGML_PARSER_H
#include "Ogml.h"
#include "DinoXmlParser.h"
#include "../basic/Hashing.h"
#include "../basic/String.h"
#include "../cluster/ClusterGraph.h"
#include "../cluster/ClusterGraphAttributes.h"
// constraints
//o#include
namespace ogdf {
//
// ---------- O g m l P a r s e r ------------------------
//
/**Objects of this class represent a validating parser for files in Ogml.
*/
class OgmlParser
{
private:
// struct definitions for mapping of templates
struct OgmlNodeTemplate;
struct OgmlEdgeTemplate;
//struct OgmlLabelTemplate;
struct OgmlSegment;
class OgmlAttributeValue;
class OgmlAttribute;
class OgmlTag;
friend ostream& operator<<(ostream& os, const OgmlParser::OgmlAttribute& oa);
friend ostream& operator<<(ostream& os, const OgmlParser::OgmlTag& ot);
static Hashing *s_tags; //!< Hashtable for saving all ogml tags.
static Hashing *s_attributes; //!< Hashtable for saving all ogml attributes.
static Hashing *s_attValues; //!< Hashtable for saving all values of ogml attributes.
//! Builds hashtables for tags and attributes.
static void buildHashTables();
mutable Ogml::GraphType m_graphType; //!< Saves a graph type. Is set by checkGraphType.
Hashing m_ids; //!< Saves all ids of an ogml-file.
/**
* Checks if all tags (XmlTagObject), their attributes (XmlAttributeObject) and
* their values are valid (are tags expected, do they own the rigth attributes...)
* and sets a valid flag to these. Furthermore it checks if ids of tags are
* unique and if id references are valid.
* See OgmlTag.h for semantics of the encodings.
* Returns the validity state of the current processed tag.
*/
int validate(const XmlTagObject *xmlTag, int ogmlTag);
/**
* Wrapper method for validate method above.
* Returns true when validation is successfull, false otherwise.
*/
//bool validate(const char* fileName);
//! Prints some useful information about un-/successful validation.
void printValidityInfo(const OgmlTag &ot,
const XmlTagObject &xto,
int valStatus,
int line);
/**
* Finds the OGML-tag in the parse tree with the specified id,
* stores the tag in xmlTag
* recTag is the tag for recursive calls
* returns false if something goes wrong
*/
//bool getXmlTagObjectById(XmlTagObject *recTag, String id, XmlTagObject *&xmlTag);
/**
* Checks the graph type and stores it in the member variable m_graphType
* xmlTag has to be the root or the graph or the structure Ogml-tag
* returns false if something goes wrong
*/
bool checkGraphType(const XmlTagObject *xmlTag) const;
//! Returns true iff subgraph is an hierarchical graph.
bool isGraphHierarchical(const XmlTagObject *xmlTag) const;
//! Returns true iff node contains other nodes.
bool isNodeHierarchical(const XmlTagObject *xmlTag) const;
Ogml::GraphType getGraphType() { return m_graphType; };
// id hash tables
// required variables for building
// hash table with id from file and node
Hashing m_nodes;
Hashing m_edges;
Hashing m_clusters;
// hash table for bend-points
Hashing m_points;
// hash table for checking uniqueness of ids
// (key:) int = id in the created graph
// (info:) String = id in the ogml file
Hashing m_nodeIds;
Hashing m_edgeIds;
Hashing m_clusterIds;
// build methods
//! Builds a graph; ignores nodes which have hierarchical structure.
bool buildGraph(Graph &G);
//! Builds a cluster graph.
bool buildCluster(
const XmlTagObject *rootTag,
Graph &G,
ClusterGraph &CG);
//! Recursive part of buildCluster.
bool buildClusterRecursive(
const XmlTagObject *xmlTag,
cluster parent,
Graph &G,
ClusterGraph &CG);
//! Build a cluster graph with style/layout attributes.
bool buildAttributedClusterGraph(
Graph &G,
ClusterGraphAttributes &CGA,
const XmlTagObject *root);
//! Method for setting labels of clusters.
bool setLabelsRecursive(
Graph &G,
ClusterGraphAttributes &CGA,
XmlTagObject *root);
// helping pointer for constraints-loading
// this pointer is set in the building methods
// so we don't have to traverse the tree in buildConstraints
XmlTagObject* m_constraintsTag;
// hashing lists for templates
// string = id
Hashing m_ogmlNodeTemplates;
Hashing m_ogmlEdgeTemplates;
//Hashing m_ogmlLabelTemplates;
// auxiliary methods for mapping graph attributes
//! Returns int value for the pattern.
int getBrushPatternAsInt(String s);
//! Returns the shape as an integer value.
int getShapeAsInt(String s);
//! Maps the OGML attribute values to corresponding GDE values.
String getNodeTemplateFromOgmlValue(String s);
//! Returns the line type as an integer value.
int getLineTypeAsInt(String s);
//! Returns the image style as an integer value.
int getImageStyleAsInt(String s);
//! Returns the alignment of image as an integer value.
int getImageAlignmentAsInt(String s);
// arrow style, actually a "boolean" function
// because it returns only 0 or 1 according to GDE
// sot <=> source or target
int getArrowStyleAsInt(String s, String sot);
// the matching method to getArrowStyleAsInt
GraphAttributes::EdgeArrow getArrowStyle(int i);
// function that operates on a string
// the input string contains "<" instead of "<"
// and ">" instead of ">"
// to disable interpreting the string as xml-tags (by DinoXmlParser)
// so this function substitutes "<" for "<"
String getLabelCaptionFromString(String str);
//! Returns the integer value of the id at the end of the string (if it exists).
bool getIdFromString(String str, int &id);
//! Validiation method.
void validate(const char* fileName);
public:
//! Constructs an OGML parser.
OgmlParser() { }
~OgmlParser() { }
//! Reads a cluster graph \a CG from file \a fileName in OGML format.
/**
* @param fileName is the name of the file to be parsed as OGML file.
* @param G is the graph to be build from the OGML file; must be the graph associated with \a CG.
* @param CG is the cluster graph to be build from the OGML file.
* @return true if succesfull, false otherwise.
*/
bool read(
const char* fileName,
Graph &G,
ClusterGraph &CG);
//! Reads a cluster graph \a CG with attributes \a CGA from file \a fileName in OGML format.
/**
* @param fileName is the name of the file to be parsed as OGML file.
* @param G is the graph to be build from the OGML file; must be the graph associated with \a CG.
* @param CG is the cluster graph to be build from the OGML file.
* @param CGA are the cluster graph attributes (associated with CG) in which layout and style information are stored.
* @return true if succesfull, false otherwise.
*/
bool read(
const char* fileName,
Graph &G,
ClusterGraph &CG,
ClusterGraphAttributes &CGA);
};//end class OGMLParser
}//end namespace ogdf
#endif