blob: 736caebd374b7992a4e9fc24a938334e4c44c095 [file] [log] [blame]
/*
* 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.
*/
#include "uima/api.hpp"
#include "uima/dirwalk.hpp"
#include "uima/xmlwriter.hpp"
using namespace std;
using namespace uima;
class XCasWriterCasConsumer : public Annotator {
private:
UnicodeString usOutDir;
std::string strOutDir;
bool writeFile;
int docnum;
/* We have a separate function getConfigValues()
for initialize() and reconfigure()
*/
TyErrorId getConfigValues() {
return (TyErrorId)UIMA_ERR_NONE;
}
public:
XCasWriterCasConsumer(void) {
cout << "XCasWriterCasConsumer: Constructor" << endl;
}
~XCasWriterCasConsumer(void) {
cout << "XCasWriterCasConsumer: Destructor" << endl;
}
/** */
TyErrorId initialize(AnnotatorContext & rclAnnotatorContext) {
cout << "XCasWriterCasConsumer: initialize()" << endl;
if (rclAnnotatorContext.isParameterDefined("OutputDirectory") &&
rclAnnotatorContext.extractValue("OutputDirectory", usOutDir) == UIMA_ERR_NONE) {
/* log the configuration parameter setting */
rclAnnotatorContext.getLogger().logMessage("OutputDirectory = '" + usOutDir + "'");
/* create the directory if it does not exist */
strOutDir = UnicodeStringRef(usOutDir).asUTF8();
util::Location location(strOutDir.c_str());
if (location.isExistent() ) {
writeFile=true;
} else {
location.makeDirectory();
}
writeFile = true;
cout << "XCasWriterCasConsumer::initialize() .. creates xcas files in directory "
<< usOutDir << endl;
} else {
rclAnnotatorContext.getLogger().logMessage("OutputDirectory not specified. XCAS will be written to stdout.");
writeFile=false;
cout << "XCasWriterCasConsumer::initialize() .. writes xcas to standard out. "
<< endl;
}
docnum=0;
return (TyErrorId)UIMA_ERR_NONE;
}
TyErrorId typeSystemInit(TypeSystem const & crTypeSystem) {
cout << "XCasWriterCasConsumer: typeSystemInit()" << endl;
return(TyErrorId)UIMA_ERR_NONE;
}
/** */
TyErrorId destroy() {
cout << "XCasWriterCasConsumer: destroy()" << endl;
return (TyErrorId)UIMA_ERR_NONE;
}
TyErrorId process(CAS & rCAS, const ResultSpecification& spec) {
cout << "XCasWriterCasConsumer: process() begins" << endl;
XCASWriter writer(rCAS, true);
if (writeFile) {
/* construct a filename */
stringstream outfn;
outfn << strOutDir << "/doc" << docnum++ << ".xcas";
outfn << flush;
cout << "XCasWriterCasConsumer::process() xcas file " << outfn.str() << endl;
//open a file stream for output xcas
ofstream file;
file.open (outfn.str().c_str(), ios::out | ios::binary);
if ( !file ) {
cerr << "XCasWriterCasConsumer: Error opening output xcas: " << outfn.str() << endl;
return(TyErrorId) UIMA_ERR_USER_ANNOTATOR_COULD_NOT_PROCESS;
}
writer.write(file);
file.close();
} else {
cout << endl;
writer.write(cout);
cout << endl;
}
cout << "XCasWriterCasConsumer: process() ends" << endl;
return (TyErrorId)UIMA_ERR_NONE;
}
TyErrorId batchProcessComplete() {
cout << "XCasWriterCasConsumer: batchProcessComplete()" << endl;
return (TyErrorId)UIMA_ERR_NONE;
}
TyErrorId collectionProcessComplete() {
cout << "XCasWriterCasConsumer: collectionProcessComplete()" << endl;
return (TyErrorId)UIMA_ERR_NONE;
}
};
// This macro exports an entry point that is used to create the annotator.
MAKE_AE(XCasWriterCasConsumer);