zorba::ItemSequence_t
GxlFunction::evaluate(
  const Arguments_t& aArgs,
  const zorba::StaticContext* aSctx,
  const zorba::DynamicContext *aDctx) const
{
  return ItemSequence_t(new LazyGxlSequence(this, aArgs[0]));
} /* GxlFunction::evaluate */
ItemSequence_t
ClosePreparedFunction::evaluate(const ExternalFunction::Arguments_t& args,
                           const zorba::StaticContext* aStaticContext,
                           const zorba::DynamicContext* aDynamincContext) const
{
  String lStatementUUID = JdbcModule::getStringArg(args, 0);

  CHECK_CONNECTION

  JdbcModule::deleteObject(aDynamincContext, lStatementUUID, INSTANCE_MAP_PREPAREDSTATEMENTS);

  return ItemSequence_t(new EmptySequence());
}
Example #3
0
ItemSequence_t
ParseFunction::evaluate(
    const ExternalFunction::Arguments_t& aArgs,
    const StaticContext* aSctxCtx,
    const DynamicContext* aDynCtx) const
{
  std::auto_ptr<std::istringstream> iss;
  std::istream *is;
  String docString;
  Item lStringItem, lOptionsItem;

  if (aArgs.size() >= 1)
  {
    Iterator_t lArg0Iter = aArgs[0]->getIterator();
    lArg0Iter->open();
    lArg0Iter->next(lStringItem);
    lArg0Iter->close();
  }

  if ( lStringItem.isStreamable() )
  {
    //
    // The "iss" auto_ptr can NOT be used since it will delete the stream that,
    // in this case, is a data member inside another object and not dynamically
    // allocated.
    //
    // We can't replace "iss" with "is" since we still need the auto_ptr for
    // the case when the result is not streamable.
    //
    is = &lStringItem.getStream();
  }
  else
  {
    docString = lStringItem.getStringValue();
    iss.reset (new std::istringstream(docString.c_str()));
    is = iss.get();
  }
  
  if (aArgs.size() == 2)
  {
    Iterator_t lArg1Iter = aArgs[1]->getIterator();
    lArg1Iter->open();
    lArg1Iter->next(lOptionsItem);
    lArg1Iter->close();
  }
  
  return ItemSequence_t(
  new SingletonItemSequence(createHtmlItem(*is, lOptionsItem)));
}
Example #4
0
ItemSequence_t WriteTextFunctionImpl::evaluate(
  ExternalFunction::Arguments_t const &args,
  StaticContext const*,
  DynamicContext const* ) const
{
  String const path( getPathArg( args, 0 ) );
  String const encoding( getStringArg( args, 2 ) );

  fs::type const fs_type = fs::get_type( path );
  if ( fs_type && fs_type != fs::file )
    raiseFileError( "FOFL0004", "not a plain file", path );

  if ( !transcode::is_supported( encoding.c_str() ) )
    raiseFileError( "FOFL9999", "encoding not supported", encoding );

  ios_base::openmode const mode = ios_base::out
    | (append_ ? ios_base::app : ios_base::trunc);

  ofstream ofs( path.c_str(), mode );
  if ( !ofs ) {
    ostringstream oss;
    oss << '"' << path << "\": can not open file for writing";
    raiseFileError( "FOFL9999", oss.str().c_str(), path );
  }

  transcode::auto_attach<ofstream> transcoder;
  if ( transcode::is_necessary( encoding.c_str() ) )
    transcoder.attach( ofs, encoding.c_str() );

  Iterator_t it( args[1]->getIterator() );
  it->open();
  Item item;
  while ( it->next( item ) ) {
    if ( item.isStreamable() ) {
      ofs << item.getStream().rdbuf();
    } else {
      zorba::String const s( item.getStringValue() );
      ofs.write( s.data(), s.size() );
    }
    if ( newlines_ )
      ofs << fs::newline;
  }
  it->close();

  return ItemSequence_t( new EmptySequence() );
}
Example #5
0
ItemSequence_t WriteBinaryFunctionImpl::evaluate(
  ExternalFunction::Arguments_t const &args,
  StaticContext const*,
  DynamicContext const* ) const
{
  String const path( getPathArg( args, 0 ) );

  fs::type const fs_type = fs::get_type( path );
  if ( fs_type && fs_type != fs::file )
    raiseFileError( "FOFL0004", "not a plain file", path );

  ios_base::openmode const mode = ios_base::out | ios_base::binary
    | (append_ ? ios_base::app : ios_base::trunc);

  ofstream ofs( path.c_str(), mode );
  if ( !ofs ) {
    ostringstream oss;
    oss << '"' << path << "\": can not open file for writing";
    raiseFileError( "FOFL9999", oss.str().c_str(), path );
  }

  Iterator_t it( args[1]->getIterator() );
  it->open();
  Item item;
  while ( it->next( item ) ) {
    if ( item.isStreamable() ) {
      if ( item.isEncoded() )
        base64::decode( item.getStream(), ofs );
      else
        ofs << item.getStream().rdbuf();
    } else {
      size_t b64_size;
      char const *const b64_value = item.getBase64BinaryValue( b64_size );
      if ( item.isEncoded() )
        base64::decode( b64_value, b64_size, ofs );
      else
        ofs.write( b64_value, b64_size );
    }
  }
  it->close();

  return ItemSequence_t( new EmptySequence() );
}
  ItemSequence_t
  CExternalFunction::evaluate
  (const ExternalFunction::Arguments_t& args) const
  {
    unsigned int lSequencesSize = (unsigned int)args.size();
    XQC_Sequence** lSequences = new XQC_Sequence*[lSequencesSize];

    // Wrap each Argument (which is just an ItemSequence) in a
    // CSequence, and keep an array of each corresponding
    // XQC_Sequence. These ItemSequences are being memory-managed by
    // the Zorba engine, so we request that CSequence NOT free them
    // when the CSequence is deleted.
    for (unsigned int i = 0; i < lSequencesSize; ++i) {
      std::unique_ptr<CSequence> lSeq(new CSequence(args[i], false, NULL));
      lSequences[i] = lSeq.release()->getXQC();
    }

    return ItemSequence_t(new UserItemSequence(lSequences, lSequencesSize, 
        theInitFunction, theNextFunction, theFreeFunction,
        theFunctionUserData, theFactory, theErrorHandler));
  }
