blob: 02c3a53470eb8c9eb338288b8fcc761e7218699b [file] [log] [blame]
/** \file xmltypesystemwriter.cpp .
-----------------------------------------------------------------------------
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
-----------------------------------------------------------------------------
Description:
-----------------------------------------------------------------------------
-------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------- */
/* Include dependencies */
/* ----------------------------------------------------------------------- */
#include "uima/pragmas.hpp"
#include "uima/xmltypesystemwriter.hpp"
#include "uima/internal_xmlconstants.hpp"
#include "uima/internal_casimpl.hpp"
/* ----------------------------------------------------------------------- */
/* Constants */
/* ----------------------------------------------------------------------- */
/* ----------------------------------------------------------------------- */
/* Forward declarations */
/* ----------------------------------------------------------------------- */
/* ----------------------------------------------------------------------- */
/* Types / Classes */
/* ----------------------------------------------------------------------- */
using namespace std;
namespace uima {
XMLTypeSystemWriter::XMLTypeSystemWriter(CAS const & crCAS)
: iv_crCAS( crCAS) {}
void XMLTypeSystemWriter::writeType(ostream & os, uima::Type const & crType) const {
UnicodeStringRef typeName( crType.getName() );
os << "<" << uima::internal::XMLConstants::TAGNAME_TYPE
<< " " << uima::internal::XMLConstants::ATTRIBUTENAME_NAME << "=\"" << typeName << "\">" << endl;
vector<uima::Feature> features;
crType.getAppropriateFeatures(features);
size_t i;
for (i=0; i<features.size(); ++i) {
assert( features[i].isValid());
// print only features which are introduced at this type
Type introType;
features[i].getIntroType(introType);
assert( introType.isValid() );
if (introType == crType) {
Type range;
features[i].getRangeType(range);
assert( range.isValid());
os <<"<" << uima::internal::XMLConstants::TAGNAME_FEATURE
<< " " << uima::internal::XMLConstants::ATTRIBUTENAME_NAME << "=\"" << features[i].getName()
<< "\" " << uima::internal::XMLConstants::ATTRIBUTENAME_RANGE << "=\"" << range.getName() << "\"/>" << endl;
// TODO ? add multiRefs ?
}
}
vector<uima::Type> subTypes;
crType.getDirectSubTypes(subTypes);
for (i=0; i<subTypes.size(); ++i) {
assert( subTypes[i].isValid() );
writeType(os, subTypes[i]);
}
os << "</" << uima::internal::XMLConstants::TAGNAME_TYPE << ">" << endl;
}
void XMLTypeSystemWriter::write(std::ostream & os) const {
os << "<?xml version=\"1.0\"?>" << endl;
os << "<!DOCTYPE " << uima::internal::XMLConstants::TAGNAME_TYPEHIERARCHY << " [\n"
"<!ELEMENT " << uima::internal::XMLConstants::TAGNAME_TYPEHIERARCHY << " (type*)>\n"
"<!ELEMENT " << uima::internal::XMLConstants::TAGNAME_TYPE << " (" << uima::internal::XMLConstants::TAGNAME_FEATURE << "|" << uima::internal::XMLConstants::TAGNAME_TYPE << ")*>\n"
"<!ATTLIST " << uima::internal::XMLConstants::TAGNAME_TYPE << " " << uima::internal::XMLConstants::ATTRIBUTENAME_NAME << " CDATA #REQUIRED>\n"
"<!ELEMENT " << uima::internal::XMLConstants::TAGNAME_FEATURE << " EMPTY>\n"
"<!ATTLIST " << uima::internal::XMLConstants::TAGNAME_FEATURE << " " << uima::internal::XMLConstants::ATTRIBUTENAME_NAME << " CDATA #REQUIRED " << uima::internal::XMLConstants::ATTRIBUTENAME_RANGE << " CDATA #REQUIRED >\n"
"]>" << endl;
os << "<" << uima::internal::XMLConstants::TAGNAME_TYPEHIERARCHY << ">" << endl;
Type top = iv_crCAS.getTypeSystem().getTopType();
writeType(os, top);
os << "</" << uima::internal::XMLConstants::TAGNAME_TYPEHIERARCHY << ">" << endl;
}
}
/* ----------------------------------------------------------------------- */
/* Implementation */
/* ----------------------------------------------------------------------- */
/* ----------------------------------------------------------------------- */