Skip to content
Snippets Groups Projects
Commit a4ebb62b authored by Jan Reher's avatar Jan Reher
Browse files

Refactored serialListReader class and maxeseriallist.cxx

parent cd28e0bf
No related branches found
No related tags found
No related merge requests found
cmake_minimum_required(VERSION 3.1)
project(apdBatchSetter)
project(apdTools)
find_package(Qt5 COMPONENTS Core Gui Widgets Network Xml)
......
......@@ -6,26 +6,66 @@
using namespace std;
void processParameters(int argc, char *argv[]);
int entryExistsInArgList(int argc, char *argv[], std::string parameterName);
void getSerialListAsStringsFromDatabase();
void convertStringListToNumbers();
void outputApdsInRange();
static bool debug = false;
static vector<string> serialListString;
static vector<unsigned long> serialList;
static unsigned long serialMin;
static unsigned long serialMax;
int main(int argc, char *argv[]) {
if (argc != 3) {
cerr << "Too few or too many parameters!" << endl;
return 1;
}
processParameters(argc, argv);
QCoreApplication *_app = new QCoreApplication(argc,argv);
serialListReader *_reader = new serialListReader(false);
vector<string> serialListString = _reader->getFullList();
vector<unsigned int> serialList;
serialList.clear();
getSerialListAsStringsFromDatabase();
convertStringListToNumbers();
outputApdsInRange();
_app->exit(0);
return 0;
}
void processParameters(int argc, char *argv[]) {
if ( argc == 4 && entryExistsInArgList(argc, argv, "debug")) {
debug = true;
}
else if (argc != 3 ) {
cerr << "Too few or too many parameters!\n"
<< "Pass first and last serial of range." << endl;
exit(1);
}
serialMin = stoul(argv[1]);
serialMax = stoul(argv[2]);
}
int entryExistsInArgList(int argc, char *argv[], std::string parameterName) {
for (int i = 0; i < argc; i++) {
if (argv[i] == parameterName) return true;
}
return false;
}
void getSerialListAsStringsFromDatabase() {
serialListReader *_reader = new serialListReader(debug);
serialListString = _reader->getListOfSerials();
}
void convertStringListToNumbers() {
serialList.clear();
for ( size_t i = 0 ; i < serialListString.size() ; i++) serialList.push_back( stoul( serialListString[i] ) );
if ( serialListString.size() != serialList.size() ) {
cerr << "ERROR: Sizes don't match!" << endl;
return 1;
exit(2);
}
}
unsigned int serialMin = stoul(argv[1]);
unsigned int serialMax = stoul(argv[2]);
void outputApdsInRange() {
int numOut = 0;
for ( size_t i = 0 ; i < serialList.size() ; i++) {
if ( serialList [i] >= serialMin && serialList [i] <= serialMax ) {
......@@ -34,5 +74,4 @@ int main(int argc, char *argv[]) {
}
}
cerr << "Found " << numOut << " APDs in the given range." << endl;
return 0;
}
......@@ -13,71 +13,88 @@
#include <QtCore/QUrl>
#include <QtNetwork/QNetworkAccessManager>
serialListReader::serialListReader(bool debug = false)
: _netman ( new QNetworkAccessManager ( this ) ) {
serialListReader::serialListReader( bool debug )
: networkManager ( new QNetworkAccessManager ( this ) ) {
_debug = debug;
getAndProcessData();
}
std::vector<std::string> serialListReader::getFullList() {
void serialListReader::getAndProcessData() {
try {
if ( _debug )
std::cout << "Initiating network request to https://ep1.ruhr-uni-bochum.de/endcapProductionDB/api/apd_details_listall.php" << std::endl;
QNetworkReply* apddetails = _netman->get ( QNetworkRequest ( QUrl ( "https://ep1.ruhr-uni-bochum.de/endcapProductionDB/api/apd_details_listall.php" ) ) );
connect ( apddetails, SIGNAL ( finished() ), &_waitForNetwork, SLOT ( quit() ) );
_waitForNetwork.exec();
if ( _debug )
std::cout << "Done, received reply." << std::endl;
if ( apddetails->attribute ( QNetworkRequest::HttpStatusCodeAttribute ).toInt() != 200 ) {
const QString exceptionMsg = QString::fromUtf8 ( "HTTP error while invoking Production DB Web API: The server returned HTTP status code %1." ).arg ( apddetails->attribute ( QNetworkRequest::HttpStatusCodeAttribute ).toInt() );
throw std::runtime_error ( exceptionMsg.toUtf8().constData() );
}
QDomDocument dom;
QString errorMsg;
int errorLine;
int errorColumn;
if ( _debug )
std::cout << "Setting content of network reply to QDomDocument, verifying response..." << std::endl;
if ( !dom.setContent ( apddetails, &errorMsg, &errorLine, &errorColumn ) ) {
const QString exceptionMsg = QString::fromUtf8 ( "Error in parsing data" );
throw std::runtime_error ( exceptionMsg.toUtf8().constData() );
}
if ( dom.documentElement().nodeName() != QString::fromUtf8 ( "productiondb" )
|| dom.documentElement().firstChild().nodeName() != QString::fromUtf8 ( "request" ) )
throw std::runtime_error ( "APD data has invalid format." );
QDomNode requestResult = dom.documentElement().firstChild();
if ( !requestResult.attributes().contains ( QString::fromUtf8 ( "successful" ) )
|| !requestResult.attributes().contains ( QString::fromUtf8 ( "error_number" ) ) )
throw std::runtime_error ( "APD data has invalid format." );
if ( requestResult.attributes().namedItem ( QString::fromUtf8 ( "successful" ) ).nodeValue() !=
QString::fromUtf8 ( "true" ) ) {
const QString exceptionMsg = QString::fromUtf8 ( "Server reports error %1 when querying data" );
throw std::runtime_error ( exceptionMsg.toUtf8().constData() );
}
if ( _debug )
std::cout << "Response OK, extracting data..." << std::endl;
const QDomNodeList nodeListApds = dom.documentElement().elementsByTagName ( QString::fromUtf8 ( "apd" ) );
if ( _debug )
std::cout << "Got " << nodeListApds.length() << " APDs!" << std::endl;
getApdListFromNetwork();
verifyHttpResponse();
getDataFromReply();
verifyDataFormat();
verifyQuerySuccess();
getApdNodeList();
readyToReadData = true;
}
catch ( std::exception& e ) {
std::cerr << e.what() << std::endl;
readyToReadData = false;
}
}
std::vector<std::string> serialList;
serialList.clear();
for ( size_t i = 0; i < nodeListApds.length(); i++ ) {
QDomNode apdNode = nodeListApds.item ( i );
std::string serial = apdNode.attributes().namedItem ( QString::fromUtf8 ( "serial" ) ).nodeValue().toStdString();
serialList.push_back(serial);
}
if ( _debug )
std::cout << "Returning serial list with " << serialList.size() << " entries!" << std::endl;
return serialList;
void serialListReader::getApdListFromNetwork() {
if ( _debug )
std::cout << "Initiating network request to " << fullApdListApiUrl << std::endl;
replyWithFullList = networkManager->get ( QNetworkRequest ( QUrl ( fullApdListApiUrl.c_str() ) ) );
connect ( replyWithFullList, SIGNAL ( finished() ), &_waitForNetwork, SLOT ( quit() ) );
_waitForNetwork.exec();
if ( _debug )
std::cout << "Done, received reply." << std::endl;
}
void serialListReader::verifyHttpResponse() {
if ( replyWithFullList->attribute ( QNetworkRequest::HttpStatusCodeAttribute ).toInt() != 200 ) {
const QString exceptionMsg = QString::fromUtf8 ( "HTTP error while invoking Production DB Web API: The server returned HTTP status code %1." ).arg ( replyWithFullList->attribute ( QNetworkRequest::HttpStatusCodeAttribute ).toInt() );
throw std::runtime_error ( exceptionMsg.toUtf8().constData() );
}
}
void serialListReader::getDataFromReply() {
QString errorMsg;
int errorLine;
int errorColumn;
documentFromNetworkReply = new QDomDocument();
if ( _debug )
std::cout << "Setting content of network reply to QDomDocument, verifying response..." << std::endl;
if ( !documentFromNetworkReply->setContent ( replyWithFullList, &errorMsg, &errorLine, &errorColumn ) ) {
const QString exceptionMsg = QString::fromUtf8 ( "Error in parsing data" );
throw std::runtime_error ( exceptionMsg.toUtf8().constData() );
}
}
void serialListReader::verifyDataFormat() {
if ( documentFromNetworkReply->documentElement().nodeName() != QString::fromUtf8 ( "productiondb" )
|| documentFromNetworkReply->documentElement().firstChild().nodeName() != QString::fromUtf8 ( "request" ) )
throw std::runtime_error ( "APD data has invalid format." );
QDomNode requestResult = documentFromNetworkReply->documentElement().firstChild();
if ( !requestResult.attributes().contains ( QString::fromUtf8 ( "successful" ) )
|| !requestResult.attributes().contains ( QString::fromUtf8 ( "error_number" ) ) )
throw std::runtime_error ( "APD data has invalid format." );
}
void serialListReader::verifyQuerySuccess() {
QDomNode requestResult = documentFromNetworkReply->documentElement().firstChild();
if ( requestResult.attributes().namedItem ( QString::fromUtf8 ( "successful" ) ).nodeValue() != QString::fromUtf8 ( "true" ) ) {
const QString exceptionMsg = QString::fromUtf8 ( "Server reports error %1 when querying data" );
throw std::runtime_error ( exceptionMsg.toUtf8().constData() );
}
}
void serialListReader::getApdNodeList() {
nodeListApds = new QDomNodeList( documentFromNetworkReply->documentElement().elementsByTagName ( QString::fromUtf8 ( "apd" ) ) );
if ( _debug )
std::cout << "Got " << nodeListApds->length() << " APDs!" << std::endl;
}
std::vector<std::string> serialListReader::getListOfSerials() {
try {
return getSerialListIfDataCanBeRead();
}
catch ( std::exception& e ) {
std::cerr << e.what() << std::endl;
......@@ -86,3 +103,22 @@ std::vector<std::string> serialListReader::getFullList() {
return serialList;
}
}
std::vector<std::string> serialListReader::getSerialListIfDataCanBeRead() {
if (!readyToReadData) throw std::runtime_error ( "No data loaded that can be read!" );
std::vector<std::string> serialList = getSerialListFromNodeList();
if ( _debug )
std::cout << "Returning serial list with " << serialList.size() << " entries!" << std::endl;
return serialList;
}
std::vector<std::string> serialListReader::getSerialListFromNodeList() {
std::vector<std::string> serialList;
serialList.clear();
for ( int i = 0; i < nodeListApds->length(); i++ ) {
QDomNode apdNode = nodeListApds->item ( i );
std::string serial = apdNode.attributes().namedItem ( QString::fromUtf8 ( "serial" ) ).nodeValue().toStdString();
serialList.push_back(serial);
}
return serialList;
}
......@@ -5,17 +5,36 @@
#include <QtCore/QEventLoop>
class QNetworkAccessManager;
class QNetworkReply;
class QDomDocument;
class QDomNodeList;
class serialListReader : public QObject {
private:
bool _debug = true;
QNetworkAccessManager* _netman;
bool _debug = false;
bool readyToReadData = false;
const std::string fullApdListApiUrl = "https://ep1.ruhr-uni-bochum.de/endcapProductionDB/api/apd_details_listall.php";
QNetworkAccessManager* networkManager;
QNetworkReply *replyWithFullList;
QDomDocument *documentFromNetworkReply;
QDomNodeList *nodeListApds;
QEventLoop _waitForNetwork;
const QString _apdDetailsApiUrl;
void getApdListFromNetwork();
void verifyHttpResponse();
void getDataFromReply();
void verifyDataFormat();
void verifyQuerySuccess();
void getApdNodeList();
std::vector<std::string> getSerialListIfDataCanBeRead();
std::vector<std::string> getSerialListFromNodeList();
public:
serialListReader(bool debug);
std::vector<std::string> getFullList();
serialListReader(bool debug = false);
void getAndProcessData();
std::vector<std::string> getListOfSerials();
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment