void kill(OSCommandLine *oscommandline, OSnl2OS* nl2OS) { FileUtil *fileUtil = NULL; fileUtil = new FileUtil(); std::string osplOutput = ""; OSSolverAgent* osagent = NULL; try { if (oscommandline->serviceLocation != "") { osagent = new OSSolverAgent(oscommandline->serviceLocation); if (oscommandline->osol == "") { // we need to construct the OSoL OSOption *osOption = NULL; osOption = new OSOption(); // get a jobId if necessary if (oscommandline->jobID == "") throw ErrorClass("there is no JobID"); //set the jobID osOption->setJobID( oscommandline->jobID); // now read the osOption object into a string OSoLWriter *osolWriter = NULL; osolWriter = new OSoLWriter(); oscommandline->osol = osolWriter->writeOSoL( osOption); delete osOption; osOption = NULL; delete osolWriter; osolWriter = NULL; } osplOutput = osagent->kill(oscommandline->osol); if (oscommandline->osplOutputFile != "") fileUtil->writeFileFromString(oscommandline->osplOutputFile, osplOutput); else osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_summary, osplOutput); delete osagent; osagent = NULL; } else { delete osagent; osagent = NULL; throw ErrorClass("please specify service location (url)"); } delete fileUtil; fileUtil = NULL; } catch (const ErrorClass& eclass) { reportErrors(oscommandline, eclass.errormsg, nl2OS); if (osagent != NULL) delete osagent; osagent = NULL; delete fileUtil; fileUtil = NULL; } }//end kill
/** Deal with the OSrL output generated by the call to one of the service methods */ void reportResults(OSCommandLine *oscommandline, std::string osrl, OSnl2OS* nl2OS) { ostringstream outStr; if (oscommandline->osrlFile == "") oscommandline->osrlFile = oscommandline->nlFile + ".osrl"; FileUtil* fileUtil = new FileUtil(); fileUtil->writeFileFromString(oscommandline->osrlFile, osrl); if (oscommandline->browser != "") { std::string str = oscommandline->browser + " " + oscommandline->osrlFile; const char *ch = &str[0]; std::system(ch); } // now put solution back to ampl OSosrl2ampl *solWriter = new OSosrl2ampl(); try { std::cout << osrl << std::endl << std::endl; // fileUtil->writeFileFromString(oscommandline->osrlFile, osrl); std::string::size_type pos1 = osrl.find( "error"); if(pos1 == std::string::npos) { OSrLReader *osrlreader = new OSrLReader(); OSResult *osresult = osrlreader->readOSrL( osrl); solWriter->writeSolFile(osrl, nl2OS->getASL("asl"), oscommandline->nlFile + ".sol"); delete osrlreader; osrlreader = NULL; } else // there was an error { osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_error, osrl); solWriter->writeSolFile(osrl, nl2OS->getASL("asl"), oscommandline->nlFile + ".sol"); } if (fileUtil != NULL) delete fileUtil; fileUtil = NULL; } catch(const ErrorClass& eclass) { outStr.str(""); outStr.clear(); outStr << "There was an error parsing the OSrL string" << endl << eclass.errormsg << endl << endl; osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_debug, outStr.str()); if (fileUtil != NULL) delete fileUtil; fileUtil = NULL; } }// reportResults
int main(int argc, char **argv) { WindowsErrorPopupBlocker(); std::ostringstream outStr; OSnl2OS *nl2OS = new OSnl2OS(); OSiLReader* osilreader = new OSiLReader(); FileUtil *fileUtil = NULL; ostringstream echo_cl; // initialize the command line structure OSCommandLine *oscommandline;// = new OSCommandLine(); OSCommandLineReader *oscommandlinereader = new OSCommandLineReader(); DefaultSolver *solverType = NULL; char* stub = NULL; if (argc > 0) stub = argv[1]; // getting the OSAmplClient_options into a std::string is a bit of a pain... char* temp = getenv("OSAmplClient_options"); ostringstream temp2; std::string amplclient_options; if (temp != NULL) { temp2 << temp; amplclient_options = temp2.str(); std::cout << amplclient_options << std::endl; } else // amplclient_options = ""; amplclient_options = "serviceMethod retrieve serviceLocation http://74.94.100.129:8080/OSServer/services/OSSolverService printLevel 4 jobID gus-10-apr-2013-0001"; // this output must be held in abeyance until the command line // has been processed and printLevel has been set... #ifndef NDEBUG echo_cl << "HERE ARE THE AMPLCLIENT OPTIONS "; echo_cl << amplclient_options; echo_cl << endl << endl; echo_cl << "Try to open file "; echo_cl << stub << ".nl"; echo_cl << endl; #endif // Now read the command line try { oscommandline = oscommandlinereader->readCommandLine(amplclient_options); } catch (const ErrorClass& eclass) { reportErrors(oscommandline, eclass.errormsg, nl2OS); delete oscommandlinereader; oscommandlinereader = NULL; return 1; } if (stub) oscommandline->nlFile = stub; /** Deal with action items: -printLevel, -logFile, -filePrintLevel, --help, --version **/ try { outStr.str(""); outStr.clear(); outStr << std::endl << "using print level " << oscommandline->printLevel << " for stdout" << std::endl; if (oscommandline->printLevel != DEFAULT_OUTPUT_LEVEL) { osoutput->SetPrintLevel("stdout", (ENUM_OUTPUT_LEVEL)oscommandline->printLevel); #ifndef NDEBUG osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_trace, echo_cl.str()); #endif osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_info, outStr.str()); } #ifndef NDEBUG else { osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_trace, echo_cl.str()); osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_debug, outStr.str()); } #endif if (oscommandline->logFile != "") { int status = osoutput->AddChannel(oscommandline->logFile); switch(status) { case 0: osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_info, "Added channel " + oscommandline->logFile); break; case 1: osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_info, "Output channel " + oscommandline->logFile + " previously defined"); break; default: throw ErrorClass("Could not add output channel " + oscommandline->logFile); }//end switch outStr.str(""); outStr.clear(); outStr << std::endl << "using print level " << oscommandline->filePrintLevel; outStr << " for " << oscommandline->logFile << std::endl; if (oscommandline->filePrintLevel != DEFAULT_OUTPUT_LEVEL) { osoutput->SetPrintLevel(oscommandline->logFile, (ENUM_OUTPUT_LEVEL)oscommandline->filePrintLevel); } else { osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_debug, outStr.str()); } } if (oscommandline->invokeHelp == true) { outStr.str(""); outStr.clear(); outStr << std::endl << std::endl << get_help() << std::endl; osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_always, outStr.str()); delete oscommandlinereader; oscommandlinereader = NULL; return 0; } if (oscommandline->writeVersion == true) { outStr.str(""); outStr.clear(); outStr << std::endl << std::endl << OSgetVersionInfo() << std::endl; osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_always, outStr.str()); delete oscommandlinereader; oscommandlinereader = NULL; return 0; } } catch (const ErrorClass& eclass) { reportErrors(oscommandline, eclass.errormsg, nl2OS); delete oscommandlinereader; oscommandlinereader = NULL; return 1; } #ifndef NDEBUG outStr.str(""); outStr.clear(); outStr << "HERE ARE THE OPTION VALUES:" << endl; if(oscommandline->configFile != "") outStr << "Config file = " << oscommandline->configFile << endl; if(oscommandline->osilFile != "") outStr << "OSiL file = " << oscommandline->osilFile << endl; if(oscommandline->osolFile != "") outStr << "OSoL file = " << oscommandline->osolFile << endl; if(oscommandline->osrlFile != "") outStr << "OSrL file = " << oscommandline->osrlFile << endl; //if(oscommandline->insListFile != "") outStr << "Instruction List file = " << oscommandline->insListFile << endl; if(oscommandline->osplInputFile != "") outStr << "OSpL Input file = " << oscommandline->osplInputFile << endl; if(oscommandline->serviceMethod != "") outStr << "Service Method = " << oscommandline->serviceMethod << endl; if(oscommandline->mpsFile != "") outStr << "MPS File Name = " << oscommandline->mpsFile << endl; if(oscommandline->nlFile != "") outStr << "NL File Name = " << oscommandline->nlFile << endl; if(oscommandline->gamsControlFile != "") outStr << "gams Control File Name = " << oscommandline->gamsControlFile << endl; if(oscommandline->browser != "") outStr << "Browser Value = " << oscommandline->browser << endl; if(oscommandline->solverName != "") outStr << "Selected Solver = " << oscommandline->solverName << endl; if(oscommandline->serviceLocation != "") outStr << "Service Location = " << oscommandline->serviceLocation << endl; if(oscommandline->jobID != "") outStr << "Job ID = " << oscommandline->jobID << endl; if(oscommandline->printModel) outStr << "print model prior to solve/send" << endl; if(oscommandline->printRowNumberAsString != "") outStr << "print model row " << oscommandline->printRowNumberAsString << " prior to solve/send" << endl; outStr << "print level for stdout: " << oscommandline->printLevel << endl; if(oscommandline->logFile != "") { outStr << "also send output to " << oscommandline->logFile << endl; outStr << "print level for file output: " << oscommandline->filePrintLevel << endl; } osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_debug, outStr.str()); #endif //convert solver name to lower case so there is no ambiguity unsigned int k; for (k = 0; k < oscommandline->solverName.length(); k++) { oscommandline->solverName[k] = (char)tolower(oscommandline->solverName[k]); } // now call the correct serviceMethod // solve is the default if (oscommandline->serviceMethod == "") oscommandline->serviceMethod = "solve"; try { // for local use only the solve method is available if (oscommandline->serviceLocation == "") if (oscommandline->serviceMethod != "solve") throw ErrorClass("No serviceLocation given. Only \'solve\' is available locally."); if (oscommandline->serviceMethod[0] == 's') { // for solve or send commands we must have an instance if (oscommandline->osil == "") { if (!findInstance(oscommandline, nl2OS)) throw ErrorClass("No instance could be found"); } // write out the model or portion thereof, if directed by the user if (oscommandline->printModel == true) { if (oscommandline->osinstance == NULL) { oscommandline->osinstance = osilreader->readOSiL(oscommandline->osil); } osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_always, oscommandline->osinstance->printModel()); } else if (oscommandline->printRowNumberAsString != "") { if (oscommandline->osinstance == NULL) { oscommandline->osinstance = osilreader->readOSiL(oscommandline->osil); } doPrintRow(oscommandline->osinstance, oscommandline->printRowNumberAsString); } // write the instance to an OSiL file, if directed by the user if (oscommandline->osilOutputFile != "") { fileUtil = new FileUtil(); if (oscommandline->osil == "") { OSiLWriter* osilwriter = new OSiLWriter(); oscommandline->osil = osilwriter->writeOSiL(oscommandline->osinstance); delete osilwriter; osilwriter = NULL; } fileUtil->writeFileFromString(oscommandline->osilOutputFile, oscommandline->osil); delete fileUtil; fileUtil = NULL; } // write the solver options to an OSoL file, if directed by the user if (oscommandline->osolOutputFile != "") { fileUtil = new FileUtil(); if (oscommandline->osol != "" && oscommandline->osoption == NULL) fileUtil->writeFileFromString(oscommandline->osolOutputFile, oscommandline->osol); else { if (oscommandline->osoption == NULL) oscommandline->osoption = new OSOption(); OSoLWriter* osolwriter = new OSoLWriter(); fileUtil->writeFileFromString(oscommandline->osolOutputFile, osolwriter->writeOSoL(oscommandline->osoption)); delete osolwriter; osolwriter = NULL; } delete fileUtil; fileUtil = NULL; } // if no serviceLocation was given, do a local solve if (oscommandline->serviceLocation == "") { std::string osrl; if (oscommandline->osinstance != NULL) if (oscommandline->osoption != NULL) osrl = runSolver(oscommandline->solverName, oscommandline->osoption, oscommandline->osinstance); else osrl = runSolver(oscommandline->solverName, oscommandline->osol, oscommandline->osinstance); else if (oscommandline->osoption != NULL) osrl = runSolver(oscommandline->solverName, oscommandline->osoption, oscommandline->osil); else osrl = runSolver(oscommandline->solverName, oscommandline->osol, oscommandline->osil); reportResults(oscommandline, osrl, nl2OS); } // remote solve or send else { if (oscommandline->serviceMethod[1] == 'e') send(oscommandline, nl2OS); else solve(oscommandline, nl2OS); } } else //call one of the other methods { switch (oscommandline->serviceMethod[0]) { case 'g': getJobID(oscommandline, nl2OS); break; case 'r': retrieve(oscommandline, nl2OS); break; case 'k': if (oscommandline->serviceMethod[1] == 'i') kill(oscommandline, nl2OS); else knock(oscommandline, nl2OS); break; default: break; } } // garbage collection if (osilreader != NULL) delete osilreader; oscommandline->osinstance = NULL; osilreader = NULL; delete oscommandlinereader; oscommandlinereader = NULL; delete fileUtil; fileUtil = NULL; if (nl2OS != NULL) delete nl2OS; nl2OS = NULL; return 0; } catch (const ErrorClass& eclass) { reportErrors(oscommandline, eclass.errormsg, nl2OS); if (osilreader != NULL) delete osilreader; oscommandline->osinstance = NULL; osilreader = NULL; delete oscommandlinereader; oscommandlinereader = NULL; delete fileUtil; fileUtil = NULL; if (nl2OS != NULL) delete nl2OS; nl2OS = NULL; return 1; } }// end of main()
bool callServiceMethod(OSCommandLine* oscommandline) { FileUtil *fileUtil = new FileUtil(); try { bool result; OSServiceMethods *osservicemethods; osservicemethods = new OSServiceMethods(oscommandline); if (oscommandline->printModel) oscommandline->osinstance->printModel(); if (oscommandline->printRowNumberAsString != "") oscommandline->osinstance->printModel(atoi((oscommandline->printRowNumberAsString).c_str())); result = osservicemethods->executeServiceMethod(oscommandline); // deal with the output if (result == false) throw ErrorClass(osservicemethods->resultString); else { if (oscommandline->serviceMethod == "getJobID") { std::cout << "The job ID generated by the system is:" << std::endl << std::endl; std::cout << osservicemethods->resultString << std::endl << std::endl; std::cout << "Be sure to make a record of this job ID for later." << std::endl; std::cout << "You will need it to retrieve the job or inquire into its status." << std::endl; } else if (oscommandline->serviceMethod == "solve" || oscommandline->serviceMethod == "retrieve") { if (oscommandline->osrlFile != "") { fileUtil->writeFileFromString(oscommandline->osrlFile, osservicemethods->resultString); if (oscommandline->browser != "") { std::string str = oscommandline->browser + " " + oscommandline->osrlFile; const char *ch = &str[0]; std::system(ch); } std::cout << "\nSolve command executed. Please see " << oscommandline->osrlFile << " for results." << std::endl; } else { std::cout << osservicemethods->resultString << std::endl; } } else if (oscommandline->serviceMethod == "kill" || oscommandline->serviceMethod == "knock") { if (oscommandline->osplOutputFile != "") { fileUtil->writeFileFromString(oscommandline->osplOutputFile, osservicemethods->resultString); } else { std::cout << osservicemethods->resultString << std::endl; } } } return 0; } catch (const ErrorClass& eclass) { OSResult *osresult = NULL; OSrLWriter *osrlwriter = NULL; osrlwriter = new OSrLWriter(); osresult = new OSResult(); osresult->setGeneralMessage(eclass.errormsg); osresult->setGeneralStatusType("error"); std::string osrl = osrlwriter->writeOSrL(osresult); if (oscommandline->osrlFile != "") { fileUtil->writeFileFromString(oscommandline->osrlFile, osrl); if (oscommandline->browser != "") { std::string str = oscommandline->browser + " " + oscommandline->osrlFile; const char *ch = &str[0]; std::system(ch); } } else { std::cout << osrl << std::endl; } //catch garbage collection delete osresult; osresult = NULL; delete osrlwriter; osrlwriter = NULL; delete oscommandline; oscommandline = NULL; delete fileUtil; fileUtil = NULL; return 1; } }
int main(int argc, char **argv) { WindowsErrorPopupBlocker(); char *stub; // set AMPL structures ASL *asl; asl = ASL_alloc(ASL_read_fg); stub = argv[1]; jac0dim((char*)stub, (fint)strlen(stub)); OSnl2osil *nl2osil = NULL; std::ostringstream outStr; std::cout << OSAmplClientVersionInfo(); std::string osss; outStr << stub << " " << getenv("OSAmplClient_options"); osss = outStr.str(); #ifdef DEBUG_AMPL_CLIENT std::cout << "Input String = " << osss << std::endl; #endif FileUtil *fileUtil = NULL; OSCommandLine *oscommandline; oscommandline = new OSCommandLine(); OSCommandLineReader *clreader; clreader = new OSCommandLineReader(); //parse the command line items into a CommandLine object try { oscommandline = clreader->readCommandLine(osss); if (oscommandline->serviceMethod == "") oscommandline->serviceMethod = "solve"; oscommandline->convertSolverNametoLowerCase(); } catch (const ErrorClass& eclass) { OSResult *osresult = NULL; osresult = new OSResult(); osresult->setGeneralMessage(eclass.errormsg); osresult->setGeneralStatusType("error"); OSrLWriter *osrlwriter = NULL; osrlwriter = new OSrLWriter(); std::string osrl = osrlwriter->writeOSrL(osresult); if (oscommandline->osrlFile != "") { fileUtil->writeFileFromString(oscommandline->osrlFile, osrl); if (oscommandline->browser != "") { std::string str = oscommandline->browser + " " + oscommandline->osrlFile; const char *ch = &str[0]; std::system(ch); } } else { std::cout << osrl << std::endl; } //catch garbage collection delete osresult; osresult = NULL; delete osrlwriter; osrlwriter = NULL; delete fileUtil; fileUtil = NULL; delete oscommandline; oscommandline = NULL; delete clreader; clreader = NULL; return 1; } #ifdef DEBUG_AMPL_CLIENT std::cout << oscommandline->list_options() << std::endl; #endif // deal with "action items": help, quit, listOptions if (oscommandline->quit || oscommandline->invokeHelp || oscommandline->writeVersion || oscommandline->listOptions) { if (oscommandline->invokeHelp) std::cout << std::endl << std::endl << get_AmplClient_help() << std::endl; if (oscommandline->listOptions) std::cout << std::endl << std::endl << oscommandline->list_options() << std::endl; delete oscommandline; oscommandline = NULL; return 0; } // call service method bool result = callServiceMethod(oscommandline); if (result == true) return 0; else return 1; }
void knock(OSCommandLine *oscommandline, OSnl2OS* nl2OS) { std::string osplOutput = ""; OSSolverAgent* osagent = NULL; FileUtil *fileUtil = NULL; fileUtil = new FileUtil(); try { if (oscommandline->serviceLocation != "") { osagent = new OSSolverAgent(oscommandline->serviceLocation); // if no OSpL file was given, make a default one if (oscommandline->osplInput == "") { std::ostringstream temp; temp << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" << "<ospl xmlns=\"os.optimizationservices.org\"\n" << " xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n" << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" << " xsi:schemaLocation=\"os.optimizationservices.org\n" << " http://www.optimizationservices.org/schemas/OSpL.xsd\">\n"<< " <processHeader>\n" << " <request action=\"getAll\"/>\n" << " </processHeader>\n" << " <processData/>\n" << "</ospl>\n"; oscommandline->osplInput = temp.str(); } // if a jobID was given on the command line, use it if(oscommandline->jobID != "") { OSOption *osOption = NULL; if (oscommandline->osol == "") { osOption = new OSOption(); } else { OSoLReader *osolReader = new OSoLReader(); try { osOption = osolReader->readOSoL(oscommandline->osol); delete osolReader; osolReader = NULL; } catch (const ErrorClass& eclass) { if (osolReader != NULL) delete osolReader; osolReader = NULL; throw ErrorClass(eclass.errormsg); } } osOption->setJobID( oscommandline->jobID); OSoLWriter *osolWriter = new OSoLWriter(); oscommandline->osol = osolWriter->writeOSoL( osOption); delete osOption; osOption = NULL; delete osolWriter; osolWriter = NULL; } osplOutput = osagent->knock(oscommandline->osplInput, oscommandline->osol); if (oscommandline->osplOutputFile != "") fileUtil->writeFileFromString(oscommandline->osplOutputFile, osplOutput); else osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_error, osplOutput); delete osagent; } else { delete osagent; throw ErrorClass("please specify service location (url)"); } delete fileUtil; fileUtil = NULL; } catch (const ErrorClass& eclass) { reportErrors(oscommandline, eclass.errormsg, nl2OS); if (osagent != NULL) delete osagent; osagent = NULL; delete fileUtil; fileUtil = NULL; } }//end knock