//////////////////////////////////////////////////////////////////////////////// /// @brief html result generators /// /// @file /// /// DISCLAIMER /// /// Copyright 2010-2011 triagens GmbH, Cologne, Germany /// /// Licensed 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. /// /// Copyright holder is triAGENS GmbH, Cologne, Germany /// /// @author Dr. Frank Celler /// @author Achim Brandt /// @author Copyright 2008-2011, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// #include "HtmlResultGenerator.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace triagens::basics; namespace triagens { namespace rest { // ----------------------------------------------------------------------------- // output methods // ----------------------------------------------------------------------------- namespace { void generateVariantArray (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { VariantArray* array = dynamic_cast(object); vector const& attributes = array->getAttributes(); vector const& values = array->getValues(); // generate attributes vector::const_iterator ai = attributes.begin(); vector::const_iterator vi = values.begin(); output.appendText("\n"); for (; ai != attributes.end() && vi != values.end(); ++ai, ++vi) { output.appendText("\n"); output.appendText("\n"); output.appendText("\n"); output.appendText("\n"); } output.appendText("
\n"); output.appendText(StringUtils::escapeHtml(*ai)); output.appendText("\n"); generator->generateVariant(output, *vi); output.appendText("
\n"); } void generateVariantBoolean (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantBlob (ResultGenerator const*, StringBuffer& output, VariantObject* object) { VariantBlob* blob = dynamic_cast(object); string v(blob->getValue(), blob->getLength()); output.appendText(StringUtils::escapeHtml(StringUtils::escapeUnicode(v))); } void generateVariantDate (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantDatetime (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantDouble (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantFloat (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantInt16 (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantInt32 (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantInt64 (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantMatrix2 (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { VariantMatrix2* matrix2 = dynamic_cast(object); output.appendText("\n"); output.appendText("\n"); vector const& dx = matrix2->getDimension(0); vector const& dy = matrix2->getDimension(1); for (vector::const_iterator i = dy.begin(); i != dy.end(); ++i) { output.appendText("\n"); } size_t x = 0; for (vector::const_iterator j = dx.begin(); j != dx.end(); ++j, ++x) { output.appendText("\n"); output.appendText("\n"); size_t y = 0; for (vector::const_iterator i = dy.begin(); i != dy.end(); ++i, ++y) { VariantObject* obj = matrix2->getValue(x, y); output.appendText("\n"); } output.appendText("\n"); } output.appendText("\n"); output.appendText("
"); generator->generateAtom(output, *i); output.appendText("
"); generator->generateAtom(output, *j); output.appendText(""); if (obj != 0) { generator->generateVariant(output, obj); } output.appendText("
\n"); } void generateVariantNull (ResultGenerator const*, StringBuffer& output, VariantObject*) { output.appendText("[null]"); } void generateVariantString (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantUInt16 (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantUInt32 (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantUInt64 (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { generator->generateAtom(output, dynamic_cast(object)->getValue()); } void generateVariantVector (ResultGenerator const* generator, StringBuffer& output, VariantObject* object) { VariantVector* vec = dynamic_cast(object); vector const& values = vec->getValues(); size_t pos = values.size(); output.appendText("\n"); output.appendText(""); for (vector::const_iterator vi = values.begin(); vi != values.end(); ++pos, ++vi) { output.appendText("\n"); } output.appendText(""); output.appendText("
"); generator->generateVariant(output, *vi); output.appendText("
"); } } // ----------------------------------------------------------------------------- // static public methods // ----------------------------------------------------------------------------- void HtmlResultGenerator::initialise () { registerObject(VariantObject::VARIANT_ARRAY, RESULT_GENERATOR_HTML, generateVariantArray); registerObject(VariantObject::VARIANT_BOOLEAN, RESULT_GENERATOR_HTML, generateVariantBoolean); registerObject(VariantObject::VARIANT_BLOB, RESULT_GENERATOR_HTML, generateVariantBlob); registerObject(VariantObject::VARIANT_DATE, RESULT_GENERATOR_HTML, generateVariantDate); registerObject(VariantObject::VARIANT_DATETIME, RESULT_GENERATOR_HTML, generateVariantDatetime); registerObject(VariantObject::VARIANT_DOUBLE, RESULT_GENERATOR_HTML, generateVariantDouble); registerObject(VariantObject::VARIANT_FLOAT, RESULT_GENERATOR_HTML, generateVariantFloat); registerObject(VariantObject::VARIANT_INT16, RESULT_GENERATOR_HTML, generateVariantInt16); registerObject(VariantObject::VARIANT_INT32, RESULT_GENERATOR_HTML, generateVariantInt32); registerObject(VariantObject::VARIANT_INT64, RESULT_GENERATOR_HTML, generateVariantInt64); registerObject(VariantObject::VARIANT_MATRIX2, RESULT_GENERATOR_HTML, generateVariantMatrix2); registerObject(VariantObject::VARIANT_NULL, RESULT_GENERATOR_HTML, generateVariantNull); registerObject(VariantObject::VARIANT_STRING, RESULT_GENERATOR_HTML, generateVariantString); registerObject(VariantObject::VARIANT_UINT16, RESULT_GENERATOR_HTML, generateVariantUInt16); registerObject(VariantObject::VARIANT_UINT32, RESULT_GENERATOR_HTML, generateVariantUInt32); registerObject(VariantObject::VARIANT_UINT64, RESULT_GENERATOR_HTML, generateVariantUInt64); registerObject(VariantObject::VARIANT_VECTOR, RESULT_GENERATOR_HTML, generateVariantVector); } // ----------------------------------------------------------------------------- // ResultGenerator methods // ----------------------------------------------------------------------------- void HtmlResultGenerator::generateResultBegin (StringBuffer& output, VariantObject*) const { output.appendText("\n\nResult\n\n\n"); } void HtmlResultGenerator::generateResultEnd (StringBuffer& output, VariantObject*) const { output.appendText("\n\n"); } void HtmlResultGenerator::generateAtom (StringBuffer& output, string const& value) const { output.appendText(StringUtils::escapeHtml(value)); } void HtmlResultGenerator::generateAtom (StringBuffer& output, char const* value) const { if (value == 0) { output.appendText(""); } else { output.appendText(StringUtils::escapeHtml(value)); } } void HtmlResultGenerator::generateAtom (StringBuffer& output, char const* value, size_t length, bool) const { if (value == 0) { output.appendText(""); } else { string v(value, length); output.appendText(StringUtils::escapeHtml(v)); } } void HtmlResultGenerator::generateAtom (StringBuffer& output, bool value) const { output.appendText(value ? "true" : "false"); } void HtmlResultGenerator::generateAtom (StringBuffer& output, double value) const { if (value == 0.0) { output.appendText("0.0", 3); } else if (isnormal(value)) { output.appendDecimal(value); } else { int a = isinf(value); if (a == -1) { generateAtom(output, "-INF"); } else if (a == 1) { generateAtom(output, "INF"); } else /* if (isnan(value)) */ { generateAtom(output, "NAN"); } } } void HtmlResultGenerator::generateAtom (StringBuffer& output, float value) const { if (value == 0.0) { output.appendText("0.0", 3); } else if (isnormal(value)) { output.appendDecimal(value); } else { int a = isinf(value); if (a == -1) { generateAtom(output, "-INF"); } else if (a == 1) { generateAtom(output, "INF"); } else /* if (isnan(value)) */ { generateAtom(output, "NAN"); } } } void HtmlResultGenerator::generateAtom (StringBuffer& output, int16_t value) const { output.appendInteger(value); } void HtmlResultGenerator::generateAtom (StringBuffer& output, int32_t value) const { output.appendInteger(value); } void HtmlResultGenerator::generateAtom (StringBuffer& output, int64_t value) const { output.appendInteger(value); } void HtmlResultGenerator::generateAtom (StringBuffer& output, uint16_t value) const { output.appendInteger(value); } void HtmlResultGenerator::generateAtom (StringBuffer& output, uint32_t value) const { output.appendInteger(value); } void HtmlResultGenerator::generateAtom (StringBuffer& output, uint64_t value) const { output.appendInteger(value); } } }