diff options
author | Andreas Beeker <kiwiwings@apache.org> | 2021-04-07 21:40:33 +0000 |
---|---|---|
committer | Andreas Beeker <kiwiwings@apache.org> | 2021-04-07 21:40:33 +0000 |
commit | b6aee1ef6d3e92a28ffd4b5c03e677b63b43747f (patch) | |
tree | ad9c7b312976c4ed113a7f3b5b4757bfe1b3eee6 /poi-examples/src/main/ruby | |
parent | 6458acb931a0cc17b2d5ed205a1b3fbbb78b9193 (diff) | |
download | poi-b6aee1ef6d3e92a28ffd4b5c03e677b63b43747f.tar.gz poi-b6aee1ef6d3e92a28ffd4b5c03e677b63b43747f.zip |
65206 - Migrate ant / maven to gradle build
compile / jar / test of mrJars
don't include ants build.xml anymore
rename directories to match project and maven artifact names
refactor artifacts - so each project has one artifact
replace static references in hssf/dev tests with junit5 constructs, which had problems in parallel tests
increase gradle heap to 4gb because of OOM - maybe less would also work
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1888488 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'poi-examples/src/main/ruby')
-rw-r--r-- | poi-examples/src/main/ruby/Makefile | 332 | ||||
-rw-r--r-- | poi-examples/src/main/ruby/Poi4R.i | 614 | ||||
-rw-r--r-- | poi-examples/src/main/ruby/cpp/RubyIO.cpp | 44 | ||||
-rw-r--r-- | poi-examples/src/main/ruby/java/org/apache/poi/RubyOutputStream.java | 62 | ||||
-rw-r--r-- | poi-examples/src/main/ruby/tests/tc_base_tests.rb | 100 | ||||
-rw-r--r-- | poi-examples/src/main/ruby/tests/tc_gc.rb | 32 | ||||
-rw-r--r-- | poi-examples/src/main/ruby/tests/ts_all.rb | 20 |
7 files changed, 1204 insertions, 0 deletions
diff --git a/poi-examples/src/main/ruby/Makefile b/poi-examples/src/main/ruby/Makefile new file mode 100644 index 0000000000..a298da3296 --- /dev/null +++ b/poi-examples/src/main/ruby/Makefile @@ -0,0 +1,332 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + + +# Makefile for building Poi4R +# +# Supported operating systems: Linux, Mac OS X and Windows. +# See INSTALL file for requirements. +# +# Steps to build +# 1. Edit the sections below as documented +# 2. make all +# 3. make install +# +# The install target installs the Poi4R python extension in python's +# site-packages directory. On Mac OS X, it also installs the gcj runtime +# libraries into $(PREFIX)/lib. +# +# To successfully import the Poi4R extension into Ruby, all required +# libraries need to be found. If the locations you chose are non-standard, +# the relevant DYLD_LIBRARY_PATH (Mac OS X), LD_LIBRARY_PATH (Linux), or +# PATH (Windows) need to be set accordingly. +# + + +VERSION=0.1.0 +POI_VER=$(shell grep '<property name="version.id"' ../../../build.xml | awk -F'"' '{print $$4}') +RUBY_VER=1.8 + +POI4R:=$(shell pwd) +POI=$(POI4R)/poi-$(POI_VER) +#DEBUG=1 + +# +# You need to uncomment and edit the variables below in the section +# corresponding to your operating system. +# +# PREFIX: where programs are normally installed on your system (Unix). +# PREFIX_RUBY: where your version of python is installed. +# GCJ_HOME: where GCC/GCJ is installed. +# Windows drive-absolute paths need to be expressed cygwin style. +# + +# Mac OS X (Darwin) +#PREFIX=/usr/local +#PREFIX_RUBY=/Library/Frameworks/Ruby.framework/Versions/$(RUBY_VER) +#SWIG=$(PREFIX)/bin/swig +#GCJ_HOME=/usr/local/gcc-3.4.1 +#DB=$(POI4R)/db-$(DB_VER) +#PREFIX_DB=/usr/local/BerkeleyDB.$(DB_LIB_VER) + +# Linux +PREFIX=/usr +PREFIX_RUBY=$(PREFIX) +SWIG=$(PREFIX)/bin/swig +GCJ_HOME=/usr +#DB=$(POI4R)/db-$(DB_VER) +#PREFIX_DB=$(PREFIX)/BerkeleyDB.$(DB_LIB_VER) + +# Windows +#PREFIX_RUBY=/cygdrive/o/Python-2.3.2 +#SWIG=/cygdrive/c/utils/bin/swig.exe +#GCJ_HOME=/cygdrive/o/mingw-3.1 +#DB=/cygdrive/o/db-$(DB_VER) +#PREFIX_DB=$(DB) + +# +# No edits required below +# + +OS=$(shell uname) +ifeq ($(findstring CYGWIN,$(OS)),CYGWIN) +OS=Cygwin +endif +ifeq ($(findstring WINNT,$(OS)),WINNT) +OS=Cygwin +endif + +ifeq ($(DEBUG),1) +COMP_OPT=DEBUG=1 +SUFFIX=d +_SUFFIX=_d +BINDIR=debug +else +COMP_OPT= +SUFFIX= +_SUFFIX= +BINDIR=release +endif + +SWIG_OPT=-DSWIG_COBJECT_TYPES -DPOI4R_VER="'$(VERSION)'" -DPOI_VER="'$(POI_VER)'" + +JCCFLAGS=--encoding=UTF-8 +#JCCFLAGS=--encoding=UTF-8 -findirect-dispatch + +ifeq ($(OS),Darwin) +RUBY_SITE=$(PREFIX_RUBY)/lib/ruby$(RUBY_VER)/site-packages +RUBY_INC=$(PREFIX_RUBY)/lib/ruby$(RUBY_VER) +POI4R=$(BINDIR)/poi4r.so +ifeq ($(DEBUG),1) +CCFLAGS=-O0 -g +LDFLAGS=-g +else +CCFLAGS=-O2 +LDFLAGS= +endif +else + +ifeq ($(OS),Linux) +RUBY_SITE=$(PREFIX_RUBY)/lib/ruby/site-ruby/$(RUBY_VER)/ +RUBY_INC=$(PREFIX_RUBY)/lib/ruby/$(RUBY_VER)/i686-linux +POI4R_LIB=$(BINDIR)/poi4r.so +ifeq ($(DEBUG),1) +CCFLAGS=-O0 -g -fPIC +LDFLAGS=-g +else +CCFLAGS=-O2 -fPIC +LDFLAGS= +endif +else + +ifeq ($(OS),Cygwin) +RUBY_SITE=`cygpath -aw $(PREFIX_RUBY)/Lib/site-packages` +RUBY_INC=`cygpath -aw $(PREFIX_RUBY)/Include` +RUBY_PC=`cygpath -aw $(PREFIX_RUBY)/PC` +POI4R_LIB=$(BINDIR)/poi4r$(_SUFFIX).so +ifeq ($(DEBUG),1) +CCFLAGS=-O -g +LDFLAGS=-g +else +CCFLAGS=-O2 +LDFLAGS= +endif +else + +RUBY=unknown +RUBY_SITE=unknown +endif +endif +endif + +CLASSES=$(BINDIR)/classes +JAR_CLASSES=$(CLASSES)/jar + +CC=$(GCJ_HOME)/bin/gcc +CXX=$(GCJ_HOME)/bin/g++ +JCC=$(GCJ_HOME)/bin/gcj +JCCH=$(GCJ_HOME)/bin/gcjh +JAR=$(GCJ_HOME)/bin/jar +POI_ZIP=poi-$(POI_VER).jar +POI_JAR=poi-$(POI_VER).jar +POI_JAR_WC=poi-$(POI_VER)-*.jar + +POI4R_CP:=$(BINDIR)/$(POI_JAR):$(CLASSES) + +OBJS=$(BINDIR)/poi.o $(BINDIR)/io.java.o $(BINDIR)/io.cpp.o + +LIBS=$(POI4R_LIB) + +default: all + +patches: + + +env: +ifndef PREFIX_RUBY + @echo Operating system is $(OS) + @echo You need to edit that section of the Makefile + @false +else + @true +endif + + +$(BINDIR): + mkdir -p $(BINDIR)/classes/jar + + +DISTRIB=Poi-$(VERSION) + +ifeq ($(OS),Cygwin) +POI4R_CP:=`cygpath -awp $(POI4R_CP)` +endif + + +ifeq ($(OS),Cygwin) +_poi=`cygpath -aw $(POI)` +else +_poi=$(POI) +endif + +$(BINDIR)/$(POI_JAR): + cp ../../../build/dist/$(POI_JAR_WC) $(BINDIR)/$(POI_JAR) + cd $(JAR_CLASSES); $(JAR) -xf ../../$(POI_JAR) + +$(BINDIR)/io.java.o: java/org/apache/poi/RubyOutputStream.java + $(JCC) $(JCCFLAGS) -C -d $(CLASSES) java/org/apache/poi/RubyOutputStream.java + $(JCC) $(JCCFLAGS) $(CCFLAGS) -I$(GCJ_HOME)/include -c -o $@ java/org/apache/poi/RubyOutputStream.java + +$(CLASSES)/org/apache/poi/RubyOutputStream.h: $(BINDIR)/io.java.o Makefile + mkdir -p $(CLASSES)/org/apache/poi/hssf/usermodel + $(JCCH) -d $(CLASSES) --classpath=$(JAR_CLASSES) org.apache.poi.hssf.usermodel.HSSFWorkbook + $(JCCH) -d $(CLASSES) --classpath=$(JAR_CLASSES) org.apache.poi.hssf.usermodel.HSSFSheet + $(JCCH) -d $(CLASSES) --classpath=$(JAR_CLASSES) org.apache.poi.hssf.usermodel.HSSFRow + $(JCCH) -d $(CLASSES) --classpath=$(JAR_CLASSES) org.apache.poi.hssf.usermodel.HSSFCell + $(JCCH) -d $(CLASSES) --classpath=$(JAR_CLASSES) org.apache.poi.hssf.usermodel.HSSFHeader + $(JCCH) -d $(CLASSES) --classpath=$(JAR_CLASSES) org.apache.poi.hssf.usermodel.HSSFFooter + $(JCCH) -d $(CLASSES) --classpath=$(JAR_CLASSES) org.apache.poi.hssf.usermodel.HSSFFont + $(JCCH) -d $(CLASSES) --classpath=$(JAR_CLASSES) org.apache.poi.hssf.usermodel.HSSFDataFormat + $(JCCH) -d $(CLASSES) --classpath=$(JAR_CLASSES) org.apache.poi.hssf.usermodel.HSSFCellStyle + $(JCCH) -d $(CLASSES) --classpath=$(CLASSES) org.apache.poi.RubyOutputStream + + +$(BINDIR)/io.cpp.o: $(CLASSES)/org/apache/poi/RubyOutputStream.h cpp/RubyIO.cpp $(BINDIR)/io.java.o + $(JCC) -I$(RUBY_INC) -I$(GCJ_HOME)/include -I$(CLASSES) $(CCFLAGS) -c -o $@ cpp/RubyIO.cpp + +$(BINDIR)/poi.o: $(BINDIR)/$(POI_JAR) + $(JCC) $(JCCFLAGS) $(CCFLAGS) -c -o $@ $(BINDIR)/$(POI_JAR) + +Poi4R_wrap.cxx: $(BINDIR)/io.cpp.o Poi4R.i +ifdef SWIG + $(SWIG) $(SWIG_OPT) -I$(CLASSES) -c++ -ruby Poi4R.i +endif + + +ifeq ($(OS),Darwin) +$(POI4R_LIB): $(OBJS) Poi4R_wrap.cxx + $(CXX) -shared -bundle -o $@ $(CCFLAGS) $(SWIG_OPT) $(DB_INC) -I$(GCJ_HOME)/include -I$(CLASSES) -I$(RUBY_INC) Poi4R_wrap.cxx $(OBJS) -L$(GCJ_HOME)/lib -lgcj -liconv -undefined suppress -flat_namespace -multiply_defined suppress +else + +ifeq ($(OS),Linux) +$(POI4R_LIB): $(OBJS) Poi4R_wrap.cxx + $(CXX) -shared -o $@ $(CCFLAGS) $(SWIG_OPT) $(DB_INC) -I$(CLASSES) -I$(RUBY_INC) Poi4R_wrap.cxx $(OBJS) -lgcj +else + +ifeq ($(OS),Cygwin) +$(POI4R_LIB): $(OBJS) Poi4R_wrap.cxx + $(CXX) -c $(CCFLAGS) $(PYDBG) -D_NO_OLDNAMES -D_off_t=off_t $(SWIG_OPT) $(DB_INC) -I$(CLASSES) -I$(RUBY_PC) -I$(RUBY_INC) -o $(BINDIR)/Poi4R_wrap.o Poi4R_wrap.cxx + $(CXX) -shared $(LDFLAGS) -o $@ $(OBJS) `cygpath -aw $(PREFIX_RUBY)/python23$(_SUFFIX).dll` $(BINDIR)/Poi4R_wrap.o -lgcj -lwin32k -lws2_32 +endif +endif +endif + + +all: env $(BINDIR) $(LIBS) + @echo build of $(POI4R_LIB) complete + +install:: all + install Poi4R.rb $(RUBY_SITE) + install $(POI4R_LIB) $(RUBY_SITE) + +ifeq ($(OS),Darwin) +install:: + install $(GCJ_HOME)/lib/libgcj.5.dylib $(PREFIX)/lib + install $(GCJ_HOME)/lib/libstdc++.6.dylib $(PREFIX)/lib + install $(GCJ_HOME)/lib/libgcc_s.1.0.dylib $(PREFIX)/lib +else + +ifeq ($(OS),Linux) +install:: + +else + +ifeq ($(OS),Cygwin) +install:: + +endif +endif +endif + + +clean: + rm -rf $(BINDIR) Poi4R.rb* Poi4R_wrap.cxx + +realclean: clean + rm -rf $(POI) $(STORE) $(DISTRIB) + +distrib:: + mkdir -p $(DISTRIB)/python + install Poi4R.rb $(DISTRIB)/python + install $(POI4R_LIB) $(DISTRIB)/python + install README $(DISTRIB) + +ifeq ($(OS),Darwin) +distrib:: +ifdef DB + mkdir -p $(DISTRIB)/db + install $(LIBDB_JAVA_LIB) $(DISTRIB)/db + install libdb_java-$(DB_LIB_VER).la.osx $(DISTRIB)/db +endif + mkdir -p $(DISTRIB)/gcj + install $(GCJ_HOME)/lib/libgcj.5.dylib $(DISTRIB)/gcj + install $(GCJ_HOME)/lib/libstdc++.6.dylib $(DISTRIB)/gcj + install $(GCJ_HOME)/lib/libgcc_s.1.0.dylib $(DISTRIB)/gcj +else + +ifeq ($(OS),Linux) +distrib:: +ifdef DB + mkdir -p $(DISTRIB)/db + install $(LIBDB_JAVA_LIB) $(DISTRIB)/db +endif + mkdir -p $(DISTRIB)/gcj + install $(GCJ_HOME)/lib/libgcj.so.5 $(DISTRIB)/gcj + install $(GCJ_HOME)/lib/libstdc++.so.6 $(DISTRIB)/gcj + install $(GCJ_HOME)/lib/libgcc_s.so.1 $(DISTRIB)/gcj +else + +ifeq ($(OS),Cygwin) +distrib:: +ifdef DB + mkdir -p $(DISTRIB)/db + install $(LIBDB_JAVA_LIB) $(DISTRIB)/db +endif +endif +endif +endif + diff --git a/poi-examples/src/main/ruby/Poi4R.i b/poi-examples/src/main/ruby/Poi4R.i new file mode 100644 index 0000000000..2f72ce9948 --- /dev/null +++ b/poi-examples/src/main/ruby/Poi4R.i @@ -0,0 +1,614 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +==================================================================== */ + +%module poi4r + + +%{ + +#include <gcj/cni.h> +#include <java/lang/Object.h> +#include <java/lang/Thread.h> +#include <java/lang/ThreadGroup.h> +#include <java/lang/Runnable.h> +#include <java/lang/String.h> +#include <java/lang/Throwable.h> +#include <java/lang/Comparable.h> +#include <java/lang/Integer.h> +#include <java/lang/Long.h> +#include <java/lang/Float.h> +#include <java/lang/Double.h> +#include <java/io/StringWriter.h> +#include <java/io/PrintWriter.h> +#include <java/util/HashMap.h> +#include <java/util/Date.h> +#include <java/util/Calendar.h> +#include <java/lang/System.h> + +#include "org/apache/poi/hssf/usermodel/HSSFWorkbook.h" +#include "org/apache/poi/hssf/usermodel/HSSFSheet.h" +#include "org/apache/poi/hssf/usermodel/HSSFRow.h" +#include "org/apache/poi/hssf/usermodel/HSSFCell.h" +#include "org/apache/poi/hssf/usermodel/HSSFFont.h" +#include "org/apache/poi/hssf/usermodel/HSSFCellStyle.h" +#include "org/apache/poi/hssf/usermodel/HSSFDataFormat.h" +#include "org/apache/poi/hssf/usermodel/HSSFHeader.h" +#include "org/apache/poi/hssf/usermodel/HSSFFooter.h" +#include "org/apache/poi/RubyOutputStream.h" + + +typedef ::org::apache::poi::hssf::usermodel::HSSFWorkbook *jhworkbook; +typedef ::org::apache::poi::hssf::usermodel::HSSFSheet *jhsheet; +typedef ::org::apache::poi::hssf::usermodel::HSSFRow *jhrow; +typedef ::org::apache::poi::hssf::usermodel::HSSFCell *jhcell; +typedef ::org::apache::poi::hssf::usermodel::HSSFCellStyle *jhcellstyle; +typedef ::org::apache::poi::hssf::usermodel::HSSFFont *jhfont; +typedef ::org::apache::poi::hssf::usermodel::HSSFFooter *jhfooter; +typedef ::org::apache::poi::hssf::usermodel::HSSFHeader *jhheader; +typedef ::org::apache::poi::hssf::usermodel::HSSFDataFormat *jhdataformat; + +typedef ::java::util::Date *jdate; +typedef ::java::util::Calendar *jcalendar; +typedef ::java::io::OutputStream *joutputstream; +typedef ::java::io::InputStream *jinputstream; +typedef ::java::util::Collection *jstringCollection; +typedef ::java::util::Collection *jtermCollection; +typedef ::java::util::Locale *jlocale; +typedef ::java::lang::Comparable *jcomparable; +typedef JArray<jobject> *jobjectArray; +typedef JArray<jstring> *jstringArray; + + +static java::lang::Thread *nextThread; +static java::util::HashMap *objects; + + +static void store_reference(jobject object) { + java::lang::Integer *ji =new java::lang::Integer(java::lang::System::identityHashCode(object)); + jobject jo = objects->get(ji); + if (!jo) { + // printf("put object in hash\n"); + objects->put(ji,object); + } +} +static VALUE jo2rv(jobject object, swig_type_info *descriptor) +{ + if (object == NULL) + { + return Qnil; + } + else + { + return SWIG_NewPointerObj((void *) object, descriptor, 0); + } +} +static int cvtptr(VALUE value, void **jo, swig_type_info *info) +{ + if (SWIG_ConvertPtr(value, jo, info, 0) == 0) + return 0; + else + { + return -1; + } +} + +static int rv2jo(VALUE rv, jobject *jo, swig_type_info *descriptor) +{ + if (NIL_P(rv)) + *jo = NULL; + else + { + java::lang::Object *javaObj; + + if (cvtptr(rv, (void **) &javaObj, descriptor) == -1) + return 0; + + *jo = javaObj; + } + + return 1; +} + + +static jstring r2j(VALUE object) +{ + if (NIL_P(object)){ + return NULL; + } + else { + char *ps = STR2CSTR(object); + jstring js = JvNewStringLatin1(ps); + + if (!js) + { + rb_raise(rb_eRuntimeError, "ruby str cannot be converted to java: %s",ps); + } + + return js; + } +} + +VALUE j2r(jstring js) +{ + if (!js) + { + return Qnil; + } + else + { + jint len = JvGetStringUTFLength(js); + char buf[len + 1]; + + JvGetStringUTFRegion(js, 0, len, buf); + buf[len] = '\0'; + + return rb_str_new2(buf); + } +} + +static void free_java_obj(void* arg1) { + jobject object =(jobject) arg1; + java::lang::Integer *ji =new java::lang::Integer(java::lang::System::identityHashCode(object)); + jobject jo = objects->get(ji); + if (jo) { + // printf("removed object from hash\n"); + objects->remove(ji); + } +} + +static void raise_ruby_error(java::lang::Throwable *e) { + java::io::StringWriter *buffer = new java::io::StringWriter(); + java::io::PrintWriter *writer = new java::io::PrintWriter(buffer); + e->printStackTrace(writer); + writer->close(); + jstring message = buffer->toString(); + jint len = JvGetStringUTFLength(message); + char buf[len + 1]; + JvGetStringUTFRegion(message, 0, len, buf); + buf[len] = '\0'; + rb_raise(rb_eRuntimeError, "error calling poi \n %s", buf); +} + +%} + +typedef long jint; +typedef long long jlong; +typedef char jbyte; +typedef float jfloat; +typedef float jdouble; +typedef int jshort; +typedef bool jboolean; + +%typemap(in) SWIGTYPE * { + + if (!rv2jo($input, (jobject *) &$1, $1_descriptor)) + rb_raise(rb_eRuntimeError, "Unrecoverable error in SWIG typemapping"); +} +%typemap(out) SWIGTYPE * { + + $result = jo2rv($1, $1_descriptor); +} + +%typemap(in) org::apache::poi::hssf::usermodel::HSSFWorkbook{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFWorkbook *))) + SWIG_fail; +} +%typemap(out) org::apache::poi::hssf::usermodel::HSSFWorkbook { + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFWorkbook *)); +} + +%typemap(in) jhsheet{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFSheet *))) + SWIG_fail; +} +%typemap(out) jhsheet { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFSheet *)); +} +%typemap(in) jhrow{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFRow *))) + SWIG_fail; +} +%typemap(out) jhrow { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFRow *)); +} +%typemap(in) jhcell{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFCell *))) + SWIG_fail; +} +%typemap(out) jhcell { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFCell *)); +} +%typemap(in) jhfont{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFFont *))) + rb_raise(rb_eRuntimeError, "Unrecoverable error in SWIG typemapping of HSSFFont"); +} + +%typemap(out) jhfont { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFFont *)); +} + +%typemap(in) jhcellstyle{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFCellStyle *))) + rb_raise(rb_eRuntimeError, "Unrecoverable error in SWIG typemapping of HSSFCellStyle"); +} +%typemap(out) jhcellstyle { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFCellStyle *)); +} +%typemap(in) jhdataformat{ + + if (!rv2jo($input, (jobject *) &$1, + $descriptor(org::apache::poi::hssf::usermodel::HSSFDataFormat *))) + rb_raise(rb_eRuntimeError, "Unrecoverable error in SWIG typemapping of HSSFDataFormat"); +} +%typemap(out) jhdataformat { + + $result = jo2rv($1, $descriptor(org::apache::poi::hssf::usermodel::HSSFDataFormat *)); +} + + +%typemap(in) jstring { + $1 = r2j($input); +} +%typemap(out) jstring { + $result = j2r($1); +} +%typecheck(SWIG_TYPECHECK_STRING) jstring { + $1 = ( NIL_P($input) || TYPE($input)==T_STRING ); +} + +%typemap(in) joutputstream { + + jlong ptr; + if (!rb_respond_to($input, rb_intern("putc"))) rb_raise(rb_eTypeError,"Expected IO"); + *(VALUE *) &ptr = (VALUE) $input; + $1 = new org::apache::poi::RubyOutputStream(ptr); +} +%typemap(in) jcalendar { + $1 = java::util::Calendar::getInstance(); + //$1->setTimeInMillis((long long) NUM2DBL(rb_funcall($input,rb_intern("to_i"),0,NULL))*1000.0); + $1->set(FIX2INT(rb_funcall($input,rb_intern("year"),0,NULL)), + FIX2INT(rb_funcall($input,rb_intern("mon"),0,NULL))-1, + FIX2INT(rb_funcall($input,rb_intern("day"),0,NULL)), + FIX2INT(rb_funcall($input,rb_intern("hour"),0,NULL)), + FIX2INT(rb_funcall($input,rb_intern("min"),0,NULL)), + FIX2INT(rb_funcall($input,rb_intern("sec"),0,NULL)) + ); +} + +%typecheck(SWIG_TYPECHECK_POINTER) jcalendar { + $1 = rb_respond_to($input, rb_intern("asctime")); +} + +%typemap(out) jdate { + jlong t = ((jdate) $1)->getTime(); + //TODO: separate seconds and microsecs + int ts=t/1000; + $result=rb_time_new((time_t) ts, 0 ); +} + + +%freefunc org::apache::poi::hssf::usermodel::HSSFWorkbook "free_java_obj"; + +%exception { + try { + $action + } catch (java::lang::Throwable *e) { + raise_ruby_error(e); + } +} +%exception org::apache::poi::hssf::usermodel::HSSFWorkbook::HSSFWorkbook { + try { + $action + store_reference(result); + } catch (java::lang::Throwable *e) { + raise_ruby_error(e); + } +} + + + + +namespace java { + namespace lang { + class Object { + jstring toString(); + }; +%nodefault; + class System : public Object { + public: + static jstring getProperty(jstring); + static jstring getProperty(jstring, jstring); + static void load(jstring); + static void loadLibrary(jstring); + static void mapLibraryName(jstring); + static void runFinalization(); + static void setProperty(jstring, jstring); + }; +%makedefault; + } + namespace io { +%nodefault; + class InputStream : public ::java::lang::Object { + }; + class OutputStream : public ::java::lang::Object { + }; + +%makedefault; + } + namespace util { + class Date : public ::java::lang::Object { + public: + Date(); + Date(jlong); + void setTime(jlong); + jstring toString(); + }; + } +} + + +namespace org { + namespace apache { + namespace poi { + namespace hssf { + namespace usermodel { +%nodefault; + class HSSFWorkbook : public ::java::lang::Object { + public: + HSSFWorkbook(); + jstring getSheetName(jint); + jint getNumberOfSheets(); + void setSheetOrder(jstring,jint); + void setSheetName(jint,jstring); + void setSheetName(jint,jstring,jshort); + jint getSheetIndex(jstring); + jhsheet createSheet(); + jhsheet cloneSheet(jint); + jhsheet createSheet(jstring); + jhsheet getSheetAt(jint); + jhsheet getSheet(jstring); + void removeSheetAt(jint); + jhcellstyle createCellStyle(); + jhfont createFont(); + jhdataformat createDataFormat(); + void write(joutputstream); + + }; + + class HSSFSheet : public ::java::lang::Object { + public: + jhrow createRow(jint); + jhrow getRow(jint); + jhfooter getFooter(); + jhheader getHeader(); + }; + class HSSFRow : public ::java::lang::Object { + public: + jhcell createCell(jshort); + jhcell getCell(jshort); + //jboolean getProtect(); //only in 2.5 + + }; + class HSSFCell : public ::java::lang::Object { + public: + void setCellValue(jdouble); + void setCellValue(jstring); + void setCellValue(jboolean); + void setCellValue(jcalendar); + void setCellFormula(jstring); + jstring getStringCellValue(); + jdouble getNumericCellValue(); + jdate getDateCellValue(); + jstring getCellFormula(); + jboolean getBooleanCellValue(); + jint getCellType(); + jshort getEncoding(); + void setAsActiveCell(); + + void setCellStyle(jhcellstyle); + void setEncoding(jshort encoding); + + static const jint CELL_TYPE_BLANK; + static const jint CELL_TYPE_BOOLEAN; + static const jint CELL_TYPE_ERROR; + static const jint CELL_TYPE_FORMULA; + static const jint CELL_TYPE_NUMERIC; + static const jint CELL_TYPE_STRING; + + static const jshort ENCODING_COMPRESSED_UNICODE; + static const jshort ENCODING_UTF_16; + }; + class HSSFCellStyle : public ::java::lang::Object { + public: + static const jshort ALIGN_CENTER; + static const jshort ALIGN_CENTER_SELECTION; + static const jshort ALIGN_FILL; + static const jshort ALIGN_GENERAL; + static const jshort ALIGN_JUSTIFY; + static const jshort ALIGN_LEFT; + static const jshort ALIGN_RIGHT; + static const jshort ALT_BARS; + static const jshort BIG_SPOTS; + static const jshort BORDER_DASH_DOT; + static const jshort BORDER_DASH_DOT_DOT; + static const jshort BORDER_DASHED; + static const jshort BORDER_DOTTED; + static const jshort BORDER_DOUBLE; + static const jshort BORDER_HAIR; + static const jshort BORDER_MEDIUM; + static const jshort BORDER_MEDIUM_DASH_DOT; + static const jshort BORDER_MEDIUM_DASH_DOT_DOT; + static const jshort BORDER_MEDIUM_DASHED; + static const jshort BORDER_NONE; + static const jshort BORDER_SLANTED_DASH_DOT; + static const jshort BORDER_THICK; + static const jshort BORDER_THIN; + static const jshort BRICKS; + static const jshort DIAMONDS; + static const jshort FINE_DOTS; + static const jshort NO_FILL; + static const jshort SOLID_FOREGROUND; + static const jshort SPARSE_DOTS; + static const jshort SQUARES; + static const jshort THICK_BACKWARD_DIAG; + static const jshort THICK_FORWARD_DIAG; + static const jshort THICK_HORZ_BANDS; + static const jshort THICK_VERT_BANDS; + static const jshort THIN_BACKWARD_DIAG; + static const jshort THIN_FORWARD_DIAG; + static const jshort THIN_HORZ_BANDS; + static const jshort THIN_VERT_BANDS; + static const jshort VERTICAL_BOTTOM; + static const jshort VERTICAL_CENTER; + static const jshort VERTICAL_JUSTIFY; + static const jshort VERTICAL_TOP; + + jshort getAlignment(); + jshort getBorderBottom(); + jshort getBorderLeft(); + jshort getBorderRight(); + jshort getBorderTop(); + jshort getBottomBorderColor(); + jshort getDataFormat(); + jshort getFillBackgroundColor(); + jshort getFillForegroundColor(); + jshort getFillPattern(); + jshort getFontIndex(); + jboolean getHidden(); + jshort getIndention(); + jshort getIndex(); + jshort getLeftBorderColor(); + jboolean getLocked(); + jshort getRightBorderColor(); + jshort getRotation(); + jshort getTopBorderColor(); + jshort getVerticalAlignment(); + jboolean getWrapText(); + void setAlignment(jshort) ; + void setBorderBottom(jshort ); + void setBorderLeft(jshort ); + void setBorderRight(jshort ); + void setBorderTop(jshort ); + void setBottomBorderColor(jshort ); + void setDataFormat(jshort ); + void setFillBackgroundColor(jshort ); + void setFillForegroundColor(jshort ); + void setFillPattern(jshort ); + void setFont(jhfont ); + void setHidden(jboolean ); + void setIndention(jshort ); + void setLeftBorderColor(jshort ); + void setLocked(jboolean ); + void setRightBorderColor(jshort ); + void setRotation(jshort ); + void setTopBorderColor(jshort ); + void setVerticalAlignment(jshort ); + void setWrapText(jboolean ); + }; + class HSSFDataFormat : public ::java::lang::Object { + public: + static jstring getBuiltinFormat(jshort); + static jshort getBuiltinFormat(jstring); + jstring getFormat(jshort); + jshort getFormat(jstring); + static jint getNumberOfBuiltinBuiltinFormats(); + //TODO static jlist getBuiltinFormats(); + + }; + class HSSFFont : public ::java::lang::Object { + public: + static const jshort BOLDWEIGHT_BOLD; +static const jshort BOLDWEIGHT_NORMAL; +static const jshort COLOR_NORMAL; +static const jshort COLOR_RED; +static const jstring FONT_ARIAL; +static const jshort SS_NONE; +static const jshort SS_SUB; +static const jshort SS_SUPER; +static const jshort U_DOUBLE; +static const jshort U_DOUBLE_ACCOUNTING; +static const jshort U_NONE; +static const jshort U_SINGLE; +static const jshort U_SINGLE_ACCOUNTING; + + jshort getBoldweight(); + jshort getColor(); + jshort getFontHeight(); + jshort getFontHeightInPoints(); + jstring getFontName(); + jshort getIndex(); + jboolean getItalic(); + jboolean getStrikeout(); + jshort getTypeOffset(); + jshort getUnderline(); + void setBoldweight(jshort ); + void setColor(jshort ); + void setFontHeight(jshort ); + void setFontHeightInPoints(jshort ); + void setFontName(jstring ); + void setItalic(jboolean ); + void setStrikeout(jboolean ); + void setTypeOffset(jshort ); + void setUnderline(jshort ); +}; +%makedefault; + } + } + } + } +} + + + + + +%init %{ + + JvCreateJavaVM(NULL); + JvAttachCurrentThread(NULL, NULL); + + nextThread = new java::lang::Thread(); + objects = new java::util::HashMap(); + + java::util::HashMap *props = (java::util::HashMap *) + java::lang::System::getProperties(); + props->put(JvNewStringUTF("inRuby"), objects); + + JvInitClass(&org::apache::poi::hssf::usermodel::HSSFFont::class$); + JvInitClass(&org::apache::poi::hssf::usermodel::HSSFCell::class$); + JvInitClass(&org::apache::poi::hssf::usermodel::HSSFSheet::class$); + JvInitClass(&org::apache::poi::hssf::usermodel::HSSFCellStyle::class$); + +%} + diff --git a/poi-examples/src/main/ruby/cpp/RubyIO.cpp b/poi-examples/src/main/ruby/cpp/RubyIO.cpp new file mode 100644 index 0000000000..d4a4638cf0 --- /dev/null +++ b/poi-examples/src/main/ruby/cpp/RubyIO.cpp @@ -0,0 +1,44 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +==================================================================== */ +#include <gcj/cni.h> + +#include "ruby.h" +#include "org/apache/poi/RubyOutputStream.h" + + +/** + * The native functions declared in org.apache.poi.RubyoutputStream + * + * @author aviks + */ + + namespace org { + namespace apache { + namespace poi { + + void RubyOutputStream::close(void) + { + rb_funcall3((VALUE ) rubyIO, rb_intern("close"), 0, NULL); + } + + void RubyOutputStream::write(jint toWrite) + { + rb_funcall((VALUE ) rubyIO, rb_intern("putc"),1,INT2FIX(toWrite)); + } + } + } +} diff --git a/poi-examples/src/main/ruby/java/org/apache/poi/RubyOutputStream.java b/poi-examples/src/main/ruby/java/org/apache/poi/RubyOutputStream.java new file mode 100644 index 0000000000..e23a0a7d39 --- /dev/null +++ b/poi-examples/src/main/ruby/java/org/apache/poi/RubyOutputStream.java @@ -0,0 +1,62 @@ +/* ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +==================================================================== */ + + +package org.apache.poi; + + +import java.io.OutputStream; +import java.io.IOException; + +/** + * @author aviks + * Wrap a java.io.OutputStream around a Ruby IO object + */ + +public class RubyOutputStream extends OutputStream { + + //pointer to native ruby VALUE + protected long rubyIO; + + public RubyOutputStream (long rubyIO) + { + this.rubyIO = rubyIO; +// incRef(); + } + + @Override + protected void finalize() + throws Throwable + { +// decRef(); + } + +// protected native void incRef(); +// protected native void decRef(); + + @Override + public native void close() + throws IOException; + + + /* (non-Javadoc) + * @see java.io.OutputStream#write(int) + */ + @Override + public native void write(int arg0) throws IOException; +} + diff --git a/poi-examples/src/main/ruby/tests/tc_base_tests.rb b/poi-examples/src/main/ruby/tests/tc_base_tests.rb new file mode 100644 index 0000000000..33492c7ab7 --- /dev/null +++ b/poi-examples/src/main/ruby/tests/tc_base_tests.rb @@ -0,0 +1,100 @@ +# ==================================================================== +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# ==================================================================== + +require 'test/unit' +require 'release/poi4r' + +class TC_base_tests < Test::Unit::TestCase + + def setup() + end + + def test_get_constant + h=Poi4r::HSSFWorkbook.new + s=h.createSheet("Sheet1") + r=s.createRow(0) + c=r.createCell(0) + assert_equal(3,Poi4r::HSSFCell.CELL_TYPE_BLANK,"Constant CELL_TYPE_BLANK") + end + + def test_base + system("rm test.xls") + h=Poi4r::HSSFWorkbook.new + + #Test Sheet Creation + s=h.createSheet("Sheet1") + s=h.createSheet("Sheet2") + assert_equal(2,h.getNumberOfSheets(),"Number of sheets is 2") + + #Test setting cell values + s=h.getSheetAt(0) + r=s.createRow(0) + c=r.createCell(0) + c.setCellValue(1.5) + assert_equal(c.getNumericCellValue(),1.5,"Numeric Cell Value") + c=r.createCell(1) + c.setCellValue("Ruby") + assert_equal(c.getStringCellValue(),"Ruby","String Cell Value") + #Test error handling + assert_raise (RuntimeError) {c.getNumericCellValue()} + + #Test styles + st = h.createCellStyle() + c=r.createCell(2) + st.setAlignment(Poi4r::HSSFCellStyle.ALIGN_CENTER) + c.setCellStyle(st) + c.setCellValue("centr'd") + + #Date handling + c=r.createCell(3) + t1=Time.now + c.setCellValue(Time.now) + t2= c.getDateCellValue().gmtime + assert_equal(t1.year,t2.year,"year") + assert_equal(t1.mon,t2.mon,"month") + assert_equal(t1.day,t2.day,"day") + assert_equal(t1.hour,t2.hour,"hour") + assert_equal(t1.min,t2.min,"min") + assert_equal(t1.sec,t2.sec,"sec") + st=h.createCellStyle(); + st.setDataFormat(Poi4r::HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")) + c.setCellStyle(st) + + #Fonts + c=r.createCell(4) + font = h.createFont(); + font.setFontHeightInPoints(24); + font.setFontName("Courier New"); + font.setItalic(true); + font.setStrikeout(true); + style = h.createCellStyle(); + style.setFont(font); + c.setCellValue("This is a test of fonts"); + c.setCellStyle(style); + + #Formulas + c=r.createCell(5) + c.setCellFormula("A1*2") + assert_equal("A1*2",c.getCellFormula,"formula") + + #Test writing + h.write(File.new("test.xls","w")) + assert_nothing_raised {File.new("test.xls","r")} + #h.write(0.1) + end + +end diff --git a/poi-examples/src/main/ruby/tests/tc_gc.rb b/poi-examples/src/main/ruby/tests/tc_gc.rb new file mode 100644 index 0000000000..82c3c2b132 --- /dev/null +++ b/poi-examples/src/main/ruby/tests/tc_gc.rb @@ -0,0 +1,32 @@ +# ==================================================================== +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# ==================================================================== + +require 'test/unit' +require 'release/poi4r' + +class TC_gc < Test::Unit::TestCase + def test_premature_collection + h=Poi4r::HSSFWorkbook.new + h.createSheet("Sheet1"); + 5000.times do + hh=Poi4r::HSSFWorkbook.new + GC.start() + end + assert_equal(1,h.getNumberOfSheets(),"Number of sheets") + end +end + diff --git a/poi-examples/src/main/ruby/tests/ts_all.rb b/poi-examples/src/main/ruby/tests/ts_all.rb new file mode 100644 index 0000000000..ef50ad5d6d --- /dev/null +++ b/poi-examples/src/main/ruby/tests/ts_all.rb @@ -0,0 +1,20 @@ +# ==================================================================== +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# ==================================================================== + +require 'test/unit' +require 'tests/tc_base_tests' +require 'tests/tc_gc' |