void AOSOutputExecutor::execute(AOSContext& context) { AString command; if ( context.useRequestParameterPairs().exists(OVERRIDE_OUTPUT) && m_Services.useConfiguration().isOutputOverrideAllowed() ) { //a_Override requested and allowed context.useRequestParameterPairs().get(OVERRIDE_OUTPUT, command); } else { command = context.getOutputCommand(); if (context.useEventVisitor().isLogging(AEventVisitor::EL_DEBUG)) { ARope rope("Default output generator overridden to: ",40); rope.append(command); context.useEventVisitor().startEvent(rope, AEventVisitor::EL_DEBUG); } } if (command.equals("NOP")) { //a_If NOP was used force XML m_Services.useConfiguration().setMimeTypeFromExt(ASW("xml",3), context); if (context.useEventVisitor().isLogging(AEventVisitor::EL_DEBUG)) context.useEventVisitor().startEvent(ASWNL("NOP detected, defaulting to XML output"), AEventVisitor::EL_DEBUG); } if (command.isEmpty()) { if (!m_Services.useConfiguration().getAosDefaultOutputGenerator().isEmpty()) { command.assign(m_Services.useConfiguration().getAosDefaultOutputGenerator()); if (context.useEventVisitor().isLogging(AEventVisitor::EL_DEBUG)) { ARope rope("No output generator specified, defaulting to: ",46); rope.append(command); context.useEventVisitor().startEvent(rope, AEventVisitor::EL_DEBUG); } } else { if (context.useEventVisitor().isLogging(AEventVisitor::EL_DEBUG)) context.useEventVisitor().startEvent(ASW("No output generator, defaulting to XML",38), AEventVisitor::EL_DEBUG); return; } } try { //a_Find input command, if not found execute the default OutputGeneratorContainer::iterator it = m_OutputGenerators.find(command); if (it == m_OutputGenerators.end()) { if (context.useEventVisitor().isLogging(AEventVisitor::EL_WARN)) { ARope rope("Skipping unknown output generator: ",35); rope.append(command); context.useEventVisitor().startEvent(rope, AEventVisitor::EL_WARN); } } else { ATimer timer(true); //a_Generate output if (context.useEventVisitor().isLogging(AEventVisitor::EL_INFO)) { ARope rope("Generating output: ",19); rope.append((*it).first); context.useEventVisitor().startEvent(rope, AEventVisitor::EL_INFO); } if (context.useContextFlags().isClear(AOSContext::CTXFLAG_IS_AJAX)) { context.useModel().overwriteElement(ASW("execute/output", 14)).addData(command); //a_Publish timers context.getRequestTimer().emitXml(context.useModel().overwriteElement(ASW("request_time",12))); context.getContextTimer().emitXml(context.useModel().overwriteElement(ASW("context_time",12))); } //a_Generate output AOSContext::ReturnCode ret = (*it).second->execute(context); switch (ret) { case AOSContext::RETURN_OK: break; case AOSContext::RETURN_REDIRECT: if (context.useEventVisitor().isLogging(AEventVisitor::EL_INFO)) { context.useEventVisitor().startEvent(ASWNL("Output generator has done a redirect"), AEventVisitor::EL_DEBUG); } break; default: context.addError((*it).second->getClass(), ASWNL("Output generator returned neither OK nor REDIRECT")); return; } //a_Event over context.useEventVisitor().endEvent(); //a_Add execution time (*it).second->addExecutionTimeSample(timer.getInterval()); } } catch(AException& ex) { AString strWhere("AOSOutputExecutor::execute(", 27); strWhere.append(command); strWhere.append(')'); context.addError(strWhere, ex.what()); AXmlElement& element = context.useModel().addElement("output_error"); element.addElement("where", strWhere); element.addElement("exception", ex); } catch(...) { AString strWhere("AOSOutputExecutor::execute(", 27); strWhere.append(command); strWhere.append(')'); context.addError(strWhere, ASWNL("Unknown Exception")); context.useModel().addElement("output_error").addData("Unknown Exception"); } }
AOSContext::ReturnCode AOSModule_Wiki_ViewFromFileSystem::execute(AOSContext& context, const AXmlElement& moduleParams) { //a_Get base path AString basePath; if (!moduleParams.emitString(AOS_Wiki_Constants::PARAM_BASE_PATH, basePath)) { context.addError(getClass(), ASWNL("Unable to find module/base-path parameter")); return AOSContext::RETURN_ERROR; } AFilename wikifile(m_Services.useConfiguration().getAosBaseDataDirectory()); wikifile.join(basePath, true); //a_Get relative wiki path AString str; context.useRequestParameterPairs().get(ASW("wikipath",8), str); wikifile.join(str, false); u4 type = AFileSystem::getType(wikifile); //a_Directory only will get default index.html if (type & AFileSystem::Directory) { //a_Directory name specified wikifile.useFilename().assign(ASW("index.html",10)); } else wikifile.setExtension(ASW(".html",5)); AString strData; if (context.useRequestParameterPairs().get(ASW("wiki.newdata",12), strData)) { //a_Check if authentication passed if ( moduleParams.exists(AOS_Wiki_Constants::PARAM_SECURE) && !context.useModel().exists(ASW("wiki/Authenticated",18)) ) { context.useModel().overwriteElement(ASW("wiki/AuthFailed",15)); return AOSContext::RETURN_OK; } //a_New data submitted u4 type = AFileSystem::getType(wikifile); if (AFileSystem::DoesNotExist != type) { //a_New data submitted, old file exists AFilename newwikifile(wikifile); //a_Temporary filename to use during the swap AFilename tempwikifile(newwikifile); tempwikifile.setExtension(ASW("_temporary_rename_",19)); //a_Generate temporary filename AFileSystem::generateTemporaryFilename(newwikifile); //a_Save new data to temp filename AFile_Physical file(newwikifile, "wb"); file.open(); file.write(strData); file.close(); //a_Add to context so it can ve viewed after save context.useModel().overwriteElement(AOS_Wiki_Constants::ELEMENT_DATA).addData(strData, AXmlElement::ENC_CDATADIRECT); //a_Rename temp to current AFileSystem::rename(wikifile, tempwikifile); AFileSystem::rename(newwikifile, wikifile); AFileSystem::remove(tempwikifile); } else { //a_Does not exist yet //a_Make sure directories exist AFileSystem::createDirectories(wikifile); //a_Save new data AFile_Physical file(wikifile, "wb"); file.open(); file.write(strData); file.close(); //a_Add to context so it can ve viewed after save context.useModel().overwriteElement(AOS_Wiki_Constants::ELEMENT_DATA).addData(strData, AXmlElement::ENC_CDATADIRECT); } } else { u4 type = AFileSystem::getType(wikifile); if (AFileSystem::DoesNotExist != type) { AFile_Physical file(wikifile); file.open(); context.useModel().overwriteElement(AOS_Wiki_Constants::ELEMENT_DATA).addData(file, AXmlElement::ENC_CDATADIRECT); } else { //a_Signal that the wiki file does not exist context.useModel().overwriteElement(AOS_Wiki_Constants::ELEMENT_DOES_NOT_EXIST); } if (moduleParams.exists(AOS_Wiki_Constants::PARAM_SECURE)) { context.useModel().overwriteElement(AOS_Wiki_Constants::ELEMENT_SECURE_EDIT); } } return AOSContext::RETURN_OK; }