Example #7
0
    ItemSequence_t
    RegisterFunction::evaluate(
        const ExternalFunction::Arguments_t &args,
        const zorba::StaticContext *aStaticContext,
        const zorba::DynamicContext *aDynamincContext) const {
      JdbcModule::initGlobals(aStaticContext);
      Item result;
      JDBC_MODULE_TRY;
      jstring driverName(NULL);
      Item item = JdbcModule::getItemArg(args, 0);
      bool hasUsername = false;
      if (item.isJSONItem()) {
        Iterator_t lKeys = item.getObjectKeys();
        lKeys->open();
        Item lKey;
        while (lKeys->next(lKey)) {
          zorba::String keystring = lKey.getStringValue();
          zorba::String value = item.getObjectValue(keystring).getStringValue();
          if (keystring == "driver") {
            driverName = env->NewStringUTF(value.c_str());
            CHECK_EXCEPTION;
          }
        }
        lKeys->close();
      }

      jobject oRegister;
      if (driverName) {
        oRegister = env->CallStaticObjectMethod(
            jClass.classID,
            jClass.forName,
            driverName);
        CHECK_EXCEPTION;
      }

      JDBC_MODULE_CATCH;
      return ItemSequence_t(new EmptySequence());
    }
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());
}
Example #9
0
    ItemSequence_t
    SetValueFunction::evaluate(
        const ExternalFunction::Arguments_t &args,
        const zorba::StaticContext *aStaticContext,
        const zorba::DynamicContext *aDynamincContext) const {
      String lStatementUUID = JdbcModule::getStringArg(args, 0);

      CHECK_CONNECTION;
      Item result;

      JDBC_MODULE_TRY;
      jobject oPreparedStatement =
          JdbcModule::getObject(aDynamincContext,
                                lStatementUUID,
                                INSTANCE_MAP_PREPAREDSTATEMENTS);

      long index = (long) JdbcModule::getItemArg(args, 1).getLongValue();
      Item value = JdbcModule::getItemArg(args, 2);
      int type = value.getTypeCode();

      switch (type) {
        case XS_DOUBLE:
          env->CallVoidMethod(oPreparedStatement, jPreparedStatement.setDouble,
                              index, value.getDoubleValue());
          break;
        case XS_FLOAT:
          env->CallVoidMethod(oPreparedStatement, jPreparedStatement.setFloat,
                              index, value.getDoubleValue());
          break;
        case XS_INTEGER:
          env->CallVoidMethod(oPreparedStatement, jPreparedStatement.setLong,
                              index, value.getLongValue());
          break;
        case XS_DECIMAL: {
          double dVal;
          sscanf(value.getStringValue().c_str(), "%lf", &dVal);
          env->CallVoidMethod(oPreparedStatement, jPreparedStatement.setDouble,
                              index, dVal);
          break;
        }
        case XS_BOOLEAN: {
          jboolean boolval = JNI_FALSE;
          if (value.getBooleanValue())
            boolval = JNI_TRUE;
          env->CallVoidMethod(oPreparedStatement, jPreparedStatement.setBoolean,
                              index, boolval);
          break;
        }
        case JS_NULL: {
          jobject oParameterMetadata =
              env->CallObjectMethod(oPreparedStatement,
                                    jPreparedStatement.getParameterMetaData);
          CHECK_EXCEPTION;
          int parameterType =
              env->CallIntMethod(oParameterMetadata,
                                 jParameterMetadata.getParameterType,
                                 index);
          CHECK_EXCEPTION;
          env->CallVoidMethod(oPreparedStatement,
                              jPreparedStatement.setNull,
                              index, parameterType);
          CHECK_EXCEPTION;
          break;
        }
        default: { // STRING
          jstring stringval = env->NewStringUTF(value.getStringValue().c_str());
          env->CallVoidMethod(oPreparedStatement, jPreparedStatement.setString,
                              index, stringval);
          break;
        }
      }
      CHECK_EXCEPTION;
      JDBC_MODULE_CATCH;

      return ItemSequence_t(new EmptySequence());
    }