void makeStrings(OSCommandLine *oscommandline) { // convert the osinstance and osoption objects to strings if (oscommandline->osil == "") { OSiLWriter *osilwriter = new OSiLWriter(); oscommandline->osil = osilwriter->writeOSiL(oscommandline->osinstance); #ifndef NDEBUG osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_trace, oscommandline->osil); #endif delete osilwriter; osilwriter = NULL; } /** With the options we need to be a little more careful: * Options can be in osol and jobID strings (either can be missing) * or in an osoption object (which would include both of the above) * or missing entirely (in which case a dummy string needs to be created) */ OSoLReader *osolreader = NULL; if (oscommandline->osoption != NULL || oscommandline->jobID != "" || oscommandline->osol == "") { if (oscommandline->osoption == NULL) { oscommandline->osoption = new OSOption(); if (oscommandline->osol != "") { osolreader = new OSoLReader(); oscommandline->osoption = osolreader->readOSoL(oscommandline->osol); } if (oscommandline->jobID != "") oscommandline->osoption->setJobID(oscommandline->jobID); } OSoLWriter *osolwriter = new OSoLWriter(); oscommandline->osol = osolwriter->writeOSoL(oscommandline->osoption); #ifndef NDEBUG osoutput->OSPrint(ENUM_OUTPUT_AREA_main, ENUM_OUTPUT_LEVEL_trace, oscommandline->osol); #endif delete osolwriter; osolwriter = NULL; } if (osolreader != NULL) { delete osolreader; oscommandline->osoption = NULL; // no longer needed, and memory may have just been freed } osolreader = NULL; }
bool OSServiceMethods::executeServiceMethod(OSCommandLine *oscommandline) { OSSolverAgent* osagent = NULL; /** * The required file conversions are all assumed * to have been taken care of in the nonstandard constructor, * so this wrapper merely directs traffic */ try { /** the only local service method is solve() */ if (oscommandline->serviceLocation == "") if (oscommandline->serviceMethod == "solve") //resultString = runSolver(oscommandline->solverName, oscommandline->osoption, oscommandline->osinstance); int junk; else throw ErrorClass("No service location (URL) specified. Only \"solve\" is available locally"); /** Here we have a remote call --- reuse as much code as possible */ else { osagent = new OSSolverAgent(oscommandline->serviceLocation); //solve if (oscommandline->serviceMethod == "solve") resultString = osagent->solve(oscommandline->osil, oscommandline->osol); //send --- first check that there is a jobID. If not, get one else if (oscommandline->serviceMethod == "send") { if (oscommandline->osol.find( "<jobID") == std::string::npos) { OSoLReader *osolreader = NULL; osolreader = new OSoLReader(); OSoLWriter *osolwriter = NULL; osolwriter = new OSoLWriter(); try { if (oscommandline->osol != "") oscommandline->osoption = osolreader->readOSoL(oscommandline->osol); oscommandline->osoption->setJobID(osagent->getJobID("")); // now write the osOption object into a string oscommandline->osol = osolwriter->writeOSoL(oscommandline->osoption); delete osolreader; osolreader = NULL; delete osolwriter; osolwriter = NULL; } catch (const ErrorClass& eclass) { delete osolreader; osolreader = NULL; delete osolwriter; osolwriter = NULL; throw ErrorClass(eclass.errormsg); } } bool sendResult; sendResult = osagent->send(oscommandline->osil, oscommandline->osol); if (sendResult == false) throw ErrorClass("send() method failed"); } //retrieve else if (oscommandline->serviceMethod == "retrieve") { if (oscommandline->osol.find( "<jobID") == std::string::npos) throw ErrorClass("there is no JobID to retrieve"); resultString = osagent->retrieve(oscommandline->osol); } //getJobID else if (oscommandline->serviceMethod == "getJobID") resultString = osagent->getJobID(oscommandline->osol); //knock else if (oscommandline->serviceMethod == "knock") resultString = osagent->knock(oscommandline->osplInput, oscommandline->osol); //kill else if (oscommandline->serviceMethod == "kill") { if (oscommandline->osol.find( "<jobID") == std::string::npos) throw ErrorClass("there is no JobID to kill"); resultString = osagent->kill(oscommandline->osol); } else throw ErrorClass("serviceMethod not recognized"); delete osagent; osagent = NULL; } return true; } catch (const ErrorClass& eclass) { OSResult *osresult = NULL; OSrLWriter *osrlwriter = NULL; osrlwriter = new OSrLWriter(); osresult = new OSResult(); osresult->setGeneralMessage(eclass.errormsg); osresult->setGeneralStatusType("error"); resultString = osrlwriter->writeOSrL(osresult); //catch garbage collection delete osresult; osresult = NULL; delete osrlwriter; osrlwriter = NULL; if (osagent != NULL) delete osagent; osagent = NULL; return false; } }//executeServiceMethod
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
OSServiceMethods::OSServiceMethods(OSCommandLine *oscommandline): resultString("") { #ifdef DEBUG_OSSERVICEMETHODS cout << "Inside the OSServiceMethods Constructor" << endl; #endif FileUtil *fileUtil = NULL; OSiLReader *osilreader = NULL; OSoLReader *osolreader = NULL; OSiLWriter *osilwriter = NULL; OSoLWriter *osolwriter = NULL; OSmps2osil *mps2osil = NULL; #ifdef COIN_HAS_ASL // OSnl2os *nl2os = NULL; OSnl2osil *nl2osil = NULL; #endif #ifdef COIN_HAS_GAMSUTILS OSgams2os *gams2os = NULL; #endif try { fileUtil = new FileUtil(); /** Prepare the OSInstance and OSOption objects if needed. * The objects are needed if * 1. any output is based on the instance ((i.e, printModel, * printRow or osilOutputFile is specified) OR * 2. a solve/send command is based on input other than OSiL format */ if ( (oscommandline->printModel || oscommandline->printRowNumberAsString != "" || oscommandline->osilOutputFile != "") || ((oscommandline->serviceMethod[0] = 's') && (oscommandline->osilFile == ""))) { /** Search for an instance in the following order * 1. osil file * 2. non-proprietary formats (only MPS for now) * 3. proprietary formats (AMPL nl, GAMS dat, etc.) */ if (oscommandline->osilFile != "") { osilreader = new OSiLReader(); oscommandline->osil = fileUtil->getFileAsString( (oscommandline->osilFile).c_str()); oscommandline->osinstance = osilreader->readOSiL(oscommandline->osil); if (oscommandline->osolFile != "") { oscommandline->osol = fileUtil->getFileAsString( (oscommandline->osolFile).c_str()); osolreader = new OSoLReader(); oscommandline->osoption = osolreader->readOSoL(oscommandline->osol); } } else if (oscommandline->mpsFile != "") { mps2osil = new OSmps2osil(oscommandline->mpsFile); mps2osil->createOSInstance(); oscommandline->osinstance = mps2osil->osinstance; if (oscommandline->osolFile != "") { oscommandline->osol = fileUtil->getFileAsString( (oscommandline->osolFile).c_str()); osolreader = new OSoLReader(); oscommandline->osoption = osolreader->readOSoL(oscommandline->osol); } } else if (oscommandline->nlFile != "") { #ifdef COIN_HAS_ASL // nl2os = new OSnl2os(oscommandline); // nl2os->createOSObjects(); // osinstance = nl2os->osinstance; // osoption = nl2os->osoption; nl2osil = new OSnl2osil(oscommandline->nlFile); nl2osil->createOSInstance(); oscommandline->osinstance = nl2osil->osinstance; #else throw ErrorClass( "nl file specified locally but ASL not present"); #endif } else if (oscommandline->gamsControlFile != "") { #ifdef COIN_HAS_GAMSUTILS gams2os = new OSgams2os(oscommandline); gams2os->createOSObjects(); osinstance = gams2os->osinstance; osoption = gams2os->osoption; #else throw ErrorClass( "a Gams Control specified locally but GAMSIP not present"); #endif } else { if (oscommandline->osolFile != "" && oscommandline->serviceLocation != "") { oscommandline->osol = fileUtil->getFileAsString( (oscommandline->osolFile).c_str()); osolreader = new OSoLReader(); oscommandline->osoption = osolreader->readOSoL(oscommandline->osol); if (oscommandline->solverName != "") oscommandline->osoption->setSolverToInvoke(oscommandline->solverName); } if (oscommandline->osol.find( "<instanceLocation") == std::string::npos) throw ErrorClass( "Error: no optimization instance found"); } // Make sure the solver name is recorded properly if (oscommandline->solverName != "") { if (oscommandline->osol == "" && oscommandline->osolFile != "") oscommandline->osol = fileUtil->getFileAsString( (oscommandline->osolFile).c_str()); oscommandline->osoption->setSolverToInvoke(oscommandline->solverName); } // convert OS objects to strings if necessary if (oscommandline->serviceLocation != "" && oscommandline->osil == "") { osilwriter= new OSiLWriter(); oscommandline->osil = osilwriter->writeOSiL(oscommandline->osinstance); } if (oscommandline->serviceLocation != "" && oscommandline->osoption != NULL) { osolwriter= new OSoLWriter(); oscommandline->osol = osolwriter->writeOSoL(oscommandline->osoption); } } // cleanup if (fileUtil != NULL) delete fileUtil; fileUtil = NULL; if (osilreader != NULL) delete osilreader; osilreader = NULL; if (osolreader != NULL) delete osolreader; osolreader = NULL; if (osilwriter != NULL) delete osilwriter; osilwriter = NULL; if (osolwriter != NULL) delete osolwriter; osolwriter = NULL; if (mps2osil != NULL) delete mps2osil; mps2osil = NULL; #ifdef COIN_HAS_ASL // if (nl2os != NULL) delete nl2os; // nl2os = NULL; if (nl2osil != NULL) delete nl2osil; nl2osil = NULL; #endif #ifdef COIN_HAS_GAMSUTILS if (gams2os != NULL) delete gams2os; gams2os = NULL; #endif } catch(const ErrorClass& eclass) { if (fileUtil != NULL) delete fileUtil; fileUtil = NULL; if (osilreader != NULL) delete osilreader; osilreader = NULL; if (osolreader != NULL) delete osolreader; osolreader = NULL; if (osilwriter != NULL) delete osilwriter; osilwriter = NULL; if (osolwriter != NULL) delete osolwriter; osolwriter = NULL; if (mps2osil != NULL) delete mps2osil; mps2osil = NULL; #ifdef COIN_HAS_ASL if (nl2osil != NULL) delete nl2osil; nl2osil = NULL; #endif #ifdef COIN_HAS_GAMSUTILS if (gams2os != NULL) delete gams2os; gams2os = NULL; #endif throw ErrorClass(eclass.errormsg); } }//end nonstandard OSServiceMethods constructor