Example #1
0
 zorba::Item HttpResponseParser::createBase64Item( std::istream& aStream )
 {
   ItemFactory* lFactory = Zorba::getInstance(0)->getItemFactory();
   // TODO: once a proper streaming implementation is in place this can be
   // changed. This required a Base64 encoding stream since the item factory
   // work only builds base64binary and assumes the data is already encoded.
   String lEncoded;
   zorba::base64::encode(aStream, &lEncoded);
   return lFactory->createBase64Binary(lEncoded.data(), lEncoded.size(), true);
 }
Example #2
0
int
itemfactory(int argc, char* argv[]) 
{
  try 
  {
    testMultipleFactoryInitilizations();
  }
  catch (ZorbaException &e) 
  {
    std::cerr << e << std::endl;
    return 1;
  }

  Zorba* lZorba = Zorba::getInstance(zorba::StoreManager::getStore());

  ItemFactory* lFactory = lZorba->getItemFactory();

  Item lItem;

  try {
    /** String */
    lItem = lFactory->createString("abc");
    UNIT_ASSERT ( checkType(lItem.getType(), "string") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "abc" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem.close();
    UNIT_ASSERT (lItem.isNull());

    /** AnyURI */
    lItem = lFactory->createAnyURI("http://www.flworfound.org/");
    UNIT_ASSERT ( checkType(lItem.getType(), "anyURI") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "http://www.flworfound.org/");
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    /** QName */
    lItem = lFactory->createQName("http://www.flworfound.org", "flwor", "name");
    UNIT_ASSERT ( checkType(lItem.getType(), "QName") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "flwor:name" );
    UNIT_ASSERT ( lItem.getNamespace() == "http://www.flworfound.org" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createQName("http://www.flworfound.org", "name");
    UNIT_ASSERT ( checkType(lItem.getType(), "QName") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "name" );
    UNIT_ASSERT ( lItem.getPrefix().length() == 0 );
    UNIT_ASSERT ( lItem.getPrefix().empty() );
    UNIT_ASSERT ( lItem.getNamespace() == "http://www.flworfound.org" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    // test generating a qname from the clark notation {ns}localname
    lItem = lFactory->createQName("{http://www.flworfound.org}name");
    UNIT_ASSERT ( checkType(lItem.getType(), "QName") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "name" );
    UNIT_ASSERT ( lItem.getPrefix().length() == 0 );
    UNIT_ASSERT ( lItem.getPrefix().empty() );
    UNIT_ASSERT ( lItem.getNamespace() == "http://www.flworfound.org" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    /** NCName */
    lItem = lFactory->createNCName("ncname");
    UNIT_ASSERT ( checkType(lItem.getType(), "NCName") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "ncname" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
  try {
    lItem.getPrefix();
    UNIT_ASSERT(false);
  } catch (ZorbaException &e) {
    UNIT_ASSERT (e.diagnostic() == zerr::ZSTR0040_TYPE_ERROR);
  }
//    CHECK_NOT_IMPLEMENTED (lItem, getPrefix());
    CHECK_NOT_IMPLEMENTED (lItem, getLocalName());
    CHECK_NOT_IMPLEMENTED (lItem, getNamespace());
    CHECK_NOT_IMPLEMENTED (lItem, getBooleanValue() );

    /** Base64Binary */
    lItem = lFactory->createBase64Binary("", 0, false);
    UNIT_ASSERT ( checkType(lItem.getType(), "base64Binary") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "" );
    UNIT_ASSERT ( lItem.getStringValue().length() == 0 );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createBase64Binary("cmxjZ3R4c3JidnllcmVuZG91aWpsbXV5Z2NhamxpcmJkaWFhbmFob2VsYXVwZmJ1Z2dmanl2eHlzYmhheXFtZXR0anV2dG1q", 96, true);
    UNIT_ASSERT ( checkType(lItem.getType(), "base64Binary") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "cmxjZ3R4c3JidnllcmVuZG91aWpsbXV5Z2NhamxpcmJkaWFhbmFob2VsYXVwZmJ1Z2dmanl2eHlzYmhheXFtZXR0anV2dG1q" );
    UNIT_ASSERT ( lItem.getStringValue().length() == 96 );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED (lItem, getBooleanValue() );

    /** HexBinary */
    lItem = lFactory->createHexBinary("", 0);
    UNIT_ASSERT ( checkType(lItem.getType(), "hexBinary") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "" );
    UNIT_ASSERT ( lItem.getStringValue().length() == 0 );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createHexBinary("d433abfb43281793214aac", 22);
    UNIT_ASSERT ( checkType(lItem.getType(), "hexBinary") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "D433ABFB43281793214AAC" );
    UNIT_ASSERT ( lItem.getStringValue().length() == 22 );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED (lItem, getBooleanValue() );

    /** Boolean */
    lItem = lFactory->createBoolean(true);
    UNIT_ASSERT ( checkType(lItem.getType(), "boolean") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "true" );
    UNIT_ASSERT ( lItem.getEBV().getStringValue() == "true" ); 
    UNIT_ASSERT ( lItem.getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createBoolean(false);
    UNIT_ASSERT ( checkType(lItem.getType(), "boolean") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "false" );
    UNIT_ASSERT ( lItem.getEBV().getStringValue() == "false" ); 
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    UNIT_ASSERT ( ! lItem.getBooleanValue() );

    /** Decimal */
    lItem = lFactory->createDecimalFromLong(12678967);
    UNIT_ASSERT ( checkType(lItem.getType(), "decimal") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "12678967" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createDecimalFromDouble(12678967.32342);
    UNIT_ASSERT ( checkType(lItem.getType(), "decimal") );
    UNIT_ASSERT ( lItem.isAtomic() );
    // double to decimal cast implies a rounding error => prefix check only
    UNIT_ASSERT ( strncmp(lItem.getStringValue().c_str(), "12678967.32342", 14) );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createDecimal("NaN");
    UNIT_ASSERT ( lItem.isNull() );

    /** Integer */
    lItem = lFactory->createInteger(23424223);
    UNIT_ASSERT ( checkType(lItem.getType(), "integer") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "23424223" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.isNaN() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, isPosOrNegInf());
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createInteger("NaN");
    UNIT_ASSERT ( lItem.isNull() );

    /** Int */
    lItem = lFactory->createInt(23424223);
    UNIT_ASSERT ( checkType(lItem.getType(), "int") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "23424223" );
	UNIT_ASSERT ( lItem.getIntValue() == 23424223 );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    UNIT_ASSERT ( !lItem.isNaN() );
    CHECK_NOT_IMPLEMENTED(lItem, isPosOrNegInf());
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /** Short */
    lItem = lFactory->createShort(233);
    UNIT_ASSERT ( checkType(lItem.getType(), "short") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "233" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.isNaN() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, isPosOrNegInf());
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );
    
    /** Char */
    lItem = lFactory->createByte('a');
    UNIT_ASSERT ( checkType(lItem.getType(), "byte") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "97" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, isPosOrNegInf());
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /** Double */
    lItem = lFactory->createDouble(213123);
    UNIT_ASSERT ( checkType(lItem.getType(), "double") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "213123" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    double x = 0;
    lItem = lFactory->createDouble(static_cast<double>(x)/static_cast<double>(x));
    UNIT_ASSERT ( checkType(lItem.getType(), "double") );
    UNIT_ASSERT ( lItem.isNaN() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createDouble(std::numeric_limits<double>::infinity());
    UNIT_ASSERT ( checkType(lItem.getType(), "double") );
    UNIT_ASSERT ( lItem.isPosOrNegInf() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createDouble("213123");
    UNIT_ASSERT ( lItem.getStringValue() == "213123" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createDouble("INF");
    UNIT_ASSERT ( lItem.isPosOrNegInf() );
    UNIT_ASSERT ( !lItem.isNaN() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createDouble("-INF");
    UNIT_ASSERT ( lItem.isPosOrNegInf() );
    UNIT_ASSERT ( !lItem.isNaN() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createDouble("NaN");
    UNIT_ASSERT ( !lItem.isPosOrNegInf() );
    UNIT_ASSERT ( lItem.isNaN() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    /* Float */
    lItem = lFactory->createFloat("23.42");
    UNIT_ASSERT ( checkType(lItem.getType(), "float") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "23.42" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createFloat("INF");
    UNIT_ASSERT ( lItem.isPosOrNegInf() );
    UNIT_ASSERT ( !lItem.isNaN() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createFloat("-INF");
    UNIT_ASSERT ( lItem.isPosOrNegInf() );
    UNIT_ASSERT ( !lItem.isNaN() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createFloat("NaN");
    UNIT_ASSERT ( !lItem.isPosOrNegInf() );
    UNIT_ASSERT ( lItem.isNaN() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

    lItem = lFactory->createFloat(23.42f);
    UNIT_ASSERT ( checkType(lItem.getType(), "float") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "23.42" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /* NonNegativeInteger */
    lItem = lFactory->createNonNegativeInteger(32423423);
    UNIT_ASSERT ( checkType(lItem.getType(), "nonNegativeInteger") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "32423423" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /* NegativeInteger */
    lItem = lFactory->createNegativeInteger(-32423423);
    UNIT_ASSERT ( checkType(lItem.getType(), "negativeInteger") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "-32423423" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createNegativeInteger(1);
    UNIT_ASSERT ( lItem.isNull() );

    /* NonPositiveInteger */
    lItem = lFactory->createNonPositiveInteger(-32423423);
    UNIT_ASSERT ( checkType(lItem.getType(), "nonPositiveInteger") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "-32423423" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createNonPositiveInteger(1);
    UNIT_ASSERT ( lItem.isNull() );

    /* PositiveInteger */
    lItem = lFactory->createPositiveInteger(32423423);
    UNIT_ASSERT ( checkType(lItem.getType(), "positiveInteger") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "32423423" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /* Unsigned Byte */
    lItem = lFactory->createUnsignedByte('a');
    UNIT_ASSERT ( checkType(lItem.getType(), "unsignedByte") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "97" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );


    /* Unsigned Short */
    lItem = lFactory->createUnsignedShort(10);
    UNIT_ASSERT ( checkType(lItem.getType(), "unsignedShort") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "10" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /* Unsigned Long */
    lItem = lFactory->createUnsignedLong(10);
    UNIT_ASSERT ( checkType(lItem.getType(), "unsignedLong") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "10" );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /* Unsigned Int */
    lItem = lFactory->createUnsignedInt(10);
    UNIT_ASSERT ( checkType(lItem.getType(), "unsignedInt") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "10" );
	UNIT_ASSERT ( lItem.getUnsignedIntValue() == 10 );
    UNIT_ASSERT ( lItem.getEBV().getBooleanValue() );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /** Date*/
    lItem = lFactory->createDate("1999-05-31");
    UNIT_ASSERT ( checkType(lItem.getType(), "date") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "1999-05-31" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createDate(1999,05,31);
    UNIT_ASSERT ( checkType(lItem.getType(), "date") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "1999-05-31" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /** DateTime*/
    lItem = lFactory->createDateTime("1999-05-31T01:02:03.04-01:00");
    UNIT_ASSERT ( checkType(lItem.getType(), "dateTime") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "1999-05-31T01:02:03.04-01:00" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createDateTime(1999, 05, 31, 01, 02, 3.04, -3600);
    UNIT_ASSERT ( checkType(lItem.getType(), "dateTime") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "1999-05-31T01:02:03.04-01:00" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /** Time*/
    lItem = lFactory->createTime("08:00:00+09:00");
    UNIT_ASSERT ( checkType(lItem.getType(), "time") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "08:00:00+09:00" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createTime(8,9,10.123);
    UNIT_ASSERT ( checkType(lItem.getType(), "time") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "08:09:10.123" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createTime(17,0,0,-21600);
    UNIT_ASSERT ( checkType(lItem.getType(), "time") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "17:00:00-06:00" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /** GYearMonth*/
    lItem = lFactory->createGYearMonth("1976-02");
    UNIT_ASSERT ( checkType(lItem.getType(), "gYearMonth") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "1976-02" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createGYearMonth(1976,02);
    UNIT_ASSERT ( checkType(lItem.getType(), "gYearMonth") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "1976-02" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /** GYear*/
    lItem = lFactory->createGYear("1977");
    UNIT_ASSERT ( checkType(lItem.getType(), "gYear") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "1977" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createGYear(1977);
    UNIT_ASSERT ( checkType(lItem.getType(), "gYear") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "1977" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /** GMonth*/
    lItem = lFactory->createGMonth("--12Z");
    UNIT_ASSERT ( checkType(lItem.getType(), "gMonth") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "--12Z" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createGMonth(11);
    UNIT_ASSERT ( checkType(lItem.getType(), "gMonth") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "--11" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );
    
    /** GMonthDay*/
    lItem = lFactory->createGMonthDay("--12-25-14:00");
    UNIT_ASSERT ( checkType(lItem.getType(), "gMonthDay") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "--12-25-14:00" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createGMonthDay(12, 25);
    UNIT_ASSERT ( checkType(lItem.getType(), "gMonthDay") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "--12-25" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /** GDay*/
    lItem = lFactory->createGDay("---25-14:00");
    UNIT_ASSERT ( checkType(lItem.getType(), "gDay") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "---25-14:00" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    lItem = lFactory->createGDay(25);
    UNIT_ASSERT ( checkType(lItem.getType(), "gDay") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "---25" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );
    CHECK_NOT_IMPLEMENTED(lItem, getBooleanValue() );

    /** String */
    lItem = lFactory->createUntypedAtomic("abc");
    UNIT_ASSERT ( checkType(lItem.getType(), "untypedAtomic") );
    UNIT_ASSERT ( lItem.isAtomic() );
    UNIT_ASSERT ( lItem.getStringValue() == "abc" );
    UNIT_ASSERT ( !lItem.getAtomizationValue().isNull() );

  } catch (ZorbaException &e) {
    std::cerr << e << std::endl;
    return 1;
  }

  return 0;
}
ItemSequence_t
GeneratePDFFunction::evaluate(const ExternalFunction::Arguments_t& args,
                              const zorba::StaticContext* aStaticContext,
                              const zorba::DynamicContext* aDynamincContext) const
{
  Iterator_t lIter = args[0]->getIterator();
  lIter->open();
  Item outputFormat;
  lIter->next(outputFormat);
  lIter->close();
  jthrowable lException = 0;
  static JNIEnv* env;
  try {
    env = zorba::jvm::JavaVMSingleton::getInstance(aStaticContext)->getEnv();
    jstring outFotmatString = env->NewStringUTF(outputFormat.getStringValue().c_str());
    // Local variables
    std::ostringstream os;
    Zorba_SerializerOptions_t lOptions;
    Serializer_t lSerializer = Serializer::createSerializer(lOptions);
    jclass fopFactoryClass;
    jobject fopFactory;
    jmethodID fopFactoryNewInstance;
    jclass byteArrayOutputStreamClass;
    jobject byteArrayOutputStream;
    jobject fop;
    jmethodID newFop;
    jclass transformerFactoryClass;
    jobject transformerFactory;
    jobject transormer;
    jclass stringReaderClass;
    jobject stringReader;
    jstring xmlUTF;
    const char* xml;
    std::string xmlString;
    jclass streamSourceClass;
    jobject streamSource;
    jobject defaultHandler;
    jclass saxResultClass;
    jobject saxResult;
    jboolean isCopy;
    jbyteArray res;
    Item base64;
    String resStore;
    jsize dataSize;
    jbyte* dataElements;

    Item item;
    lIter = args[1]->getIterator();
    lIter->open();
    lIter->next(item);
    lIter->close();
    // Searialize Item
    SingletonItemSequence lSequence(item);
    lSerializer->serialize(&lSequence, os);
    xmlString = os.str();
    xml = xmlString.c_str();

    // Create an OutputStream
    byteArrayOutputStreamClass = env->FindClass("java/io/ByteArrayOutputStream");
    CHECK_EXCEPTION(env);
    byteArrayOutputStream = env->NewObject(byteArrayOutputStreamClass,
        env->GetMethodID(byteArrayOutputStreamClass, "<init>", "()V"));
    CHECK_EXCEPTION(env);

    // Create a FopFactory instance
    fopFactoryClass = env->FindClass("org/apache/fop/apps/FopFactory");
    CHECK_EXCEPTION(env);
    fopFactoryNewInstance = env->GetStaticMethodID(fopFactoryClass, "newInstance", "()Lorg/apache/fop/apps/FopFactory;");
    CHECK_EXCEPTION(env);
    fopFactory = env->CallStaticObjectMethod(fopFactoryClass, fopFactoryNewInstance);
    CHECK_EXCEPTION(env);

    // Create the Fop
    newFop = env->GetMethodID(fopFactoryClass, "newFop", "(Ljava/lang/String;Ljava/io/OutputStream;)Lorg/apache/fop/apps/Fop;");
    CHECK_EXCEPTION(env);
    fop = env->CallObjectMethod(fopFactory,
        newFop,
        outFotmatString, byteArrayOutputStream);
    CHECK_EXCEPTION(env);

    // Create the Transformer
    transformerFactoryClass = env->FindClass("javax/xml/transform/TransformerFactory");
    CHECK_EXCEPTION(env);
    transformerFactory = env->CallStaticObjectMethod(transformerFactoryClass,
        env->GetStaticMethodID(transformerFactoryClass, "newInstance", "()Ljavax/xml/transform/TransformerFactory;"));
    CHECK_EXCEPTION(env);
    transormer = env->CallObjectMethod(transformerFactory,
        env->GetMethodID(transformerFactoryClass, "newTransformer", "()Ljavax/xml/transform/Transformer;"));
    CHECK_EXCEPTION(env);

    // Create Source
    xmlUTF = env->NewStringUTF(xml);
    stringReaderClass = env->FindClass("java/io/StringReader");
    CHECK_EXCEPTION(env);
    stringReader = env->NewObject(stringReaderClass,
        env->GetMethodID(stringReaderClass, "<init>", "(Ljava/lang/String;)V"), xmlUTF);
    CHECK_EXCEPTION(env);
    streamSourceClass = env->FindClass("javax/xml/transform/stream/StreamSource");
    CHECK_EXCEPTION(env);
    streamSource = env->NewObject(streamSourceClass,
        env->GetMethodID(streamSourceClass, "<init>", "(Ljava/io/Reader;)V"), stringReader);
    CHECK_EXCEPTION(env);

    // Create the SAXResult 
    defaultHandler = env->CallObjectMethod(fop,
        env->GetMethodID(env->FindClass("org/apache/fop/apps/Fop"), "getDefaultHandler",
          "()Lorg/xml/sax/helpers/DefaultHandler;"));
    CHECK_EXCEPTION(env);
    saxResultClass = env->FindClass("javax/xml/transform/sax/SAXResult");
    CHECK_EXCEPTION(env);
    saxResult = env->NewObject(saxResultClass,
        env->GetMethodID(saxResultClass, "<init>", "(Lorg/xml/sax/ContentHandler;)V"),
        defaultHandler);
    CHECK_EXCEPTION(env);

    // Transform
    env->CallObjectMethod(transormer,
        env->GetMethodID(env->FindClass("javax/xml/transform/Transformer"), 
          "transform", 
          "(Ljavax/xml/transform/Source;Ljavax/xml/transform/Result;)V"),
        streamSource, saxResult);
    CHECK_EXCEPTION(env);

    // Close outputstream
    env->CallObjectMethod(byteArrayOutputStream,
        env->GetMethodID(env->FindClass("java/io/OutputStream"),
          "close", "()V"));
    CHECK_EXCEPTION(env);
    saxResultClass = env->FindClass("javax/xml/transform/sax/SAXResult");
    CHECK_EXCEPTION(env);

    // Get the byte array
    res = (jbyteArray) env->CallObjectMethod(byteArrayOutputStream,
        env->GetMethodID(byteArrayOutputStreamClass, "toByteArray", "()[B"));
    CHECK_EXCEPTION(env);

    // Create the result
    dataSize = env->GetArrayLength(res);
    dataElements = env->GetByteArrayElements(res, &isCopy);

    std::string lBinaryString((const char*) dataElements, dataSize);
    std::stringstream lStream(lBinaryString);
    String base64S;
    base64::encode(lStream, &base64S);
    Item lRes( theFactory->createBase64Binary(base64S.data(), base64S.size(), true) );
    return ItemSequence_t(new SingletonItemSequence(lRes));
  } catch (zorba::jvm::VMOpenException&) {
    Item lQName = theFactory->createQName("http://zorba.io/modules/xsl-fo",
        "JVM-NOT-STARTED");
    throw USER_EXCEPTION(lQName, "Could not start the Java VM (is the classpath set?)");
  } catch (JavaException&) {
    jclass stringWriterClass = env->FindClass("java/io/StringWriter");
    jclass printWriterClass = env->FindClass("java/io/PrintWriter");
    jclass throwableClass = env->FindClass("java/lang/Throwable");
    jobject stringWriter = env->NewObject(
        stringWriterClass,
        env->GetMethodID(stringWriterClass, "<init>", "()V"));
    jobject printWriter = env->NewObject(
        printWriterClass, env->GetMethodID(printWriterClass, "<init>", "(Ljava/io/Writer;)V"), stringWriter);
    env->CallObjectMethod(lException, env->GetMethodID(throwableClass, "printStackTrace", "(Ljava/io/PrintWriter;)V"), printWriter);
    //env->CallObjectMethod(printWriter, env->GetMethodID(printWriterClass, "flush", "()V"));
    jmethodID toStringMethod = env->GetMethodID(stringWriterClass, "toString", "()Ljava/lang/String;");
    jobject errorMessageObj = env->CallObjectMethod(
        stringWriter, toStringMethod);
    jstring errorMessage = (jstring) errorMessageObj;
    const char *errMsg = env->GetStringUTFChars(errorMessage, 0);
    std::stringstream s;
    s << "A Java Exception was thrown:" << std::endl << errMsg;
    env->ReleaseStringUTFChars(errorMessage, errMsg);
    std::string err("");
    err += s.str();
    env->ExceptionClear();
    Item lQName = theFactory->createQName("http://zorba.io/modules/xsl-fo",
        "JAVA-EXCEPTION");
    throw USER_EXCEPTION(lQName, err);
  }
  return ItemSequence_t(new EmptySequence());
}