summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvo Hinkelmann <ihi@openoffice.org>2009-09-16 11:45:54 +0000
committerIvo Hinkelmann <ihi@openoffice.org>2009-09-16 11:45:54 +0000
commitd6cf80c14ef6abe02125bb8f66262961193cffd7 (patch)
treecd0ac5af57e495d4eb1a269f4b1723ffa0ac0c48
parente87ea379e99c01e62555c1821b69a55a490b07f2 (diff)
CWS-TOOLING: integrate CWS l10nframework01
-rw-r--r--basebmp/test/makefile.mk6
-rw-r--r--canvas/source/cairo/makefile.mk4
-rw-r--r--canvas/source/factory/makefile.mk4
-rw-r--r--canvas/source/null/makefile.mk4
-rw-r--r--canvas/source/simplecanvas/makefile.mk3
-rw-r--r--canvas/source/tools/makefile.mk4
-rw-r--r--dtrans/source/generic/makefile.mk3
-rw-r--r--dtrans/util/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/egif/makefile.mk7
-rw-r--r--goodies/source/filter.vcl/eos2met/makefile.mk8
-rw-r--r--goodies/source/filter.vcl/epbm/makefile.mk8
-rw-r--r--goodies/source/filter.vcl/epgm/makefile.mk8
-rw-r--r--goodies/source/filter.vcl/epict/makefile.mk8
-rw-r--r--goodies/source/filter.vcl/eppm/makefile.mk7
-rw-r--r--goodies/source/filter.vcl/eps/makefile.mk6
-rw-r--r--goodies/source/filter.vcl/eras/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/etiff/makefile.mk4
-rw-r--r--goodies/source/filter.vcl/expm/makefile.mk4
-rw-r--r--goodies/source/filter.vcl/icgm/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/idxf/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/ieps/makefile.mk4
-rw-r--r--goodies/source/filter.vcl/ios2met/makefile.mk4
-rw-r--r--goodies/source/filter.vcl/ipbm/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/ipcd/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/ipcx/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/ipict/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/ipsd/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/iras/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/itga/makefile.mk3
-rw-r--r--goodies/source/filter.vcl/itiff/makefile.mk3
-rw-r--r--goodies/source/inv/makefile.mk14
-rw-r--r--goodies/util/makefile.mk5
-rw-r--r--o3tl/qa/makefile.mk7
-rw-r--r--transex3/prj/build.lst5
-rw-r--r--transex3/prj/d.lst19
-rw-r--r--transex3/source/filter/merge/FCFGMerge.cfg125
-rw-r--r--transex3/source/filter/merge/FCFGMerge.java131
-rw-r--r--transex3/source/filter/merge/Manifest.mf1
-rw-r--r--transex3/source/filter/merge/Merger.java364
-rw-r--r--transex3/source/filter/merge/makefile.mk96
-rw-r--r--transex3/source/filter/utils/AnalyzeStartupLog.java328
-rw-r--r--transex3/source/filter/utils/Cache.java2449
-rw-r--r--transex3/source/filter/utils/ConfigHelper.java303
-rw-r--r--transex3/source/filter/utils/FileHelper.java766
-rw-r--r--transex3/source/filter/utils/Logger.java177
-rw-r--r--transex3/source/filter/utils/MalformedCommandLineException.java50
-rw-r--r--transex3/source/filter/utils/XMLHelper.java825
-rw-r--r--transex3/source/filter/utils/makefile.mk57
-rw-r--r--transex3/source/help/HelpCompiler.cxx593
-rw-r--r--transex3/source/help/HelpCompiler.hxx320
-rw-r--r--transex3/source/help/HelpFileDocument.java89
-rw-r--r--transex3/source/help/HelpIndexerTool.java346
-rw-r--r--transex3/source/help/HelpLinker.cxx1157
-rw-r--r--transex3/source/help/MANIFEST.MF2
-rw-r--r--transex3/source/help/compilehelp.hxx80
-rw-r--r--transex3/source/help/helplinker.pmk35
-rw-r--r--transex3/source/help/makefile.mk139
-rw-r--r--vcl/workben/makefile.mk3
58 files changed, 8556 insertions, 62 deletions
diff --git a/basebmp/test/makefile.mk b/basebmp/test/makefile.mk
index 7d0dc6e3967a..3ea13868aeb4 100644
--- a/basebmp/test/makefile.mk
+++ b/basebmp/test/makefile.mk
@@ -65,6 +65,7 @@ CDEFS+=-xalias_level=compatible
.ENDIF
# --- Common ----------------------------------------------------------
+.IF "$(L10N_framework)"==""
# BEGIN ----------------------------------------------------------------
# auto generated Target:tests by codegen.pl
@@ -85,7 +86,6 @@ SHL1OBJS= \
# here, because not yet delivered. Need the functionality to test, so
# we're linking it in statically. Need to keep this in sync with
# source/makefile.mk
-
SHL1TARGET= tests
SHL1STDLIBS= $(SALLIB) \
$(CPPUNITLIB) \
@@ -95,7 +95,7 @@ SHL1IMPLIB= i$(SHL1TARGET)
DEF1NAME =$(SHL1TARGET)
SHL1VERSIONMAP = export.map
-
+.ENDIF
# END ------------------------------------------------------------------
#APP2TARGET= bmpdemo
@@ -127,6 +127,7 @@ SLOFILES=$(SHL1OBJS)
.INCLUDE : _cppunit.mk
# --- Enable test execution in normal build ------------------------
+.IF "$(L10N_framework)"==""
unittest : $(SHL1TARGETN)
@echo ----------------------------------------------------------
@@ -135,3 +136,4 @@ unittest : $(SHL1TARGETN)
$(TESTSHL2) -sf $(mktmp ) $(SHL1TARGETN)
ALLTAR : unittest
+.ENDIF
diff --git a/canvas/source/cairo/makefile.mk b/canvas/source/cairo/makefile.mk
index 2ab726da3464..b59bd904cb3a 100644
--- a/canvas/source/cairo/makefile.mk
+++ b/canvas/source/cairo/makefile.mk
@@ -65,7 +65,7 @@ CFLAGS+=-I$(SOLARINCDIR)/cairo
.IF "$(verbose)"!="" || "$(VERBOSE)"!=""
CDEFS+= -DVERBOSE
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/cairo_cachedbitmap.obj \
$(SLO)$/cairo_cairo.obj \
$(SLO)$/cairo_canvas.obj \
@@ -131,7 +131,7 @@ SHL1VERSIONMAP=exports.map
DEF1NAME=$(SHL1TARGET)
DEF1EXPORTFILE=exports.dxp
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/canvas/source/factory/makefile.mk b/canvas/source/factory/makefile.mk
index 3e9611412463..1051b953ae81 100644
--- a/canvas/source/factory/makefile.mk
+++ b/canvas/source/factory/makefile.mk
@@ -37,7 +37,7 @@ ENABLE_EXCEPTIONS = TRUE
.INCLUDE : settings.mk
DLLPRE =
-
+.IF "$(L10N_framework)"==""
SLOFILES = \
$(SLO)$/cf_service.obj
@@ -55,6 +55,6 @@ SHL1LIBS = $(SLB)$/$(TARGET).lib
SHL1DEF = $(MISC)$/$(SHL1TARGET).def
DEF1NAME = $(SHL1TARGET)
-
+.ENDIF
.INCLUDE : target.mk
diff --git a/canvas/source/null/makefile.mk b/canvas/source/null/makefile.mk
index 76e372c56fd7..99a6bbab93a4 100644
--- a/canvas/source/null/makefile.mk
+++ b/canvas/source/null/makefile.mk
@@ -45,7 +45,7 @@ DLLPRE =
.IF "$(verbose)"!="" || "$(VERBOSE)"!=""
CDEFS+= -DVERBOSE
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/null_canvasbitmap.obj \
$(SLO)$/null_canvascustomsprite.obj \
$(SLO)$/null_canvasfont.obj \
@@ -68,7 +68,7 @@ SHL1VERSIONMAP=exports.map
DEF1NAME=$(SHL1TARGET)
DEF1EXPORTFILE=exports.dxp
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/canvas/source/simplecanvas/makefile.mk b/canvas/source/simplecanvas/makefile.mk
index 6417ddb0c650..c0a60250ab85 100644
--- a/canvas/source/simplecanvas/makefile.mk
+++ b/canvas/source/simplecanvas/makefile.mk
@@ -45,7 +45,7 @@ DLLPRE =
.IF "$(verbose)"!="" || "$(VERBOSE)"!=""
CDEFS+= -DVERBOSE
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/simplecanvasimpl.obj
SHL1TARGET=$(TARGET).uno
@@ -60,6 +60,7 @@ SHL1VERSIONMAP=exports.map
DEF1NAME=$(SHL1TARGET)
DEF1EXPORTFILE=exports.dxp
+.ENDIF
# ==========================================================================
diff --git a/canvas/source/tools/makefile.mk b/canvas/source/tools/makefile.mk
index bf99a00febfc..9dc9967fac82 100644
--- a/canvas/source/tools/makefile.mk
+++ b/canvas/source/tools/makefile.mk
@@ -51,7 +51,7 @@ CDEFS+= -DPROFILER
#CFLAGS +:= /Ox /Ot # THIS IS IMPORTANT
-
+.IF "$(L10N_framework)"==""
SLOFILES = \
$(SLO)$/cachedprimitivebase.obj \
$(SLO)$/canvascustomspritehelper.obj \
@@ -95,7 +95,7 @@ DEFLIB1NAME =$(TARGET)
.IF "$(GUI)" == "WNT"
SHL1STDLIBS += $(WINMMLIB) $(KERNEL32LIB)
.ENDIF
-
+.ENDIF
# ==========================================================================
diff --git a/dtrans/source/generic/makefile.mk b/dtrans/source/generic/makefile.mk
index 21076595d208..aa856865a3a8 100644
--- a/dtrans/source/generic/makefile.mk
+++ b/dtrans/source/generic/makefile.mk
@@ -40,7 +40,7 @@ COMP1TYPELIST=dtrans
# --- Settings -----------------------------------------------------
.INCLUDE : settings.mk
-
+.IF "$(L10N_framework)"==""
# ------------------------------------------------------------------
SLOFILES= \
@@ -66,5 +66,6 @@ DEF1NAME= $(SHL1TARGET)
DEF1EXPORTFILE= exports.dxp
# --- Targets ------------------------------------------------------
+.ENDIF # L10N_framework
.INCLUDE : target.mk
diff --git a/dtrans/util/makefile.mk b/dtrans/util/makefile.mk
index 416ef7286aee..2e9666137619 100644
--- a/dtrans/util/makefile.mk
+++ b/dtrans/util/makefile.mk
@@ -41,7 +41,7 @@ TARGET4=dnd
# --- Settings -----------------------------------------------------
.INCLUDE : settings.mk
-
+.IF "$(L10N_framework)"==""
# --- mcnttype dynlib ----------------------------------------------
@@ -180,6 +180,7 @@ DEF3NAME= $(SHL3TARGET)
DEF3EXPORTFILE= exports.dxp
.ENDIF # "$(GUI)"=="OS2"
+.ENDIF # L10N_framework
.INCLUDE : target.mk
diff --git a/goodies/source/filter.vcl/egif/makefile.mk b/goodies/source/filter.vcl/egif/makefile.mk
index 55165533580c..418af69c7bf8 100644
--- a/goodies/source/filter.vcl/egif/makefile.mk
+++ b/goodies/source/filter.vcl/egif/makefile.mk
@@ -49,17 +49,18 @@ CDEFS+= -DEDITDEBUG
SRS1NAME=$(TARGET)
SRC1FILES = dlgegif.src \
egifstr.src
-
+.IF "$(L10N_framework)"==""
SLOFILES= $(SLO)$/egif.obj \
$(SLO)$/dlgegif.obj \
$(SLO)$/giflzwc.obj
-
+.ENDIF
# ==========================================================================
RESLIB1NAME=$(TARGET2)
RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs
+.IF "$(L10N_framework)"==""
SHL1TARGET= egi$(DLLPOSTFIX)
SHL1IMPLIB= egif
SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(CPPULIB) $(SVTOOLLIB) $(SALLIB)
@@ -75,7 +76,7 @@ SHL1OBJS= $(SLO)$/egif.obj
SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/goodies/source/filter.vcl/eos2met/makefile.mk b/goodies/source/filter.vcl/eos2met/makefile.mk
index 1d6725e5e902..05f2f032e342 100644
--- a/goodies/source/filter.vcl/eos2met/makefile.mk
+++ b/goodies/source/filter.vcl/eos2met/makefile.mk
@@ -49,15 +49,15 @@ CDEFS+= -DEDITDEBUG
SRS1NAME=$(TARGET)
SRC1FILES= dlgeos2.src \
eos2mstr.src
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/eos2met.obj \
$(SLO)$/dlgeos2.obj
-
+.ENDIF
# ==========================================================================
RESLIB1NAME=$(TARGET2)
RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs
-
+.IF "$(L10N_framework)"==""
SHL1TARGET= eme$(DLLPOSTFIX)
SHL1IMPLIB= eos2met
SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(SVTOOLLIB) $(CPPULIB) $(SALLIB)
@@ -72,7 +72,7 @@ SHL1OBJS= $(SLO)$/eos2met.obj
SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/goodies/source/filter.vcl/epbm/makefile.mk b/goodies/source/filter.vcl/epbm/makefile.mk
index e70256c893e1..f4411d04e0fd 100644
--- a/goodies/source/filter.vcl/epbm/makefile.mk
+++ b/goodies/source/filter.vcl/epbm/makefile.mk
@@ -49,15 +49,15 @@ CDEFS+= -DEDITDEBUG
SRS1NAME=$(TARGET)
SRC1FILES= dlgepbm.src \
epbmstr.src
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/epbm.obj \
$(SLO)$/dlgepbm.obj
-
+.ENDIF
# ==========================================================================
RESLIB1NAME=$(TARGET2)
RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs
-
+.IF "$(L10N_framework)"==""
SHL1TARGET= epb$(DLLPOSTFIX)
SHL1IMPLIB= epbm
SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(CPPULIB) $(SVTOOLLIB) $(SALLIB)
@@ -73,7 +73,7 @@ SHL1OBJS= $(SLO)$/epbm.obj
SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/goodies/source/filter.vcl/epgm/makefile.mk b/goodies/source/filter.vcl/epgm/makefile.mk
index b4ff18588263..579ee6858a78 100644
--- a/goodies/source/filter.vcl/epgm/makefile.mk
+++ b/goodies/source/filter.vcl/epgm/makefile.mk
@@ -50,15 +50,15 @@ CDEFS+= -DEDITDEBUG
SRS1NAME=$(TARGET)
SRC1FILES= dlgepgm.src \
epgmstr.src
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/epgm.obj \
$(SLO)$/dlgepgm.obj
-
+.ENDIF
# ==========================================================================
RESLIB1NAME=$(TARGET2)
RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs
-
+.IF "$(L10N_framework)"==""
SHL1TARGET= epg$(DLLPOSTFIX)
SHL1IMPLIB= epgm
SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(CPPULIB) $(SVTOOLLIB) $(SALLIB)
@@ -74,7 +74,7 @@ SHL1OBJS= $(SLO)$/epgm.obj
SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/goodies/source/filter.vcl/epict/makefile.mk b/goodies/source/filter.vcl/epict/makefile.mk
index 33af96f1fb85..4aa4bab80ffc 100644
--- a/goodies/source/filter.vcl/epict/makefile.mk
+++ b/goodies/source/filter.vcl/epict/makefile.mk
@@ -50,15 +50,15 @@ CDEFS+= -DEDITDEBUG
SRS1NAME=$(TARGET)
SRC1FILES = dlgepct.src \
epictstr.src
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/epict.obj \
$(SLO)$/dlgepct.obj
-
+.ENDIF
# ==========================================================================
RESLIB1NAME=$(TARGET2)
RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs
-
+.IF "$(L10N_framework)"==""
SHL1TARGET= ept$(DLLPOSTFIX)
SHL1IMPLIB= epict
SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(SVTOOLLIB) $(CPPULIB) $(SALLIB)
@@ -74,7 +74,7 @@ SHL1OBJS= $(SLO)$/epict.obj
SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/goodies/source/filter.vcl/eppm/makefile.mk b/goodies/source/filter.vcl/eppm/makefile.mk
index 8ac83d7f1c8d..b40f9d897b8a 100644
--- a/goodies/source/filter.vcl/eppm/makefile.mk
+++ b/goodies/source/filter.vcl/eppm/makefile.mk
@@ -49,15 +49,15 @@ CDEFS+= -DEDITDEBUG
SRS1NAME=$(TARGET)
SRC1FILES= dlgeppm.src \
eppmstr.src
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/eppm.obj \
$(SLO)$/dlgeppm.obj
-
+.ENDIF
# ==========================================================================
RESLIB1NAME=$(TARGET2)
RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs
-
+.IF "$(L10N_framework)"==""
SHL1TARGET= epp$(DLLPOSTFIX)
SHL1IMPLIB= eppm
SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(CPPULIB) $(SVTOOLLIB) $(SALLIB)
@@ -73,6 +73,7 @@ SHL1OBJS= $(SLO)$/eppm.obj
SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/eps/makefile.mk b/goodies/source/filter.vcl/eps/makefile.mk
index 59b63477531d..c5599344725a 100644
--- a/goodies/source/filter.vcl/eps/makefile.mk
+++ b/goodies/source/filter.vcl/eps/makefile.mk
@@ -50,16 +50,17 @@ CDEFS+= -DEDITDEBUG
SRS1NAME=$(TARGET)
SRC1FILES = dlgeps.src \
epsstr.src
-
+.IF "$(L10N_framework)"==""
EXCEPTIONSFILES=$(SLO)$/eps.obj
SLOFILES = $(SLO)$/eps.obj \
$(SLO)$/dlgeps.obj
+.ENDIF
# ==========================================================================
RESLIB1NAME=$(TARGET)
RESLIB1SRSFILES=$(SRS)$/$(TARGET).srs
-
+.IF "$(L10N_framework)"==""
SHL1TARGET= eps$(DLLPOSTFIX)
SHL1IMPLIB= eps
SHL1STDLIBS= $(TOOLSLIB) $(VCLLIB) $(VCLLIB) $(SVTOOLLIB) $(CPPULIB) $(SALLIB)
@@ -75,6 +76,7 @@ SHL1OBJS= $(SLO)$/eps.obj
SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/eras/makefile.mk b/goodies/source/filter.vcl/eras/makefile.mk
index ae68c4a4ded6..e6aeaeefb223 100644
--- a/goodies/source/filter.vcl/eras/makefile.mk
+++ b/goodies/source/filter.vcl/eras/makefile.mk
@@ -40,7 +40,7 @@ DEPTARGET=veras
.INCLUDE : settings.mk
# --- Allgemein ----------------------------------------------------------
-
+.IF "$(L10N_framework)"==""
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
@@ -63,6 +63,7 @@ SHL1OBJS= $(SLO)$/eras.obj
SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/etiff/makefile.mk b/goodies/source/filter.vcl/etiff/makefile.mk
index 69b958fc3598..70902012ce23 100644
--- a/goodies/source/filter.vcl/etiff/makefile.mk
+++ b/goodies/source/filter.vcl/etiff/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vetiff
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/etiff.obj
# ==========================================================================
@@ -63,7 +63,7 @@ SHL1OBJS= $(SLO)$/etiff.obj
SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/goodies/source/filter.vcl/expm/makefile.mk b/goodies/source/filter.vcl/expm/makefile.mk
index a4093415be76..e123220feff8 100644
--- a/goodies/source/filter.vcl/expm/makefile.mk
+++ b/goodies/source/filter.vcl/expm/makefile.mk
@@ -45,7 +45,7 @@ DEPTARGET=vexpm
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/expm.obj
# ==========================================================================
@@ -64,7 +64,7 @@ SHL1OBJS= $(SLO)$/expm.obj
SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/goodies/source/filter.vcl/icgm/makefile.mk b/goodies/source/filter.vcl/icgm/makefile.mk
index 0d97b3a144ef..ee62bbfb051c 100644
--- a/goodies/source/filter.vcl/icgm/makefile.mk
+++ b/goodies/source/filter.vcl/icgm/makefile.mk
@@ -39,7 +39,7 @@ ENABLE_EXCEPTIONS=TRUE
.INCLUDE : settings.mk
# --- Files --------------------------------------------------------
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/cgm.obj \
$(SLO)$/chart.obj \
$(SLO)$/class0.obj \
@@ -76,6 +76,7 @@ SHL1STDLIBS = \
$(TOOLSLIB) \
$(CPPULIB) \
$(SALLIB)
+.ENDIF
# --- Targets --------------------------------------------------------------
diff --git a/goodies/source/filter.vcl/idxf/makefile.mk b/goodies/source/filter.vcl/idxf/makefile.mk
index dbbcc83cec45..081022cd4e5b 100644
--- a/goodies/source/filter.vcl/idxf/makefile.mk
+++ b/goodies/source/filter.vcl/idxf/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vidxf
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
EXCEPTIONSFILES=\
$(SLO)$/dxfentrd.obj \
$(SLO)$/dxf2mtf.obj
@@ -76,6 +76,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/ieps/makefile.mk b/goodies/source/filter.vcl/ieps/makefile.mk
index b1e38231a3ff..673cce72744c 100644
--- a/goodies/source/filter.vcl/ieps/makefile.mk
+++ b/goodies/source/filter.vcl/ieps/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vieps
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/ieps.obj
# ==========================================================================
@@ -64,7 +64,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/goodies/source/filter.vcl/ios2met/makefile.mk b/goodies/source/filter.vcl/ios2met/makefile.mk
index 0cb3e762f06f..c987476316c6 100644
--- a/goodies/source/filter.vcl/ios2met/makefile.mk
+++ b/goodies/source/filter.vcl/ios2met/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vios2met
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/ios2met.obj
# ==========================================================================
@@ -65,7 +65,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
-
+.ENDIF
# ==========================================================================
.INCLUDE : target.mk
diff --git a/goodies/source/filter.vcl/ipbm/makefile.mk b/goodies/source/filter.vcl/ipbm/makefile.mk
index 1ef6fe0fd33b..84a9815a4974 100644
--- a/goodies/source/filter.vcl/ipbm/makefile.mk
+++ b/goodies/source/filter.vcl/ipbm/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vipbm
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/ipbm.obj
# ==========================================================================
@@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/ipcd/makefile.mk b/goodies/source/filter.vcl/ipcd/makefile.mk
index c125d88e4bf9..7782b7b8e627 100644
--- a/goodies/source/filter.vcl/ipcd/makefile.mk
+++ b/goodies/source/filter.vcl/ipcd/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vipcd
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/ipcd.obj
# ==========================================================================
@@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/ipcx/makefile.mk b/goodies/source/filter.vcl/ipcx/makefile.mk
index 796f16daaff8..7f0f309ae786 100644
--- a/goodies/source/filter.vcl/ipcx/makefile.mk
+++ b/goodies/source/filter.vcl/ipcx/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vipcx
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/ipcx.obj
# ==========================================================================
@@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/ipict/makefile.mk b/goodies/source/filter.vcl/ipict/makefile.mk
index 56c158316ad7..2d84bffe3c36 100644
--- a/goodies/source/filter.vcl/ipict/makefile.mk
+++ b/goodies/source/filter.vcl/ipict/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vipict
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/ipict.obj
# ==========================================================================
@@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/ipsd/makefile.mk b/goodies/source/filter.vcl/ipsd/makefile.mk
index 933827b88ef4..cd29c94f8074 100644
--- a/goodies/source/filter.vcl/ipsd/makefile.mk
+++ b/goodies/source/filter.vcl/ipsd/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vipsd
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/ipsd.obj
# ==========================================================================
@@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/iras/makefile.mk b/goodies/source/filter.vcl/iras/makefile.mk
index 1a4190a6e180..28b84c8401ef 100644
--- a/goodies/source/filter.vcl/iras/makefile.mk
+++ b/goodies/source/filter.vcl/iras/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=viras
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/iras.obj
# ==========================================================================
@@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/itga/makefile.mk b/goodies/source/filter.vcl/itga/makefile.mk
index 980b155a5210..a9dfe2e77643 100644
--- a/goodies/source/filter.vcl/itga/makefile.mk
+++ b/goodies/source/filter.vcl/itga/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vitga
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/itga.obj
# ==========================================================================
@@ -64,6 +64,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/filter.vcl/itiff/makefile.mk b/goodies/source/filter.vcl/itiff/makefile.mk
index 9b610d421f37..78405a563659 100644
--- a/goodies/source/filter.vcl/itiff/makefile.mk
+++ b/goodies/source/filter.vcl/itiff/makefile.mk
@@ -44,7 +44,7 @@ DEPTARGET=vitiff
.IF "$(editdebug)"!="" || "$(EDITDEBUG)"!=""
CDEFS+= -DEDITDEBUG
.ENDIF
-
+.IF "$(L10N_framework)"==""
SLOFILES = $(SLO)$/itiff.obj \
$(SLO)$/lzwdecom.obj \
$(SLO)$/ccidecom.obj
@@ -68,6 +68,7 @@ SHL1VERSIONMAP=exports.map
SHL1DEF= $(MISC)$/$(SHL1TARGET).def
DEF1NAME=$(SHL1TARGET)
+.ENDIF
# ==========================================================================
diff --git a/goodies/source/inv/makefile.mk b/goodies/source/inv/makefile.mk
index 359aab167008..500ba17f6091 100644
--- a/goodies/source/inv/makefile.mk
+++ b/goodies/source/inv/makefile.mk
@@ -42,6 +42,7 @@ EXTERNAL_WARNINGS_NOT_ERRORS := TRUE
.INCLUDE : settings.mk
# --- Files --------------------------------------------------------
+.IF "$(L10N_framework)"==""
.IF "$(TEST)" != ""
CDEFS+=-DTEST
@@ -62,6 +63,7 @@ SLOFILES= \
$(SLO)$/score.obj \
$(SLO)$/monst.obj
.ENDIF
+.ENDIF
SRS1NAME=$(TARGET)
SRC1FILES=gegner.src strings.src
@@ -70,6 +72,9 @@ RESLIB1IMAGES= $(PRJ)$/res
RESLIB1NAME=tfu
RESLIB1SRSFILES=$(SRS)$/invader.srs
+
+.IF "$(L10N_framework)"==""
+
.IF "$(TEST)"!=""
APP1TARGET= $(TARGET)
APP1OBJS= $(OBJFILES)
@@ -85,7 +90,7 @@ APP1STDLIBS= $(CPPULIB) \
.ELSE
SHL1TARGET= tfu$(DLLPOSTFIX)
-SHL1IMPLIB= itfu
+SHL1IMPLIB= i
SHL1STDLIBS=\
$(VCLLIB) \
$(TOOLSLIB) \
@@ -103,10 +108,11 @@ SHL1DEF=$(MISC)$/$(SHL1TARGET).def
.ENDIF
# --- Targets -------------------------------------------------------
-
+.ENDIF
.INCLUDE : target.mk
+.IF "$(L10N_framework)"==""
ALLTAR: \
$(BIN)$/applicat.rdb
@@ -147,3 +153,7 @@ $(MISC)$/$(SHL1TARGET).def: makefile.mk
.ENDIF
+.ELSE
+pseudo:
+
+.ENDIF
diff --git a/goodies/util/makefile.mk b/goodies/util/makefile.mk
index 13bb94069804..dc5d9566ea8a 100644
--- a/goodies/util/makefile.mk
+++ b/goodies/util/makefile.mk
@@ -42,6 +42,7 @@ GEN_HID=TRUE
.INCLUDE : settings.mk
# --- Allgemein ---------------------------------------------------
+.IF "$(L10N_framework)"==""
LIB1TARGET=$(SLB)$/go.lib
LIB1FILES=\
@@ -78,6 +79,7 @@ DEF1EXPORTFILE =goodies.dxp
# THB: exports list goodies checked for 6.0 Final 6.12.2001
# Note: explicit exports only necessary for VCL graphic filters (see there)
+.ENDIF
# --- Targets -----------------------------------------------------------
@@ -86,6 +88,7 @@ DEF1EXPORTFILE =goodies.dxp
.IF "$(depend)"==""
# --- Goodies-Filter-Datei ---
+.IF "$(L10N_framework)"==""
$(MISC)$/$(SHL1TARGET).flt: makefile.mk
@echo ------------------------------
@@ -98,3 +101,5 @@ $(MISC)$/$(SHL1TARGET).flt: makefile.mk
@echo CT>>$@
.ENDIF
+
+.ENDIF
diff --git a/o3tl/qa/makefile.mk b/o3tl/qa/makefile.mk
index a6ebfbba4bb9..70fe224cf6a9 100644
--- a/o3tl/qa/makefile.mk
+++ b/o3tl/qa/makefile.mk
@@ -39,7 +39,7 @@ ENABLE_EXCEPTIONS=TRUE
# --- Settings -----------------------------------------------------
.INCLUDE : settings.mk
-
+.IF "$(L10N_framework)"==""
# --- Common ----------------------------------------------------------
# BEGIN ----------------------------------------------------------------
@@ -65,12 +65,13 @@ SHL1VERSIONMAP = export.map
SLOFILES=$(SHL1OBJS)
# --- Targets ------------------------------------------------------
+.ENDIF # L10N_framework
.INCLUDE : target.mk
.INCLUDE : _cppunit.mk
# --- Enable test execution in normal build ------------------------
-
+.IF "$(L10N_framework)"==""
unittest : $(SHL1TARGETN)
@echo ----------------------------------------------------------
@echo - start unit test on library $(SHL1TARGETN)
@@ -78,3 +79,5 @@ unittest : $(SHL1TARGETN)
$(TESTSHL2) -sf $(mktmp ) $(SHL1TARGETN)
ALLTAR : unittest
+.ENDIF # L10N_framework
+
diff --git a/transex3/prj/build.lst b/transex3/prj/build.lst
index 91a5056acce3..1ba0a50ff41c 100644
--- a/transex3/prj/build.lst
+++ b/transex3/prj/build.lst
@@ -1,7 +1,10 @@
-tr transex3 : tools NULL
+tr transex3 : tools libxslt berkeleydb lucene NULL
tr transex3 usr1 - all tr_mkout NULL
tr transex3\inc nmake - all tr_inc NULL
tr transex3\source nmake - all tr_src tr_inc NULL
tr transex3\layout nmake - all rt_layout tr_src tr_inc NULL
tr transex3\java\l10nconv nmake - all tr_conv NULL
tr transex3\java\receditor nmake - all tr_rece NULL
+tr transex3\source\help nmake - all tr_bla_help NULL
+tr transex3\source\filter\utils nmake - all tr_bla_utils NULL
+tr transex3\source\filter\merge nmake - all tr_bla_merge tr_bla_utils NULL
diff --git a/transex3/prj/d.lst b/transex3/prj/d.lst
index 54d1ab156205..39bafa4694c6 100644
--- a/transex3/prj/d.lst
+++ b/transex3/prj/d.lst
@@ -1,4 +1,10 @@
mkdir: %_DEST%\inc%_EXT%\transex3
+mkdir: %_DEST%\bin%_EXT%
+mkdir: %_DEST%\bin%_EXT%\help
+mkdir: %_DEST%\bin%_EXT%\help\com
+mkdir: %_DEST%\bin%_EXT%\help\com\sun
+mkdir: %_DEST%\bin%_EXT%\help\com\sun\star
+mkdir: %_DEST%\bin%_EXT%\help\com\sun\star\help
..\%__SRC%\bin\cfgex.exe %_DEST%\bin%_EXT%\cfgex.exe
..\%__SRC%\bin\cfgex %_DEST%\bin%_EXT%\cfgex
@@ -20,6 +26,14 @@ mkdir: %_DEST%\inc%_EXT%\transex3
..\%__SRC%\bin\txtconv %_DEST%\bin%_EXT%\txtconv
..\%__SRC%\bin\tralay.exe %_DEST%\bin%_EXT%\tralay.exe
..\%__SRC%\bin\tralay %_DEST%\bin%_EXT%\tralay
+..\%__SRC%\bin\ulfconv %_DEST%\bin%_EXT%\ulfconv
+..\%__SRC%\class\FCFGMerge.jar %_DEST%\bin%_EXT%\FCFGMerge.jar
+..\%__SRC%\class\HelpIndexerTool.jar %_DEST%\bin%_EXT%\HelpIndexerTool.jar
+..\%__SRC%\bin\HelpLinker %_DEST%\bin%_EXT%\HelpLinker
+..\%__SRC%\bin\HelpCompiler %_DEST%\bin%_EXT%\HelpCompiler
+..\%__SRC%\bin\HelpCompiler.exe %_DEST%\bin%_EXT%\HelpCompiler.exe
+..\%__SRC%\bin\HelpLinker.exe %_DEST%\bin%_EXT%\HelpLinker.exe
+..\%__SRC%\bin\HelpLinker* %_DEST%\bin%_EXT%
..\%__SRC%\class\converter\converter.jar %_DEST%\bin%_EXT%\converter.jar
..\%__SRC%\doc\converter_javadoc.zip %_DEST%\bin%_EXT%\converter_javadoc.zip
@@ -38,3 +52,8 @@ mkdir: %_DEST%\inc%_EXT%\transex3
..\inc\utf8conv.hxx %_DEST%\inc%_EXT%\transex3\utf8conv.hxx
..\%__SRC%\lib\transex.lib %_DEST%\lib%_EXT%\transex.lib
..\%__SRC%\lib\libtransex.a %_DEST%\lib%_EXT%\libtransex.a
+
+..\source\help\compilehelp.hxx %_DEST%\inc%_EXT%\transex3\compilehelp.hxx
+#..\source\help\helplinkerdllapi.h %_DEST%\inc%_EXT%\transex3\helplinkerdllapi.h
+..\%__SRC%\lib\* %_DEST%\lib%_EXT%\*
+..\%__SRC%\class\com\sun\star\help\* %_DEST%\bin%_EXT%\help\com\sun\star\help\*
diff --git a/transex3/source/filter/merge/FCFGMerge.cfg b/transex3/source/filter/merge/FCFGMerge.cfg
new file mode 100644
index 000000000000..46fcccafe7e4
--- /dev/null
+++ b/transex3/source/filter/merge/FCFGMerge.cfg
@@ -0,0 +1,125 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: FCFGMerge.cfg,v $
+#
+# $Revision: 1.5 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+#************************************************
+# Specify the verbose mode of this tool.
+# 1 = show errors only
+# 2 = show errors/warnings (default)
+# 3 = show errors/warnings and some generic infos
+# 4 = show anything (including detailed infos)
+#
+# [OPTIONAL]
+#************************************************
+
+loglevel = 2
+
+#************************************************
+# This extension is used for all XML files. It doesnt
+# matter if its used for reading fragments or writing
+# XML packages.
+# Must be given without any additional signes like "."
+# or "*."!
+#
+# [REQUIRED]
+#************************************************
+
+extension_xcu=xcu
+
+#************************************************
+# This extension is used for all Package files. It doesnt
+# matter if its used for reading such files or writing
+# it.
+# Must be given without any additional signes like "."
+# or "*."!
+#
+# [REQUIRED]
+#************************************************
+
+extension_pkg=pkg
+
+#************************************************
+# These values are used to generate a correct XML
+# header.
+# Note: The property "xmlpackage" must be specified
+# via command line. There exists more then one
+# possible value.
+#
+# [REQUIRED]
+#************************************************
+
+xmlversion = 1.0
+xmlencoding = UTF-8
+xmlpath = org.openoffice.TypeDetection
+#xmlpackage =
+
+#************************************************
+# These values are used to name the configuration
+# sets inside the generated XCM file for different
+# item groups like e.g. types, filters etcpp.
+#
+# [REQUIRED]
+#************************************************
+
+setname_types = Types
+setname_filters = Filters
+setname_frameloaders = FrameLoaders
+setname_contenthandlers = ContentHandlers
+
+subdir_types = types
+subdir_filters = filters
+subdir_frameloaders = frameloaders
+subdir_contenthandlers = contenthandlers
+
+#************************************************
+# This delimiter is used to split every
+# item list of the package configuration files
+# (which are temp. created by the make proccess)
+# into its tokens.
+#
+# [REQUIRED]
+#************************************************
+delimiter=,
+
+#************************************************
+# Enable/disable removing of leading/trailing withespaces
+# during splitting stringlists.
+#
+# [REQUIRED]
+#************************************************
+trim=true
+
+#************************************************
+# Enable/disable removing of leading/trailing "-signs
+# during splitting stringlists.
+#
+# [REQUIRED]
+#************************************************
+decode=false
diff --git a/transex3/source/filter/merge/FCFGMerge.java b/transex3/source/filter/merge/FCFGMerge.java
new file mode 100644
index 000000000000..7fbfa8a0c986
--- /dev/null
+++ b/transex3/source/filter/merge/FCFGMerge.java
@@ -0,0 +1,131 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: FCFGMerge.java,v $
+ * $Revision: 1.5 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.filter.config.tools.merge;
+
+//_______________________________________________
+
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import com.sun.star.filter.config.tools.utils.*;
+
+//_______________________________________________
+
+/**
+ * Its a simple command line tool, which can merge different XML fragments
+ * together. Such fragments must exist as files on disk, will be moved into
+ * one file together on disk.
+ *
+ *
+ */
+public class FCFGMerge
+{
+ //___________________________________________
+ // const
+
+ private static final java.lang.String CFGFILE = "com/sun/star/filter/config/tools/merge/FCFGMerge.cfg";
+ private static final java.lang.String PROP_LOGLEVEL = "loglevel";
+
+ //___________________________________________
+ // main
+
+ public static void main(java.lang.String[] sCmdLine)
+ {
+ FCFGMerge.printCopyright();
+
+ // create log object in default mode "WARNINGS"
+ // If a command line parameter indicates another
+ // level - change it!
+ Logger aLog = new Logger();
+
+ try
+ {
+ // merge config file and overwrite properties
+ // via command line
+ ConfigHelper aCfg = null;
+ aCfg = new ConfigHelper(CFGFILE, sCmdLine);
+
+ // update log level
+ int nLogLevel = aCfg.getInt(PROP_LOGLEVEL, Logger.LEVEL_WARNINGS);
+ aLog = new Logger(nLogLevel);
+
+ // help requested?
+ if (aCfg.isHelp())
+ {
+ FCFGMerge.printHelp();
+ System.exit(-1);
+ }
+
+ // create new merge object and start operation
+ Merger aMerger = new Merger(aCfg, aLog);
+ aMerger.merge();
+ }
+ catch(java.lang.Throwable ex)
+ {
+ aLog.setException(ex);
+ System.exit(-1);
+ }
+
+ System.exit(0);
+ }
+
+ //___________________________________________
+
+ /** prints out a copyright message on stdout.
+ */
+ private static void printCopyright()
+ {
+ java.lang.StringBuffer sOut = new java.lang.StringBuffer(256);
+ sOut.append("FCFGMerge\n");
+ sOut.append("Copyright: 2003 by Sun Microsystems, Inc.\n");
+ sOut.append("All Rights Reserved.\n");
+ System.out.println(sOut.toString());
+ }
+
+ //___________________________________________
+
+ /** prints out a help message on stdout.
+ */
+ private static void printHelp()
+ {
+ java.lang.StringBuffer sOut = new java.lang.StringBuffer(256);
+ sOut.append("____________________________________________________________\n");
+ sOut.append("usage: FCFGMerge cfg=<file name>\n" );
+ sOut.append("parameters:\n" );
+ sOut.append("\tcfg=<file name>\n" );
+ sOut.append("\t\tmust point to a system file, which contains\n" );
+ sOut.append("\t\tall neccessary configuration data for the merge process.\n");
+ sOut.append("\n\tFurther cou can specify every parameter allowed in the\n" );
+ sOut.append("\n\tconfig file as command line parameter too, to overwrite\n" );
+ sOut.append("\n\tthe value from the file.\n" );
+ System.out.println(sOut.toString());
+ }
+}
diff --git a/transex3/source/filter/merge/Manifest.mf b/transex3/source/filter/merge/Manifest.mf
new file mode 100644
index 000000000000..1337eaf4d39a
--- /dev/null
+++ b/transex3/source/filter/merge/Manifest.mf
@@ -0,0 +1 @@
+Main-Class: com.sun.star.filter.config.tools.merge.FCFGMerge
diff --git a/transex3/source/filter/merge/Merger.java b/transex3/source/filter/merge/Merger.java
new file mode 100644
index 000000000000..0bf11fc42fbf
--- /dev/null
+++ b/transex3/source/filter/merge/Merger.java
@@ -0,0 +1,364 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: Merger.java,v $
+ * $Revision: 1.8 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+package com.sun.star.filter.config.tools.merge;
+
+//_______________________________________________
+
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+import com.sun.star.filter.config.tools.utils.*;
+
+//_______________________________________________
+
+/** can merge different xml fragments together.
+ *
+ *
+ */
+public class Merger
+{
+ //___________________________________________
+ // const
+
+ private static final java.lang.String PROP_XMLVERSION = "xmlversion" ; // <= global cfg file
+ private static final java.lang.String PROP_XMLENCODING = "xmlencoding" ; // <= global cfg file
+ private static final java.lang.String PROP_XMLPATH = "xmlpath" ; // <= global cfg file
+ private static final java.lang.String PROP_XMLPACKAGE = "xmlpackage" ; // <= global cfg file
+
+ private static final java.lang.String PROP_SETNAME_TYPES = "setname_types" ; // <= global cfg file
+ private static final java.lang.String PROP_SETNAME_FILTERS = "setname_filters" ; // <= global cfg file
+ private static final java.lang.String PROP_SETNAME_LOADERS = "setname_frameloaders" ; // <= global cfg file
+ private static final java.lang.String PROP_SETNAME_HANDLERS = "setname_contenthandlers" ; // <= global cfg file
+
+ private static final java.lang.String PROP_SUBDIR_TYPES = "subdir_types" ; // <= global cfg file
+ private static final java.lang.String PROP_SUBDIR_FILTERS = "subdir_filters" ; // <= global cfg file
+ private static final java.lang.String PROP_SUBDIR_LOADERS = "subdir_frameloaders" ; // <= global cfg file
+ private static final java.lang.String PROP_SUBDIR_HANDLERS = "subdir_contenthandlers" ; // <= global cfg file
+
+ private static final java.lang.String PROP_EXTENSION_XCU = "extension_xcu" ; // <= global cfg file
+ private static final java.lang.String PROP_EXTENSION_PKG = "extension_pkg" ; // <= global cfg file
+
+ private static final java.lang.String PROP_DELIMITER = "delimiter" ; // <= global cfg file
+ private static final java.lang.String PROP_TRIM = "trim" ; // <= global cfg file
+ private static final java.lang.String PROP_DECODE = "decode" ; // <= global cfg file
+
+ private static final java.lang.String PROP_FRAGMENTSDIR = "fragmentsdir" ; // <= cmdline
+ private static final java.lang.String PROP_TEMPDIR = "tempdir" ; // <= cmdline
+ private static final java.lang.String PROP_OUTDIR = "outdir" ; // <= cmdline
+ private static final java.lang.String PROP_PKG = "pkg" ; // <= cmdline
+ private static final java.lang.String PROP_DEBUG = "debug" ; // <= cmdline
+
+ private static final java.lang.String PROP_TCFG = "tcfg" ; // <= cmdline
+ private static final java.lang.String PROP_FCFG = "fcfg" ; // <= cmdline
+ private static final java.lang.String PROP_LCFG = "lcfg" ; // <= cmdline
+ private static final java.lang.String PROP_CCFG = "ccfg" ; // <= cmdline
+ private static final java.lang.String PROP_LANGUAGEPACK = "languagepack" ; // <= cmdline
+
+ private static final java.lang.String PROP_ITEMS = "items" ; // <= pkg cfg files!
+
+ //___________________________________________
+ // member
+
+ //-------------------------------------------
+ /** TODO */
+ private ConfigHelper m_aCfg;
+
+ //-------------------------------------------
+ /** TODO */
+ private Logger m_aLog;
+
+ //-------------------------------------------
+ /** TODO */
+ private java.io.File m_aFragmentsDir;
+
+ //-------------------------------------------
+ /** TODO */
+ private java.io.File m_aTempDir;
+
+ //-------------------------------------------
+ /** TODO */
+ private java.io.File m_aOutDir;
+
+ //-------------------------------------------
+ /** TODO */
+ private java.util.Vector m_lTypes;
+ private java.util.Vector m_lFilters;
+ private java.util.Vector m_lLoaders;
+ private java.util.Vector m_lHandlers;
+
+ //___________________________________________
+ // interface
+
+ //-------------------------------------------
+ /** initialize a new instance of this class and
+ * try to get all needed resources from the config module.
+ *
+ * @param aCfg
+ * provides access to all values of the global
+ * config file and to the command line.
+ *
+ * @param aLog
+ * can be used to print out log informations.
+ */
+ public Merger(ConfigHelper aCfg,
+ Logger aLog)
+ throws java.lang.Exception
+ {
+ m_aCfg = aCfg;
+ m_aLog = aLog;
+
+ m_aFragmentsDir = new java.io.File(m_aCfg.getString(PROP_FRAGMENTSDIR));
+ m_aTempDir = new java.io.File(m_aCfg.getString(PROP_TEMPDIR ));
+// m_aOutDir = new java.io.File(m_aCfg.getString(PROP_OUTDIR ));
+
+ java.lang.String sDelimiter = m_aCfg.getString(PROP_DELIMITER);
+ boolean bTrim = m_aCfg.getBoolean(PROP_TRIM);
+ boolean bDecode = m_aCfg.getBoolean(PROP_DECODE);
+
+ try
+ {
+ ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_TCFG), null);
+ m_lTypes = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode);
+ }
+ catch(java.util.NoSuchElementException ex1)
+ {
+ m_lTypes = new java.util.Vector();
+ //m_aLog.setWarning("Fragment list of types is missing. Parameter \"items\" seems to be invalid.");
+ }
+
+ try
+ {
+ ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_FCFG), null);
+ m_lFilters = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode);
+ }
+ catch(java.util.NoSuchElementException ex1)
+ {
+ m_lFilters = new java.util.Vector();
+ //m_aLog.setWarning("Fragment list of filters is missing. Parameter \"items\" seems to be invalid.");
+ }
+
+ try
+ {
+ ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_LCFG), null);
+ m_lLoaders = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode);
+ }
+ catch(java.util.NoSuchElementException ex1)
+ {
+ m_lLoaders = new java.util.Vector();
+ //m_aLog.setWarning("Fragment list of frame loader objects is missing. Parameter \"items\" seems to be invalid.");
+ }
+
+ try
+ {
+ ConfigHelper aFcfg = new ConfigHelper(m_aCfg.getString(PROP_CCFG), null);
+ m_lHandlers = aFcfg.getStringList(PROP_ITEMS, sDelimiter, bTrim, bDecode);
+ }
+ catch(java.util.NoSuchElementException ex1)
+ {
+ m_lHandlers = new java.util.Vector();
+ //m_aLog.setWarning("Fragment list of content handler objects is missing. Parameter \"items\" seems to be invalid.");
+ }
+ }
+
+ //-------------------------------------------
+ /** TODO */
+ public synchronized void merge()
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sBuffer = new java.lang.StringBuffer(1000000);
+ java.lang.String sPackage = m_aCfg.getString(PROP_PKG);
+
+ m_aLog.setGlobalInfo("create package \""+sPackage+"\" ...");
+ m_aLog.setDetailedInfo("generate package header ... ");
+
+ sBuffer.append(
+ XMLHelper.generateHeader(
+ m_aCfg.getString (PROP_XMLVERSION ),
+ m_aCfg.getString (PROP_XMLENCODING ),
+ m_aCfg.getString (PROP_XMLPATH ),
+ m_aCfg.getString (PROP_XMLPACKAGE ),
+ m_aCfg.getBoolean(PROP_LANGUAGEPACK, false)));
+
+ // counts all transfered fragments
+ // Can be used later to decide, if a generated package file
+ // contains "nothing"!
+ int nItemCount = 0;
+
+ for (int i=0; i<4; ++i)
+ {
+ java.lang.String sSetName = null;
+ java.lang.String sSubDir = null;
+ java.util.Vector lFragments = null;
+
+ try
+ {
+ switch(i)
+ {
+ case 0: // types
+ {
+ m_aLog.setDetailedInfo("generate set for types ... ");
+ sSetName = m_aCfg.getString(PROP_SETNAME_TYPES);
+ sSubDir = m_aCfg.getString(PROP_SUBDIR_TYPES );
+ lFragments = m_lTypes;
+ }
+ break;
+
+ case 1: // filters
+ {
+ m_aLog.setDetailedInfo("generate set for filter ... ");
+ sSetName = m_aCfg.getString(PROP_SETNAME_FILTERS);
+ sSubDir = m_aCfg.getString(PROP_SUBDIR_FILTERS );
+ lFragments = m_lFilters;
+ }
+ break;
+
+ case 2: // loaders
+ {
+ m_aLog.setDetailedInfo("generate set for frame loader ... ");
+ sSetName = m_aCfg.getString(PROP_SETNAME_LOADERS);
+ sSubDir = m_aCfg.getString(PROP_SUBDIR_LOADERS );
+ lFragments = m_lLoaders;
+ }
+ break;
+
+ case 3: // handlers
+ {
+ m_aLog.setDetailedInfo("generate set for content handler ... ");
+ sSetName = m_aCfg.getString(PROP_SETNAME_HANDLERS);
+ sSubDir = m_aCfg.getString(PROP_SUBDIR_HANDLERS );
+ lFragments = m_lHandlers;
+ }
+ break;
+ }
+
+ nItemCount += lFragments.size();
+
+ getFragments(
+ new java.io.File(m_aFragmentsDir, sSubDir),
+ sSetName,
+ lFragments,
+ 1,
+ sBuffer);
+ }
+ catch(java.util.NoSuchElementException exIgnore)
+ { continue; }
+ }
+
+ m_aLog.setDetailedInfo("generate package footer ... ");
+ sBuffer.append(XMLHelper.generateFooter());
+
+ // Attention!
+ // If the package seem to be empty, it make no sense to generate a corresponding
+ // xml file. We should suppress writing of this file on disk completly ...
+ if (nItemCount < 1)
+ {
+ m_aLog.setWarning("Package is empty and will not result into a xml file on disk!? Please check configuration file.");
+ return;
+ }
+ m_aLog.setGlobalInfo("package contains "+nItemCount+" items");
+
+ java.io.File aPackage = new File(sPackage);
+ m_aLog.setGlobalInfo("write temp package \""+aPackage.getPath()); // TODO encoding must be readed from the configuration
+ FileHelper.writeEncodedBufferToFile(aPackage, "UTF-8", false, sBuffer); // check for success is done inside this method!
+ }
+
+ //-------------------------------------------
+ /** TODO */
+ private void getFragments(java.io.File aDir ,
+ java.lang.String sSetName ,
+ java.util.Vector lFragments ,
+ int nPrettyTabs,
+ java.lang.StringBuffer sBuffer )
+ throws java.lang.Exception
+ {
+ if (lFragments.size()<1)
+ {
+ m_aLog.setWarning("List of fragments is empty!? Will be ignored ...");
+ return;
+ }
+
+ java.util.Enumeration pFragments = lFragments.elements();
+ java.lang.String sExtXcu = m_aCfg.getString(PROP_EXTENSION_XCU);
+
+ for (int tabs=0; tabs<nPrettyTabs; ++tabs)
+ sBuffer.append("\t");
+ sBuffer.append("<node oor:name=\""+sSetName+"\">\n");
+ ++nPrettyTabs;
+
+ // special mode for generating language packs.
+ // In such case we must live with some missing fragment files.
+ // Reason behind; Not all filters are realy localized.
+ // But we dont use a different fragment list. We try to locate
+ // any fragment file in its language-pack version ...
+ boolean bHandleLanguagePacks = m_aCfg.getBoolean(PROP_LANGUAGEPACK, false);
+ boolean bDebug = m_aCfg.getBoolean(PROP_DEBUG , false);
+ java.lang.String sEncoding = "UTF-8";
+ if (bDebug)
+ sEncoding = "UTF-8Special";
+
+ while(pFragments.hasMoreElements())
+ {
+ java.lang.String sFragment = (java.lang.String)pFragments.nextElement();
+ java.io.File aFragment = new java.io.File(aDir, sFragment+"."+sExtXcu);
+
+ // handle simple files only and check for existence!
+ if (!aFragment.exists())
+ {
+ if (bHandleLanguagePacks)
+ {
+ m_aLog.setWarning("language fragment \""+aFragment.getPath()+"\" does not exist. Will be ignored.");
+ continue;
+ }
+ else
+ throw new java.io.IOException("fragment \""+aFragment.getPath()+"\" does not exists.");
+ }
+
+ if (!aFragment.isFile())
+ {
+ m_aLog.setWarning("fragment \""+aFragment.getPath()+"\" seem to be not a valid file.");
+ continue;
+ }
+
+ // copy file content of original fragment
+ // Note: A FileNotFoundException will be thrown automaticly by the
+ // used reader objects. Let it break this method too. Our calli is interested
+ // on such errors :-)
+ m_aLog.setDetailedInfo("merge fragment \""+aFragment.getPath()+"\" ...");
+ FileHelper.readEncodedBufferFromFile(aFragment, sEncoding, sBuffer);
+
+ sBuffer.append("\n");
+ }
+
+ --nPrettyTabs;
+ for (int tabs=0; tabs<nPrettyTabs; ++tabs)
+ sBuffer.append("\t");
+ sBuffer.append("</node>\n");
+ }
+}
diff --git a/transex3/source/filter/merge/makefile.mk b/transex3/source/filter/merge/makefile.mk
new file mode 100644
index 000000000000..bf768be851d8
--- /dev/null
+++ b/transex3/source/filter/merge/makefile.mk
@@ -0,0 +1,96 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.9.102.1 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ = ..$/..$/..
+TARGET = FCFGMerge
+PRJNAME = filter
+PACKAGE = com$/sun$/star$/filter$/config$/tools$/merge
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE: settings.mk
+
+#----- compile .java files -----------------------------------------
+#.IF "$(L10N_framework)"==""
+
+OWNCOPY = \
+ $(MISC)$/$(TARGET)_copied.done
+
+#JARFILES = \
+# ridl.jar \
+# unoil.jar \
+# jurt.jar \
+# juh.jar \
+# java_uno.jar
+
+CFGFILES = \
+ FCFGMerge.cfg
+
+JAVACLASSFILES = \
+ $(CLASSDIR)$/$(PACKAGE)$/Merger.class \
+ $(CLASSDIR)$/$(PACKAGE)$/FCFGMerge.class
+
+CUSTOMMANIFESTFILE = \
+ Manifest.mf
+
+MAXLINELENGTH = 100000
+
+#----- make a jar from compiled files ------------------------------
+
+JARCLASSDIRS = \
+ com$/sun$/star$/filter$/config$/tools$/utils \
+ com$/sun$/star$/filter$/config$/tools$/merge
+
+JARTARGET = $(TARGET).jar
+
+JARCOMPRESS = TRUE
+
+# --- targets -----------------------------------------------------
+
+.INCLUDE : target.mk
+
+.IF "$(SOLAR_JAVA)" != "" || "$(GUI)"=="OS2"
+ALLTAR : $(OWNCOPY)
+
+.IF "$(JARTARGETN)" != ""
+$(JARTARGETN) : $(OWNCOPY)
+.ENDIF
+
+$(OWNCOPY) : $(CFGFILES)
+ -$(MKDIRHIER) $(CLASSDIR)$/$(PACKAGE)
+ $(COPY) $? $(CLASSDIR)$/$(PACKAGE) && $(TOUCH) $@
+
+.ENDIF # "$(SOLAR_JAVA)" != ""
+
+#.ELSE
+#pseudo:
+
+#.ENDIF
diff --git a/transex3/source/filter/utils/AnalyzeStartupLog.java b/transex3/source/filter/utils/AnalyzeStartupLog.java
new file mode 100644
index 000000000000..498528850697
--- /dev/null
+++ b/transex3/source/filter/utils/AnalyzeStartupLog.java
@@ -0,0 +1,328 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: AnalyzeStartupLog.java,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// imports
+import java.util.*;
+import java.lang.*;
+
+//_______________________________________________
+// implementation
+public class AnalyzeStartupLog
+{
+ private class OperationTime
+ {
+ /** name the measured operation. */
+ public java.lang.String sOperation;
+
+ /** contains the time value, when this operation was started. */
+ public long nStartTime;
+
+ /** contains the time value, when this operation was finished. */
+ public long nEndTime;
+
+ /** text inside log file, which identifies the start time value. */
+ public java.lang.String sStartMsg;
+
+ /** text inside log file, which identifies the end time value. */
+ public java.lang.String sEndMsg;
+ }
+
+ //_________________________________
+ // main
+
+ public static void main(java.lang.String[] lCmdLine)
+ {
+ int nExit = 0;
+ try
+ {
+ // analyze command line
+ ConfigHelper aCmdLine = new ConfigHelper("", lCmdLine);
+ java.lang.String sLogDir = aCmdLine.getString("logdir" );
+ java.lang.String sDataFile = aCmdLine.getString("datafile");
+
+ if (sLogDir == null || sDataFile == null)
+ {
+ System.err.println("AnalyzeStartupLog lodir=<dir> datafile=<file>");
+ System.err.println("E.g.: AnalyzeStartupLog lodir=c:\\temp\\logs datafile=c:\\temp\\data.csv");
+ System.exit(--nExit);
+ }
+
+ // get list of all log files
+ boolean bRecursive = true;
+ java.util.Vector lLogs = FileHelper.getSystemFilesFromDir(new java.io.File(sLogDir), bRecursive);
+ if (lLogs == null || lLogs.isEmpty())
+ {
+ System.err.println("log dir is empty");
+ System.exit(--nExit);
+ }
+
+ // analyze it
+ java.lang.StringBuffer sOut = new java.lang.StringBuffer(1000);
+ sOut.append("log;t_cfg_start;t_cfg_end;t_fwk_start;t_fwk_end;t_sfx_start;t_sfx_end;t_types_start;t_types_end;t_filters_start;t_filters_end;");
+ sOut.append("t_filters_swriter_start;t_filters_swriter_end;t_filters_sweb_start;t_filters_sweb_end;t_filters_sglobal_start;t_filters_sglobal_end;t_filters_scalc_start;t_filters_scalc_end;t_filters_sdraw_start;t_filters_sdraw_end;t_filters_simpress_start;t_filters_simpress_end;t_filters_schart_start;t_filters_schart_end;t_filters_smath_start;t_filters_smath_end;");
+ sOut.append("t_others_start;t_others_end;d_cfg;d_fwk;d_sfx;d_types;d_filters;d_others;d_complete\n");
+
+ java.util.Enumeration aIt = lLogs.elements();
+ while (aIt.hasMoreElements())
+ {
+ java.io.File aLog = (java.io.File)aIt.nextElement();
+ java.io.FileReader aReader = new java.io.FileReader(aLog);
+ java.io.BufferedReader aBuffer = new java.io.BufferedReader(aReader);
+
+ long t_cfg_start = 0;
+ long t_cfg_end = 0;
+
+ long t_fwk_start = 0;
+ long t_fwk_end = 0;
+
+ long t_sfx_start = 0;
+ long t_sfx_end = 0;
+
+ long t_types_start = 0;
+ long t_types_end = 0;
+
+ long t_filters_start = 0;
+ long t_filters_end = 0;
+
+ long t_filters_swriter_start = 0;
+ long t_filters_swriter_end = 0;
+
+ long t_filters_sweb_start = 0;
+ long t_filters_sweb_end = 0;
+
+ long t_filters_sglobal_start = 0;
+ long t_filters_sglobal_end = 0;
+
+ long t_filters_scalc_start = 0;
+ long t_filters_scalc_end = 0;
+
+ long t_filters_sdraw_start = 0;
+ long t_filters_sdraw_end = 0;
+
+ long t_filters_simpress_start = 0;
+ long t_filters_simpress_end = 0;
+
+ long t_filters_schart_start = 0;
+ long t_filters_schart_end = 0;
+
+ long t_filters_smath_start = 0;
+ long t_filters_smath_end = 0;
+
+ long t_others_start = 0;
+ long t_others_end = 0;
+
+ while (true)
+ {
+ java.lang.String sLine = aBuffer.readLine();
+ if (sLine == null)
+ break;
+
+ if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : { creation ConfigItem [file=standard, version=6, mode=3]"))
+ t_cfg_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : } creation ConfigItem"))
+ t_cfg_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : { reading TypeDetection.xml"))
+ t_fwk_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("| framework (as96863) ::FilterCache::FilterCache : } reading TypeDetection.xml"))
+ t_fwk_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ framework (as96863) ::FilterCFGAccess::impl_loadTypes"))
+ t_types_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} framework (as96863) ::FilterCFGAccess::impl_loadTypes"))
+ t_types_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ framework (as96863) ::FilterCFGAccess::impl_loadFilters"))
+ t_filters_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} framework (as96863) ::FilterCFGAccess::impl_loadFilters"))
+ t_filters_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [swriter]"))
+ t_filters_swriter_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [swriter]"))
+ t_filters_swriter_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [sweb]"))
+ t_filters_sweb_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [sweb]"))
+ t_filters_sweb_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [sglobal]"))
+ t_filters_sglobal_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [sglobal]"))
+ t_filters_sglobal_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [scalc]"))
+ t_filters_scalc_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [scalc]"))
+ t_filters_scalc_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [sdraw]"))
+ t_filters_sdraw_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [sdraw]"))
+ t_filters_sdraw_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [simpress]"))
+ t_filters_simpress_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [simpress]"))
+ t_filters_simpress_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [schart]"))
+ t_filters_schart_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [schart]"))
+ t_filters_schart_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ reading FilterGroup [smath]"))
+ t_filters_smath_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} reading FilterGroup [smath]"))
+ t_filters_smath_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("{ framework (as96863) ::FilterCFGAccess::impl_loadDetectors"))
+ t_others_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} framework (as96863) ::FilterCFGAccess::impl_loadContentHandlers"))
+ t_others_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} framework (as96863) ::FilterCache::FilterCache"))
+ t_sfx_start = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ else
+ if (sLine.endsWith("} desktop (lo119109) OfficeWrapper::OfficeWrapper"))
+ t_sfx_end = new java.lang.Long(sLine.substring(0, 6)).longValue();
+ }
+
+ sOut.append(aLog.getName() );
+ sOut.append(";" );
+ sOut.append(t_cfg_start );
+ sOut.append(";" );
+ sOut.append(t_cfg_end );
+ sOut.append(";" );
+ sOut.append(t_fwk_start );
+ sOut.append(";" );
+ sOut.append(t_fwk_end );
+ sOut.append(";" );
+ sOut.append(t_sfx_start );
+ sOut.append(";" );
+ sOut.append(t_sfx_end );
+ sOut.append(";" );
+ sOut.append(t_types_start );
+ sOut.append(";" );
+ sOut.append(t_types_end );
+ sOut.append(";" );
+ sOut.append(t_filters_start );
+ sOut.append(";" );
+ sOut.append(t_filters_end );
+ sOut.append(";" );
+
+ sOut.append(t_filters_swriter_start );
+ sOut.append(";" );
+ sOut.append(t_filters_swriter_end );
+ sOut.append(";" );
+ sOut.append(t_filters_sweb_start );
+ sOut.append(";" );
+ sOut.append(t_filters_sweb_end );
+ sOut.append(";" );
+ sOut.append(t_filters_sglobal_start );
+ sOut.append(";" );
+ sOut.append(t_filters_sglobal_end );
+ sOut.append(";" );
+ sOut.append(t_filters_scalc_start );
+ sOut.append(";" );
+ sOut.append(t_filters_scalc_end );
+ sOut.append(";" );
+ sOut.append(t_filters_sdraw_start );
+ sOut.append(";" );
+ sOut.append(t_filters_sdraw_end );
+ sOut.append(";" );
+ sOut.append(t_filters_simpress_start );
+ sOut.append(";" );
+ sOut.append(t_filters_simpress_end );
+ sOut.append(";" );
+ sOut.append(t_filters_schart_start );
+ sOut.append(";" );
+ sOut.append(t_filters_schart_end );
+ sOut.append(";" );
+ sOut.append(t_filters_smath_start );
+ sOut.append(";" );
+ sOut.append(t_filters_smath_end );
+ sOut.append(";" );
+
+ sOut.append(t_others_start );
+ sOut.append(";" );
+ sOut.append(t_others_end );
+ sOut.append(";" );
+ sOut.append(t_cfg_end -t_cfg_start );
+ sOut.append(";" );
+ sOut.append(t_fwk_end -t_fwk_start );
+ sOut.append(";" );
+ sOut.append(t_sfx_end -t_sfx_start );
+ sOut.append(";" );
+ sOut.append(t_types_end -t_types_start );
+ sOut.append(";" );
+ sOut.append(t_filters_end-t_filters_start);
+ sOut.append(";" );
+ sOut.append(t_others_end -t_others_start );
+ sOut.append(";" );
+ sOut.append(t_others_end -t_cfg_start );
+ sOut.append("\n" );
+
+ aBuffer.close();
+ }
+
+ java.io.FileWriter aCSV = new java.io.FileWriter(sDataFile);
+ java.lang.String sData = sOut.toString();
+ aCSV.write(sData, 0, sData.length());
+ aCSV.flush();
+ aCSV.close();
+ }
+ catch(java.lang.Throwable exAny)
+ {
+ System.err.println(exAny.getMessage());
+ exAny.printStackTrace();
+ System.exit(--nExit);
+ }
+
+ System.exit(0);
+ }
+}
diff --git a/transex3/source/filter/utils/Cache.java b/transex3/source/filter/utils/Cache.java
new file mode 100644
index 000000000000..94c26008ed13
--- /dev/null
+++ b/transex3/source/filter/utils/Cache.java
@@ -0,0 +1,2449 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: Cache.java,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+
+//_______________________________________________
+
+/**
+ * It implements a container for all possible entries which are part of the type
+ * and filter mechanism of an office - means all items of the configuration file
+ * "TypeDetection". How these entries will be readed or written can be switch
+ * in different modes. That would make it possible to edit an xml directly or
+ * to contact a running office instance.
+ *
+ *
+ */
+public class Cache
+{
+ //___________________________________________
+ // public const
+
+ /** identifies a file type item of this cache. */
+ public static final int E_TYPE = 0;
+
+ /** identifies a filter item of this cache. */
+ public static final int E_FILTER = 1;
+
+ /** identifies a detect service item of this cache. */
+ public static final int E_DETECTSERVICE = 2;
+
+ /** identifies a frame loader item of this cache. */
+ public static final int E_FRAMELOADER = 3;
+
+ /** identifies a content handler item of this cache. */
+ public static final int E_CONTENTHANDLER = 4;
+
+ /** indicates an unsupported xml format => error! */
+ public static final int FORMAT_UNSUPPORTED = -1;
+
+ /** identify the configuration format of an office 6.0.
+ * The own formated data string is used. */
+ public static final int FORMAT_60 = 0;
+
+ /** identify the configuration format of an office 6.y.
+ * Properties are realy xml tags again. */
+ public static final int FORMAT_6Y = 1;
+
+ /** identify the configuration format which is used inside
+ * this tooling project. */
+ public static final int FORMAT_INTERNAL = 2;
+
+ /** right value for a command line parameter to define a 6.0 version. */
+ public static final java.lang.String CMDVAL_FORMAT_60 = "6.0";
+
+ /** right value for a command line parameter to define a 6.Y version. */
+ public static final java.lang.String CMDVAL_FORMAT_6Y = "6.Y";
+
+ /** right value for a command line parameter to define an internal xml version! */
+ public static final java.lang.String CMDVAL_FORMAT_INTERNAL = "internal";
+
+ // general
+ public static final java.lang.String PROPNAME_DATA = "Data";
+ public static final java.lang.String PROPNAME_NAME = "Name";
+ public static final java.lang.String PROPNAME_UINAME = "UIName";
+ public static final java.lang.String PROPNAME_UINAMES = "UINames";
+
+ // type 6.0 ...
+ public static final java.lang.String PROPNAME_MEDIATYPE = "MediaType";
+ public static final java.lang.String PROPNAME_PREFERRED = "Preferred";
+ public static final java.lang.String PROPNAME_CLIPBOARDFORMAT = "ClipboardFormat";
+ public static final java.lang.String PROPNAME_DOCUMENTICONID = "DocumentIconID";
+ public static final java.lang.String PROPNAME_URLPATTERN = "URLPattern";
+ public static final java.lang.String PROPNAME_EXTENSIONS = "Extensions";
+ // ... +6.y
+ public static final java.lang.String PROPNAME_UIORDER = "UIOrder";
+ public static final java.lang.String PROPNAME_PREFERREDFILTER = "PreferredFilter";
+ public static final java.lang.String PROPNAME_DETECTSERVICE = "DetectService";
+ public static final java.lang.String PROPNAME_FRAMELOADER = "FrameLoader";
+ public static final java.lang.String PROPNAME_CONTENTHANDLER = "ContentHandler";
+
+ // filter
+ public static final java.lang.String PROPNAME_DOCUMENTSERVICE = "DocumentService";
+ public static final java.lang.String PROPNAME_FILEFORMATVERSION = "FileFormatVersion";
+ public static final java.lang.String PROPNAME_FILTERSERVICE = "FilterService";
+ public static final java.lang.String PROPNAME_FLAGS = "Flags";
+ public static final java.lang.String PROPNAME_ORDER = "Order"; // -6.y
+ public static final java.lang.String PROPNAME_TEMPLATENAME = "TemplateName";
+ public static final java.lang.String PROPNAME_TYPE = "Type";
+ public static final java.lang.String PROPNAME_UICOMPONENT = "UIComponent";
+ public static final java.lang.String PROPNAME_USERDATA = "UserData";
+
+ // frame loader / detect services / content handler
+ public static final java.lang.String PROPNAME_TYPES = "Types";
+
+ //___________________________________________
+ // private const
+
+ private static final java.lang.String FILTERSERVICE_NATIVEWARPPER = "com.sun.star.filter.NativeFilterWrapper";
+ private static final java.lang.String GENERIC_DETECTSERVICE = "com.sun.star.comp.office.FrameLoader";
+
+ /** its the name of the cfg set, which contains all types. */
+ private static final java.lang.String CFGNODE_TYPES = "Types";
+
+ /** its the name of the cfg set, which contains all filters. */
+ private static final java.lang.String CFGNODE_FILTERS = "Filters";
+
+ /** its the name of the cfg set, which contains all detect services. */
+ private static final java.lang.String CFGNODE_DETECTSERVICES = "DetectServices";
+
+ /** its the name of the cfg set, which contains all frame loaders. */
+ private static final java.lang.String CFGNODE_FRAMELOADERS = "FrameLoaders";
+
+ /** its the name of the cfg set, which contains all content handlers. */
+ private static final java.lang.String CFGNODE_CONTENTHANDLERS = "ContentHandlers";
+
+ // names for filter flags
+ private static final java.lang.String FLAGNAME_3RDPARTYFILTER = "3RDPARTYFILTER";
+ private static final java.lang.String FLAGNAME_ALIEN = "ALIEN";
+ private static final java.lang.String FLAGNAME_ASYNCHRON = "ASYNCHRON";
+ private static final java.lang.String FLAGNAME_BROWSERPREFERRED = "BROWSERPREFERRED";
+ private static final java.lang.String FLAGNAME_CONSULTSERVICE = "CONSULTSERVICE";
+ private static final java.lang.String FLAGNAME_DEFAULT = "DEFAULT";
+ private static final java.lang.String FLAGNAME_EXPORT = "EXPORT";
+ private static final java.lang.String FLAGNAME_IMPORT = "IMPORT";
+ private static final java.lang.String FLAGNAME_INTERNAL = "INTERNAL";
+ private static final java.lang.String FLAGNAME_NOTINCHOOSER = "NOTINCHOOSER";
+ private static final java.lang.String FLAGNAME_NOTINFILEDIALOG = "NOTINFILEDIALOG";
+ private static final java.lang.String FLAGNAME_NOTINSTALLED = "NOTINSTALLED";
+ private static final java.lang.String FLAGNAME_OWN = "OWN";
+ private static final java.lang.String FLAGNAME_PACKED = "PACKED";
+ private static final java.lang.String FLAGNAME_PREFERRED = "PREFERRED";
+ private static final java.lang.String FLAGNAME_READONLY = "READONLY";
+ private static final java.lang.String FLAGNAME_SILENTEXPORT = "SILENTEXPORT";
+ private static final java.lang.String FLAGNAME_TEMPLATE = "TEMPLATE";
+ private static final java.lang.String FLAGNAME_TEMPLATEPATH = "TEMPLATEPATH";
+ private static final java.lang.String FLAGNAME_USESOPTIONS = "USESOPTIONS";
+
+ private static final java.lang.String FLAGNAME_COMBINED = "COMBINED";
+ private static final java.lang.String FLAGNAME_SUPPORTSSELECTION= "SUPPORTSSELECTION";
+
+ // values for filter flags
+ private static final int FLAGVAL_3RDPARTYFILTER = 0x00080000; // 524288
+ private static final int FLAGVAL_ALIEN = 0x00000040; // 64
+ private static final int FLAGVAL_ALL = 0xffffffff; // 4294967295
+ private static final int FLAGVAL_ASYNCHRON = 0x00004000; // 16384
+ private static final int FLAGVAL_BROWSERPREFERRED = 0x00400000; // 4194304
+ private static final int FLAGVAL_CONSULTSERVICE = 0x00040000; // 262144
+ private static final int FLAGVAL_DEFAULT = 0x00000100; // 256
+ private static final int FLAGVAL_EXPORT = 0x00000002; // 2
+ private static final int FLAGVAL_IMPORT = 0x00000001; // 1
+ private static final int FLAGVAL_INTERNAL = 0x00000008; // 8
+ private static final int FLAGVAL_NOTINCHOOSER = 0x00002000; // 8192
+ private static final int FLAGVAL_NOTINFILEDIALOG = 0x00001000; // 4096
+ private static final int FLAGVAL_NOTINSTALLED = 0x00020000; // 131072
+ private static final int FLAGVAL_OWN = 0x00000020; // 32
+ private static final int FLAGVAL_PACKED = 0x00100000; // 1048576
+ private static final int FLAGVAL_PREFERRED = 0x10000000; // 268435456
+ private static final int FLAGVAL_READONLY = 0x00010000; // 65536
+ private static final int FLAGVAL_SILENTEXPORT = 0x00200000; // 2097152
+ private static final int FLAGVAL_TEMPLATE = 0x00000004; // 4
+ private static final int FLAGVAL_TEMPLATEPATH = 0x00000010; // 16
+ private static final int FLAGVAL_USESOPTIONS = 0x00000080; // 128
+
+ private static final int FLAGVAL_COMBINED = 0x00800000; // ...
+ private static final int FLAGVAL_SUPPORTSSELECTION = 0x00000400; // 1024
+
+ //___________________________________________
+ // member
+
+ /** list of all located types.
+ * Format: [string,HashMap]
+ */
+ private java.util.HashMap m_lTypes;
+
+ /** list of all located filters.
+ * Format: [string,HashMap]
+ */
+ private java.util.HashMap m_lFilters;
+
+ /** list of all located detect services.
+ * Format: [string,HashMap]
+ */
+ private java.util.HashMap m_lDetectServices;
+
+ /** list of all located frame loader.
+ * Format: [string,HashMap]
+ */
+ private java.util.HashMap m_lFrameLoaders;
+
+ /** list of all located content handler.
+ * Format: [string,HashMap]
+ */
+ private java.util.HashMap m_lContentHandlers;
+
+ /** contains all analyzed relations between
+ * filters and types. The key is an internal
+ * type name (can be used as reference into the
+ * list m_lTypes) and the value is a Vector of all
+ * internal filter names, which are registered for
+ * this type.
+ * Format: [string, Vector]
+ */
+ private java.util.HashMap m_lFilterToTypeRegistrations;
+
+ private int m_nDoubleRegisteredFilters;
+ private int m_nTypesForFilters;
+ private int m_nTypesForDetectServices;
+ private int m_nTypesForFrameLoaders;
+ private int m_nTypesForContentHandlers;
+
+ /** can be used to log different informations. */
+ private Logger m_aDebug;
+
+ //___________________________________________
+ // interface
+
+ /** standard ctor.
+ *
+ * Initialize an empty cache instance. You have to use
+ * on of the fromXXX() methods to fill it from different
+ * sources with content.
+ */
+ public Cache(Logger aDebug)
+ {
+ reset();
+ m_aDebug = aDebug;
+ }
+
+ //___________________________________________
+
+ /** free memory and set default values on all members.
+ */
+ public synchronized void reset()
+ {
+ m_lTypes = new java.util.HashMap();
+ m_lFilters = new java.util.HashMap();
+ m_lFrameLoaders = new java.util.HashMap();
+ m_lDetectServices = new java.util.HashMap();
+ m_lContentHandlers = new java.util.HashMap();
+ m_lFilterToTypeRegistrations = new java.util.HashMap();
+ m_aDebug = new Logger();
+ m_nDoubleRegisteredFilters = 0;
+ m_nTypesForFilters = 0;
+ m_nTypesForDetectServices = 0;
+ m_nTypesForFrameLoaders = 0;
+ m_nTypesForContentHandlers = 0;
+ }
+
+ //___________________________________________
+
+ /** converts a string representation of an xml format
+ * to its int value, which must be used at some interface
+ * methods of this cache.
+ *
+ * If the given string does not match to any well known format,
+ * the return value will be FORMAT_UNSUPPORTED. The calli have to
+ * check that. Otherwhise a called interface method at this cache
+ * instance will be rejected by an exception!
+ *
+ * @param sFormat
+ * the string representation
+ * Must be one of our public const values from type CMDVAL_FORMAT_xxx.
+ *
+ * @return [int]
+ * the int representation.
+ * Will be one of our public const values from type FORMAT_xxx.
+ */
+ public static int mapFormatString2Format(java.lang.String sFormat)
+ {
+ int nFormat = FORMAT_UNSUPPORTED;
+ if (sFormat.equalsIgnoreCase(CMDVAL_FORMAT_60))
+ nFormat = FORMAT_60;
+ else
+ if (sFormat.equalsIgnoreCase(CMDVAL_FORMAT_6Y))
+ nFormat = FORMAT_6Y;
+ else
+ if (sFormat.equalsIgnoreCase(CMDVAL_FORMAT_INTERNAL))
+ nFormat = FORMAT_INTERNAL;
+ return nFormat;
+ }
+
+ //___________________________________________
+
+ /** return some statistic values.
+ *
+ * Such values can be: - count of container items,
+ * - ...
+ *
+ * @return [java.lang.String]
+ * a formated string, which contains al statistic data.
+ */
+ public synchronized java.lang.String getStatistics()
+ {
+ java.lang.StringBuffer sBuffer = new java.lang.StringBuffer(256);
+
+ sBuffer.append("types = "+m_lTypes.size() +"\n");
+ sBuffer.append("filters = "+m_lFilters.size() +"\n");
+ sBuffer.append("detect services = "+m_lDetectServices.size() +"\n");
+ sBuffer.append("frame loaders = "+m_lFrameLoaders.size() +"\n");
+ sBuffer.append("content handler = "+m_lContentHandlers.size() +"\n");
+ sBuffer.append("double registered filters = "+m_nDoubleRegisteredFilters+"\n");
+ sBuffer.append("types used by filters = "+m_nTypesForFilters +"\n");
+ sBuffer.append("types used by detect services = "+m_nTypesForDetectServices +"\n");
+ sBuffer.append("types used by frame loaders = "+m_nTypesForFrameLoaders +"\n");
+ sBuffer.append("types used by content handlers = "+m_nTypesForContentHandlers+"\n");
+
+ return sBuffer.toString();
+ }
+
+ //___________________________________________
+
+ /** reset this cache and fill it with new values using the given XML file.
+ *
+ * @param aXML
+ * must be a system file of a suitable XML file, which
+ * include all neccessary type/filter items.
+ *
+ * @param nFormat
+ * identifies the format of the specified xml file,
+ * which must be interpreted.
+ */
+ public synchronized void fromXML(java.io.File aXML ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ // clear this cache
+ reset();
+
+ // parse it
+ javax.xml.parsers.DocumentBuilderFactory aFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
+ /* Attention:
+ * This call is important. It force right handling of entities during parsing and(!)
+ * writing. It let all possible signs for entities or it's quoted representations
+ * untouched. So this class don't change the original signs of the original file.
+ * Means:
+ * <ul>
+ * <li>(') => (')</li>
+ * <li>(") => (")</li>
+ * <li>(>) => (&gt;)</li>
+ * <li>(<) => (&lt;)</li>
+ * <li>(&gt;) => (&gt;)</li>
+ * <li>(&amp;) => (&amp;)</li>
+ * <li>...</li>
+ * </ul>
+ */
+
+ System.out.println("TODO: must be adapted to java 1.3 :-(");
+ System.exit(-1);
+//TODO_JAVA aFactory.setExpandEntityReferences(false);
+
+ javax.xml.parsers.DocumentBuilder aBuilder = aFactory.newDocumentBuilder();
+ org.w3c.dom.Document aDOM = aBuilder.parse(aXML);
+ org.w3c.dom.Element aRoot = aDOM.getDocumentElement();
+
+ // step over all sets
+ java.util.Vector lSetNodes = XMLHelper.extractChildNodesByTagName(aRoot, XMLHelper.XMLTAG_NODE);
+ java.util.Enumeration it1 = lSetNodes.elements();
+ while (it1.hasMoreElements())
+ {
+ // try to find out, which set should be read
+ org.w3c.dom.Node aSetNode = (org.w3c.dom.Node)it1.nextElement();
+ java.lang.String sSetName = XMLHelper.extractNodeAttribByName(aSetNode, XMLHelper.XMLATTRIB_OOR_NAME);
+ if (sSetName == null)
+ throw new java.io.IOException("unsupported format: could not extract set name on node ...\n"+aSetNode);
+
+ // map some generic interfaces to the right members!
+ int eType = -1 ;
+ java.util.HashMap rMap = null;
+
+ if (sSetName.equals(CFGNODE_TYPES))
+ {
+ eType = E_TYPE;
+ rMap = m_lTypes;
+ }
+ else
+ if (sSetName.equals(CFGNODE_FILTERS))
+ {
+ eType = E_FILTER;
+ rMap = m_lFilters;
+ }
+ else
+ if (sSetName.equals(CFGNODE_FRAMELOADERS))
+ {
+ eType = E_FRAMELOADER;
+ rMap = m_lFrameLoaders;
+ }
+ else
+ if (sSetName.equals(CFGNODE_DETECTSERVICES))
+ {
+ eType = E_DETECTSERVICE;
+ rMap = m_lDetectServices;
+ }
+ else
+ if (sSetName.equals(CFGNODE_CONTENTHANDLERS))
+ {
+ eType = E_CONTENTHANDLER;
+ rMap = m_lContentHandlers;
+ }
+ else
+ throw new java.io.IOException("unsupported format: unknown set name [\""+sSetName+"\"] detected on node ...\n"+aSetNode);
+
+ // load all set entries
+ java.util.Vector lChildNodes = XMLHelper.extractChildNodesByTagName(aSetNode, XMLHelper.XMLTAG_NODE);
+ java.util.Enumeration it2 = lChildNodes.elements();
+ while (it2.hasMoreElements())
+ {
+ org.w3c.dom.Node aChildNode = (org.w3c.dom.Node)it2.nextElement();
+ java.lang.String sChildName = XMLHelper.extractNodeAttribByName(aChildNode, XMLHelper.XMLATTRIB_OOR_NAME);
+ if (sChildName == null)
+ throw new java.io.IOException("unsupported format: could not extract child node name on node ...\n"+aChildNode);
+ java.util.HashMap aPropSet = null;
+
+ // Note: Our internal format is different from the source format!
+ java.util.HashMap aTempSet = XMLHelper.convertNodeToPropSet(aChildNode);
+ switch(eType)
+ {
+ case E_TYPE :
+ {
+ aPropSet = Cache.convertTypePropsToInternal(aTempSet, nFormat);
+ m_aDebug.setDetailedInfo("type [\""+sChildName+"\"] converted to internal format");
+ }
+ break;
+
+ case E_FILTER :
+ {
+ aPropSet = Cache.convertFilterPropsToInternal(aTempSet, nFormat);
+ m_aDebug.setDetailedInfo("filter [\""+sChildName+"\"] converted to internal format");
+ }
+ break;
+
+ case E_DETECTSERVICE :
+ {
+ aPropSet = Cache.convertDetectServicePropsToInternal(aTempSet, nFormat);
+ m_aDebug.setDetailedInfo("detect service [\""+sChildName+"\"] converted to internal format");
+ }
+ break;
+
+ case E_FRAMELOADER :
+ {
+ aPropSet = Cache.convertFrameLoaderPropsToInternal(aTempSet, nFormat);
+ m_aDebug.setDetailedInfo("frame loader [\""+sChildName+"\"] converted to internal format");
+ }
+ break;
+
+ case E_CONTENTHANDLER :
+ {
+ aPropSet = Cache.convertContentHandlerPropsToInternal(aTempSet, nFormat);
+ m_aDebug.setDetailedInfo("content handler [\""+sChildName+"\"] converted to internal format");
+ }
+ break;
+ }
+ m_aDebug.setDetailedInfo("props = "+aTempSet);
+ rMap.put(sChildName, aPropSet);
+ }
+ }
+ }
+
+ //___________________________________________
+
+ /** create some hml views of the current content of this cache.
+ *
+ * The given directory is used to create different html files
+ * there. Every of them show another aspect of this cache.
+ * E.g.: - all type/filter properties
+ * - relation ships between types/filters/loaders etc.
+ *
+ * @param aDirectory
+ * points to a system directory, which
+ * can be used completely(!) to generate
+ * the results there.
+ *
+ * @param nFormat
+ * specify in which context the cache items should be
+ * interpreted.
+ */
+ public synchronized void toHTML(java.io.File aDirectory,
+ int nFormat ,
+ java.lang.String sEncoding )
+ throws java.lang.Exception
+ {
+ if (nFormat != FORMAT_6Y)
+ throw new java.lang.Exception("HTML views are supported for the new 6.y format only yet.");
+
+ java.lang.StringBuffer sRelationView = new java.lang.StringBuffer(1000);
+ sRelationView.append("<html><header><title>Relation View</title></header><body>");
+ sRelationView.append("<table border=1>");
+ sRelationView.append("<tr><td><b>type</b></td><td><b>detect service</b></td><td><b>preferred filter</b></td><td><b>frame loader</b></td><td><b>content handler</b></td></tr>");
+
+ java.util.Iterator aIt = m_lTypes.keySet().iterator();
+ while (aIt.hasNext())
+ {
+ java.lang.String sType = (java.lang.String)aIt.next();
+ java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sType);
+
+ sRelationView.append("<tr>");
+ sRelationView.append("<td>"+sType+"</td>");
+
+ java.lang.String sVal = (java.lang.String)aType.get(PROPNAME_DETECTSERVICE);
+ if (sVal == null || sVal.length()<1)
+ sRelationView.append("<td> - </td>");
+ else
+ sRelationView.append("<td>"+sVal+"</td>");
+
+ sVal = (java.lang.String)aType.get(PROPNAME_PREFERREDFILTER);
+ if (sVal == null || sVal.length()<1)
+ sRelationView.append("<td> - </td>");
+ else
+ sRelationView.append("<td>"+sVal+"</td>");
+
+ sVal = (java.lang.String)aType.get(PROPNAME_FRAMELOADER);
+ if (sVal == null || sVal.length()<1)
+ sRelationView.append("<td> - </td>");
+ else
+ sRelationView.append("<td>"+sVal+"</td>");
+
+ sVal = (java.lang.String)aType.get(PROPNAME_CONTENTHANDLER);
+ if (sVal == null || sVal.length()<1)
+ sRelationView.append("<td> - </td>");
+ else
+ sRelationView.append("<td>"+sVal+"</td>");
+
+ sRelationView.append("</tr>");
+ }
+
+ sRelationView.append("</table>");
+ sRelationView.append("</body>");
+
+ FileHelper.writeEncodedBufferToFile(new java.io.File(aDirectory, "relation_view.html"), sEncoding, false, sRelationView);
+
+ java.util.HashMap lFilters2TypeRegistration = new java.util.HashMap();
+ aIt = m_lFilters.keySet().iterator();
+ while (aIt.hasNext())
+ {
+ java.lang.String sFilter = (java.lang.String)aIt.next();
+ java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter);
+ java.lang.String sType = (java.lang.String)aFilter.get(PROPNAME_TYPE);
+
+ java.util.Vector lFilters = (java.util.Vector)lFilters2TypeRegistration.get(sType);
+ if (lFilters == null)
+ lFilters = new java.util.Vector();
+ lFilters.add(sFilter);
+ lFilters2TypeRegistration.put(sType, lFilters);
+ }
+
+ java.lang.StringBuffer sType2FiltersView = new java.lang.StringBuffer(1000);
+ sType2FiltersView.append("<html><header><title>Type2Filters View</title></header><body>");
+ sType2FiltersView.append("<table border=1>");
+ sType2FiltersView.append("<tr><td><b>type</b></td><td><b>filters</b></td></tr>");
+
+ aIt = lFilters2TypeRegistration.keySet().iterator();
+ while (aIt.hasNext())
+ {
+ java.lang.String sType = (java.lang.String)aIt.next();
+ java.util.Vector lFilters = (java.util.Vector)lFilters2TypeRegistration.get(sType);
+
+ sType2FiltersView.append("<tr><td>"+sType+"</td><td>");
+ java.util.Enumeration aEn = lFilters.elements();
+ while(aEn.hasMoreElements())
+ sType2FiltersView.append(aEn.nextElement()+"<br>");
+ sType2FiltersView.append("</td></tr>");
+ }
+
+ sType2FiltersView.append("</table>");
+ sType2FiltersView.append("</body>");
+
+ FileHelper.writeEncodedBufferToFile(new java.io.File(aDirectory, "type2filters_view.html"), sEncoding, false, sType2FiltersView);
+ }
+
+ //___________________________________________
+
+ /** converts all items of this cache to its xml representation
+ * and write it to the given file.
+ *
+ * @param aXML
+ * the target file for output.
+ *
+ * @param nFormat
+ * the requested xml format.
+ * see const values FORMAT_xxx too.
+ *
+ * @param sEncoding
+ * specify the file encoding for the generated xml file.
+ *
+ * @throws [java.lang.Exception]
+ * if something fail during convertion.
+ */
+ public synchronized void toXML(java.io.File aXML ,
+ int nFormat ,
+ java.lang.String sEncoding)
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sXML = new java.lang.StringBuffer(500000);
+
+ for (int i=0; i<5; ++i)
+ {
+ // define right sub container
+ java.lang.String sSetName = null;
+ java.util.HashMap rMap = null;
+ int eType = -1;
+
+ switch(i)
+ {
+ case 0 :
+ {
+ sSetName = CFGNODE_TYPES;
+ rMap = m_lTypes;
+ eType = E_TYPE;
+ }
+ break;
+
+ case 1 :
+ {
+ sSetName = CFGNODE_FILTERS;
+ rMap = m_lFilters;
+ eType = E_FILTER;
+ }
+ break;
+
+ case 2 :
+ {
+ sSetName = CFGNODE_DETECTSERVICES;
+ rMap = m_lDetectServices;
+ eType = E_DETECTSERVICE;
+ }
+ break;
+
+ case 3 :
+ {
+ sSetName = CFGNODE_FRAMELOADERS;
+ rMap = m_lFrameLoaders;
+ eType = E_FRAMELOADER;
+ }
+ break;
+
+ case 4 :
+ {
+ sSetName = CFGNODE_CONTENTHANDLERS;
+ rMap = m_lContentHandlers;
+ eType = E_CONTENTHANDLER;
+ }
+ break;
+ }
+
+ // generate set
+ sXML.append("<node oor:name=\""+sSetName+"\" oor:op=\"replace\">\n");
+ java.util.Iterator it = rMap.keySet().iterator();
+ while(it.hasNext())
+ {
+ java.lang.String sItem = (java.lang.String)it.next();
+ sXML.append("<node oor:name=\""+sItem+"\" oor:op=\"replace\">\n");
+ sXML.append(getItemAsXML(eType, sItem, nFormat));
+ sXML.append("</node>\n");
+ }
+ sXML.append("</node>\n");
+ }
+
+ java.io.FileOutputStream aStream = new java.io.FileOutputStream(aXML.getAbsolutePath(), false);
+ java.io.OutputStreamWriter aWriter = new java.io.OutputStreamWriter(aStream, sEncoding);
+ java.lang.String sOut = sXML.toString();
+ aWriter.write(sOut, 0, sOut.length());
+ aWriter.flush();
+ aWriter.close();
+ }
+
+ //___________________________________________
+
+ /** converts a type property set from internal format
+ * to an external one.
+ *
+ * @param aMap
+ * points to the item, which should be converted.
+ *
+ * @param nFormat
+ * specify the requested output format.
+ *
+ * @return [java.util.HashMap]
+ * contains the properties in the requested format.
+ *
+ * @throws [java.lang.Exception
+ * if something fail during convertion.
+ */
+ private static java.util.HashMap convertTypePropsToExternal(java.util.HashMap aMap ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ java.util.HashMap aResultMap = new java.util.HashMap();
+ // copy Name property ... if it exists!
+ if (aMap.containsKey(PROPNAME_NAME))
+ aResultMap.put(PROPNAME_NAME, aMap.get(PROPNAME_NAME));
+ switch(nFormat)
+ {
+ //-----------------------------------
+ case FORMAT_60 :
+ {
+ // copy UIName property unchanged
+ aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME));
+
+ // ignore properties "UIOrder", "PreferredFilter", "DetectService"
+ // They are not supported for 6.0 types.
+
+ // pack all other properties to one "Data" string value
+ java.lang.StringBuffer sData = new java.lang.StringBuffer(256);
+
+ sData.append(aMap.get(PROPNAME_PREFERRED));
+ sData.append(",");
+ sData.append(aMap.get(PROPNAME_MEDIATYPE));
+ sData.append(",");
+ sData.append(aMap.get(PROPNAME_CLIPBOARDFORMAT));
+ sData.append(",");
+
+ java.util.Vector lList = (java.util.Vector)aMap.get(PROPNAME_URLPATTERN);
+ int c = lList.size();
+ int i = 0;
+ for (i=0; i<c; ++i)
+ {
+ sData.append(lList.elementAt(i));
+ if (i<(c-1))
+ sData.append(";");
+ }
+
+ lList = (java.util.Vector)aMap.get(PROPNAME_EXTENSIONS);
+ c = lList.size();
+ for (i=0; i<c; ++i)
+ {
+ sData.append(lList.elementAt(i));
+ if (i<(c-1))
+ sData.append(";");
+ }
+
+ sData.append(",");
+ sData.append(aMap.get(PROPNAME_DOCUMENTICONID));
+ sData.append(",");
+
+ aResultMap.put(PROPNAME_DATA, sData.toString());
+ }
+ break;
+
+ //-----------------------------------
+ case FORMAT_6Y :
+ {
+ // copy all supported properties directly
+ aResultMap.put(PROPNAME_PREFERRED , aMap.get(PROPNAME_PREFERRED ));
+ aResultMap.put(PROPNAME_MEDIATYPE , aMap.get(PROPNAME_MEDIATYPE ));
+ aResultMap.put(PROPNAME_URLPATTERN , aMap.get(PROPNAME_URLPATTERN ));
+ aResultMap.put(PROPNAME_EXTENSIONS , aMap.get(PROPNAME_EXTENSIONS ));
+ aResultMap.put(PROPNAME_UINAME , aMap.get(PROPNAME_UINAME ));
+ aResultMap.put(PROPNAME_PREFERREDFILTER, aMap.get(PROPNAME_PREFERREDFILTER));
+ aResultMap.put(PROPNAME_DETECTSERVICE , aMap.get(PROPNAME_DETECTSERVICE ));
+ aResultMap.put(PROPNAME_CLIPBOARDFORMAT, aMap.get(PROPNAME_CLIPBOARDFORMAT));
+ aResultMap.put(PROPNAME_UIORDER , aMap.get(PROPNAME_UIORDER ));
+ /* REMOVED!
+ aResultMap.put(PROPNAME_DOCUMENTICONID , aMap.get(PROPNAME_DOCUMENTICONID ));
+ */
+ }
+ break;
+
+ //-----------------------------------
+ default :
+ throw new java.lang.Exception("unknown format");
+ }
+
+ return aResultMap;
+ }
+
+ //___________________________________________
+
+ /** converts a filter property set from internal format
+ * to an external one.
+ *
+ * @param aMap
+ * points to the item, which should be converted.
+ *
+ * @param nFormat
+ * specify the requested output format.
+ *
+ * @return [java.util.HashMap]
+ * contains the properties in the requested format.
+ *
+ * @throws [java.lang.Exception
+ * if something fail during convertion.
+ */
+ private static java.util.HashMap convertFilterPropsToExternal(java.util.HashMap aMap ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ java.util.HashMap aResultMap = new java.util.HashMap();
+ // copy Name property ... if it exists!
+ if (aMap.containsKey(PROPNAME_NAME))
+ aResultMap.put(PROPNAME_NAME, aMap.get(PROPNAME_NAME));
+ switch(nFormat)
+ {
+ //-----------------------------------
+ case FORMAT_60 :
+ {
+ // copy UIName property unchanged!
+ aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME));
+
+ // but pack all other properties
+ java.lang.StringBuffer sData = new java.lang.StringBuffer(256);
+
+ sData.append(aMap.get(PROPNAME_ORDER));
+ sData.append(",");
+ sData.append(aMap.get(PROPNAME_TYPE));
+ sData.append(",");
+ sData.append(aMap.get(PROPNAME_DOCUMENTSERVICE));
+ sData.append(",");
+ sData.append(aMap.get(PROPNAME_FILTERSERVICE));
+ sData.append(",");
+ sData.append(aMap.get(PROPNAME_FLAGS));
+ sData.append(",");
+ java.util.Vector lList = (java.util.Vector)aMap.get(PROPNAME_USERDATA);
+ int c = lList.size();
+ int i = 0;
+ for (i=0; i<c; ++i)
+ {
+ sData.append(lList.elementAt(i));
+ if (i<(c-1))
+ sData.append(";");
+ }
+ sData.append(",");
+ sData.append(aMap.get(PROPNAME_FILEFORMATVERSION));
+ sData.append(",");
+ sData.append(aMap.get(PROPNAME_TEMPLATENAME));
+ sData.append(",");
+ sData.append(aMap.get(PROPNAME_UICOMPONENT));
+ sData.append(",");
+
+ aResultMap.put(PROPNAME_DATA, sData.toString());
+ }
+ break;
+
+ //-----------------------------------
+ case FORMAT_6Y :
+ {
+ // supress "Order" property.
+ // Will be moved to type entries in 6.y version!
+
+ // supress "UIName" property.
+ // Only type entries will be localized in 6.y version!
+ /* TODO make it configurable :-) */
+ aResultMap.put(PROPNAME_UINAME , aMap.get(PROPNAME_UINAME ));
+
+ // copy all supported properties directly
+ aResultMap.put(PROPNAME_TYPE , aMap.get(PROPNAME_TYPE ));
+ aResultMap.put(PROPNAME_DOCUMENTSERVICE , aMap.get(PROPNAME_DOCUMENTSERVICE ));
+ aResultMap.put(PROPNAME_FILTERSERVICE , aMap.get(PROPNAME_FILTERSERVICE ));
+ aResultMap.put(PROPNAME_USERDATA , aMap.get(PROPNAME_USERDATA ));
+ aResultMap.put(PROPNAME_FILEFORMATVERSION, aMap.get(PROPNAME_FILEFORMATVERSION));
+ aResultMap.put(PROPNAME_TEMPLATENAME , aMap.get(PROPNAME_TEMPLATENAME ));
+ aResultMap.put(PROPNAME_UICOMPONENT , aMap.get(PROPNAME_UICOMPONENT ));
+
+ // "Flags" will be converted from internal format [int] to
+ // the 6.y format [string-list]!
+ java.lang.Integer nFlags = (java.lang.Integer)aMap.get(PROPNAME_FLAGS);
+ java.util.Vector lFlags = Cache.convertFilterFlagValues2Names(nFlags);
+ aResultMap.put(PROPNAME_FLAGS, lFlags);
+ }
+ break;
+
+ //-----------------------------------
+ default :
+ throw new java.lang.Exception("unknown format");
+ }
+
+ return aResultMap;
+ }
+
+ //___________________________________________
+
+ /** converts a detect service property set from internal format
+ * to an external one.
+ *
+ * @param aMap
+ * points to the item, which should be converted.
+ *
+ * @param nFormat
+ * specify the requested output format.
+ *
+ * @return [java.util.HashMap]
+ * contains the properties in the requested format.
+ *
+ * @throws [java.lang.Exception
+ * if something fail during convertion.
+ */
+ private static java.util.HashMap convertDetectServicePropsToExternal(java.util.HashMap aMap ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ java.util.HashMap aResultMap = null;
+
+ switch(nFormat)
+ {
+ //-----------------------------------
+ case FORMAT_60 :
+ {
+ // no changes!
+ aResultMap = aMap;
+ }
+ break;
+
+ //-----------------------------------
+ case FORMAT_6Y :
+ {
+ // remove localized name
+ aResultMap = aMap;
+ aResultMap.remove(PROPNAME_UINAME);
+ }
+ break;
+
+ //-----------------------------------
+ default :
+ throw new java.lang.Exception("unknown format");
+ }
+
+ return aResultMap;
+ }
+
+ private static java.util.HashMap convertFrameLoaderPropsToExternal(java.util.HashMap aMap ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ java.util.HashMap aResultMap = null;
+
+ switch(nFormat)
+ {
+ //-----------------------------------
+ case FORMAT_60 :
+ {
+ // no changes!
+ aResultMap = aMap;
+ }
+ break;
+
+ //-----------------------------------
+ case FORMAT_6Y :
+ {
+ // remove localized name
+ aResultMap = aMap;
+ aResultMap.remove(PROPNAME_UINAME);
+ }
+ break;
+
+ //-----------------------------------
+ default :
+ throw new java.lang.Exception("unknown format");
+ }
+
+ return aResultMap;
+ }
+
+ private static java.util.HashMap convertContentHandlerPropsToExternal(java.util.HashMap aMap ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ java.util.HashMap aResultMap = null;
+
+ switch(nFormat)
+ {
+ //-----------------------------------
+ case FORMAT_60 :
+ {
+ // no changes!
+ aResultMap = aMap;
+ }
+ break;
+
+ //-----------------------------------
+ case FORMAT_6Y :
+ {
+ // remove localized name
+ aResultMap = aMap;
+ aResultMap.remove(PROPNAME_UINAME);
+ }
+ break;
+
+ //-----------------------------------
+ default :
+ throw new java.lang.Exception("unknown format");
+ }
+
+ return aResultMap;
+ }
+
+ //___________________________________________
+
+ /** converts a type property set (using an external format) to
+ * our internal cache format.
+ *
+ * Especialy the data format string will be expanded
+ * to its real properties.
+ *
+ * Schema:
+ * aMap["UIName"] => aExpandedMap["UIName"]
+ * aMap["Data" ] => aExpandedMap["Preferred" ], aExpandedMap["MediaType"] etc. ...
+ *
+ * @param aMap
+ * points to the item, which should be converted.
+
+ * @param nFormat
+ * specify the external format.
+ *
+ * @return [java.util.HashMap]
+ * The new map in internal format.
+ */
+ private static java.util.HashMap convertTypePropsToInternal(java.util.HashMap aMap ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ java.util.HashMap aResultMap = new java.util.HashMap();
+ // copy Name property ... if it exists!
+ if (aMap.containsKey(PROPNAME_NAME))
+ aResultMap.put(PROPNAME_NAME, aMap.get(PROPNAME_NAME));
+ switch(nFormat)
+ {
+ //-----------------------------------
+ case FORMAT_60 :
+ {
+ // copy UIName property unchanged!
+ aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME));
+
+ // generate new property "UIOrder"
+ // Its the moved property "Order" of filters for versions >= 6.y!
+ aResultMap.put(PROPNAME_UIORDER, new java.lang.Integer(0));
+
+ // generate new property "PreferredFilter"
+ // Its a the moved filter flag "Preferred" for versions >= 6.y!
+ aResultMap.put(PROPNAME_PREFERREDFILTER, new java.lang.String());
+
+ // generate new property "DetectService"
+ // Every type know its detector diretcly from now. No search
+ // will be neccessary any longer.
+ aResultMap.put(PROPNAME_DETECTSERVICE, new java.lang.String());
+
+ // analyze the Data property of the original map
+ // and copy its results (means all expanded properties)
+ // to the result map.
+ java.lang.String sDataVal = (java.lang.String)aMap.get(PROPNAME_DATA);
+ java.util.Vector lTokens = Cache.splitTokenString(sDataVal, ",");
+
+ int t = 0;
+ java.util.Enumeration it = lTokens.elements();
+ while (it.hasMoreElements())
+ {
+ java.lang.String sToken = (java.lang.String)it.nextElement();
+ switch(t)
+ {
+ case 0 :
+ aResultMap.put(PROPNAME_PREFERRED, new java.lang.Boolean(sToken));
+ break;
+ case 1 :
+ aResultMap.put(PROPNAME_MEDIATYPE, sToken);
+ break;
+ case 2 :
+ {
+ /*HACK ersetze %20 mit " " ...*/
+ int ni = sToken.indexOf("%20");
+ if (ni!=-1)
+ {
+ java.lang.String sPatch = sToken.substring(0,ni) + " " + sToken.substring(ni+3);
+ sToken = sPatch;
+ }
+ aResultMap.put(PROPNAME_CLIPBOARDFORMAT, sToken);
+ }
+ break;
+ case 3 :
+ aResultMap.put(PROPNAME_URLPATTERN, Cache.splitTokenString(sToken, ";"));
+ break;
+ case 4 :
+ aResultMap.put(PROPNAME_EXTENSIONS, Cache.splitTokenString(sToken, ";"));
+ break;
+ case 5 :
+ aResultMap.put(PROPNAME_DOCUMENTICONID, new java.lang.Integer(sToken));
+ break;
+ default :
+ throw new java.lang.Exception("unsupported format for data value of a type \""+aMap.get(PROPNAME_NAME)+"\" detected.");
+ }
+ ++t;
+ }
+ }
+ break;
+
+ //-----------------------------------
+ case FORMAT_6Y :
+ {
+ // copy all supported properties directly
+ aResultMap.put(PROPNAME_PREFERRED , aMap.get(PROPNAME_PREFERRED ));
+ aResultMap.put(PROPNAME_MEDIATYPE , aMap.get(PROPNAME_MEDIATYPE ));
+ aResultMap.put(PROPNAME_CLIPBOARDFORMAT, aMap.get(PROPNAME_CLIPBOARDFORMAT));
+ aResultMap.put(PROPNAME_URLPATTERN , aMap.get(PROPNAME_URLPATTERN ));
+ aResultMap.put(PROPNAME_EXTENSIONS , aMap.get(PROPNAME_EXTENSIONS ));
+ aResultMap.put(PROPNAME_DOCUMENTICONID , aMap.get(PROPNAME_DOCUMENTICONID ));
+ aResultMap.put(PROPNAME_UINAME , aMap.get(PROPNAME_UINAME ));
+ aResultMap.put(PROPNAME_UIORDER , aMap.get(PROPNAME_UIORDER ));
+ aResultMap.put(PROPNAME_PREFERREDFILTER, aMap.get(PROPNAME_PREFERREDFILTER));
+ aResultMap.put(PROPNAME_DETECTSERVICE , aMap.get(PROPNAME_DETECTSERVICE ));
+ }
+ break;
+
+ //-----------------------------------
+ default :
+ throw new java.lang.Exception("unknown format");
+ }
+
+ return aResultMap;
+ }
+
+ //___________________________________________
+
+ /** converts a filter property set (using an external format) to
+ * our internal cache format.
+ *
+ * Especialy the data format string will be expanded
+ * to its real properties.
+ *
+ * Schema:
+ * aMap["UIName"] => aExpandedMap["UIName"]
+ * aMap["Data" ] => aExpandedMap["Order" ], aExpandedMap["Flags"] etc. ...
+ *
+ * @param aMap
+ * points to the item, which should be converted.
+ *
+ * @param nFormat
+ * specify the external format.
+ *
+ * @return [java.util.HashMap]
+ * The new map in internal format.
+ */
+ private static java.util.HashMap convertFilterPropsToInternal(java.util.HashMap aMap ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ java.util.HashMap aResultMap = new java.util.HashMap();
+ // copy Name property ... if it exists!
+ if (aMap.containsKey(PROPNAME_NAME))
+ aResultMap.put(PROPNAME_NAME, aMap.get(PROPNAME_NAME));
+ switch(nFormat)
+ {
+ //-----------------------------------
+ case FORMAT_60 :
+ {
+ // copy UIName property
+ aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME));
+
+ // analyze the Data property of the original map
+ // and copy its results (means all expanded properties)
+ // to the result map.
+ java.lang.String sDataVal = (java.lang.String)aMap.get(PROPNAME_DATA);
+ java.util.Vector lTokens = Cache.splitTokenString(sDataVal, ",");
+
+ int t = 0;
+ java.util.Enumeration it = lTokens.elements();
+ while (it.hasMoreElements())
+ {
+ java.lang.String sToken = (java.lang.String)it.nextElement();
+ switch(t)
+ {
+ case 0 :
+ aResultMap.put(PROPNAME_ORDER, new java.lang.Integer(sToken));
+ break;
+ case 1 :
+ aResultMap.put(PROPNAME_TYPE, sToken);
+ break;
+ case 2 :
+ aResultMap.put(PROPNAME_DOCUMENTSERVICE, sToken);
+ break;
+ case 3 :
+ aResultMap.put(PROPNAME_FILTERSERVICE, sToken);
+ break;
+ case 4 :
+ aResultMap.put(PROPNAME_FLAGS, new java.lang.Integer(sToken));
+ break;
+ case 5 :
+ aResultMap.put(PROPNAME_USERDATA, Cache.splitTokenString(sToken, ";"));
+ break;
+ case 6 :
+ aResultMap.put(PROPNAME_FILEFORMATVERSION, new java.lang.Integer(sToken));
+ break;
+ case 7 :
+ aResultMap.put(PROPNAME_TEMPLATENAME, sToken);
+ break;
+ case 8 :
+ aResultMap.put(PROPNAME_UICOMPONENT, sToken);
+ break;
+ default :
+ throw new java.lang.Exception("unsupported format for data value of a filter detected.");
+ }
+ ++t;
+ }
+
+ // its an optional property :-)
+ if (!aResultMap.containsKey(PROPNAME_TEMPLATENAME))
+ aResultMap.put(PROPNAME_TEMPLATENAME, new java.lang.String(""));
+
+ // its an optional property :-)
+ if (!aResultMap.containsKey(PROPNAME_UICOMPONENT))
+ aResultMap.put(PROPNAME_UICOMPONENT, new java.lang.String(""));
+ }
+ break;
+
+ //-----------------------------------
+ case FORMAT_6Y :
+ {
+ // "Order" does not exist for 6.y versions! Use default.
+ aResultMap.put(PROPNAME_ORDER, new java.lang.Integer(0));
+
+ // "UIName" property does not exist for 6.y versions! use default.
+ /* TODO make it configurable :-) */
+ aResultMap.put(PROPNAME_UINAME, aMap.get(PROPNAME_UINAME));
+ //aResultMap.put(PROPNAME_UINAME, new java.util.HashMap());
+
+ // "Flags" must be converted from names to its values
+ java.util.Vector lFlags = (java.util.Vector)aMap.get(PROPNAME_FLAGS);
+ java.lang.Integer nFlags = Cache.convertFilterFlagNames2Values(lFlags);
+ aResultMap.put(PROPNAME_FLAGS, nFlags);
+
+ // copy all direct supported properties
+ aResultMap.put(PROPNAME_TYPE , aMap.get(PROPNAME_TYPE ));
+ aResultMap.put(PROPNAME_DOCUMENTSERVICE , aMap.get(PROPNAME_DOCUMENTSERVICE ));
+ aResultMap.put(PROPNAME_FILTERSERVICE , aMap.get(PROPNAME_ORDER ));
+ aResultMap.put(PROPNAME_USERDATA , aMap.get(PROPNAME_USERDATA ));
+ aResultMap.put(PROPNAME_FILEFORMATVERSION, aMap.get(PROPNAME_FILEFORMATVERSION));
+ aResultMap.put(PROPNAME_TEMPLATENAME , aMap.get(PROPNAME_TEMPLATENAME ));
+ aResultMap.put(PROPNAME_UICOMPONENT , aMap.get(PROPNAME_UICOMPONENT ));
+ }
+ break;
+
+ //-----------------------------------
+ default :
+ throw new java.lang.Exception("unknown format");
+ }
+
+ return aResultMap;
+ }
+
+ private static java.util.HashMap convertDetectServicePropsToInternal(java.util.HashMap aMap ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ /*FIXME*/
+ java.util.HashMap aResultMap = aMap;
+ return aResultMap;
+ }
+
+ private static java.util.HashMap convertFrameLoaderPropsToInternal(java.util.HashMap aMap ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ /*FIXME*/
+ java.util.HashMap aResultMap = aMap;
+ return aResultMap;
+ }
+
+ private static java.util.HashMap convertContentHandlerPropsToInternal(java.util.HashMap aMap ,
+ int nFormat)
+ throws java.lang.Exception
+ {
+ /*FIXME*/
+ java.util.HashMap aResultMap = aMap;
+ return aResultMap;
+ }
+
+ //___________________________________________
+
+ /** converts filter flag names to its int representation.
+ *
+ * @param lFlags
+ * a list of flag names.
+ *
+ * @return [java.lang.Integer]
+ * an integer field of all set flags.
+ *
+ * @throws [java.lang.Exception]
+ * for unsupported flags or empty flag fields!
+ */
+ private static java.lang.Integer convertFilterFlagNames2Values(java.util.Vector lFlags)
+ throws java.lang.Exception
+ {
+ int nFlags = 0;
+ java.util.Enumeration it = lFlags.elements();
+ while(it.hasMoreElements())
+ {
+ java.lang.String sFlagName = (java.lang.String)it.nextElement();
+
+ if (sFlagName.equals(FLAGNAME_3RDPARTYFILTER))
+ nFlags |= FLAGVAL_3RDPARTYFILTER;
+ else
+ if (sFlagName.equals(FLAGNAME_ALIEN))
+ nFlags |= FLAGVAL_ALIEN;
+ else
+ if (sFlagName.equals(FLAGNAME_ASYNCHRON))
+ nFlags |= FLAGVAL_ASYNCHRON;
+ else
+ if (sFlagName.equals(FLAGNAME_BROWSERPREFERRED))
+ nFlags |= FLAGVAL_BROWSERPREFERRED;
+ else
+ if (sFlagName.equals(FLAGNAME_CONSULTSERVICE))
+ nFlags |= FLAGVAL_CONSULTSERVICE;
+ else
+ if (sFlagName.equals(FLAGNAME_DEFAULT))
+ nFlags |= FLAGVAL_DEFAULT;
+ else
+ if (sFlagName.equals(FLAGNAME_EXPORT))
+ nFlags |= FLAGVAL_EXPORT;
+ else
+ if (sFlagName.equals(FLAGNAME_IMPORT))
+ nFlags |= FLAGVAL_IMPORT;
+ else
+ if (sFlagName.equals(FLAGNAME_INTERNAL))
+ nFlags |= FLAGVAL_INTERNAL;
+ else
+ if (sFlagName.equals(FLAGNAME_NOTINCHOOSER))
+ nFlags |= FLAGVAL_NOTINCHOOSER;
+ else
+ if (sFlagName.equals(FLAGNAME_NOTINFILEDIALOG))
+ nFlags |= FLAGVAL_NOTINFILEDIALOG;
+ else
+ if (sFlagName.equals(FLAGNAME_NOTINSTALLED))
+ nFlags |= FLAGVAL_NOTINSTALLED;
+ else
+ if (sFlagName.equals(FLAGNAME_OWN))
+ nFlags |= FLAGVAL_OWN;
+ else
+ if (sFlagName.equals(FLAGNAME_PACKED))
+ nFlags |= FLAGVAL_PACKED;
+ else
+ if (sFlagName.equals(FLAGNAME_PREFERRED))
+ nFlags |= FLAGVAL_PREFERRED;
+ else
+ if (sFlagName.equals(FLAGNAME_READONLY))
+ nFlags |= FLAGVAL_READONLY;
+ else
+ if (sFlagName.equals(FLAGNAME_SILENTEXPORT))
+ nFlags |= FLAGVAL_SILENTEXPORT;
+ else
+ if (sFlagName.equals(FLAGNAME_TEMPLATE))
+ nFlags |= FLAGVAL_TEMPLATE;
+ else
+ if (sFlagName.equals(FLAGNAME_TEMPLATEPATH))
+ nFlags |= FLAGVAL_TEMPLATEPATH;
+ else
+ if (sFlagName.equals(FLAGNAME_USESOPTIONS))
+ nFlags |= FLAGVAL_USESOPTIONS;
+ else
+ if (sFlagName.equals(FLAGNAME_COMBINED))
+ nFlags |= FLAGVAL_COMBINED;
+ else
+ throw new java.lang.Exception("unsupported filter flag detected: \""+sFlagName+"\"");
+ }
+
+ if (nFlags == 0)
+ throw new java.lang.Exception("no filter flags?");
+
+ return new java.lang.Integer(nFlags);
+ }
+
+ //___________________________________________
+
+ /** converts filter flag values to its string representation.
+ *
+ * @param nFlags
+ * the flag field as int value.
+ *
+ * @return [java.util.Vector]
+ * a list of flag names.
+ *
+ * @throws [java.lang.Exception]
+ * for unsupported flags or empty flag fields!
+ */
+ private static java.util.Vector convertFilterFlagValues2Names(java.lang.Integer nFlags)
+ throws java.lang.Exception
+ {
+ java.util.Vector lFlags = new java.util.Vector();
+ int field = nFlags.intValue();
+
+ if (field == 0)
+ throw new java.lang.Exception("no filter flags?");
+
+ if((field & FLAGVAL_IMPORT) == FLAGVAL_IMPORT)
+ lFlags.add(FLAGNAME_IMPORT);
+
+ if((field & FLAGVAL_EXPORT) == FLAGVAL_EXPORT)
+ lFlags.add(FLAGNAME_EXPORT);
+
+ if((field & FLAGVAL_TEMPLATE) == FLAGVAL_TEMPLATE)
+ lFlags.add(FLAGNAME_TEMPLATE);
+
+ if((field & FLAGVAL_INTERNAL) == FLAGVAL_INTERNAL)
+ lFlags.add(FLAGNAME_INTERNAL);
+
+ if((field & FLAGVAL_TEMPLATEPATH) == FLAGVAL_TEMPLATEPATH)
+ lFlags.add(FLAGNAME_TEMPLATEPATH);
+
+ if((field & FLAGVAL_OWN) == FLAGVAL_OWN)
+ lFlags.add(FLAGNAME_OWN);
+
+ if((field & FLAGVAL_ALIEN) == FLAGVAL_ALIEN)
+ lFlags.add(FLAGNAME_ALIEN);
+
+ if((field & FLAGVAL_USESOPTIONS) == FLAGVAL_USESOPTIONS)
+ lFlags.add(FLAGNAME_USESOPTIONS);
+
+ if((field & FLAGVAL_DEFAULT) == FLAGVAL_DEFAULT)
+ lFlags.add(FLAGNAME_DEFAULT);
+
+ if((field & FLAGVAL_NOTINFILEDIALOG) == FLAGVAL_NOTINFILEDIALOG)
+ lFlags.add(FLAGNAME_NOTINFILEDIALOG);
+
+ if((field & FLAGVAL_NOTINCHOOSER) == FLAGVAL_NOTINCHOOSER)
+ lFlags.add(FLAGNAME_NOTINCHOOSER);
+
+ if((field & FLAGVAL_ASYNCHRON) == FLAGVAL_ASYNCHRON)
+ lFlags.add(FLAGNAME_ASYNCHRON);
+
+ if((field & FLAGVAL_READONLY) == FLAGVAL_READONLY)
+ lFlags.add(FLAGNAME_READONLY);
+
+ if((field & FLAGVAL_NOTINSTALLED) == FLAGVAL_NOTINSTALLED)
+ lFlags.add(FLAGNAME_NOTINSTALLED);
+
+ if((field & FLAGVAL_CONSULTSERVICE) == FLAGVAL_CONSULTSERVICE)
+ lFlags.add(FLAGNAME_CONSULTSERVICE);
+
+ if((field & FLAGVAL_3RDPARTYFILTER) == FLAGVAL_3RDPARTYFILTER)
+ lFlags.add(FLAGNAME_3RDPARTYFILTER);
+
+ if((field & FLAGVAL_PACKED) == FLAGVAL_PACKED)
+ lFlags.add(FLAGNAME_PACKED);
+
+ if((field & FLAGVAL_SILENTEXPORT) == FLAGVAL_SILENTEXPORT)
+ lFlags.add(FLAGNAME_SILENTEXPORT);
+
+ if((field & FLAGVAL_BROWSERPREFERRED) == FLAGVAL_BROWSERPREFERRED)
+ lFlags.add(FLAGNAME_BROWSERPREFERRED);
+
+ if((field & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED)
+ lFlags.add(FLAGNAME_PREFERRED);
+
+ if((field & FLAGVAL_COMBINED) == FLAGVAL_COMBINED)
+ lFlags.add(FLAGNAME_COMBINED);
+
+ if((field & FLAGVAL_COMBINED) == FLAGVAL_SUPPORTSSELECTION)
+ lFlags.add(FLAGNAME_SUPPORTSSELECTION);
+
+ return lFlags;
+ }
+
+ //___________________________________________
+
+ /** return a reference to one of our member
+ * lists for types/filters etc ...
+ *
+ * @param eItemType
+ * specify, which item map is required.
+ *
+ * @return [java.util.HashMap]
+ * a reference(!) to the right member.
+ *
+ * @throws [java.lang.Exception]
+ * if the specified map does not exist.
+ */
+ private java.util.HashMap getItemMap(int eItemType)
+ throws java.lang.Exception
+ {
+ java.util.HashMap rMap = null;
+ switch(eItemType)
+ {
+ case E_TYPE :
+ rMap = m_lTypes;
+ break;
+
+ case E_FILTER :
+ rMap = m_lFilters;
+ break;
+
+ case E_DETECTSERVICE :
+ rMap = m_lDetectServices;
+ break;
+
+ case E_FRAMELOADER :
+ rMap = m_lFrameLoaders;
+ break;
+
+ case E_CONTENTHANDLER :
+ rMap = m_lContentHandlers;
+ break;
+
+ default:
+ throw new java.lang.Exception("Invalid item map specified.");
+ }
+ return rMap;
+ }
+
+ //___________________________________________
+
+ /** return the count of items inside a sub container
+ * of this cache.
+ *
+ * @param eItemType
+ * specify, which item map is required.
+ *
+ * @throws [java.lang.Exception]
+ * if the specified map does not exist.
+ */
+ public synchronized int getItemCount(int eItemType)
+ throws java.lang.Exception
+ {
+ java.util.HashMap rMap = getItemMap(eItemType);
+ return rMap.size();
+ }
+
+ //___________________________________________
+
+ /** get a list of all item names of the specified
+ * sub container.
+ *
+ * @param eItemType
+ * specify, which item map is required.
+ *
+ * @throws [java.lang.Exception]
+ * if the specified map does not exist.
+ */
+ public synchronized java.util.Vector getItemNames(int eItemType)
+ throws java.lang.Exception
+ {
+ java.util.Vector lNames = new java.util.Vector();
+ java.util.HashMap rMap = getItemMap(eItemType);
+ java.util.Iterator it = rMap.keySet().iterator();
+ while(it.hasNext())
+ lNames.add(it.next());
+ return lNames;
+ }
+
+ //___________________________________________
+
+ /** get a list of all item names of the specified
+ * sub coontainer, where items match to given property set.
+ *
+ * Note: The given property set must exist at all
+ * returned items as minimum and every checked property
+ * value must be equals! Using of reg expressions or
+ * similar mechanism will not be supported here.
+ *
+ * @param eItemType
+ * specify, which item map is required.
+ *
+ * @param aPropSet
+ * the set of properties, which must
+ * exist at the returned item as minimum.
+ *
+ * @throws [java.lang.Exception]
+ * if the specified map does not exist.
+ */
+ public synchronized java.util.Vector getMatchedItemNames(int eItemType,
+ java.util.HashMap aPropSet )
+ throws java.lang.Exception
+ {
+ java.util.Vector lNames = new java.util.Vector();
+ java.util.HashMap rMap = getItemMap(eItemType);
+ java.util.Iterator it = rMap.keySet().iterator();
+ while(it.hasNext())
+ {
+ java.lang.String sItemName = (java.lang.String)it.next();
+ java.util.HashMap rItemProps = (java.util.HashMap)rMap.get(sItemName);
+
+ boolean bMatch = Cache.matchPropSet(rItemProps, aPropSet);
+ if (bMatch)
+ lNames.add(sItemName);
+ else
+ {
+ java.lang.StringBuffer sBuffer = new java.lang.StringBuffer(1000);
+ sBuffer.append("entry ["+eItemType+"] \""+sItemName+"\" does not match.\n");
+ sBuffer.append("\torg items = {"+rItemProps+"}\n");
+ sBuffer.append("\treq items = {"+aPropSet+"}\n");
+
+ m_aDebug.setDetailedInfo(sBuffer.toString());
+ }
+ }
+ return lNames;
+ }
+
+ //___________________________________________
+
+ /** check if two property sets are equals in its
+ * shared properties.
+ *
+ * Note: Only set properties of the match set will be searched
+ * inside the original set. And its values must be equals.
+ * Using of reg expressions or similar mechanism will not
+ * be supported here.
+ *
+ * @param rOrgProps
+ * the original property set, which should be checked.
+ *
+ * @param rMatchProps
+ * contains the properties, which must be searched
+ * inside rOrgProps.
+ *
+ * @return TRUE if all properties of rMatchProps could be located
+ * inside rOrgProps.
+ */
+ private static boolean matchPropSet(java.util.HashMap rOrgProps ,
+ java.util.HashMap rMatchProps)
+ {
+ java.util.Iterator it = rMatchProps.keySet().iterator();
+ while(it.hasNext())
+ {
+ java.lang.String sMatchName = (java.lang.String)it.next();
+ java.lang.Object aMatchValue = rMatchProps.get(sMatchName);
+
+ if (
+ (!rOrgProps.containsKey(sMatchName) ) ||
+ (!rOrgProps.get(sMatchName).equals(aMatchValue))
+ )
+ {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ //___________________________________________
+
+ /** return a property set for the queried container item.
+ *
+ * @param eItemType
+ * specify, which item map is required.
+ *
+ * @param sItemName
+ * must be a valid item name of the specified item map.
+ *
+ * @return [java.util.HashMap]
+ * the property set of the queried item.
+ * Always different from null!
+ *
+ * @throws [java.lang.Exception]
+ * if the specified item does not exists or
+ * seems to be invalid in general (means null!).
+ */
+ public synchronized java.util.HashMap getItem(int eItemType,
+ java.lang.String sItemName)
+ throws java.lang.Exception
+ {
+ java.util.HashMap rMap = getItemMap(eItemType);
+ java.util.HashMap rItem = (java.util.HashMap)rMap.get(sItemName);
+ if (rItem == null)
+ throw new java.lang.Exception("Queried item \""+sItemName+"\" does not exist inside this cache.");
+ return rItem;
+ }
+
+ //___________________________________________
+
+ /** return a requested item in XML format.
+ *
+ * @param eItemType
+ * identify the right sub set of this cache
+ * inside which the requested item should exist.
+ * e.g. E_TYPE, E_FILTER, ...
+ *
+ * @param sItemName
+ * the name of the request item
+ *
+ * @param nXMLFormat
+ * means the format of the generated xml source.
+ *
+ * @return [java.lang.String]
+ * a xml formated string, which contains all properties
+ * for this container item.
+ */
+ public synchronized java.lang.String getItemAsXML(int eItemType ,
+ java.lang.String sItemName ,
+ int nXMLFormat)
+ throws java.lang.Exception
+ {
+ // Note: Our internal format must be converted to the target format!
+ java.util.HashMap rItem = getItem(eItemType, sItemName);
+ java.util.HashMap rFormatedItem = null;
+ switch(eItemType)
+ {
+ case E_TYPE :
+ {
+ rFormatedItem = Cache.convertTypePropsToExternal(rItem, nXMLFormat);
+ m_aDebug.setGlobalInfo("type to external \""+sItemName+"\"");
+ }
+ break;
+
+ case E_FILTER :
+ {
+ rFormatedItem = Cache.convertFilterPropsToExternal(rItem, nXMLFormat);
+ m_aDebug.setGlobalInfo("filter to external \""+sItemName+"\"");
+ }
+ break;
+
+ case E_DETECTSERVICE :
+ {
+ rFormatedItem = Cache.convertDetectServicePropsToExternal(rItem, nXMLFormat);
+ m_aDebug.setGlobalInfo("detect service to external \""+sItemName+"\"");
+ }
+ break;
+
+ case E_FRAMELOADER :
+ {
+ rFormatedItem = Cache.convertFrameLoaderPropsToExternal(rItem, nXMLFormat);
+ m_aDebug.setGlobalInfo("frame loader to external \""+sItemName+"\"");
+ }
+ break;
+
+ case E_CONTENTHANDLER :
+ {
+ rFormatedItem = Cache.convertContentHandlerPropsToExternal(rItem, nXMLFormat);
+ m_aDebug.setGlobalInfo("content handler to external \""+sItemName+"\"");
+ }
+ break;
+ }
+
+ java.lang.StringBuffer sXML = new java.lang.StringBuffer(1000);
+ int nPrettyTabs = 1;
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+ sXML.append("<"+XMLHelper.XMLTAG_NODE+" "+XMLHelper.XMLATTRIB_OOR_NAME+"=\""+XMLHelper.encodeHTMLSigns(sItemName)+"\" "+XMLHelper.XMLATTRIB_OOR_OP+"=\""+XMLHelper.XMLATTRIB_OP_REPLACE+"\">\n");
+ sXML.append(XMLHelper.convertPropSetToXML(rFormatedItem, nPrettyTabs+1));
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+ sXML.append("</"+XMLHelper.XMLTAG_NODE+">\n");
+
+ return sXML.toString();
+ }
+
+ //___________________________________________
+
+ /** split the given string (using the specified delimiter)
+ * and return alist of found string tokens.
+ *
+ * Note: Against the normal behaviour of the StringTokenizer class
+ * this method returns empty tokens too.
+ * E.g: "0,,1" will return "0" - "" - "1"
+ *
+ * @param sTokenString
+ * the string value, which should be analyzed.
+ *
+ * @param sDelim
+ * the delimiter, which will be used to differe between tokens.
+ *
+ * @return [java.util.Vector]
+ * a list of string tokens. Can be empty - but not null!
+ */
+ private static java.util.Vector splitTokenString(java.lang.String sTokenString,
+ java.lang.String sDelim )
+ {
+ java.util.Vector lTokens = new java.util.Vector();
+ java.util.StringTokenizer aTokenizer = new java.util.StringTokenizer(sTokenString, sDelim, true);
+ boolean bLastWasDelim = false;
+
+ while (aTokenizer.hasMoreTokens())
+ {
+ java.lang.String sToken = aTokenizer.nextToken();
+ if (sToken.equals(sDelim))
+ {
+ if (bLastWasDelim)
+ {
+ // last token was a delimiter - new one too
+ // => an empty token must be placed between these
+ // two delimiters! Add this empty value to the return list.
+ lTokens.add("");
+ }
+ else
+ {
+ // last token was not a delimiter - new one is such delim
+ // => ignore this delimiter - but save the information, that
+ // it occured
+ bLastWasDelim = true;
+ }
+ }
+ else
+ {
+ // new token is no delim
+ // => Add it to the return list.
+ lTokens.add(sToken);
+ // Dont forget to reset this information - so next loop
+ // will do the right things!
+ bLastWasDelim = false;
+ }
+ }
+
+ return lTokens;
+ }
+
+ //___________________________________________
+
+ /**
+ */
+ public synchronized void analyze()
+ {
+ m_nDoubleRegisteredFilters = 0;
+ m_nTypesForFilters = 0;
+ m_nTypesForDetectServices = 0;
+ m_nTypesForFrameLoaders = 0;
+ m_nTypesForContentHandlers = 0;
+
+ // create table of types and all registered filters for such types
+ // By the way: count all double registrations, where a filter
+ // uses the same type then another filter.
+ m_lFilterToTypeRegistrations = new java.util.HashMap();
+ java.util.Iterator aIt1 = m_lFilters.keySet().iterator();
+ while (aIt1.hasNext())
+ {
+ java.lang.String sFilter = (java.lang.String)aIt1.next();
+ java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter);
+ java.lang.String sType = (java.lang.String)aFilter.get(PROPNAME_TYPE);
+
+ java.util.Vector lFilters = (java.util.Vector)m_lFilterToTypeRegistrations.get(sType);
+ if (lFilters == null)
+ lFilters = new java.util.Vector();
+ else
+ ++m_nDoubleRegisteredFilters;
+ lFilters.add(sFilter);
+ m_lFilterToTypeRegistrations.put(sType, lFilters);
+ }
+
+ // count, how many types are used by filters, frame loaders or content handlers
+ aIt1 = m_lTypes.keySet().iterator();
+ while (aIt1.hasNext())
+ {
+ java.lang.String sType = (java.lang.String)aIt1.next();
+
+ java.util.Iterator aIt2 = m_lFilters.keySet().iterator();
+ while (aIt2.hasNext())
+ {
+ java.lang.String sItem = (java.lang.String)aIt2.next();
+ java.util.HashMap aItem = (java.util.HashMap)m_lFilters.get(sItem);
+ java.lang.String sTypeReg = (java.lang.String)aItem.get(PROPNAME_TYPE);
+
+ if (sTypeReg.equals(sType))
+ {
+ ++m_nTypesForFilters;
+ break;
+ }
+ }
+
+ aIt2 = m_lDetectServices.keySet().iterator();
+ while (aIt2.hasNext())
+ {
+ java.lang.String sItem = (java.lang.String)aIt2.next();
+ java.util.HashMap aItem = (java.util.HashMap)m_lDetectServices.get(sItem);
+ java.util.Vector lTypeReg = (java.util.Vector)aItem.get(PROPNAME_TYPES);
+
+ if (lTypeReg.contains(sType))
+ {
+ ++m_nTypesForDetectServices;
+ break;
+ }
+ }
+
+ aIt2 = m_lFrameLoaders.keySet().iterator();
+ while (aIt2.hasNext())
+ {
+ java.lang.String sItem = (java.lang.String)aIt2.next();
+ java.util.HashMap aItem = (java.util.HashMap)m_lFrameLoaders.get(sItem);
+ java.util.Vector lTypeReg = (java.util.Vector)aItem.get(PROPNAME_TYPES);
+
+ if (lTypeReg.contains(sType))
+ {
+ ++m_nTypesForFrameLoaders;
+ break;
+ }
+ }
+
+ aIt2 = m_lContentHandlers.keySet().iterator();
+ while (aIt2.hasNext())
+ {
+ java.lang.String sItem = (java.lang.String)aIt2.next();
+ java.util.HashMap aItem = (java.util.HashMap)m_lContentHandlers.get(sItem);
+ java.util.Vector lTypeReg = (java.util.Vector)aItem.get(PROPNAME_TYPES);
+
+ if (lTypeReg.contains(sType))
+ {
+ ++m_nTypesForContentHandlers;
+ break;
+ }
+ }
+ }
+ }
+
+ //___________________________________________
+
+ /** validate all cache entries.
+ *
+ * It checks if all made registrations are valid;
+ * try to repair some simple problems;
+ * create missing informations on demand ...
+ *
+ * @param nFormat
+ * specify, which configuration format
+ * must be checked.
+ *
+ * @throws [java.lang.Exception]
+ * if an unrecoverable problem occure.
+ */
+ public synchronized void validate(int nFormat)
+ throws java.lang.Exception
+ {
+ validateTypes(nFormat);
+ validateFilters(nFormat);
+ }
+
+ //___________________________________________
+
+ /** validate all type entries of this cache.
+ *
+ * @param nFormat
+ * specify, which configuration format
+ * must be checked.
+ *
+ * @throws [java.lang.Exception]
+ * if an unrecoverable problem occure.
+ */
+ private void validateTypes(int nFormat)
+ throws java.lang.Exception
+ {
+ java.util.Iterator aIt1 = m_lTypes.keySet().iterator();
+ while(aIt1.hasNext())
+ {
+ java.lang.String sType = (java.lang.String)aIt1.next();
+ java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sType);
+ if (aType == null)
+ throw new java.lang.Exception("type ["+sType+"] dos not exist realy?!");
+
+ if (
+ (!aType.containsKey(PROPNAME_MEDIATYPE )) ||
+ (!aType.containsKey(PROPNAME_PREFERRED )) ||
+ (!aType.containsKey(PROPNAME_CLIPBOARDFORMAT)) ||
+ (!aType.containsKey(PROPNAME_DOCUMENTICONID )) ||
+ (!aType.containsKey(PROPNAME_URLPATTERN )) ||
+ (!aType.containsKey(PROPNAME_EXTENSIONS )) ||
+ (!aType.containsKey(PROPNAME_UINAME ))
+ )
+ {
+ throw new java.lang.Exception("Type \""+sType+"\" does not contain all neccessary properties for a 6.0/6.Y format.");
+ }
+
+ if (
+ (((java.util.Vector)aType.get(PROPNAME_EXTENSIONS)).isEmpty()) &&
+ (((java.util.Vector)aType.get(PROPNAME_URLPATTERN)).isEmpty())
+ )
+ {
+ throw new java.lang.Exception("Type \""+sType+"\" does not contain any extension nor an url pattern.");
+ }
+
+ if (((java.util.HashMap)aType.get(PROPNAME_UINAME)).isEmpty())
+ throw new java.lang.Exception("Type \""+sType+"\" is not localized.");
+
+ if (nFormat == FORMAT_6Y)
+ {
+ if (
+ (!aType.containsKey(PROPNAME_UIORDER )) ||
+ (!aType.containsKey(PROPNAME_PREFERREDFILTER)) ||
+ (!aType.containsKey(PROPNAME_DETECTSERVICE ))
+ )
+ {
+ throw new java.lang.Exception("Type \""+sType+"\" does not contain all neccessary properties for a 6.Y format.");
+ }
+
+ if (((java.lang.Integer)aType.get(PROPNAME_UIORDER)).intValue() < 0)
+ throw new java.lang.Exception("Type \""+sType+"\" has invalid value for prop UIOrder.");
+
+ if (((java.lang.String)aType.get(PROPNAME_DETECTSERVICE)).length() < 1)
+ m_aDebug.setWarning("Type \""+sType+"\" has no detect service registered.");
+
+ java.lang.String sPreferredReg = (java.lang.String)aType.get(PROPNAME_PREFERREDFILTER);
+ if (
+ (sPreferredReg == null) ||
+ (sPreferredReg.length() < 1 )
+ )
+ {
+ m_aDebug.setWarning("Type \""+sType+"\" has no preferred filter ...");
+ /*FIXME
+ * OK - not every type has a filter registered .. but the
+ * a frame loader MUST(!) exist! Check it.
+ */
+ }
+ else
+ {
+ if (!m_lFilters.containsKey(sPreferredReg))
+ throw new java.lang.Exception("Type \""+sType+"\" has no valid preferred filter registration [\""+sPreferredReg+"\"].");
+ }
+ }
+ }
+ }
+
+ //___________________________________________
+
+ /** validate all filter entries of this cache.
+ *
+ * @param nFormat
+ * specify, which configuration format
+ * must be checked.
+ *
+ * @throws [java.lang.Exception]
+ * if an unrecoverable problem occure.
+ */
+ public synchronized void validateFilters(int nFormat)
+ throws java.lang.Exception
+ {
+ java.util.Iterator aIt1 = m_lFilters.keySet().iterator();
+ while(aIt1.hasNext())
+ {
+ java.lang.String sFilter = (java.lang.String)aIt1.next();
+ java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter);
+ if (aFilter == null)
+ throw new java.lang.Exception("filter ["+sFilter+"] dos not exist realy?!");
+
+ if (
+ (!aFilter.containsKey(PROPNAME_DOCUMENTSERVICE )) ||
+ (!aFilter.containsKey(PROPNAME_FILEFORMATVERSION)) ||
+ (!aFilter.containsKey(PROPNAME_FILTERSERVICE )) ||
+ (!aFilter.containsKey(PROPNAME_FLAGS )) ||
+ (!aFilter.containsKey(PROPNAME_TEMPLATENAME )) ||
+ (!aFilter.containsKey(PROPNAME_TYPE )) ||
+ (!aFilter.containsKey(PROPNAME_UICOMPONENT )) ||
+ (!aFilter.containsKey(PROPNAME_USERDATA ))
+ )
+ {
+ throw new java.lang.Exception("Filter \""+sFilter+"\" does not contain all neccessary properties for a 6.0/6.Y format.");
+ }
+
+ if (((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue() < 1)
+ throw new java.lang.Exception("Filter \""+sFilter+"\" does not have a valid flag field.");
+
+ if (!m_lTypes.containsKey(aFilter.get(PROPNAME_TYPE)))
+ throw new java.lang.Exception("Filter \""+sFilter+"\" is not registered for a well known type.");
+
+ if (nFormat == FORMAT_60)
+ {
+ if (
+ (!aFilter.containsKey(PROPNAME_ORDER )) ||
+ (!aFilter.containsKey(PROPNAME_UINAME))
+ )
+ {
+ throw new java.lang.Exception("Filter \""+sFilter+"\" does not contain all neccessary properties for a 6.0 format.");
+ }
+
+ if (((java.lang.Integer)aFilter.get(PROPNAME_ORDER)).intValue() < 0)
+ throw new java.lang.Exception("Filter \""+sFilter+"\" does not have a valid Order value.");
+
+ if (((java.util.HashMap)aFilter.get(PROPNAME_UINAME)).isEmpty())
+ throw new java.lang.Exception("Filter \""+sFilter+"\" is not localized.");
+ }
+/*TODO
+ depends from the configuration item "remove_filter_flag_preferred" ...
+
+ if (nFormat == FORMAT_6Y)
+ {
+ int flags = ((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue();
+ if ((flags & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED)
+ throw new java.lang.Exception("Filter \""+sFilter+"\" has superflous Preferred flag set. Please remove this flag. ["+flags+"]");
+ }
+*/
+ }
+ }
+
+ /*TODO
+ * - remove graphic filters!
+ * - move detect services to types
+ */
+
+ public synchronized void transform60to6Y(boolean bCreateCombineFilterFlag ,
+ boolean bRemoveFilterFlagBrowserPreferred,
+ boolean bRemoveFilterFlagPreferred ,
+ boolean bRemoveFilterFlag3rdparty ,
+ boolean bRemoveFilterUINames ,
+ boolean bRemoveGraphicFilters ,
+ boolean bSetDefaultDetector )
+ throws java.lang.Exception
+ {
+ // remove some superflous cache entries ...
+ // everything related to "load macros"
+ // Macros should be dispatched instead of loaded!
+ if (m_lTypes.containsKey("macro"))
+ {
+ m_lTypes.remove("macro");
+ m_aDebug.setDetailedInfo("superflous type \"macro\" was removed");
+ }
+ if (m_lFrameLoaders.containsKey("com.sun.star.comp.sfx2.SfxMacroLoader"))
+ {
+ m_lFrameLoaders.remove("com.sun.star.comp.sfx2.SfxMacroLoader");
+ m_aDebug.setDetailedInfo("superflous frame loader \"com.sun.star.comp.sfx2.SfxMacroLoader\" was removed");
+ }
+
+ // step over all filters and check her properties and references
+ java.util.Vector lPreferredFilters = new java.util.Vector();
+ java.util.Vector lNoRealFilters = new java.util.Vector();
+ java.util.Iterator aIt1 = m_lFilters.keySet().iterator();
+ while(aIt1.hasNext())
+ {
+ java.lang.String sFilter = (java.lang.String)aIt1.next();
+ java.util.HashMap aFilter = (java.util.HashMap)m_lFilters.get(sFilter);
+
+ // remove the "graphic helper filters" used by draw and impress
+ // They dont have any valid document service name set and cant be handled
+ // by our generic FrameLoader!
+ // They must be moved to her own configuration ...
+
+ if (
+ (bRemoveGraphicFilters ) &&
+ (((java.lang.String)aFilter.get(PROPNAME_DOCUMENTSERVICE)).length() < 1)
+ )
+ {
+ lNoRealFilters.add(sFilter);
+ continue;
+ }
+
+ java.lang.String sTypeReg = (java.lang.String)aFilter.get(PROPNAME_TYPE);
+ java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg);
+
+ // move UINames of filters to types
+ java.util.HashMap lFilterUINames = (java.util.HashMap)aFilter.get(PROPNAME_UINAME);
+ java.util.HashMap lTypeUINames = (java.util.HashMap)aType.get(PROPNAME_UINAME);
+ java.util.HashMap lPatchUINames = new java.util.HashMap();
+
+ java.util.Iterator pUINames = lTypeUINames.keySet().iterator();
+ while(pUINames.hasNext())
+ {
+ java.lang.String sLocale = (java.lang.String)pUINames.next();
+ java.lang.String sValue = (java.lang.String)lTypeUINames.get(sLocale);
+ lPatchUINames.put(sLocale, sValue);
+ }
+
+ pUINames = lFilterUINames.keySet().iterator();
+ while(pUINames.hasNext())
+ {
+ java.lang.String sLocale = (java.lang.String)pUINames.next();
+ java.lang.String sValue = (java.lang.String)lFilterUINames.get(sLocale);
+ lPatchUINames.put(sFilter+":"+sLocale, sValue);
+ }
+ aType.put(PROPNAME_UINAME, lPatchUINames);
+
+ // set generic filter service wrapper for our own native filters!
+ // By the way: The format types of such filters can be detected by our
+ // generic detector too.
+ if (
+ (bSetDefaultDetector ) &&
+ (((java.lang.String)aFilter.get(PROPNAME_FILTERSERVICE)).length() < 1)
+ )
+ {
+ /*ME_THINKING aFilter.put(PROPNAME_FILTERSERVICE, FILTERSERVICE_NATIVEWARPPER);*/
+ aType.put(PROPNAME_DETECTSERVICE, GENERIC_DETECTSERVICE);
+ }
+
+ // move the preferred filter information to any type
+ // Set the filter name to the type for which the filter is registered.
+ // If this type already have a set PreferredFilter value, check if the current filter
+ // has the preferred flag set. If not ignore it - otherwhise overwrite the
+ // current information at the type. But look for multiple preferred filter relations ...
+ // means: look if more the one filter has set the preferred flag for the same type!
+
+ /* Attention!
+ *
+ * Dont remove the preferred flag from any filter! ... not here.
+ * Otherwhise next loop can't detect ambigous preferred registrations!
+ * Add filter to a temp. list, which can be used later to remove the preferred
+ * flag ...
+ */
+
+ int flags1 = ((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue();
+ java.lang.String sDocSrv = (java.lang.String)aFilter.get(PROPNAME_DOCUMENTSERVICE);
+ if (sDocSrv.length()>0)// without a doc service its not a real filter - its a graphic filter!
+ {
+ boolean preferred1 = ((flags1 & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED);
+ if (preferred1)
+ lPreferredFilters.add(aFilter);
+
+ java.lang.String sAlreadyRegisteredFilter = (java.lang.String)aType.get(PROPNAME_PREFERREDFILTER);
+ // no registration => set this filter as "any possible one"!
+ if (sAlreadyRegisteredFilter.length() < 1)
+ aType.put(PROPNAME_PREFERREDFILTER, sFilter);
+ else
+ {
+ java.util.HashMap aAlreadyRegisteredFilter = (java.util.HashMap)m_lFilters.get(sAlreadyRegisteredFilter);
+ int flags2 = ((java.lang.Integer)aAlreadyRegisteredFilter.get(PROPNAME_FLAGS)).intValue();
+ boolean preferred2 = ((flags2 & FLAGVAL_PREFERRED) == FLAGVAL_PREFERRED);
+
+ // two preferred filters for the same type! => error
+ if (preferred1 && preferred2)
+ {
+ java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256);
+ sMsg.append("More the one preferred filter detected for the same type.\n");
+ sMsg.append("\ttype = \""+sTypeReg+"\"\n");
+ sMsg.append("\tfilter[1] = \""+sAlreadyRegisteredFilter+"\"\n");
+ sMsg.append("\tfilter[2] = \""+sFilter+"\"\n");
+ throw new java.lang.Exception(sMsg.toString());
+ }
+ else
+ // overwrite the "any possible" filter with a real preferred one
+ if (preferred1 && !preferred2)
+ aType.put(PROPNAME_PREFERREDFILTER, sFilter);
+ }
+ }
+
+ // create the new combined filter flag if required
+ if (bCreateCombineFilterFlag)
+ {
+ if (
+ ((flags1 & FLAGVAL_IMPORT) == FLAGVAL_IMPORT) &&
+ ((flags1 & FLAGVAL_EXPORT) == FLAGVAL_EXPORT)
+ )
+ {
+ flags1 |= FLAGVAL_COMBINED;
+ flags1 &= ~FLAGVAL_IMPORT ;
+ flags1 &= ~FLAGVAL_EXPORT ;
+ aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags1));
+ }
+ }
+
+ // remove some obsolete filter flags
+ if (bRemoveFilterFlagBrowserPreferred)
+ {
+ flags1 &= ~FLAGVAL_BROWSERPREFERRED;
+ aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags1));
+ }
+
+ if (bRemoveFilterFlag3rdparty)
+ {
+ flags1 &= ~FLAGVAL_3RDPARTYFILTER;
+ aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags1));
+ }
+
+ // if its a filter with an UI order ...
+ // move this information to the registered type.
+ // Note: Because more then one filter can be registered for the same type.
+ // Handle it as an error ... till we find a better transformation!
+ java.lang.Integer nOrder = (java.lang.Integer)aFilter.get(PROPNAME_ORDER);
+ java.lang.Integer nUIOrder = (java.lang.Integer)aType.get(PROPNAME_UIORDER);
+ int order = nOrder.intValue();
+ int uiorder = nUIOrder.intValue();
+
+ if (order > 0)
+ {
+ if (
+ (uiorder < 1 ) ||
+ (uiorder > order)
+ )
+ {
+ aType.put(PROPNAME_UIORDER, nOrder);
+ m_aDebug.setDetailedInfo("moved order value "+nOrder+" from filter \""+sFilter+"\" to type \""+sTypeReg+"\"");
+ }
+ else
+ m_aDebug.setDetailedInfo("ignore order value [order="+nOrder+",uiorder="+nUIOrder+"] for filter \""+sFilter+"\" and type \""+sTypeReg+"\"");
+ }
+ }
+
+ // NOW ... remove the preferred flags from every filter, which it has set.
+ java.util.Enumeration aIt2 = null;
+ if (bRemoveFilterFlagPreferred)
+ {
+ aIt2 = lPreferredFilters.elements();
+ while (aIt2.hasMoreElements())
+ {
+ java.util.HashMap aFilter = (java.util.HashMap)aIt2.nextElement();
+ int flags = ((java.lang.Integer)aFilter.get(PROPNAME_FLAGS)).intValue();
+ flags &= ~FLAGVAL_PREFERRED;
+ aFilter.put(PROPNAME_FLAGS, new java.lang.Integer(flags));
+ }
+ }
+
+ // NOW ... remove all "no real filters" like the graphich helper filters of
+ // draw and impress!
+ aIt2 = lNoRealFilters.elements();
+ while (aIt2.hasMoreElements())
+ m_lFilters.remove(aIt2.nextElement());
+
+ // step over all detect services and move this information directly to
+ // the corresponding types
+ // Overwrite possibel default registrations with a real existing one!
+ aIt1 = m_lDetectServices.keySet().iterator();
+ while(aIt1.hasNext())
+ {
+ java.lang.String sDetector = (java.lang.String)aIt1.next();
+ java.util.HashMap aDetector = (java.util.HashMap)m_lDetectServices.get(sDetector);
+ java.util.Vector lTypeReg = (java.util.Vector)aDetector.get(PROPNAME_TYPES);
+ aIt2 = lTypeReg.elements();
+ while(aIt2.hasMoreElements())
+ {
+ java.lang.String sTypeReg = (java.lang.String)aIt2.nextElement();
+ java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg);
+
+ if (aType == null)
+ {
+ m_aDebug.setWarning("Detector \""+sDetector+"\" seem to be registered for unknown type \""+sTypeReg+"\"");
+ continue;
+ }
+
+ java.lang.Object aAlreadyRegisteredDetector = aType.get(PROPNAME_DETECTSERVICE);
+ if (aAlreadyRegisteredDetector != null && ((java.lang.String)aAlreadyRegisteredDetector).length() > 0)
+ {
+ java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256);
+ sMsg.append("type \""+sTypeReg+"\" has ambigous registrations of a detect service\n");
+ sMsg.append("\tdetect service[1] = \""+(java.lang.String)aAlreadyRegisteredDetector+"\"\n");
+ sMsg.append("\tdetect service[2] = \""+sDetector+"\"\n");
+ m_aDebug.setWarning(sMsg.toString());
+ }
+ aType.put(PROPNAME_DETECTSERVICE, sDetector);
+ m_aDebug.setGlobalInfo("move detector \""+sDetector+"\" to type \""+sTypeReg+"\"");
+ }
+ }
+
+ // because all detect service was registered as type properties directly ...
+ // remove all detect service objects of this cache!
+ m_lDetectServices.clear();
+
+ // step over all frame loader and move this information directly to
+ // the corresponding types
+ // Overwrite possibel default registrations with a real existing one!
+ aIt1 = m_lFrameLoaders.keySet().iterator();
+ while(aIt1.hasNext())
+ {
+ java.lang.String sLoader = (java.lang.String)aIt1.next();
+ java.util.HashMap aLoader = (java.util.HashMap)m_lFrameLoaders.get(sLoader);
+ java.util.Vector lTypeReg = (java.util.Vector)aLoader.get(PROPNAME_TYPES);
+ aIt2 = lTypeReg.elements();
+ while(aIt2.hasMoreElements())
+ {
+ java.lang.String sTypeReg = (java.lang.String)aIt2.nextElement();
+ java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg);
+ java.lang.String sAlreadyRegisteredLoader = (java.lang.String)aType.get(PROPNAME_FRAMELOADER);
+ if (sAlreadyRegisteredLoader != null && sAlreadyRegisteredLoader.length() > 0)
+ {
+ java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256);
+ sMsg.append("type \""+sTypeReg+"\" has ambigous registrations of a frame loader\n");
+ sMsg.append("\tframe loader[1] = \""+sAlreadyRegisteredLoader+"\"\n");
+ sMsg.append("\tframe loader[2] = \""+sLoader+"\"\n");
+ m_aDebug.setWarning(sMsg.toString());
+ }
+ aType.put(PROPNAME_FRAMELOADER, sLoader);
+ System.out.println("move loader \""+sLoader+"\" to type \""+sTypeReg+"\"");
+ }
+ }
+
+ m_lFrameLoaders.clear();
+
+ // step over all content handler and move this information directly to
+ // the corresponding types
+ // Overwrite possibel default registrations with a real existing one!
+ aIt1 = m_lContentHandlers.keySet().iterator();
+ while(aIt1.hasNext())
+ {
+ java.lang.String sHandler = (java.lang.String)aIt1.next();
+ java.util.HashMap aHandler = (java.util.HashMap)m_lContentHandlers.get(sHandler);
+ java.util.Vector lTypeReg = (java.util.Vector)aHandler.get(PROPNAME_TYPES);
+ aIt2 = lTypeReg.elements();
+ while(aIt2.hasMoreElements())
+ {
+ java.lang.String sTypeReg = (java.lang.String)aIt2.nextElement();
+ java.util.HashMap aType = (java.util.HashMap)m_lTypes.get(sTypeReg);
+ java.lang.String sAlreadyRegisteredHandler = (java.lang.String)aType.get(PROPNAME_CONTENTHANDLER);
+ if (sAlreadyRegisteredHandler != null && sAlreadyRegisteredHandler.length() > 0)
+ {
+ java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256);
+ sMsg.append("type \""+sTypeReg+"\" has ambigous registrations of a content handler\n");
+ sMsg.append("\tcontent handler[1] = \""+sAlreadyRegisteredHandler+"\"\n");
+ sMsg.append("\tcontent handler[2] = \""+sHandler+"\"\n");
+ m_aDebug.setWarning(sMsg.toString());
+ }
+ aType.put(PROPNAME_CONTENTHANDLER, sHandler);
+ System.out.println("move handler \""+sHandler+"\" to type \""+sTypeReg+"\"");
+ }
+ }
+
+ m_lContentHandlers.clear();
+
+/*
+ int c = m_lTypes.size();
+ java.lang.String[] lT1 = new java.lang.String[c];
+ java.lang.String[] lT2 = new java.lang.String[c];
+ long nUPS = 0;
+
+ int i = 0;
+ aIt1 = m_lTypes.keySet().iterator();
+ while(aIt1.hasNext())
+ {
+ lT1[i] = (java.lang.String)aIt1.next();
+ lT2[i] = lT1[i];
+ ++i;
+ }
+
+ for (int i1=0; i1<c; ++i1)
+ {
+ java.lang.String sT1 = lT1[i1];
+ java.util.HashMap aT1 = (java.util.HashMap)m_lTypes.get(sT1);
+
+ for (int i2=i1; i2<c; ++i2)
+ {
+ java.lang.String sT2 = lT1[i2];
+ java.util.HashMap aT2 = (java.util.HashMap)m_lTypes.get(sT2);
+
+ if (!sT1.equals(sT2))
+ {
+ if (
+ aT1.get(PROPNAME_MEDIATYPE).equals(aT2.get(PROPNAME_MEDIATYPE)) &&
+ aT1.get(PROPNAME_CLIPBOARDFORMAT).equals(aT2.get(PROPNAME_CLIPBOARDFORMAT)) &&
+ aT1.get(PROPNAME_URLPATTERN).equals(aT2.get(PROPNAME_URLPATTERN)) &&
+ aT1.get(PROPNAME_EXTENSIONS).equals(aT2.get(PROPNAME_EXTENSIONS))
+ )
+ {
+ System.err.println("UUPPSS----------------------------------------------------------------------------");
+ System.err.println("[1]\""+sT1+"\" equals [2]\""+sT2+"\"");
+ System.err.println("\tprops 1: "+aT1);
+ System.err.println("\tprops 2: "+aT2);
+ System.err.println("----------------------------------------------------------------------------------\n");
+ ++nUPS;
+// throw new java.lang.Exception("UUPPS :-)");
+ }
+ }
+ }
+ }
+ System.err.println("count of UPS = "+nUPS);
+*/
+ }
+}
diff --git a/transex3/source/filter/utils/ConfigHelper.java b/transex3/source/filter/utils/ConfigHelper.java
new file mode 100644
index 000000000000..78cc71cf65b2
--- /dev/null
+++ b/transex3/source/filter/utils/ConfigHelper.java
@@ -0,0 +1,303 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: ConfigHelper.java,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ **********************************************************************_*/
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// imports
+
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+
+//_______________________________________________
+// definition
+
+/** can be used to analyze command line parameters
+ * and merge it together with might existing config
+ * files. That provides the possibility to overwrite
+ * config values via command line parameter.
+ *
+ *
+ */
+public class ConfigHelper extends java.util.Properties
+{
+ //___________________________________________
+ // member
+
+ /** indicates an empty command line. */
+ private boolean m_bEmpty = true;
+
+ //___________________________________________
+ // ctor
+
+ //-------------------------------------------
+ /** initialize a new helper with the list of
+ * command line parameters and bind this new instance
+ * to a property file on disk.
+ *
+ * @param sPropFile
+ * name of the property file.
+ * If its set to null or an empty value
+ * it will be ignored.
+ *
+ * @param lCommandLineArgs
+ * the list of original command line arguments.
+ *
+ * @throws [Exception]
+ * in case the command line contains an unknown
+ * schema for specifiying parameters or the
+ * specified property file does not exists
+ * or seem to be corrupted.
+ */
+ public ConfigHelper(java.lang.String sPropFile ,
+ java.lang.String[] lCommandLineArgs)
+ throws java.lang.Exception
+ {
+ // first load prop file, so its values can be overwritten
+ // by command line args later
+ // Do it only, if a valid file name was given.
+ // But in case this file name is wrong, throw an exception.
+ // So the outside code can react!
+ if (
+ (sPropFile != null) &&
+ (sPropFile.length() > 0 )
+ )
+ {
+ java.lang.ClassLoader aLoader = getClass().getClassLoader();
+ java.io.InputStream aStream = aLoader.getResourceAsStream(sPropFile);
+ if (aStream == null)
+ aStream = new java.io.FileInputStream(sPropFile);
+ load(aStream);
+ }
+
+ int count = 0;
+ if (lCommandLineArgs != null)
+ count = lCommandLineArgs.length;
+ m_bEmpty = (count < 1);
+
+ for (int arg=0; arg<count; ++arg)
+ {
+ // is it a named-value argument?
+ // Note: We ignores double "=" signs! => search from left to right
+ int len = lCommandLineArgs[arg].length();
+ int pos = lCommandLineArgs[arg].indexOf('=');
+ if (pos != -1)
+ {
+ java.lang.String sArg = lCommandLineArgs[arg].substring(0,pos);
+ java.lang.String sValue = lCommandLineArgs[arg].substring(pos+1);
+ setProperty(sArg, sValue);
+ continue;
+ }
+
+ // is it a boolean argument?
+ // Note: Because "--" and "-" will be interpreted as the same
+ // we search from right to left!
+ pos = lCommandLineArgs[arg].lastIndexOf('-');
+ if (pos == -1)
+ pos = lCommandLineArgs[arg].lastIndexOf('/');
+ if (pos != -1)
+ {
+ java.lang.String sArg = lCommandLineArgs[arg].substring(pos+1);
+ setProperty(sArg, java.lang.String.valueOf(true));
+ continue;
+ }
+
+ // There is an unknown format used by this argument ...
+ throw new MalformedCommandLineException("Invalid command line detected. The argument \""+lCommandLineArgs[arg]+"\" use an unsupported format.");
+ }
+ }
+
+ //-------------------------------------------
+ /** indicates if the given command line includes
+ * a help request.
+ *
+ * @return True if there was an explicit help request.
+ */
+ public synchronized boolean isHelp()
+ {
+ return (
+ (containsKey("help")) ||
+ (containsKey("?") ) ||
+ (containsKey("h") )
+ );
+ }
+
+ //-------------------------------------------
+ /** indicates if the gioven command line was empty.
+ *
+ * @return True if there was an empty command line.
+ */
+ public synchronized boolean isEmpty()
+ {
+ return m_bEmpty;
+ }
+
+ //-------------------------------------------
+ /** returns the value of sProp as boolean value.
+ *
+ * @param sProp
+ * the name of the parameter.
+ *
+ * @return The boolean value of the requested property.
+ *
+ * @throw [NoSuchElementException]
+ * if the requested property does not exists.
+ */
+ public synchronized boolean getBoolean(java.lang.String sProp)
+ throws java.util.NoSuchElementException
+ {
+ java.lang.String sValue = getProperty(sProp);
+ if (sValue == null)
+ throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!");
+ return new java.lang.Boolean(sValue).booleanValue();
+ }
+
+ public synchronized boolean getBoolean(java.lang.String sProp ,
+ boolean bDefault)
+ {
+ java.lang.String sDefault = java.lang.String.valueOf(bDefault);
+ java.lang.String sValue = getProperty(sProp, sDefault);
+ return new java.lang.Boolean(sValue).booleanValue();
+ }
+
+ //-------------------------------------------
+ /** returns the value of sProp as int value.
+ *
+ * @param sProp
+ * the name of the parameter.
+ *
+ * @return The int value of the requested property.
+ *
+ * @throw [NoSuchElementException]
+ * if the requested property does not exists.
+ */
+ public synchronized int getInt(java.lang.String sProp)
+ throws java.util.NoSuchElementException
+ {
+ java.lang.String sValue = getProperty(sProp);
+ if (sValue == null)
+ throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!");
+ return new java.lang.Integer(sValue).intValue();
+ }
+
+ public synchronized int getInt(java.lang.String sProp ,
+ int nDefault)
+ {
+ java.lang.String sDefault = java.lang.String.valueOf(nDefault);
+ java.lang.String sValue = getProperty(sProp, sDefault);
+ return new java.lang.Integer(sValue).intValue();
+ }
+
+ //-------------------------------------------
+ /** returns the value of sProp as string value.
+ *
+ * @param sProp
+ * the name of the parameter.
+ *
+ * @return The string value of the requested property.
+ *
+ * @throw [NoSuchElementException]
+ * if the requested property does not exists.
+ */
+ public synchronized java.lang.String getString(java.lang.String sProp)
+ throws java.util.NoSuchElementException
+ {
+ java.lang.String sValue = getProperty(sProp);
+ if (sValue == null)
+ throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!");
+ return sValue;
+ }
+
+ //-------------------------------------------
+ /** returns the value of sProp as string list value!
+ *
+ * @descr The delimiter must be well known and
+ * it must be clear if trailing/leading
+ * whitespaces must be ignored or not.
+ *
+ * @param sProp
+ * the name of the parameter.
+ *
+ * @param sDelim
+ * the delimiter, which must be used to split
+ * the config string value into an array.
+ *
+ * @param bTrim
+ * if its set to true, trailing and leading whitespace
+ * characters will be ommited.
+ *
+ * @param bDecode
+ * if its set to TRUE all liste items will be
+ * interpreted as "<xxx>" and converted to <xxx>!
+ *
+ * @return The string list value of the requested property.
+ *
+ * @throw [NoSuchElementException]
+ * if the requested property does not exists.
+ */
+ public synchronized java.util.Vector getStringList(java.lang.String sProp ,
+ java.lang.String sDelimiter,
+ boolean bTrim ,
+ boolean bDecode )
+ throws java.util.NoSuchElementException
+ {
+ java.lang.String sValue = getProperty(sProp);
+ if (sValue == null)
+ throw new java.util.NoSuchElementException("The requested config value \""+sProp+"\" does not exists!");
+
+ java.util.Vector lValue = new java.util.Vector();
+ try
+ {
+ java.util.StringTokenizer lTokens = new java.util.StringTokenizer(sValue, sDelimiter);
+ while(lTokens.hasMoreTokens())
+ {
+ java.lang.String sToken = lTokens.nextToken();
+ // remove trailing/leading whitespaces
+ if (bTrim)
+ sToken = sToken.trim();
+ // remove ""
+ if (
+ (bDecode ) &&
+ (sToken.indexOf("\"") == 0 ) &&
+ (sToken.lastIndexOf("\"") == sToken.length()-1)
+ )
+ {
+ sToken = sToken.substring(1, sToken.length()-1);
+ }
+ lValue.add(sToken);
+ }
+ }
+ catch(java.lang.Throwable ex)
+ { lValue.clear(); }
+
+ return lValue;
+ }
+}
diff --git a/transex3/source/filter/utils/FileHelper.java b/transex3/source/filter/utils/FileHelper.java
new file mode 100644
index 000000000000..71f51cf36bf6
--- /dev/null
+++ b/transex3/source/filter/utils/FileHelper.java
@@ -0,0 +1,766 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: FileHelper.java,v $
+ * $Revision: 1.13 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.filter.config.tools.utils;
+
+// __________ Imports __________
+
+import java.io.*;
+import java.lang.*;
+import java.net.*;
+import java.util.*;
+
+// __________ Implementation __________
+
+/**
+ * It collects some static helper functons to handle file system specific problems.
+ * Sometimes it's neccessary to convert URL from/to system pathes;
+ * or from string notation to structural versions (e.g. com.sun.star.util.URL).
+ * And sometimes java had another notation then the office it has.
+ * Further it provides functionality to work easiear with the java.io.File class of java.
+ *
+ *
+ */
+public class FileHelper
+{
+ // ____________________
+
+ /**
+ * Because the office need URLs for loading/saving documents
+ * we must convert used system pathes.
+ * And java use another notation for file URLs ... correct it.
+ *
+ * @param aSystemPath
+ * represent the file in system notation
+ *
+ * @return [String]
+ * a file url which represent the given system path
+ */
+ public static java.lang.String getFileURLFromSystemPath(java.io.File aSystemPath)
+ {
+ System.out.println("TODO: must be adapted to java 1.3 :-(");
+ System.exit(-1);
+/*TODO_JAVA
+ try
+ {
+ sFileURL = aSystemPath.toURI().toURL().toString();
+ }
+ catch( MalformedURLException exWrong )
+ {
+ sFileURL = null;
+ }
+*/
+ java.lang.String sFileURL = null;
+
+ // problem of java: file URL's are coded with 1 slash instead of 2 or 3 ones!
+ // => correct this problem first, otherwise office can't use these URL's
+ if(
+ (sFileURL != null ) &&
+ (sFileURL.startsWith("file:/") == true ) &&
+ (sFileURL.startsWith("file://") == false)
+ )
+ {
+ java.lang.StringBuffer sWorkBuffer = new java.lang.StringBuffer(sFileURL);
+ sWorkBuffer.insert(6,"//");
+ sFileURL = sWorkBuffer.toString();
+ }
+
+ return sFileURL;
+ }
+
+ // ____________________
+
+ /**
+ * The same as getFileURLFromSystemPath() before but uses string parameter instead
+ * of a java.io.File type. It exist to supress converting of neccessary parameters in the
+ * outside code. But of course getFileURLFromSystemPath(File) will be a little bit faster
+ * then this method ...
+ *
+ * @param sSystemPath
+ * represent the file in system notation
+ *
+ * @return [String]
+ * a file url which represent the given system path
+ */
+ public static java.lang.String getFileURLFromSystemPath(java.lang.String sSystemPath)
+ {
+ return getFileURLFromSystemPath(new java.io.File(sSystemPath));
+ }
+
+ // ____________________
+
+ /**
+ * Does the same as getFileURLFromSystemPath() before ... but uses
+ * the given protocol string (e.g."http://") insted of "file:///".
+ *
+ * @param aSystemPath
+ * represent the file in system notation
+ *
+ * @param aBasePath
+ * define the base path of the aSystemPath value,
+ * which must be replaced with the value of "sServerPath".
+ *
+ * @param sServerURL
+ * Will be used to replace sBasePath.
+ *
+ * @example
+ * System Path = "d:\test\file.txt"
+ * Base Path = "d:\test"
+ * Server Path = "http://alaska:8000"
+ * => "http://alaska:8000/file.txt"
+ *
+ * @return [String]
+ * an url which represent the given system path
+ * and uses the given protocol
+ */
+ public static java.lang.String getURLWithProtocolFromSystemPath(java.io.File aSystemPath,
+ java.io.File aBasePath ,
+ java.lang.String sServerURL )
+ {
+ System.out.println("TODO: must be adapted to java 1.3 :-(");
+ System.exit(-1);
+
+ java.lang.String sFileURL = FileHelper.getFileURLFromSystemPath(aSystemPath);
+ java.lang.String sBaseURL = FileHelper.getFileURLFromSystemPath(aBasePath );
+
+ // cut last '/'!
+ if (sBaseURL.lastIndexOf('/')==(sBaseURL.length()-1))
+ sBaseURL = sBaseURL.substring(0,sBaseURL.length()-1);
+
+ // cut last '/'!
+ if (sServerURL.lastIndexOf('/')==(sServerURL.length()-1))
+ sServerURL = sServerURL.substring(0,sServerURL.length()-1);
+
+//TODO_JAVA java.lang.String sURL = sFileURL.replaceFirst(sBaseURL,sServerURL);
+ java.lang.String sURL = null;
+ return sURL;
+ }
+
+ // ____________________
+
+ /**
+ * The same as getURLWithProtocolFromSystemPath() before but uses string parameter instead
+ * of a java.io.File types. It exist to supress converting of neccessary parameters in the
+ * outside code. But of course getURLWithProtocolFromSystemPath(File,File,String) will be
+ * a little bit faster then this method ...
+ *
+ * @param sSystemPath
+ * represent the file in system notation
+ *
+ * @param sBasePath
+ * define the base path of the aSystemPath value,
+ * which must be replaced with the value of "sServerPath".
+ *
+ * @param sServerPath
+ * Will be used to replace sBasePath.
+ *
+ * @example
+ * System Path = "d:\test\file.txt"
+ * Base Path = "d:\test"
+ * Server Path = "http://alaska:8000"
+ * => "http://alaska:8000/file.txt"
+ *
+ * @return [String]
+ * an url which represent the given system path
+ * and uses the given protocol
+ */
+ public static java.lang.String getURLWithProtocolFromSystemPath(java.lang.String sSystemPath,
+ java.lang.String sBasePath ,
+ java.lang.String sServerPath)
+ {
+ return getURLWithProtocolFromSystemPath(new java.io.File(sSystemPath), new java.io.File(sBasePath), sServerPath);
+ }
+
+ //_________________________________
+
+ /**
+ * Return a list of all available files of a directory.
+ * We filter sub directories. All other files
+ * are returned. So they can be used for further purposes.
+ * One parameter define the start directory,
+ * another one enable/disable recursive search into sub directories.
+ *
+ * @param aRoot
+ * the start directory, which should be analyzed.
+ *
+ * @param bRecursive
+ * enable/disable search in sub directories.
+ *
+ * @return [Vector]
+ * a filtered list of java java.io.File objects of all available files
+ * of the start dir (and may of its sub directories).
+ */
+ public static java.util.Vector getSystemFilesFromDir(java.io.File aRoot ,
+ boolean bRecursive)
+ {
+ java.io.File[] lAllFiles = aRoot.listFiles();
+ if (lAllFiles == null)
+ return null;
+
+ int c = lAllFiles.length;
+ java.util.Vector lFilteredFiles = new java.util.Vector(c);
+ for (int i=0; i<c; ++i)
+ {
+ // simple files!
+ if (lAllFiles[i].isFile())
+ lFilteredFiles.add(lAllFiles[i]);
+ else
+ // recursion?
+ if (bRecursive && lAllFiles[i].isDirectory())
+ {
+ java.util.Vector lSubFiles = FileHelper.getSystemFilesFromDir(lAllFiles[i],bRecursive);
+ if (lSubFiles != null)
+ {
+ java.util.Enumeration aSnapshot = lSubFiles.elements();
+ while (aSnapshot.hasMoreElements())
+ lFilteredFiles.add(aSnapshot.nextElement());
+ }
+ }
+ }
+
+ return lFilteredFiles;
+ }
+
+ //_________________________________
+ /** it converts the given name (e.g. an internal type name) to
+ * an usable system file name.
+ *
+ * Do so some special characters (e.g. "/") must be replaced with other ones.
+ *
+ * @param sName
+ * the name, which should be analyzed and converted.
+ *
+ * @return A valid system file name, which should be similar to the
+ * given name, but does not contain special characters any longer.
+ */
+ public static java.lang.String convertName2FileName(String sName)
+ {
+ int i = 0;
+ int nLength = sName.length();
+ char[] lBuffer = sName.toCharArray();
+
+ java.lang.StringBuffer sNewName = new java.lang.StringBuffer(nLength);
+ for (i=0; i<nLength; ++i)
+ {
+ char c = lBuffer[i];
+ if (
+ c>=48 && c<=57 // 0-9
+ &&
+ c>=97 && c<=122 // a-z
+ &&
+ c>=65 && c<=90 // A-Z
+ )
+ {
+ sNewName.append(c);
+ }
+ else
+ {
+ sNewName.append("_");
+ }
+ }
+
+ return sNewName.toString();
+ }
+
+ //___________________________________________
+
+ /** it removes all child nodes of a file system directory.
+ *
+ * @param aDirectory
+ * points to the directory, which should be made empty.
+ *
+ * @param bFilesOnly
+ * force deletion of files only. If its set to TRUE,
+ * no subdirectory will be removed.
+ *
+ * @throw [java.io.IOException]
+ * if some of the child nodes couldn't be removed.
+ */
+ public static void makeDirectoryEmpty(java.io.File aDirectory,
+ boolean bFilesOnly)
+ throws java.io.IOException
+ {
+ if (!aDirectory.isDirectory())
+ throw new java.io.FileNotFoundException("\""+aDirectory.toString()+"\" is not a directory.");
+
+ java.io.File[] lChilds = aDirectory.listFiles();
+ for (int f=0; f<lChilds.length; ++f)
+ {
+ if (lChilds[f].isDirectory())
+ {
+ FileHelper.makeDirectoryEmpty(lChilds[f], bFilesOnly);
+ if (!bFilesOnly)
+ {
+ if (!lChilds[f].delete())
+ throw new java.io.IOException("\""+lChilds[f].toString()+"\" could not be deleted.");
+ }
+ }
+ else
+ {
+ if (!lChilds[f].delete())
+ throw new java.io.IOException("\""+lChilds[f].toString()+"\" could not be deleted.");
+ }
+ }
+ }
+
+ //___________________________________________
+
+ /** it try to generate a new file with a unique ID
+ * inside given directory.
+ *
+ * Call this method with a directory and a base name for
+ * a file. It will be used to generate a new files inside
+ * the directory. Existing files will be checked and new file
+ * name will be tested till a non existing file name would be found.
+ *
+ * @param aBaseDir
+ * must be a system path
+ * e.g.: "c:\temp"
+ *
+ * @param sBaseName
+ * must be a system file name without extensions.
+ * e.g.: "myfile_"
+ *
+ * @param sExtension
+ * the whished extension.
+ * e.g.: "dat"
+ *
+ * @return A valid file object, if an unique file could be created -
+ * Null otherwhise.
+ * e.g.: "c:\temp\myfile_1.dat"
+ */
+ public static java.io.File createUniqueFile(java.io.File aBaseDir ,
+ java.lang.String sBaseName ,
+ java.lang.String sExtension)
+ {
+ java.io.File aBaseFile = new java.io.File(aBaseDir, sBaseName);
+ java.io.File aFile = null;
+ long nr = 0;
+ while (aFile == null && nr < java.lang.Long.MAX_VALUE)
+ {
+ java.lang.String sFileName = aBaseFile.getPath() + java.lang.String.valueOf(nr) + "." + sExtension;
+ aFile = new java.io.File(sFileName);
+ if (aFile.exists())
+ aFile=null;
+ ++nr;
+ }
+ return aFile;
+ }
+
+ //___________________________________________
+
+ /** reads the complete file, using the right encoding,
+ * into the given string buffer.
+ *
+ * @param aFile
+ * must point to a system file, which must exist.
+ * e.g.: "c:\temp\test.txt"
+ * "/tmp/test.txt"
+ *
+ * @param sEncoding
+ * will be used to encode the string content
+ * inside the file.
+ * e.g.: "UTF8"
+ *
+ * @param sBuffer
+ * used to return the file content.
+ *
+ * @throw [IOException]
+ * - if the file couldnt be opened
+ * - if the file does not use the right encoding
+ */
+ public static void readEncodedBufferFromFile(java.io.File aFile ,
+ java.lang.String sEncoding,
+ java.lang.StringBuffer sBuffer )
+ throws java.io.IOException
+ {
+ if (sEncoding.equals("UTF-8Special"))
+ {
+ FileHelper.readAndCheckUTF8File(aFile,sBuffer);
+ return;
+ }
+
+ java.io.FileInputStream aByteStream = new java.io.FileInputStream(aFile.getAbsolutePath());
+ java.io.InputStreamReader aEncodedReader = new java.io.InputStreamReader(aByteStream, sEncoding);
+ char[] aEncodedBuffer = new char[4096];
+ int nReadCount = 0;
+
+ while((nReadCount=aEncodedReader.read(aEncodedBuffer))>0)
+ sBuffer.append(aEncodedBuffer, 0, nReadCount);
+
+ aEncodedReader.close();
+ }
+
+ //___________________________________________
+ private static void logEncodingData(java.lang.StringBuffer sLog ,
+ int nUTF8 ,
+ int nByteOrg1 ,
+ int nByteOrg2 ,
+ int nByteOrg3 ,
+ int nByteOrg4 ,
+ int nByte1 ,
+ int nByte2 ,
+ int nByte3 ,
+ int nByte4 ,
+ int nEncodingType)
+ {
+ sLog.append("["+nEncodingType+"]\t");
+ sLog.append((int)nUTF8+"\t=");
+ sLog.append("\t"+nByteOrg1+"/"+nByte1);
+ sLog.append("\t"+nByteOrg2+"/"+nByte2);
+ sLog.append("\t"+nByteOrg3+"/"+nByte3);
+ sLog.append("\t"+nByteOrg4+"/"+nByte4);
+ sLog.append("\n");
+ }
+
+ //___________________________________________
+ private static char impl_convertBytesToChar(int nByte1, int nByte2, int nByte3, int nByte4)
+ {
+ return (char)((nByte1*0x40000)+(nByte2*0x1000)+(nByte3*0x40)+nByte4);
+ }
+
+ //___________________________________________
+ private static int impl_readAndCheckNextByte(byte[] aBuffer ,
+ int nBufPos ,
+ int nBufLength ,
+ int nMinRange ,
+ int nMaxRange )
+ throws java.lang.Exception
+ {
+ if (nBufPos>=nBufLength)
+ throw new java.lang.Exception("impl_readAndCheckNextByte()\nEnd of buffer reached.");
+
+ int nByte = aBuffer[nBufPos] & 0xFF;
+ if (
+ (nByte < nMinRange) ||
+ (nByte > nMaxRange)
+ )
+ {
+ throw new java.lang.Exception("impl_readAndCheckNextByte()\nByte does not fit the specified range.");
+ }
+
+ return nByte;
+ }
+
+ //___________________________________________
+ public static void readAndCheckUTF8File(java.io.File aFile ,
+ java.lang.StringBuffer sBuffer)
+ throws java.io.IOException
+ {
+ java.io.FileInputStream aByteStream = new java.io.FileInputStream(aFile.getAbsolutePath());
+ byte[] aBuffer = new byte[4096];
+ int nReadCount = 0;
+ int nByteOrg_1 = 0;
+ int nByteOrg_2 = 0;
+ int nByteOrg_3 = 0;
+ int nByteOrg_4 = 0;
+ int nByte_1 = 0;
+ int nByte_2 = 0;
+ int nByte_3 = 0;
+ int nByte_4 = 0;
+ char nUTF8 = 0;
+ int i = 0;
+ int nEncodingType = 0;
+ java.lang.StringBuffer sLog = new java.lang.StringBuffer();
+
+ try
+ {
+
+ while((nReadCount=aByteStream.read(aBuffer))>0)
+ {
+ i=0;
+ while (i<nReadCount)
+ {
+ nByteOrg_1 = 0;
+ nByteOrg_2 = 0;
+ nByteOrg_3 = 0;
+ nByteOrg_4 = 0;
+ nByte_1 = 0;
+ nByte_2 = 0;
+ nByte_3 = 0;
+ nByte_4 = 0;
+ nUTF8 = 0;
+ nEncodingType = 0;
+
+ nByteOrg_1 = aBuffer[i++] & 0xFF;
+ nByte_1 = nByteOrg_1;
+ /*
+ Table 3-6. Well-Formed UTF-8 Byte Sequences
+
+ ============================================================================
+ Nr. Code Points 1st Byte 2nd Byte 3rd Byte 4th Byte
+ ============================================================================
+ 01 U+ 0..U+ 7F 00..7F
+ 02 U+ 80..U+ 7FF C2..DF 80..BF
+ 03 U+ 800..U+ FFF E0 A0..BF 80..BF
+ 04 U+ 1000..U+ CFFF E1..EC 80..BF 80..BF
+ 05 U+ D000..U+ D7FF ED 80..9F 80..BF
+ 06 U+ E000..U+ FFFF EE..EF 80..BF 80..BF
+ 07 U+ 10000..U+ 3FFFF F0 90..BF 80..BF 80..BF
+ 08 U+ 40000..U+ FFFFF F1..F3 80..BF 80..BF 80..BF
+ 09 U+100000..U+10FFFF F4 80..8F 80..BF 80..BF
+ */
+ // ------------------------------------------------------------
+ // 01
+ // 1 byte: 0xxxxxxx
+ // ------------------------------------------------------------
+ if (
+ (nByteOrg_1 >= 0x00) &&
+ (nByteOrg_1 <= 0x7F)
+ )
+ {
+ nEncodingType = 1;
+ nUTF8 = (char)nByte_1;
+ }
+ // ------------------------------------------------------------
+ // 02
+ // 1 byte: 110xxxxx
+ // 2 byte: 101xxxxx
+ // ------------------------------------------------------------
+ else
+ if (
+ (nByteOrg_1 >= 0xC2) &&
+ (nByteOrg_1 <= 0xDF)
+ )
+ {
+ nEncodingType = 2;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_1 = nByteOrg_1-0xC2;
+ nByte_2 = nByteOrg_2-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0,0,nByte_1, nByte_2);
+ }
+ // ------------------------------------------------------------
+ // 03
+ // 1 byte: 11100000
+ // 2 byte: 101xxxxx
+ // 3 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (nByteOrg_1 == 0xE0)
+ {
+ nEncodingType = 3;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0xA0, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_2 = nByteOrg_2-0xA0;
+ nByte_3 = nByteOrg_3-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0,0,nByte_2, nByte_3);
+ }
+ // ------------------------------------------------------------
+ // 04
+ // 1 byte: 111xxxxx
+ // 2 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (
+ (nByteOrg_1 >= 0xE1) &&
+ (nByteOrg_1 <= 0xEC)
+ )
+ {
+ nEncodingType = 4;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_1 = nByteOrg_1-0xE1;
+ nByte_2 = nByteOrg_2-0x80;
+ nByte_3 = nByteOrg_3-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0,nByte_1, nByte_2, nByte_3);
+ }
+ // ------------------------------------------------------------
+ // 05
+ // 1 byte: 11101101
+ // 2 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (nByteOrg_1 == 0xED)
+ {
+ nEncodingType = 5;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0x9F);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_2 = nByteOrg_2-0x80;
+ nByte_3 = nByteOrg_3-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0,0, nByte_2, nByte_3);
+ }
+ // ------------------------------------------------------------
+ // 06
+ // 1 byte: 1110111x
+ // 2 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (
+ (nByteOrg_1 >= 0xEE) &&
+ (nByteOrg_1 <= 0xEF)
+ )
+ {
+ nEncodingType = 6;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_1 = nByteOrg_1-0xEE;
+ nByte_2 = nByteOrg_2-0x80;
+ nByte_3 = nByteOrg_3-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0,nByte_1, nByte_2, nByte_3);
+ }
+ // ------------------------------------------------------------
+ // 07
+ // 1 byte: 11110000
+ // 2 byte: 1001xxxx
+ // 3 byte: 10xxxxxx
+ // 4 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (nByteOrg_1 == 0xF0)
+ {
+ nEncodingType = 7;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x90, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_4 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_2 = nByteOrg_2-0x90;
+ nByte_3 = nByteOrg_3-0x80;
+ nByte_4 = nByteOrg_4-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0, nByte_2, nByte_3, nByte_4);
+ }
+ // ------------------------------------------------------------
+ // 08
+ // 1 byte: 111100xx
+ // 2 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (
+ (nByteOrg_1 >= 0xF1) &&
+ (nByteOrg_1 <= 0xF3)
+ )
+ {
+ nEncodingType = 8;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_4 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_1 = nByteOrg_1-0xF1;
+ nByte_2 = nByteOrg_2-0x80;
+ nByte_3 = nByteOrg_3-0x80;
+ nByte_4 = nByteOrg_4-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(nByte_1, nByte_2, nByte_3, nByte_4);
+ }
+ // ------------------------------------------------------------
+ // 09
+ // 1 byte: 11110100
+ // 2 byte: 10xxxxxx
+ // 3 byte: 10xxxxxx
+ // 4 byte: 10xxxxxx
+ // ------------------------------------------------------------
+ else
+ if (nByteOrg_1 == 0xF0)
+ {
+ nEncodingType = 9;
+ nByteOrg_2 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_3 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByteOrg_4 = FileHelper.impl_readAndCheckNextByte(aBuffer, i++, nReadCount, 0x80, 0xBF);
+ nByte_2 = nByteOrg_2-0x80;
+ nByte_3 = nByteOrg_3-0x80;
+ nByte_4 = nByteOrg_4-0x80;
+ nUTF8 = FileHelper.impl_convertBytesToChar(0, nByte_2, nByte_3, nByte_4);
+ }
+ // wrong encoding ?
+ else
+ {
+ throw new java.lang.Exception("Non well formed UTF-8 encoding.");
+ }
+
+ sBuffer.append(nUTF8);
+ // -> DEBUG !
+ FileHelper.logEncodingData(sLog, nUTF8, nByteOrg_1, nByteOrg_2, nByteOrg_3, nByteOrg_4, nByte_1, nByte_2, nByte_3, nByte_4, nEncodingType);
+ // <- DEBUG !
+ }
+ }
+
+ }
+ catch(java.lang.Throwable ex)
+ {
+ // -> DEBUG !
+ FileHelper.logEncodingData(sLog, nUTF8, nByteOrg_1, nByteOrg_2, nByteOrg_3, nByteOrg_4, nByte_1, nByte_2, nByte_3, nByte_4, nEncodingType);
+
+ java.io.File aDir = new java.io.File(aFile.getParent());
+ java.lang.String sDump = aFile.getName();
+ java.io.File aDump = FileHelper.createUniqueFile(aDir, sDump, "dump");
+ FileHelper.writeEncodedBufferToFile(aDump, "UTF-8", false, sLog);
+ // <- DEBUG !
+
+ java.lang.String sMsg = "File '"+aFile.getPath()+"' is not encoded right as UTF-8.";
+ throw new java.io.IOException(sMsg);
+ }
+
+ aByteStream.close();
+ }
+
+ //___________________________________________
+
+ /** writes the given string buffer into the specified file
+ * using the specified encoding.
+ *
+ * Further it can be set, if the file should be expanded
+ * or replaced by this new string buffer.
+ *
+ * @param aFile
+ * must point to a system file. It can already exist!
+ * e.g.: "c:\temp\test.txt"
+ * "/tmp/test.txt"
+ *
+ * @param sEncoding
+ * will be used to encode the string content inside the file.
+ * e.g.: "UTF8"
+ *
+ * @param bAppend
+ * specify if an already existing file will be
+ * expanded or replaced.
+ *
+ * @param sBuffer
+ * the new string content for this file.
+ */
+ public static void writeEncodedBufferToFile(java.io.File aFile ,
+ java.lang.String sEncoding,
+ boolean bAppend ,
+ java.lang.StringBuffer sBuffer )
+ throws java.io.IOException
+ {
+ java.io.FileOutputStream aByteStream = new java.io.FileOutputStream(aFile.getAbsolutePath(), bAppend);
+ java.io.OutputStreamWriter aEncodedWriter = new java.io.OutputStreamWriter(aByteStream, sEncoding);
+
+ java.lang.String sTemp = sBuffer.toString();
+ aEncodedWriter.write(sTemp, 0, sTemp.length());
+
+ aEncodedWriter.flush();
+ aEncodedWriter.close();
+
+ if (!aFile.exists())
+ throw new java.io.IOException("File \""+aFile.getAbsolutePath()+"\" not written correctly.");
+ }
+}
diff --git a/transex3/source/filter/utils/Logger.java b/transex3/source/filter/utils/Logger.java
new file mode 100644
index 000000000000..7657eba5f426
--- /dev/null
+++ b/transex3/source/filter/utils/Logger.java
@@ -0,0 +1,177 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: Logger.java,v $
+ * $Revision: 1.8 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// imports
+
+import java.lang.*;
+import java.util.*;
+
+//_______________________________________________
+// definition
+
+/** can be used to print out some debug messages
+ * and group it into warnings/errors or info statements.
+ *
+ *
+ */
+public class Logger
+{
+ //___________________________________________
+ // const
+
+ /** only error message will be shown. */
+ public static final int LEVEL_ERRORS = 1;
+
+ /** only errors and warnings will be shown. */
+ public static final int LEVEL_WARNINGS = 2;
+
+ /** enable errors/warnings and some global info
+ * message. */
+ public static final int LEVEL_GLOBALINFOS = 3;
+
+ /** enable anything! */
+ public static final int LEVEL_DETAILEDINFOS = 4;
+
+ //___________________________________________
+ // member
+
+ /** enable/disable different output level.
+ * e.g. warnings/errors/infos */
+ private int m_nLevel;
+
+ //___________________________________________
+ // ctor
+
+ /** initialize new debug object with the specified
+ * debug level.
+ *
+ * @param nLevel
+ * the new debug level.
+ * See const values LEVEL_xxx too.
+ */
+ public Logger(int nLevel)
+ {
+ m_nLevel = nLevel;
+ }
+
+ //___________________________________________
+ // interface
+
+ /** initialize new debug object with a default
+ * debug level.
+ */
+ public Logger()
+ {
+ m_nLevel = LEVEL_DETAILEDINFOS;
+ }
+
+ //___________________________________________
+ // interface
+
+ /** prints out an exception ... if the right level is set.
+ *
+ * @param ex
+ * the exception object
+ */
+ public synchronized void setException(java.lang.Throwable ex)
+ {
+ if (m_nLevel >= LEVEL_ERRORS)
+ {
+ System.err.println("Exception:\n");
+ ex.printStackTrace();
+ }
+ }
+
+ //___________________________________________
+ // interface
+
+ /** prints out an error ... if the right level is set.
+ *
+ * @param sError
+ * the error message.
+ */
+ public synchronized void setError(java.lang.String sError)
+ {
+ if (m_nLevel >= LEVEL_ERRORS)
+ System.err.println("Error :\t\""+sError+"\"");
+ }
+
+ //___________________________________________
+ // interface
+
+ /** prints out a warning ... if the right level is set.
+ *
+ * @param sWarning
+ * the warning message.
+ */
+ public synchronized void setWarning(java.lang.String sWarning)
+ {
+ if (m_nLevel >= LEVEL_WARNINGS)
+ System.err.println("Warning :\t\""+sWarning+"\"");
+ }
+
+ //___________________________________________
+ // interface
+
+ /** prints out a global info message ... if the right level is set.
+ *
+ * Global infos should be used to describe a complex operation.
+ * E.g.: loading of a document.
+ * But not for every sub operation like e.g. analyzing lines
+ * during loading the document!
+ *
+ * @param sInfo
+ * the info message.
+ */
+ public synchronized void setGlobalInfo(java.lang.String sInfo)
+ {
+ if (m_nLevel >= LEVEL_GLOBALINFOS)
+ System.out.println("Info :\t\""+sInfo+"\"");
+ }
+
+ //___________________________________________
+ // interface
+
+ /** prints out a mode detailed info message ... if the right level is set.
+ *
+ * Such detailed message are e.g. "analyze line [n] of file ...".
+ *
+ * @param sInfo
+ * the info message.
+ */
+ public synchronized void setDetailedInfo(java.lang.String sInfo)
+ {
+ if (m_nLevel >= LEVEL_DETAILEDINFOS)
+ System.out.println("Detail :\t\""+sInfo+"\"");
+ }
+}
diff --git a/transex3/source/filter/utils/MalformedCommandLineException.java b/transex3/source/filter/utils/MalformedCommandLineException.java
new file mode 100644
index 000000000000..e073dcb9adcc
--- /dev/null
+++ b/transex3/source/filter/utils/MalformedCommandLineException.java
@@ -0,0 +1,50 @@
+/*_***********************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: MalformedCommandLineException.java,v $
+ * $Revision: 1.4 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ **********************************************************************_*/
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+// imports
+
+import java.lang.*;
+
+//___________________________________________
+// types
+
+/** indicates a malformed command line.
+ *
+ * E.g. it must be thrown if the command line contains one item more then once,
+ * or use unsupported format.
+ */
+public class MalformedCommandLineException extends java.lang.Exception
+{
+ public MalformedCommandLineException() {}
+ public MalformedCommandLineException(java.lang.String sMsg) { super(sMsg); }
+}
diff --git a/transex3/source/filter/utils/XMLHelper.java b/transex3/source/filter/utils/XMLHelper.java
new file mode 100644
index 000000000000..0f912cac8e25
--- /dev/null
+++ b/transex3/source/filter/utils/XMLHelper.java
@@ -0,0 +1,825 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: XMLHelper.java,v $
+ * $Revision: 1.7 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.filter.config.tools.utils;
+
+//_______________________________________________
+
+import java.lang.*;
+import java.util.*;
+import java.io.*;
+
+//_______________________________________________
+
+/**
+ * It provides some constant values and some static helper routines
+ * which are neccessary to work with a xml file - especialy
+ * the filter configuration.
+ *
+ *
+ */
+public class XMLHelper
+{
+ //___________________________________________
+ // public const
+
+ /** its a possible value of the xml attribute "oor:type" and identify an integer type. */
+ public static final java.lang.String XMLTYPE_INTEGER = "xs:int";
+
+ /** its a possible value of the xml attribute "oor:type" and identify an boolean type. */
+ public static final java.lang.String XMLTYPE_BOOLEAN = "xs:boolean";
+
+ /** its a possible value of the xml attribute "oor:type" and identify an string type. */
+ public static final java.lang.String XMLTYPE_STRING = "xs:string";
+
+ /** its a possible value of the xml attribute "oor:type" and identify an string list type. */
+ public static final java.lang.String XMLTYPE_STRINGLIST = "oor:string-list";
+
+ /** its a xml attribute, which specify a property name. */
+ public static final java.lang.String XMLATTRIB_OOR_NAME = "oor:name";
+
+ /** its a xml attribute, which specify a property type. */
+ public static final java.lang.String XMLATTRIB_OOR_TYPE = "oor:type";
+
+ /** its a xml attribute, which specify a list separator. */
+ public static final java.lang.String XMLATTRIB_OOR_SEPARATOR = "oor:separator";
+
+ /** its a xml attribute, which specify a localized value. */
+ public static final java.lang.String XMLATTRIB_OOR_LOCALIZED = "oor:localized";
+
+ /** its a xml attribute, which specify a merge operation for cfg layering. */
+ public static final java.lang.String XMLATTRIB_OOR_OP = "oor:op";
+
+ /** can be used as value for XMLATTRIB_OOR_OP. */
+ public static final java.lang.String XMLATTRIB_OP_REPLACE = "replace";
+
+ /** its a xml attribute, which specify a locale value. */
+ public static final java.lang.String XMLATTRIB_XML_LANG = "xml:lang";
+
+ /** its the tag name of a <value ...> entry. */
+ public static final java.lang.String XMLTAG_VALUE = "value";
+
+ /** its the tag name of a <prop ...> entry. */
+ public static final java.lang.String XMLTAG_PROP = "prop";
+
+ /** its the tag name of a <node ...> entry. */
+ public static final java.lang.String XMLTAG_NODE = "node";
+
+ //___________________________________________
+ // private const
+
+ /** a static list of all possible separators, which can be used for configuration type string-list. */
+ private static final java.lang.String[] DELIMS = {" ", ",", ";", ".", ":", "-", "_", "#", "'", "+", "*", "~", "=", "?"};
+
+ /** index of the default separator inside list DELIMS.
+ * Its neccessary to know such default separator; because it can
+ * be supressed as xml attribute of the corresponding value tag. */
+ private static final int DEFAULT_SEPARATOR = 0;
+
+ //___________________________________________
+
+ /** analyze the structures of the given XML node and
+ * return a property set of all found sub nodes.
+ *
+ * Such properties are organized as [name, value] pairs.
+ * The type of a xml node will be detected automaticly.
+ * Following types are supported:
+ * xs:int => java.lang.Integer
+ * xs:bool => java.lang.Boolean
+ * xs:string => java.lang.String
+ * oor:string-list => java.util.LinkedList[java.lang.String]
+ * oor:set => java.util.Vector[java.lang.Object]
+ * oor:localized => java.util.HashMap[java.lang.Object]
+ *
+ * @param aNode
+ * points directly to the xml node, where we should analyze
+ * the children nodes.
+ *
+ * @return [java.util.HashMap]
+ * contains every node name as key and its string(!) as value.
+ */
+ public static java.util.HashMap convertNodeToPropSet(org.w3c.dom.Node aNode)
+ throws java.lang.Exception
+ {
+ java.util.HashMap aPropSet = new java.util.HashMap();
+
+ // get all child nodes, which seems to be properties
+ java.util.Vector lChildNodes = XMLHelper.extractChildNodesByTagName(aNode, XMLTAG_PROP);
+ java.util.Enumeration en1 = lChildNodes.elements();
+ while(en1.hasMoreElements())
+ {
+ org.w3c.dom.Node aChildNode = (org.w3c.dom.Node)en1.nextElement();
+
+ // read its name
+ java.lang.String sChildName = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_NAME);
+ if (sChildName == null)
+ throw new java.io.IOException("unsupported format: could not extract child node name");
+
+ // read its type info
+ java.lang.String sChildType = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_TYPE);
+ if (sChildType == null)
+ {
+ /** Special patch:
+ * If an xml tag has no type information set ... we can restore it
+ * by analyzing the already readed tag name :-)
+ * Not very nice - but it can help to read stripped xml files too. */
+ sChildType = XMLHelper.getTypeForTag(sChildName);
+ if (sChildType == null)
+ throw new java.io.IOException("unsupported format: could not extract child node type");
+ }
+
+ // read its value(s?)
+ java.util.Vector lChildValues = XMLHelper.extractChildNodesByTagName(aChildNode, XMLTAG_VALUE);
+ java.util.Enumeration en2 = lChildValues.elements();
+ int nValue = 0;
+ java.lang.Object aValue = null;
+ while(en2.hasMoreElements())
+ {
+ org.w3c.dom.Node aValueNode = (org.w3c.dom.Node)en2.nextElement();
+ java.lang.String sChildLocale = XMLHelper.extractNodeAttribByName(aValueNode, XMLATTRIB_XML_LANG);
+ boolean bLocalized = (sChildLocale != null);
+
+ ++nValue;
+
+ if (sChildType.equals(XMLTYPE_INTEGER))
+ {
+ if (!bLocalized && nValue > 1)
+ throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+ java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+ aValue = new java.lang.Integer(sData);
+ }
+ else
+ if (sChildType.equals(XMLTYPE_BOOLEAN))
+ {
+ if (!bLocalized && nValue > 1)
+ throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+ java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+ aValue = new java.lang.Boolean(sData);
+ }
+ else
+ if (sChildType.equals(XMLTYPE_STRING))
+ {
+ if (!bLocalized && nValue > 1)
+ throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+
+ java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+
+ java.util.HashMap lLocalized = null;
+ if (bLocalized)
+ {
+ if (aValue == null)
+ aValue = new java.util.HashMap();
+ lLocalized = (java.util.HashMap)aValue;
+ lLocalized.put(sChildLocale, sData);
+ }
+ else
+ aValue = sData;
+ }
+ else
+ if (sChildType.equals(XMLTYPE_STRINGLIST))
+ {
+ if (!bLocalized && nValue > 1)
+ throw new java.io.IOException("unsupported format: more then one value for non localized but atomic type detected");
+
+ java.lang.String sSeparator = XMLHelper.extractNodeAttribByName(aChildNode, XMLATTRIB_OOR_SEPARATOR);
+ if (sSeparator == null)
+ sSeparator = " ";
+
+ java.lang.String sData = ((org.w3c.dom.CharacterData)aValueNode.getFirstChild()).getData();
+ sData = sData.replace('\t', ' ');
+ sData = sData.replace('\n', ' ');
+ java.util.StringTokenizer aTokenizer = new java.util.StringTokenizer(sData, sSeparator);
+ java.util.Vector lList = new java.util.Vector();
+ while(aTokenizer.hasMoreTokens())
+ {
+ java.lang.String sToken = (java.lang.String)aTokenizer.nextToken();
+ sToken.trim();
+ if (sToken.length() < 1)
+ continue;
+ lList.add(sToken);
+ }
+ aValue = lList;
+ }
+
+ aPropSet.put(sChildName, aValue);
+ }
+ }
+
+ return aPropSet;
+ }
+
+ //___________________________________________
+
+ private static java.lang.String getTypeForTag(java.lang.String sTag)
+ {
+ java.lang.String sType = null;
+
+ if (
+ (sTag.equals(Cache.PROPNAME_DATA )) ||
+ (sTag.equals(Cache.PROPNAME_NAME )) ||
+ (sTag.equals(Cache.PROPNAME_UINAME )) ||
+ (sTag.equals(Cache.PROPNAME_MEDIATYPE )) ||
+ (sTag.equals(Cache.PROPNAME_CLIPBOARDFORMAT )) ||
+ (sTag.equals(Cache.PROPNAME_PREFERREDFILTER )) ||
+ (sTag.equals(Cache.PROPNAME_DETECTSERVICE )) ||
+ (sTag.equals(Cache.PROPNAME_FRAMELOADER )) ||
+ (sTag.equals(Cache.PROPNAME_CONTENTHANDLER )) ||
+ (sTag.equals(Cache.PROPNAME_DOCUMENTSERVICE )) ||
+ (sTag.equals(Cache.PROPNAME_FILTERSERVICE )) ||
+ (sTag.equals(Cache.PROPNAME_TEMPLATENAME )) ||
+ (sTag.equals(Cache.PROPNAME_TYPE )) ||
+ (sTag.equals(Cache.PROPNAME_UICOMPONENT ))
+ )
+ sType = XMLTYPE_STRING;
+ else
+ if (
+ (sTag.equals(Cache.PROPNAME_PREFERRED )) ||
+ (sTag.equals("Installed" ))
+ )
+ sType = XMLTYPE_BOOLEAN;
+ else
+ if (
+ (sTag.equals(Cache.PROPNAME_UIORDER )) ||
+ (sTag.equals(Cache.PROPNAME_DOCUMENTICONID )) ||
+ (sTag.equals(Cache.PROPNAME_FILEFORMATVERSION))
+ )
+ sType = XMLTYPE_INTEGER;
+ else
+ if (
+ (sTag.equals(Cache.PROPNAME_URLPATTERN )) ||
+ (sTag.equals(Cache.PROPNAME_EXTENSIONS )) ||
+ (sTag.equals(Cache.PROPNAME_USERDATA )) ||
+ (sTag.equals(Cache.PROPNAME_FLAGS )) ||
+ (sTag.equals(Cache.PROPNAME_TYPES ))
+ )
+ sType = XMLTYPE_STRINGLIST;
+
+ if (sType == null)
+ System.err.println("getTypeForTag("+sTag+") = "+sType);
+
+ return sType;
+ }
+
+ //___________________________________________
+
+ /** return a xml representation of the given property set.
+ *
+ * @param aPropSet
+ * a set of <name,value> pairs, which should be translated to xml
+ *
+ * @return [java.lang.String]
+ * the xml string representation.
+ *
+ * @throws [java.lang.Exception]
+ * if anything during convertion fill fail.
+ */
+ public static java.lang.String convertPropSetToXML(java.util.HashMap aPropSet ,
+ int nPrettyTabs)
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sXML = new java.lang.StringBuffer(256);
+
+ java.util.Iterator it1 = aPropSet.keySet().iterator();
+ while(it1.hasNext())
+ {
+ java.lang.String sProp = (java.lang.String)it1.next();
+ java.lang.Object aVal = aPropSet.get(sProp);
+
+ sProp = encodeHTMLSigns(sProp);
+
+ // is it a simple type?
+ if (
+ (aVal instanceof java.lang.Integer) ||
+ (aVal instanceof java.lang.Boolean) ||
+ (aVal instanceof java.lang.String )
+ )
+ {
+ sXML.append(XMLHelper.convertSimpleObjectToXML(sProp, aVal, nPrettyTabs));
+ continue;
+ }
+
+ // no!
+ // is it a list value?
+ if (aVal instanceof java.util.Vector)
+ {
+ java.util.Vector lVal = (java.util.Vector)aVal;
+ sXML.append(XMLHelper.convertListToXML(sProp, lVal, nPrettyTabs));
+ continue;
+ }
+
+ // its a localized value?
+ if (aVal instanceof java.util.HashMap)
+ {
+ java.util.HashMap lVal = (java.util.HashMap)aVal;
+ sXML.append(XMLHelper.convertLocalizedValueToXML(sProp, lVal, nPrettyTabs));
+ continue;
+ }
+
+ // unknown type!
+ java.lang.StringBuffer sMsg = new java.lang.StringBuffer(256);
+ sMsg.append("unsupported object type detected.");
+ sMsg.append("\ttype ? : \""+sProp+"\" = "+aVal);
+ sMsg.append("\tprop set: \""+aPropSet );
+ throw new java.lang.Exception(sMsg.toString());
+ }
+
+ return sXML.toString();
+ }
+
+ public static java.lang.String encodeHTMLSigns(java.lang.String sValue)
+ {
+ java.lang.StringBuffer sSource = new java.lang.StringBuffer(sValue);
+ java.lang.StringBuffer sDestination = new java.lang.StringBuffer(1000 );
+
+ for (int i=0; i<sSource.length(); ++i)
+ {
+ char c = sSource.charAt(i);
+ if (c == '&')
+ sDestination.append("&amp;");
+ else
+ sDestination.append(c);
+ }
+
+ java.lang.String sReturn = sDestination.toString();
+ if (!sReturn.equals(sValue))
+ System.out.println("encode \""+sValue+"\" => \""+sReturn+"\"");
+
+ return sReturn;
+ }
+
+ //___________________________________________
+
+ /** return a xml representation of an atomic property.
+ *
+ * Atomic property types are e.g. Integer, Boolean, String.
+ *
+ * @param sName
+ * the name of the property.
+
+ * @param aValue
+ * the value of the property.
+ *
+ * @param nPrettyTabs
+ * count of tab signs for pretty format the xml code :-)
+ *
+ * @return [java.lang.String]
+ * the xml string representation.
+ *
+ * @throws [java.lang.Exception]
+ * if anything during convertion fill fail.
+ */
+ private static java.lang.String convertSimpleObjectToXML(java.lang.String sName ,
+ java.lang.Object aValue ,
+ int nPrettyTabs)
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sXML = new java.lang.StringBuffer(256);
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+
+ if (aValue instanceof java.lang.Integer)
+ {
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">");
+ sXML.append("<value>"+aValue.toString()+"</value>");
+ sXML.append("</prop>\n");
+ }
+ else
+ if (aValue instanceof java.lang.Boolean)
+ {
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">");
+ sXML.append("<value>"+aValue.toString()+"</value>");
+ sXML.append("</prop>\n");
+ }
+ else
+ if (aValue instanceof java.lang.String)
+ {
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\"");
+ java.lang.String sValue = (java.lang.String)aValue;
+
+ sValue = encodeHTMLSigns(sValue);
+
+ if (sValue.length() < 1)
+ sXML.append("/>\n");
+ else
+ {
+ sXML.append("><value>"+sValue+"</value>");
+ sXML.append("</prop>\n");
+ }
+ }
+ else
+ {
+ System.err.println("name = "+sName);
+ System.err.println("value = "+aValue);
+ // ! can be used outside to detect - that it was not a simple type :-)
+ throw new java.lang.Exception("not an atomic type.");
+ }
+
+ return sXML.toString();
+ }
+
+ //___________________________________________
+
+ /** return a xml representation of a string-list property.
+ *
+ * @param sName
+ * the name of the property.
+
+ * @param aValue
+ * the value of the property.
+ *
+ * @param nPrettyTabs
+ * count of tab signs for pretty format the xml code :-)
+ *
+ * @return [java.lang.String]
+ * the xml string representation.
+ *
+ * @throws [java.lang.Exception]
+ * if anything during convertion fill fail.
+ */
+ private static java.lang.String convertListToXML(java.lang.String sName ,
+ java.util.Vector aValue ,
+ int nPrettyTabs)
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sXML = new java.lang.StringBuffer(256);
+
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+
+ int c = aValue.size();
+ if (c < 1)
+ {
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\"/>\n");
+ return sXML.toString();
+ }
+
+ // step over all list items and add it to a string buffer
+ // Every item will be separated by a default separator "\n" first.
+ // Because "\n" is not a valid separator at all and can`t occure inside
+ // our list items. During we step over all items, we check if our current separator
+ // (we use a list of possible ones!) clash with an item.
+ // If it clash - we step to the next possible separator.
+ // If our list of possible separator values runs out of range we throw
+ // an exception :-) Its better then generating of wrong values
+ // If we found a valid seperator - we use it to replace our "\n" place holder
+ // at the end of the following loop ...
+
+ int d = 0;
+ java.lang.StringBuffer sValBuff = new java.lang.StringBuffer(256);
+ for (int i=0; i<c; ++i)
+ {
+ // get the next list item
+ java.lang.Object aItem = aValue.get(i);
+ if (!(aItem instanceof java.lang.String))
+ throw new java.lang.Exception("Current implementation supports string-list only!");
+
+ java.lang.String sValue = (java.lang.String)aItem;
+
+ sValue = encodeHTMLSigns(sValue);
+
+ // append item with default separator, which isn a valid separator at all
+ // But supress adding of the separator if last element is reached.
+ sValBuff.append(sValue);
+ if (i<(c-1))
+ sValBuff.append("\n");
+
+ // check for delim clash
+ // Attention: An empty (means default) element forbid using
+ // of a whitespace character as separator!
+ while(true)
+ {
+ if (d >= DELIMS.length)
+ throw new java.lang.Exception("No valid separator found for a string list item.");
+ if (sValue.length() < 1 && DELIMS[d].equals(" "))
+ {
+ ++d;
+ continue;
+ }
+ if (sValue.indexOf(DELIMS[d]) != -1)
+ {
+ ++d;
+ continue;
+ }
+ break;
+ }
+ }
+
+ // replace default separator with right one
+ System.out.println("TODO: must be adapted to java 1.3 :-(");
+ System.exit(-1);
+//TODO_JAVA java.lang.String sListVal = sValBuff.toString().replaceAll("\n", DELIMS[d]);
+ java.lang.String sListVal = null;
+
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">");
+ if (d == DEFAULT_SEPARATOR)
+ sXML.append("<value>");
+ else
+ sXML.append("<value "+XMLATTRIB_OOR_SEPARATOR+"=\""+DELIMS[d]+"\">");
+ sXML.append(sListVal);
+ sXML.append("</value>");
+ sXML.append("</prop>\n");
+
+ return sXML.toString();
+ }
+
+ //___________________________________________
+
+ /** return a xml representation of a localized property.
+ *
+ * @param sName
+ * the name of the property.
+
+ * @param aValue
+ * the value of the property.
+ *
+ * @param nPrettyTabs
+ * count of tab signs for pretty format the xml code :-)
+ *
+ * @return [java.lang.String]
+ * the xml string representation.
+ *
+ * @throws [java.lang.Exception]
+ * if anything during convertion fill fail.
+ */
+ private static java.lang.String convertLocalizedValueToXML(java.lang.String sName ,
+ java.util.HashMap aValue ,
+ int nPrettyTabs)
+ throws java.lang.Exception
+ {
+ java.lang.StringBuffer sXML = new java.lang.StringBuffer(256);
+
+ int c = aValue.size();
+ if (c < 1)
+ throw new java.lang.Exception("Cant detect type of localized values. Because the given list is empty.");
+
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+ // !Our localized values must be formated at a deeper coloum
+ // then its property name!
+ ++nPrettyTabs;
+
+ sXML.append("<prop "+XMLATTRIB_OOR_NAME+"=\""+sName+"\">\n");
+ java.util.Iterator it = aValue.keySet().iterator();
+// boolean bTypeKnown = false;
+ while(it.hasNext())
+ {
+ java.lang.String sLocale = (java.lang.String)it.next();
+ java.lang.Object aLocalizedValue = aValue.get(sLocale);
+/*
+ if (!bTypeKnown)
+ {
+ bTypeKnown = true;
+ if (aLocalizedValue instanceof java.lang.Integer)
+ sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_INTEGER+"\">\n");
+ else
+ if (aLocalizedValue instanceof java.lang.Boolean)
+ sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_BOOLEAN+"\">\n");
+ else
+ if (aLocalizedValue instanceof java.lang.String)
+ sXML.append(" "+XMLATTRIB_OOR_TYPE+"=\""+XMLTYPE_STRING+"\">\n");
+ else
+ throw new java.lang.Exception("Unsupported type for localized value detected.");
+ }
+*/
+ java.lang.String sLocValue = aLocalizedValue.toString();
+ java.lang.String sValue = encodeHTMLSigns(sLocValue);
+
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+ sXML.append("<value "+XMLATTRIB_XML_LANG+"=\""+sLocale+"\">"+sValue+"</value>\n");
+ }
+ --nPrettyTabs;
+ for (int t=0; t<nPrettyTabs; ++t)
+ sXML.append("\t");
+ sXML.append("</prop>\n");
+
+ return sXML.toString();
+ }
+
+ //___________________________________________
+
+ /** returns the value of an attribute of the given node.
+ *
+ * If the given node represent an lement node, may it supports some attributes.
+ * Then this method search for an attribute with the specified name and return it's value.
+ * If nothing could be found ... or the given node isn't a suitable node ... it returns null.
+ *
+ * @param aNode
+ * the node, which should be analyzed.
+ *
+ * @param sAttrib
+ * name of the attribute, which should be searched.
+ *
+ * @return The value of the specified attribute if it could be found at the given node.
+ * Can be null if node doesn't support attributes or the searched one does not exist there.
+ */
+ public static java.lang.String extractNodeAttribByName(org.w3c.dom.Node aNode ,
+ java.lang.String sAttrib)
+ throws java.lang.Exception
+ {
+ // We can get valid attributes for element nodes only!
+ if (aNode.getNodeType() != org.w3c.dom.Node.ELEMENT_NODE)
+ {
+// System.err.println("not an element node");
+ return null;
+ }
+
+ // may it supports attributes in general ... but doesn't have anyone realy.
+ org.w3c.dom.NamedNodeMap lAttribs = aNode.getAttributes();
+ if (lAttribs==null)
+ {
+// System.err.println("no attributes at all");
+ return null;
+ }
+
+ // step over the attribute list and search for the requested one
+ for (int i=0; i<lAttribs.getLength(); ++i)
+ {
+ org.w3c.dom.Attr aAttrib = (org.w3c.dom.Attr)lAttribs.item(i);
+ if (aAttrib.getName().equals(sAttrib))
+ {
+ java.lang.String sValue = aAttrib.getValue();
+ return sValue;
+ }
+ }
+
+ // the searched attribute was not found!
+// System.err.println("required attribute \""+sAttrib+"\" does not exist for node ["+aNode.toString()+"]");
+ return null;
+ }
+
+ //___________________________________________
+
+ /** returns a list of childs, which are ELEMENT_NODES and have the right tag name.
+ *
+ * It analyze the list of all possible child nodes. Only ELEMENT_NODES are candidates.
+ * All other ones will be ignored. Further these element nodes are compared by it's tag
+ * names. If it match with the specified value it's added to the return list.
+ * So the return list includes references to the DOM tree nodes only, which are child
+ * element nodes with the right tag name.
+ *
+ * @param aNode
+ * provides access to the child nodes, which should be analyzed
+ *
+ * @param sTag
+ * the searched tag name.
+ *
+ * @return A list of child nodes, which are element nodes and have the right tag name.
+ */
+ public static java.util.Vector extractChildNodesByTagName(org.w3c.dom.Node aNode,
+ java.lang.String sTag )
+ {
+ // extract first all ELEMENT_NODES of he given parent
+ // Such nodes only provide tag names.
+ java.util.Vector lChilds = XMLHelper.extractChildNodesByType(aNode,org.w3c.dom.Node.ELEMENT_NODE);
+ java.util.Vector lExtractedChilds = new java.util.Vector(lChilds.size());
+
+ // step over the list and search for the right tags using the specified name
+ java.util.Enumeration en = lChilds.elements();
+ while (en.hasMoreElements())
+ {
+ org.w3c.dom.Node aChild = (org.w3c.dom.Node)en.nextElement();
+ if (aChild.getNodeName().equals(sTag))
+ lExtractedChilds.add(aChild);
+ }
+
+ // pack(!) and return the list
+ lExtractedChilds.trimToSize();
+ return lExtractedChilds;
+ }
+
+ //___________________________________________
+
+ /** returns a list of childs, which supports the right node type.
+ *
+ * It analyze the list of all possible child nodes. If a node represent the right node type
+ * it is added to the return list. Otherwhise it will be ignored.
+ *
+ * @param aNode
+ * provides access to the list of possible children nodes.
+ *
+ * @param nType
+ * represent the searched node type.
+ * Possible values are constant fields of a org.w3c.dom.Node - e.g. org.w3c.dom.Node.ELEMENT_NODE.
+ *
+ * @return A list of child nodes, which provides the right node type.
+ */
+ public static java.util.Vector extractChildNodesByType(org.w3c.dom.Node aNode,
+ short nType)
+ {
+ // get list of all possibe childs and reserve enough space for our return list
+ // Attention: A null pointer is not allowed for return! (means lExtractedChilds)
+ org.w3c.dom.NodeList lChilds = aNode.getChildNodes();
+ int c = lChilds.getLength();
+ java.util.Vector lExtractedChilds = new java.util.Vector(c);
+
+ // step of these childs and select only needed ones
+ for (int i=0; i<c; ++i)
+ {
+ org.w3c.dom.Node aChild = lChilds.item(i);
+ if (aChild.getNodeType() == nType)
+ lExtractedChilds.add(aChild);
+ }
+
+ // pack(!) and return the list
+ lExtractedChilds.trimToSize();
+ return lExtractedChilds;
+ }
+
+ //___________________________________________
+
+ /** generates an xml header, using parameters.
+ *
+ * @param sVersion
+ * number of the xml version.
+ *
+ * @param sEncoding
+ * used file encoding.
+ *
+ * @param sPath
+ * name of the configuration root.
+ *
+ * @param sPackage
+ * name of the configuration package.
+ *
+ * @param bLanguagepack
+ * force creation of a special header,
+ * which is needed for language packs only.
+ *
+ * @return [java.lang.String]
+ * the generated xml header.
+
+*/
+ public static java.lang.String generateHeader(java.lang.String sVersion ,
+ java.lang.String sEncoding ,
+ java.lang.String sPath ,
+ java.lang.String sPackage ,
+ boolean bLanguagePack)
+ {
+ java.lang.StringBuffer sHeader = new java.lang.StringBuffer(256);
+
+ if (bLanguagePack)
+ {
+ sHeader.append("<?xml version=\"");
+ sHeader.append(sVersion);
+ sHeader.append("\" encoding=\"");
+ sHeader.append(sEncoding);
+ sHeader.append("\"?>\n");
+ sHeader.append("<oor:component-data oor:package=\"");
+ sHeader.append(sPath);
+ sHeader.append("\" oor:name=\"");
+ sHeader.append(sPackage);
+ sHeader.append("\" xmlns:install=\"http://openoffice.org/2004/installation\"");
+ sHeader.append(" xmlns:oor=\"http://openoffice.org/2001/registry\"");
+ sHeader.append(" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"");
+ sHeader.append(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n");
+ }
+ else
+ {
+ sHeader.append("<?xml version=\"");
+ sHeader.append(sVersion);
+ sHeader.append("\" encoding=\"");
+ sHeader.append(sEncoding);
+ sHeader.append("\"?>\n<!DOCTYPE oor:component-data SYSTEM \"../../../../component-update.dtd\">\n");
+ sHeader.append("<oor:component-data xmlns:oor=\"http://openoffice.org/2001/registry\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" oor:package=\"");
+ sHeader.append(sPath);
+ sHeader.append("\" oor:name=\"");
+ sHeader.append(sPackage);
+ sHeader.append("\">\n");
+ }
+
+ return sHeader.toString();
+ }
+
+ public static java.lang.String generateFooter()
+ {
+ return "</oor:component-data>\n";
+ }
+}
diff --git a/transex3/source/filter/utils/makefile.mk b/transex3/source/filter/utils/makefile.mk
new file mode 100644
index 000000000000..d41d8ba9a825
--- /dev/null
+++ b/transex3/source/filter/utils/makefile.mk
@@ -0,0 +1,57 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.9.98.2 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ = ..$/..$/..
+TARGET = FCFGUtils
+PRJNAME = filter
+PACKAGE = com$/sun$/star$/filter$/config$/tools$/utils
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE: settings.mk
+
+#----- compile .java files -----------------------------------------
+
+
+JAVACLASSFILES = \
+ $(CLASSDIR)$/$(PACKAGE)$/AnalyzeStartupLog.class \
+ $(CLASSDIR)$/$(PACKAGE)$/ConfigHelper.class \
+ $(CLASSDIR)$/$(PACKAGE)$/Logger.class \
+ $(CLASSDIR)$/$(PACKAGE)$/FileHelper.class \
+ $(CLASSDIR)$/$(PACKAGE)$/MalformedCommandLineException.class \
+ $(CLASSDIR)$/$(PACKAGE)$/Cache.class \
+ $(CLASSDIR)$/$(PACKAGE)$/XMLHelper.class
+
+MAXLINELENGTH = 100000
+
+# --- targets -----------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/transex3/source/help/HelpCompiler.cxx b/transex3/source/help/HelpCompiler.cxx
new file mode 100644
index 000000000000..5001d0907972
--- /dev/null
+++ b/transex3/source/help/HelpCompiler.cxx
@@ -0,0 +1,593 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: HelpCompiler.cxx,v $
+ * $Revision: 1.9 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+
+#include "HelpCompiler.hxx"
+#include <limits.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libxslt/xslt.h>
+#include <libxslt/xsltInternals.h>
+#include <libxslt/transform.h>
+#include <libxslt/xsltutils.h>
+#ifdef __MINGW32__
+#include <tools/prewin.h>
+#include <tools/postwin.h>
+#endif
+#include <osl/thread.hxx>
+
+static void impl_sleep( sal_uInt32 nSec )
+{
+ TimeValue aTime;
+ aTime.Seconds = nSec;
+ aTime.Nanosec = 0;
+
+ osl::Thread::wait( aTime );
+}
+
+HelpCompiler::HelpCompiler(StreamTable &in_streamTable, const fs::path &in_inputFile,
+ const fs::path &in_src, const fs::path &in_resEmbStylesheet,
+ const std::string &in_module, const std::string &in_lang, bool in_bExtensionMode)
+ : streamTable(in_streamTable), inputFile(in_inputFile),
+ src(in_src), module(in_module), lang(in_lang), resEmbStylesheet(in_resEmbStylesheet),
+ bExtensionMode( in_bExtensionMode )
+{
+ xmlKeepBlanksDefaultValue = 0;
+}
+
+xmlDocPtr HelpCompiler::getSourceDocument(const fs::path &filePath)
+{
+ static const char *params[4 + 1];
+ static xsltStylesheetPtr cur = NULL;
+
+ xmlDocPtr res;
+ if( bExtensionMode )
+ {
+ res = xmlParseFile(filePath.native_file_string().c_str());
+ if( !res ){
+ impl_sleep( 3 );
+ res = xmlParseFile(filePath.native_file_string().c_str());
+ }
+ }
+ else
+ {
+ if (!cur)
+ {
+ static std::string fsroot('\'' + src.toUTF8() + '\'');
+ static std::string esclang('\'' + lang + '\'');
+
+ xmlSubstituteEntitiesDefault(1);
+ xmlLoadExtDtdDefaultValue = 1;
+ cur = xsltParseStylesheetFile((const xmlChar *)resEmbStylesheet.native_file_string().c_str());
+
+ int nbparams = 0;
+ params[nbparams++] = "Language";
+ params[nbparams++] = esclang.c_str();
+ params[nbparams++] = "fsroot";
+ params[nbparams++] = fsroot.c_str();
+ params[nbparams] = NULL;
+ }
+ xmlDocPtr doc = xmlParseFile(filePath.native_file_string().c_str());
+ if( !doc )
+ {
+ impl_sleep( 3 );
+ doc = xmlParseFile(filePath.native_file_string().c_str());
+ }
+
+ //???res = xmlParseFile(filePath.native_file_string().c_str());
+
+ res = xsltApplyStylesheet(cur, doc, params);
+ xmlFreeDoc(doc);
+ }
+ return res;
+}
+
+HashSet HelpCompiler::switchFind(xmlDocPtr doc)
+{
+ HashSet hs;
+ xmlChar *xpath = (xmlChar*)"//switchinline";
+
+ xmlXPathContextPtr context = xmlXPathNewContext(doc);
+ xmlXPathObjectPtr result = xmlXPathEvalExpression(xpath, context);
+ xmlXPathFreeContext(context);
+ if (result)
+ {
+ xmlNodeSetPtr nodeset = result->nodesetval;
+ for (int i = 0; i < nodeset->nodeNr; i++)
+ {
+ xmlNodePtr el = nodeset->nodeTab[i];
+ xmlChar *select = xmlGetProp(el, (xmlChar*)"select");
+ if (select)
+ {
+ if (!strcmp((const char*)select, "appl"))
+ {
+ xmlNodePtr n1 = el->xmlChildrenNode;
+ while (n1)
+ {
+ if ((!xmlStrcmp(n1->name, (const xmlChar*)"caseinline")))
+ {
+ xmlChar *appl = xmlGetProp(n1, (xmlChar*)"select");
+ hs.push_back(std::string((const char*)appl));
+ xmlFree(appl);
+ }
+ else if ((!xmlStrcmp(n1->name, (const xmlChar*)"defaultinline")))
+ hs.push_back(std::string("DEFAULT"));
+ n1 = n1->next;
+ }
+ }
+ xmlFree(select);
+ }
+ }
+ xmlXPathFreeObject(result);
+ }
+ hs.push_back(std::string("DEFAULT"));
+ return hs;
+}
+
+// returns a node representing the whole stuff compiled for the current
+// application.
+xmlNodePtr HelpCompiler::clone(xmlNodePtr node, const std::string& appl)
+{
+ xmlNodePtr parent = xmlCopyNode(node, 2);
+ xmlNodePtr n = node->xmlChildrenNode;
+ while (n != NULL)
+ {
+ bool isappl = false;
+ if ( (!strcmp((const char*)n->name, "switchinline")) ||
+ (!strcmp((const char*)n->name, "switch")) )
+ {
+ xmlChar *select = xmlGetProp(n, (xmlChar*)"select");
+ if (select)
+ {
+ if (!strcmp((const char*)select, "appl"))
+ isappl = true;
+ xmlFree(select);
+ }
+ }
+ if (isappl)
+ {
+ xmlNodePtr caseNode = n->xmlChildrenNode;
+ if (appl == "DEFAULT")
+ {
+ while (caseNode)
+ {
+ if (!strcmp((const char*)caseNode->name, "defaultinline"))
+ {
+ xmlNodePtr cnl = caseNode->xmlChildrenNode;
+ while (cnl)
+ {
+ xmlAddChild(parent, clone(cnl, appl));
+ cnl = cnl->next;
+ }
+ break;
+ }
+ caseNode = caseNode->next;
+ }
+ }
+ else
+ {
+ while (caseNode)
+ {
+ isappl=false;
+ if (!strcmp((const char*)caseNode->name, "caseinline"))
+ {
+ xmlChar *select = xmlGetProp(n, (xmlChar*)"select");
+ if (select)
+ {
+ if (!strcmp((const char*)select, appl.c_str()))
+ isappl = true;
+ xmlFree(select);
+ }
+ if (isappl)
+ {
+ xmlNodePtr cnl = caseNode->xmlChildrenNode;
+ while (cnl)
+ {
+ xmlAddChild(parent, clone(cnl, appl));
+ cnl = cnl->next;
+ }
+ break;
+ }
+
+ }
+ caseNode = caseNode->next;
+ }
+ }
+
+ }
+ else
+ xmlAddChild(parent, clone(n, appl));
+
+ n = n->next;
+ }
+ return parent;
+}
+
+class myparser
+{
+public:
+ std::string documentId;
+ std::string fileName;
+ std::string title;
+ HashSet *hidlist;
+ Hashtable *keywords;
+ Stringtable *helptexts;
+private:
+ HashSet extendedHelpText;
+public:
+ myparser(const std::string &indocumentId, const std::string &infileName,
+ const std::string &intitle) : documentId(indocumentId), fileName(infileName),
+ title(intitle)
+ {
+ hidlist = new HashSet;
+ keywords = new Hashtable;
+ helptexts = new Stringtable;
+ }
+ void traverse( xmlNodePtr parentNode );
+private:
+ std::string dump(xmlNodePtr node);
+};
+
+std::string myparser::dump(xmlNodePtr node)
+{
+ std::string app;
+ if (node->xmlChildrenNode)
+ {
+ xmlNodePtr list = node->xmlChildrenNode;
+ while (list)
+ {
+ app += dump(list);
+ list = list->next;
+ }
+ }
+ if (xmlNodeIsText(node))
+ {
+ xmlChar *pContent = xmlNodeGetContent(node);
+ app += std::string((const char*)pContent);
+ xmlFree(pContent);
+ // std::cout << app << std::endl;
+ }
+ return app;
+}
+
+void trim(std::string& str)
+{
+ std::string::size_type pos = str.find_last_not_of(' ');
+ if(pos != std::string::npos)
+ {
+ str.erase(pos + 1);
+ pos = str.find_first_not_of(' ');
+ if(pos != std::string::npos)
+ str.erase(0, pos);
+ }
+ else
+ str.erase(str.begin(), str.end());
+}
+
+void myparser::traverse( xmlNodePtr parentNode )
+{
+ // traverse all nodes that belong to the parent
+ xmlNodePtr test ;
+ for (test = parentNode->xmlChildrenNode; test; test = test->next)
+ {
+ if (fileName.empty() && !strcmp((const char*)test->name, "filename"))
+ {
+ xmlNodePtr node = test->xmlChildrenNode;
+ if (xmlNodeIsText(node))
+ {
+ xmlChar *pContent = xmlNodeGetContent(node);
+ fileName = std::string((const char*)pContent);
+ xmlFree(pContent);
+ }
+ }
+ else if (title.empty() && !strcmp((const char*)test->name, "title"))
+ {
+ title = dump(test);
+ if (title.empty())
+ title = "<notitle>";
+ }
+ else if (!strcmp((const char*)test->name, "bookmark"))
+ {
+ xmlChar *branchxml = xmlGetProp(test, (const xmlChar*)"branch");
+ xmlChar *idxml = xmlGetProp(test, (const xmlChar*)"id");
+ std::string branch((const char*)branchxml);
+ std::string anchor((const char*)idxml);
+ xmlFree (branchxml);
+ xmlFree (idxml);
+
+ std::string hid;
+
+ if (branch.find("hid") == 0)
+ {
+ size_t index = branch.find('/');
+ if (index != std::string::npos)
+ {
+ hid = branch.substr(1 + index);
+ // one shall serve as a documentId
+ if (documentId.empty())
+ documentId = hid;
+ extendedHelpText.push_back(hid);
+ std::string foo = anchor.empty() ? hid : hid + "#" + anchor;
+ HCDBG(std::cerr << "hid pushback" << foo << std::endl);
+ hidlist->push_back( anchor.empty() ? hid : hid + "#" + anchor);
+ }
+ else
+ continue;
+ }
+ else if (branch.compare("index") == 0)
+ {
+ LinkedList ll;
+
+ for (xmlNodePtr nd = test->xmlChildrenNode; nd; nd = nd->next)
+ {
+ if (strcmp((const char*)nd->name, "bookmark_value"))
+ continue;
+
+ std::string embedded;
+ xmlChar *embeddedxml = xmlGetProp(nd, (const xmlChar*)"embedded");
+ if (embeddedxml)
+ {
+ embedded = std::string((const char*)embeddedxml);
+ xmlFree (embeddedxml);
+ std::transform (embedded.begin(), embedded.end(),
+ embedded.begin(), tolower);
+ }
+
+ bool isEmbedded = !embedded.empty() && embedded.compare("true") == 0;
+ if (isEmbedded)
+ continue;
+
+ std::string keyword = dump(nd);
+ size_t keywordSem = keyword.find(';');
+ if (keywordSem != std::string::npos)
+ {
+ std::string tmppre =
+ keyword.substr(0,keywordSem);
+ trim(tmppre);
+ std::string tmppos =
+ keyword.substr(1+keywordSem);
+ trim(tmppos);
+ keyword = tmppre + ";" + tmppos;
+ }
+ ll.push_back(keyword);
+ }
+ if (!ll.empty())
+ (*keywords)[anchor] = ll;
+ }
+ else if (branch.compare("contents") == 0)
+ {
+ // currently not used
+ }
+ }
+ else if (!strcmp((const char*)test->name, "ahelp"))
+ {
+ std::string text = dump(test);
+ trim(text);
+ std::string name;
+
+ HashSet::const_iterator aEnd = extendedHelpText.end();
+ for (HashSet::const_iterator iter = extendedHelpText.begin(); iter != aEnd;
+ ++iter)
+ {
+ name = *iter;
+ (*helptexts)[name] = text;
+ }
+ extendedHelpText.clear();
+ }
+
+ // traverse children
+ traverse(test);
+ }
+}
+
+bool HelpCompiler::compile( void ) throw( HelpProcessingException )
+{
+ // we now have the jaroutputstream, which will contain the document.
+ // now determine the document as a dom tree in variable docResolved
+
+ xmlDocPtr docResolvedOrg = getSourceDocument(inputFile);
+
+ // now add path to the document
+ // resolve the dom
+ if (!docResolvedOrg)
+ {
+ impl_sleep( 3 );
+ docResolvedOrg = getSourceDocument(inputFile);
+ if( !docResolvedOrg )
+ {
+ std::stringstream aStrStream;
+ aStrStream << "ERROR: file not existing: " << inputFile.native_file_string().c_str() << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+ }
+
+ // now find all applications for which one has to compile
+ std::string documentId;
+ std::string fileName;
+ std::string title;
+ // returns all applications for which one has to compile
+ HashSet applications = switchFind(docResolvedOrg);
+
+ HashSet::const_iterator aEnd = applications.end();
+ for (HashSet::const_iterator aI = applications.begin(); aI != aEnd; ++aI)
+ {
+ std::string appl = *aI;
+ std::string modulename = appl;
+ if (modulename[0] == 'S')
+ {
+ modulename = modulename.substr(1);
+ std::transform(modulename.begin(), modulename.end(), modulename.begin(), tolower);
+ }
+ if (modulename != "DEFAULT" && modulename != module)
+ continue;
+
+ // returns a clone of the document with swich-cases resolved
+ xmlNodePtr docResolved = clone(xmlDocGetRootElement(docResolvedOrg), appl);
+ myparser aparser(documentId, fileName, title);
+ aparser.traverse(docResolved);
+
+ documentId = aparser.documentId;
+ fileName = aparser.fileName;
+ title = aparser.title;
+
+ HCDBG(std::cerr << documentId << " : " << fileName << " : " << title << std::endl);
+
+ xmlDocPtr docResolvedDoc = xmlCopyDoc(docResolvedOrg, false);
+ xmlDocSetRootElement(docResolvedDoc, docResolved);
+
+ if (modulename == "DEFAULT")
+ {
+ streamTable.dropdefault();
+ streamTable.default_doc = docResolvedDoc;
+ streamTable.default_hidlist = aparser.hidlist;
+ streamTable.default_helptexts = aparser.helptexts;
+ streamTable.default_keywords = aparser.keywords;
+ }
+ else if (modulename == module)
+ {
+ streamTable.dropappl();
+ streamTable.appl_doc = docResolvedDoc;
+ streamTable.appl_hidlist = aparser.hidlist;
+ streamTable.appl_helptexts = aparser.helptexts;
+ streamTable.appl_keywords = aparser.keywords;
+ }
+ else
+ {
+ std::stringstream aStrStream;
+ aStrStream << "ERROR: Found unexpected module name \"" << modulename
+ << "\" in file" << src.native_file_string().c_str() << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ } // end iteration over all applications
+
+ streamTable.document_id = documentId;
+ streamTable.document_path = fileName;
+ streamTable.document_title = title;
+ std::string actMod = module;
+ if ( !bExtensionMode && !fileName.empty())
+ {
+ if (fileName.find("/text/") == 0)
+ {
+ int len = strlen("/text/");
+ actMod = fileName.substr(len);
+ actMod = actMod.substr(0, actMod.find('/'));
+ }
+ }
+ streamTable.document_module = actMod;
+
+ xmlFreeDoc(docResolvedOrg);
+ return true;
+}
+
+namespace fs
+{
+ rtl_TextEncoding getThreadTextEncoding( void )
+ {
+ static bool bNeedsInit = true;
+ static rtl_TextEncoding nThreadTextEncoding;
+ if( bNeedsInit )
+ {
+ bNeedsInit = false;
+ nThreadTextEncoding = osl_getThreadTextEncoding();
+ }
+ return nThreadTextEncoding;
+ }
+
+ void create_directory(const fs::path indexDirName)
+ {
+ HCDBG(
+ std::cerr << "creating " <<
+ rtl::OUStringToOString(indexDirName.data, RTL_TEXTENCODING_UTF8).getStr()
+ << std::endl
+ );
+ osl::Directory::createPath(indexDirName.data);
+ }
+
+ void rename(const fs::path &src, const fs::path &dest)
+ {
+ osl::File::move(src.data, dest.data);
+ }
+
+ void copy(const fs::path &src, const fs::path &dest)
+ {
+ osl::File::copy(src.data, dest.data);
+ }
+
+ bool exists(const fs::path &in)
+ {
+ osl::File tmp(in.data);
+ return (tmp.open(osl_File_OpenFlag_Read) == osl::FileBase::E_None);
+ }
+
+ void remove(const fs::path &in)
+ {
+ osl::File::remove(in.data);
+ }
+
+ void removeRecursive(rtl::OUString const& _suDirURL)
+ {
+ {
+ osl::Directory aDir(_suDirURL);
+ aDir.open();
+ if (aDir.isOpen())
+ {
+ osl::DirectoryItem aItem;
+ osl::FileStatus aStatus(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Attributes);
+ while (aDir.getNextItem(aItem) == ::osl::FileBase::E_None)
+ {
+ if (osl::FileBase::E_None == aItem.getFileStatus(aStatus) &&
+ aStatus.isValid(osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Attributes))
+ {
+ rtl::OUString suFilename = aStatus.getFileName();
+ rtl::OUString suFullFileURL;
+ suFullFileURL += _suDirURL;
+ suFullFileURL += rtl::OUString::createFromAscii("/");
+ suFullFileURL += suFilename;
+
+ if (aStatus.getFileType() == osl::FileStatus::Directory)
+ removeRecursive(suFullFileURL);
+ else
+ osl::File::remove(suFullFileURL);
+ }
+ }
+ aDir.close();
+ }
+ }
+ osl::Directory::remove(_suDirURL);
+ }
+
+ void remove_all(const fs::path &in)
+ {
+ removeRecursive(in.data);
+ }
+}
+
+/* vi:set tabstop=4 shiftwidth=4 expandtab: */
diff --git a/transex3/source/help/HelpCompiler.hxx b/transex3/source/help/HelpCompiler.hxx
new file mode 100644
index 000000000000..7ffb096bd635
--- /dev/null
+++ b/transex3/source/help/HelpCompiler.hxx
@@ -0,0 +1,320 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: HelpCompiler.hxx,v $
+ * $Revision: 1.8 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef HELPCOMPILER_HXX
+#define HELPCOMPILER_HXX
+
+#include <string>
+#include <hash_map>
+#include <vector>
+#include <list>
+#include <fstream>
+#include <iostream>
+#include <sstream>
+#include <algorithm>
+#include <ctype.h>
+#ifdef SYSTEM_DB
+#include <db.h>
+#else
+#include <berkeleydb/db.h>
+#endif
+
+#include <boost/shared_ptr.hpp>
+
+#include <libxml/xmlmemory.h>
+#include <libxml/debugXML.h>
+#include <libxml/HTMLtree.h>
+#include <libxml/xmlIO.h>
+#include <libxml/xinclude.h>
+#include <libxml/catalog.h>
+
+#include <rtl/ustring.hxx>
+#include <osl/thread.h>
+#include <osl/process.h>
+#include <osl/file.hxx>
+
+#include <compilehelp.hxx>
+
+#define EMULATEORIGINAL 1
+
+#ifdef CMCDEBUG
+ #define HCDBG(foo) do { if (1) foo; } while(0)
+#else
+ #define HCDBG(foo) do { if (0) foo; } while(0)
+#endif
+
+namespace fs
+{
+ rtl_TextEncoding getThreadTextEncoding( void );
+
+ enum convert { native };
+ class path
+ {
+ public:
+ ::rtl::OUString data;
+ public:
+ path() {}
+ path(const path &rOther) : data(rOther.data) {}
+ path(const std::string &in, convert)
+ {
+ rtl::OUString sWorkingDir;
+ osl_getProcessWorkingDir(&sWorkingDir.pData);
+
+ rtl::OString tmp(in.c_str());
+ rtl::OUString ustrSystemPath(rtl::OStringToOUString(tmp, getThreadTextEncoding()));
+ osl::File::getFileURLFromSystemPath(ustrSystemPath, data);
+ osl::File::getAbsoluteFileURL(sWorkingDir, data, data);
+ }
+ path(const std::string &FileURL)
+ {
+ rtl::OString tmp(FileURL.c_str());
+ data = rtl::OStringToOUString(tmp, getThreadTextEncoding());
+ }
+ std::string native_file_string() const
+ {
+ ::rtl::OUString ustrSystemPath;
+ osl::File::getSystemPathFromFileURL(data, ustrSystemPath);
+ rtl::OString tmp(rtl::OUStringToOString(ustrSystemPath, getThreadTextEncoding()));
+ HCDBG(std::cerr << "native_file_string is " << tmp.getStr() << std::endl);
+ return std::string(tmp.getStr());
+ }
+ std::string native_directory_string() const { return native_file_string(); }
+ std::string toUTF8() const
+ {
+ rtl::OString tmp(rtl::OUStringToOString(data, RTL_TEXTENCODING_UTF8));
+ return std::string(tmp.getStr());
+ }
+ bool empty() const { return data.getLength() == 0; }
+ path operator/(const std::string &in) const
+ {
+ path ret(*this);
+ HCDBG(std::cerr << "orig was " <<
+ rtl::OUStringToOString(ret.data, RTL_TEXTENCODING_UTF8).getStr() << std::endl);
+ rtl::OString tmp(in.c_str());
+ rtl::OUString ustrSystemPath(rtl::OStringToOUString(tmp, getThreadTextEncoding()));
+ ret.data += rtl::OUString(sal_Unicode('/'));
+ ret.data += ustrSystemPath;
+ HCDBG(std::cerr << "final is " <<
+ rtl::OUStringToOString(ret.data, RTL_TEXTENCODING_UTF8).getStr() << std::endl);
+ return ret;
+ }
+ void append(const char *in)
+ {
+ rtl::OString tmp(in);
+ rtl::OUString ustrSystemPath(rtl::OStringToOUString(tmp, getThreadTextEncoding()));
+ data = data + ustrSystemPath;
+ }
+ void append(const std::string &in) { append(in.c_str()); }
+ };
+
+ void create_directory(const fs::path indexDirName);
+ void rename(const fs::path &src, const fs::path &dest);
+ void copy(const fs::path &src, const fs::path &dest);
+ bool exists(const fs::path &in);
+ void remove_all(const fs::path &in);
+ void remove(const fs::path &in);
+}
+
+struct joaat_hash
+{
+ size_t operator()(const std::string &str) const
+ {
+ size_t hash = 0;
+ const char *key = str.data();
+ for (size_t i = 0; i < str.size(); i++)
+ {
+ hash += key[i];
+ hash += (hash << 10);
+ hash ^= (hash >> 6);
+ }
+ hash += (hash << 3);
+ hash ^= (hash >> 11);
+ hash += (hash << 15);
+ return hash;
+ }
+};
+
+#define get16bits(d) ((((sal_uInt32)(((const sal_uInt8 *)(d))[1])) << 8)\
+ +(sal_uInt32)(((const sal_uInt8 *)(d))[0]) )
+
+struct SuperFastHash
+{
+ size_t operator()(const std::string &str) const
+ {
+ const char * data = str.data();
+ int len = str.size();
+ size_t hash = len, tmp;
+ if (len <= 0 || data == NULL) return 0;
+
+ int rem = len & 3;
+ len >>= 2;
+
+ /* Main loop */
+ for (;len > 0; len--)
+ {
+ hash += get16bits (data);
+ tmp = (get16bits (data+2) << 11) ^ hash;
+ hash = (hash << 16) ^ tmp;
+ data += 2*sizeof (sal_uInt16);
+ hash += hash >> 11;
+ }
+
+ /* Handle end cases */
+ switch (rem)
+ {
+ case 3: hash += get16bits (data);
+ hash ^= hash << 16;
+ hash ^= data[sizeof (sal_uInt16)] << 18;
+ hash += hash >> 11;
+ break;
+ case 2: hash += get16bits (data);
+ hash ^= hash << 11;
+ hash += hash >> 17;
+ break;
+ case 1: hash += *data;
+ hash ^= hash << 10;
+ hash += hash >> 1;
+ }
+
+ /* Force "avalanching" of final 127 bits */
+ hash ^= hash << 3;
+ hash += hash >> 5;
+ hash ^= hash << 4;
+ hash += hash >> 17;
+ hash ^= hash << 25;
+ hash += hash >> 6;
+
+ return hash;
+ }
+};
+
+#define pref_hash joaat_hash
+
+typedef std::hash_map<std::string, std::string, pref_hash> Stringtable;
+typedef std::list<std::string> LinkedList;
+typedef std::vector<std::string> HashSet;
+
+typedef std::hash_map<std::string, LinkedList, pref_hash> Hashtable;
+
+class StreamTable
+{
+public:
+ std::string document_id;
+ std::string document_path;
+ std::string document_module;
+ std::string document_title;
+
+ HashSet *appl_hidlist;
+ Hashtable *appl_keywords;
+ Stringtable *appl_helptexts;
+ xmlDocPtr appl_doc;
+
+ HashSet *default_hidlist;
+ Hashtable *default_keywords;
+ Stringtable *default_helptexts;
+ xmlDocPtr default_doc;
+
+ StreamTable() :
+ appl_hidlist(NULL), appl_keywords(NULL), appl_helptexts(NULL), appl_doc(NULL),
+ default_hidlist(NULL), default_keywords(NULL), default_helptexts(NULL), default_doc(NULL)
+ {}
+ void dropdefault()
+ {
+ delete default_hidlist;
+ delete default_keywords;
+ delete default_helptexts;
+ if (default_doc) xmlFreeDoc(default_doc);
+ }
+ void dropappl()
+ {
+ delete appl_hidlist;
+ delete appl_keywords;
+ delete appl_helptexts;
+ if (appl_doc) xmlFreeDoc(appl_doc);
+ }
+ ~StreamTable()
+ {
+ dropappl();
+ dropdefault();
+ }
+};
+
+struct HelpProcessingException
+{
+ HelpProcessingErrorClass m_eErrorClass;
+ std::string m_aErrorMsg;
+ std::string m_aXMLParsingFile;
+ int m_nXMLParsingLine;
+
+ HelpProcessingException( HelpProcessingErrorClass eErrorClass, const std::string& aErrorMsg )
+ : m_eErrorClass( eErrorClass )
+ , m_aErrorMsg( aErrorMsg )
+ {}
+ HelpProcessingException( const std::string& aErrorMsg, const std::string& aXMLParsingFile, int nXMLParsingLine )
+ : m_eErrorClass( HELPPROCESSING_XMLPARSING_ERROR )
+ , m_aErrorMsg( aErrorMsg )
+ , m_aXMLParsingFile( aXMLParsingFile )
+ , m_nXMLParsingLine( nXMLParsingLine )
+ {}
+};
+
+class HelpCompiler
+{
+public:
+ HelpCompiler(StreamTable &streamTable,
+ const fs::path &in_inputFile,
+ const fs::path &in_src,
+ const fs::path &in_resEmbStylesheet,
+ const std::string &in_module,
+ const std::string &in_lang,
+ bool in_bExtensionMode);
+ bool compile( void ) throw (HelpProcessingException);
+ void addEntryToJarFile(const std::string &prefix,
+ const std::string &entryName, const std::string &bytesToAdd);
+ void addEntryToJarFile(const std::string &prefix,
+ const std::string &entryName, const HashSet &bytesToAdd);
+ void addEntryToJarFile(const std::string &prefix,
+ const std::string &entryName, const Stringtable &bytesToAdd);
+ void addEntryToJarFile(const std::string &prefix,
+ const std::string &entryName, const Hashtable &bytesToAdd);
+private:
+ xmlDocPtr getSourceDocument(const fs::path &filePath);
+ HashSet switchFind(xmlDocPtr doc);
+ xmlNodePtr clone(xmlNodePtr node, const std::string& appl);
+ StreamTable &streamTable;
+ const fs::path inputFile, src;
+ const std::string module, lang;
+ const fs::path resEmbStylesheet;
+ bool bExtensionMode;
+};
+
+#endif
+
+/* vi:set tabstop=4 shiftwidth=4 expandtab: */
diff --git a/transex3/source/help/HelpFileDocument.java b/transex3/source/help/HelpFileDocument.java
new file mode 100644
index 000000000000..2212db27f251
--- /dev/null
+++ b/transex3/source/help/HelpFileDocument.java
@@ -0,0 +1,89 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: HelpFileDocument.java,v $
+ * $Revision: 1.2 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.help;
+
+import java.io.File;
+import java.io.Reader;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+//import java.io.FileReader;
+import java.io.StringReader;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+
+/** Lucene Document for help files */
+public class HelpFileDocument
+{
+ /** Creates reader for UTF-8 files
+ */
+ private static Reader getReaderForFile( File aFile )
+ throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException {
+ Reader aReader;
+ if( aFile != null ) {
+ FileInputStream fis = new FileInputStream( aFile );
+ aReader = new InputStreamReader( fis, "UTF-8" );
+ }
+ else {
+ aReader = new StringReader( "" );
+ }
+ return aReader;
+ }
+
+ /** Makes a document for a File.
+ */
+ public static Document Document( String aModule, File aCaptionFile, File aContentFile )
+ throws java.io.FileNotFoundException, java.io.UnsupportedEncodingException {
+ Document doc = new Document();
+
+ // Add the path of the file as a field named "path". Use a field that is
+ // indexed (i.e. searchable), but don't tokenize the field into words.
+ File aFile = aCaptionFile != null ? aCaptionFile : aContentFile;
+ if( aFile != null )
+ {
+ String aPath = "#HLP#" + aModule + "/" + aFile.getName();
+ doc.add(new Field("path", aPath, Field.Store.YES, Field.Index.UN_TOKENIZED));
+ }
+
+ // Add the caption of the file to a field named "caption". Specify a Reader,
+ // so that the text of the file is tokenized and indexed, but not stored.
+ doc.add( new Field( "caption", getReaderForFile( aCaptionFile ) ) );
+
+ // Add the contents of the file to a field named "content". Specify a Reader,
+ // so that the text of the file is tokenized and indexed, but not stored.
+ doc.add( new Field( "content", getReaderForFile( aContentFile ) ) );
+
+ // return the document
+ return doc;
+ }
+
+ private HelpFileDocument() {}
+}
diff --git a/transex3/source/help/HelpIndexerTool.java b/transex3/source/help/HelpIndexerTool.java
new file mode 100644
index 000000000000..76125450c6f1
--- /dev/null
+++ b/transex3/source/help/HelpIndexerTool.java
@@ -0,0 +1,346 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: HelpIndexer.java,v $
+ * $Revision: 1.21 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package com.sun.star.help;
+
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+import java.util.zip.CRC32;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.analysis.cjk.CJKAnalyzer;
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.index.IndexWriter;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.Date;
+
+public class HelpIndexerTool
+{
+ public HelpIndexerTool()
+ {
+ }
+
+
+ /**
+ * @param args the command line arguments
+ */
+ public static void main( String[] args )
+ {
+ boolean bExtensionMode = false;
+ mainImpl( args, bExtensionMode );
+ }
+
+ public static void mainImpl( String[] args, boolean bExtensionMode )
+ {
+ String aDirToZipStr = "";
+ String aSrcDirStr = "";
+ String aLanguageStr = "";
+ String aModule = "";
+ String aTargetZipFileStr = "";
+
+ // Scan arguments
+ boolean bLang = false;
+ boolean bMod = false;
+ boolean bZipDir = false;
+ boolean bSrcDir = false;
+ boolean bOutput = false;
+
+ int nArgCount = args.length;
+ for( int i = 0 ; i < nArgCount ; i++ )
+ {
+ if( "-lang".equals(args[i]) )
+ {
+ if( i + 1 < nArgCount )
+ {
+ aLanguageStr = args[i + 1];
+ bLang = true;
+ }
+ i++;
+ }
+ else if( "-mod".equals(args[i]) )
+ {
+ if( i + 1 < nArgCount )
+ {
+ aModule = args[i + 1];
+ bMod = true;
+ }
+ i++;
+ }
+ else if( "-zipdir".equals(args[i]) )
+ {
+ if( i + 1 < nArgCount )
+ {
+ aDirToZipStr = args[i + 1];
+ bZipDir = true;
+ }
+ i++;
+ }
+ else if( "-srcdir".equals(args[i]) )
+ {
+ if( i + 1 < nArgCount )
+ {
+ aSrcDirStr = args[i + 1];
+ bSrcDir = true;
+ }
+ i++;
+ }
+ else if( "-o".equals(args[i]) )
+ {
+ if( i + 1 < nArgCount )
+ {
+ aTargetZipFileStr = args[i + 1];
+ bOutput = true;
+ }
+ i++;
+ }
+ }
+
+ if( !bLang || !bMod || !bZipDir || (!bOutput && !bExtensionMode) )
+ {
+ if( bExtensionMode )
+ return;
+
+ System.out.println("Usage: HelpIndexer -lang ISOLangCode -mod HelpModule -zipdir TempZipDir -o OutputZipFile");
+ System.exit( -1 );
+ }
+
+ String aIndexDirName = aModule + ".idxl";
+ File aIndexDir = new File( aDirToZipStr + File.separator + aIndexDirName );
+ if( !bSrcDir )
+ aSrcDirStr = aDirToZipStr;
+ File aCaptionFilesDir = new File( aSrcDirStr + File.separator + "caption" );
+ File aContentFilesDir = new File( aSrcDirStr + File.separator + "content" );
+
+ try
+ {
+ Date start = new Date();
+ Analyzer analyzer = aLanguageStr.equals("ja") ? (Analyzer)new CJKAnalyzer() : (Analyzer)new StandardAnalyzer();
+ IndexWriter writer = new IndexWriter( aIndexDir, analyzer, true );
+ if( !bExtensionMode )
+ System.out.println( "Lucene: Indexing to directory '" + aIndexDir + "'..." );
+ int nRet = indexDocs( writer, aModule, bExtensionMode, aCaptionFilesDir, aContentFilesDir );
+ if( nRet != -1 )
+ {
+ if( !bExtensionMode )
+ {
+ System.out.println();
+ System.out.println( "Optimizing ..." );
+ }
+ writer.optimize();
+ }
+ writer.close();
+
+ if( bExtensionMode )
+ {
+ if( !bSrcDir )
+ {
+ deleteRecursively( aCaptionFilesDir );
+ deleteRecursively( aContentFilesDir );
+ }
+ }
+ else
+ {
+ if( nRet == -1 )
+ deleteRecursively( aIndexDir );
+
+ if( !bExtensionMode )
+ System.out.println( "Zipping ..." );
+ File aDirToZipFile = new File( aDirToZipStr );
+ createZipFile( aDirToZipFile, aTargetZipFileStr );
+ deleteRecursively( aDirToZipFile );
+ }
+
+ Date end = new Date();
+ if( !bExtensionMode )
+ System.out.println(end.getTime() - start.getTime() + " total milliseconds");
+ }
+ catch (IOException e)
+ {
+ if( bExtensionMode )
+ return;
+
+ System.out.println(" caught a " + e.getClass() +
+ "\n with message: " + e.getMessage());
+ System.exit( -1 );
+ }
+ }
+
+ private static int indexDocs(IndexWriter writer, String aModule, boolean bExtensionMode,
+ File aCaptionFilesDir, File aContentFilesDir) throws IOException
+ {
+ if( !aCaptionFilesDir.canRead() || !aCaptionFilesDir.isDirectory() )
+ {
+ if( !bExtensionMode )
+ System.out.println( "Not found: " + aCaptionFilesDir );
+ return -1;
+ }
+ if( !aContentFilesDir.canRead() || !aContentFilesDir.isDirectory() )
+ {
+ if( !bExtensionMode )
+ System.out.println( "Not found: " + aContentFilesDir );
+ return -1;
+ }
+
+ String[] aCaptionFiles = aCaptionFilesDir.list();
+ List aCaptionFilesList = Arrays.asList( aCaptionFiles );
+ HashSet aCaptionFilesHashSet = new HashSet( aCaptionFilesList );
+
+ String[] aContentFiles = aContentFilesDir.list();
+ List aContentFilesList = Arrays.asList( aContentFiles );
+ HashSet aContentFilesHashSet = new HashSet( aContentFilesList );
+
+ // Loop over caption files and find corresponding content file
+ if( !bExtensionMode )
+ System.out.println( "Indexing, adding files" );
+ int nCaptionFilesLen = aCaptionFiles.length;
+ for( int i = 0 ; i < nCaptionFilesLen ; i++ )
+ {
+ String aCaptionFileStr = aCaptionFiles[i];
+ File aCaptionFile = new File( aCaptionFilesDir, aCaptionFileStr );
+ File aContentFile = null;
+ if( aContentFilesHashSet.contains( aCaptionFileStr ) )
+ aContentFile = new File( aContentFilesDir, aCaptionFileStr );
+
+ if( !bExtensionMode )
+ System.out.print( "." );
+ writer.addDocument( HelpFileDocument.Document( aModule, aCaptionFile, aContentFile ) );
+ }
+
+ // Loop over content files to find remaining files not mapped to caption files
+ int nContentFilesLen = aContentFiles.length;
+ for( int i = 0 ; i < nContentFilesLen ; i++ )
+ {
+ String aContentFileStr = aContentFiles[i];
+ if( !aCaptionFilesHashSet.contains( aContentFileStr ) )
+ {
+ // Not already handled in caption files loop
+ File aCaptionFile = null;
+ File aContentFile = new File( aContentFilesDir, aContentFileStr );
+ if( !bExtensionMode )
+ System.out.print( "." );
+ writer.addDocument( HelpFileDocument.Document( aModule, aCaptionFile, aContentFile ) );
+ }
+ }
+ return 0;
+ }
+
+ public static void createZipFile( File aDirToZip, String aTargetZipFileStr )
+ throws FileNotFoundException, IOException
+ {
+ FileOutputStream fos = new FileOutputStream( aTargetZipFileStr );
+ ZipOutputStream zos = new ZipOutputStream( fos );
+
+ File[] aChildrenFiles = aDirToZip.listFiles();
+ int nFileCount = aChildrenFiles.length;
+ for( int i = 0 ; i < nFileCount ; i++ )
+ addToZipRecursively( zos, aChildrenFiles[i], null );
+
+ zos.close();
+ }
+
+ public static void addToZipRecursively( ZipOutputStream zos, File aFile, String aBasePath )
+ throws FileNotFoundException, IOException
+ {
+ if( aFile.isDirectory() )
+ {
+ String aDirName = aFile.getName();
+ if( aDirName.equalsIgnoreCase( "caption" ) || aDirName.equalsIgnoreCase( "content" ) )
+ return;
+
+ File[] aChildrenFiles = aFile.listFiles();
+ String aNewBasePath = "";
+ if( aBasePath != null )
+ aNewBasePath += aBasePath + File.separator;
+ aNewBasePath += aDirName;
+
+ int nFileCount = aChildrenFiles.length;
+ for( int i = 0 ; i < nFileCount ; i++ )
+ addToZipRecursively( zos, aChildrenFiles[i], aNewBasePath );
+
+ return;
+ }
+
+ // No directory
+ // read contents of file we are going to put in the zip
+ int fileLength = (int) aFile.length();
+ FileInputStream fis = new FileInputStream( aFile );
+ byte[] wholeFile = new byte[fileLength];
+ int bytesRead = fis.read( wholeFile, 0, fileLength );
+ fis.close();
+
+ String aFileName = aFile.getName();
+ String aEntryName = "";
+ if( aBasePath != null )
+ aEntryName += aBasePath + "/";
+ aEntryName += aFileName;
+ ZipEntry aZipEntry = new ZipEntry( aEntryName );
+ aZipEntry.setTime( aFile.lastModified() );
+ aZipEntry.setSize( fileLength );
+
+ int nMethod = ( aFileName.toLowerCase().endsWith( ".jar" ) )
+ ? ZipEntry.STORED : ZipEntry.DEFLATED;
+ aZipEntry.setMethod( nMethod );
+
+ CRC32 tempCRC = new CRC32();
+ tempCRC.update( wholeFile, 0, wholeFile.length );
+ aZipEntry.setCrc( tempCRC.getValue() );
+
+ // write the contents into the zip element
+ zos.putNextEntry( aZipEntry );
+ zos.write( wholeFile, 0, fileLength );
+ zos.closeEntry();
+ }
+
+ static public boolean deleteRecursively( File aFile )
+ {
+ if( aFile.isDirectory() )
+ {
+ File[] aChildrenFiles = aFile.listFiles();
+ int nFileCount = aChildrenFiles.length;
+ for( int i = 0 ; i < nFileCount ; i++ )
+ {
+ File aChildrenFile = aChildrenFiles[i];
+ boolean bSuccess = deleteRecursively( aChildrenFile );
+ if( !bSuccess )
+ return false;
+ }
+ }
+
+ return aFile.delete();
+ }
+}
+
diff --git a/transex3/source/help/HelpLinker.cxx b/transex3/source/help/HelpLinker.cxx
new file mode 100644
index 000000000000..67049df439e1
--- /dev/null
+++ b/transex3/source/help/HelpLinker.cxx
@@ -0,0 +1,1157 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: HelpLinker.cxx,v $
+ * $Revision: 1.16 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "HelpCompiler.hxx"
+
+#include <map>
+
+#include <string.h>
+#include <limits.h>
+
+#include <libxslt/xslt.h>
+#include <libxslt/transform.h>
+#include <libxslt/xsltutils.h>
+#include <libxslt/functions.h>
+#include <libxslt/extensions.h>
+
+#include <sal/types.h>
+#include <osl/time.h>
+#include <rtl/bootstrap.hxx>
+
+#ifdef SYSTEM_EXPAT
+#include <expat.h>
+#else
+#include <expat/xmlparse.h>
+#endif
+
+#define DBHELP_ONLY
+
+
+class IndexerPreProcessor
+{
+private:
+ std::string m_aModuleName;
+ fs::path m_fsIndexBaseDir;
+ fs::path m_fsCaptionFilesDirName;
+ fs::path m_fsContentFilesDirName;
+
+ xsltStylesheetPtr m_xsltStylesheetPtrCaption;
+ xsltStylesheetPtr m_xsltStylesheetPtrContent;
+
+public:
+ IndexerPreProcessor( const std::string& aModuleName, const fs::path& fsIndexBaseDir,
+ const fs::path& idxCaptionStylesheet, const fs::path& idxContentStylesheet );
+ ~IndexerPreProcessor();
+
+ void processDocument( xmlDocPtr doc, const std::string& EncodedDocPath );
+};
+
+IndexerPreProcessor::IndexerPreProcessor
+ ( const std::string& aModuleName, const fs::path& fsIndexBaseDir,
+ const fs::path& idxCaptionStylesheet, const fs::path& idxContentStylesheet )
+ : m_aModuleName( aModuleName )
+ , m_fsIndexBaseDir( fsIndexBaseDir )
+{
+ m_fsCaptionFilesDirName = fsIndexBaseDir / "caption";
+ fs::create_directory( m_fsCaptionFilesDirName );
+
+ m_fsContentFilesDirName = fsIndexBaseDir / "content";
+ fs::create_directory( m_fsContentFilesDirName );
+
+ m_xsltStylesheetPtrCaption = xsltParseStylesheetFile
+ ((const xmlChar *)idxCaptionStylesheet.native_file_string().c_str());
+ m_xsltStylesheetPtrContent = xsltParseStylesheetFile
+ ((const xmlChar *)idxContentStylesheet.native_file_string().c_str());
+}
+
+IndexerPreProcessor::~IndexerPreProcessor()
+{
+ if( m_xsltStylesheetPtrCaption )
+ xsltFreeStylesheet( m_xsltStylesheetPtrCaption );
+ if( m_xsltStylesheetPtrContent )
+ xsltFreeStylesheet( m_xsltStylesheetPtrContent );
+}
+
+
+std::string getEncodedPath( const std::string& Path )
+{
+ rtl::OString aOStr_Path( Path.c_str() );
+ rtl::OUString aOUStr_Path( rtl::OStringToOUString
+ ( aOStr_Path, fs::getThreadTextEncoding() ) );
+ rtl::OUString aPathURL;
+ osl::File::getFileURLFromSystemPath( aOUStr_Path, aPathURL );
+ rtl::OString aOStr_PathURL( rtl::OUStringToOString
+ ( aPathURL, fs::getThreadTextEncoding() ) );
+ std::string aStdStr_PathURL( aOStr_PathURL.getStr() );
+ return aStdStr_PathURL;
+}
+
+void IndexerPreProcessor::processDocument
+ ( xmlDocPtr doc, const std::string &EncodedDocPath )
+{
+ std::string aStdStr_EncodedDocPathURL = getEncodedPath( EncodedDocPath );
+
+ xmlDocPtr resCaption = xsltApplyStylesheet( m_xsltStylesheetPtrCaption, doc, NULL );
+ xmlNodePtr pResNodeCaption = resCaption->xmlChildrenNode;
+ if( pResNodeCaption )
+ {
+ fs::path fsCaptionPureTextFile_docURL = m_fsCaptionFilesDirName / aStdStr_EncodedDocPathURL;
+ std::string aCaptionPureTextFileStr_docURL = fsCaptionPureTextFile_docURL.native_file_string();
+ FILE* pFile_docURL = fopen( aCaptionPureTextFileStr_docURL.c_str(), "w" );
+ if( pFile_docURL )
+ {
+ fprintf( pFile_docURL, "%s\n", pResNodeCaption->content );
+ fclose( pFile_docURL );
+ }
+ }
+ xmlFreeDoc(resCaption);
+
+ xmlDocPtr resContent = xsltApplyStylesheet( m_xsltStylesheetPtrContent, doc, NULL );
+ xmlNodePtr pResNodeContent = resContent->xmlChildrenNode;
+ if( pResNodeContent )
+ {
+ fs::path fsContentPureTextFile_docURL = m_fsContentFilesDirName / aStdStr_EncodedDocPathURL;
+ std::string aContentPureTextFileStr_docURL = fsContentPureTextFile_docURL.native_file_string();
+ FILE* pFile_docURL = fopen( aContentPureTextFileStr_docURL.c_str(), "w" );
+ if( pFile_docURL )
+ {
+ fprintf( pFile_docURL, "%s\n", pResNodeContent->content );
+ fclose( pFile_docURL );
+ }
+ }
+ xmlFreeDoc(resContent);
+}
+
+struct Data
+{
+ std::vector<std::string> _idList;
+ typedef std::vector<std::string>::const_iterator cIter;
+
+ void append(const std::string &id)
+ {
+ _idList.push_back(id);
+ }
+
+ std::string getString() const
+ {
+ std::string ret;
+ cIter aEnd = _idList.end();
+ for (cIter aIter = _idList.begin(); aIter != aEnd; ++aIter)
+ ret += *aIter + ";";
+ return ret;
+ }
+};
+
+void writeKeyValue_DBHelp( FILE* pFile, const std::string& aKeyStr, const std::string& aValueStr )
+{
+ if( pFile == NULL )
+ return;
+ char cLF = 10;
+ int nKeyLen = aKeyStr.length();
+ int nValueLen = aValueStr.length();
+ fprintf( pFile, "%x ", nKeyLen );
+ if( nKeyLen > 0 )
+ fwrite( aKeyStr.c_str(), 1, nKeyLen, pFile );
+ fprintf( pFile, " %x ", nValueLen );
+ if( nValueLen > 0 )
+ fwrite( aValueStr.c_str(), 1, nValueLen, pFile );
+ fprintf( pFile, "%c", cLF );
+}
+
+class HelpKeyword
+{
+private:
+ typedef std::hash_map<std::string, Data, pref_hash> DataHashtable;
+ DataHashtable _hash;
+
+public:
+ void insert(const std::string &key, const std::string &id)
+ {
+ Data &data = _hash[key];
+ data.append(id);
+ }
+
+ void dump(DB* table)
+ {
+ DataHashtable::const_iterator aEnd = _hash.end();
+ for (DataHashtable::const_iterator aIter = _hash.begin(); aIter != aEnd; ++aIter)
+ {
+ const std::string &keystr = aIter->first;
+ DBT key;
+ memset(&key, 0, sizeof(key));
+ key.data = const_cast<char*>(keystr.c_str());
+ key.size = keystr.length();
+
+ const Data &data = aIter->second;
+ std::string str = data.getString();
+ DBT value;
+ memset(&value, 0, sizeof(value));
+ value.data = const_cast<char*>(str.c_str());
+ value.size = str.length();
+
+ table->put(table, NULL, &key, &value, 0);
+ }
+ }
+
+ void dump_DBHelp( const std::string& rFileName )
+ {
+ FILE* pFile = fopen( rFileName.c_str(), "wb" );
+ if( pFile == NULL )
+ return;
+
+ DataHashtable::const_iterator aEnd = _hash.end();
+ for (DataHashtable::const_iterator aIter = _hash.begin(); aIter != aEnd; ++aIter)
+ writeKeyValue_DBHelp( pFile, aIter->first, aIter->second.getString() );
+
+ fclose( pFile );
+ }
+};
+
+class HelpLinker
+{
+public:
+ void main(std::vector<std::string> &args, std::string* pExtensionPath = NULL )
+ throw( HelpProcessingException );
+
+ HelpLinker()
+ : init(true)
+ , m_pIndexerPreProcessor(NULL)
+ {}
+ ~HelpLinker()
+ { delete m_pIndexerPreProcessor; }
+
+private:
+ int locCount, totCount;
+ Stringtable additionalFiles;
+ HashSet helpFiles;
+ fs::path sourceRoot;
+ fs::path embeddStylesheet;
+ fs::path idxCaptionStylesheet;
+ fs::path idxContentStylesheet;
+ fs::path zipdir;
+ fs::path outputFile;
+ std::string module;
+ std::string lang;
+ std::string hid;
+ std::string extensionPath;
+ bool bExtensionMode;
+ fs::path indexDirName;
+ Stringtable hidlistTranslation;
+ fs::path indexDirParentName;
+ bool init;
+ IndexerPreProcessor* m_pIndexerPreProcessor;
+ void initIndexerPreProcessor();
+ void link() throw( HelpProcessingException );
+ void addBookmark( DB* dbBase, FILE* pFile_DBHelp, std::string thishid,
+ const std::string& fileB, const std::string& anchorB,
+ const std::string& jarfileB, const std::string& titleB );
+#if 0
+ /**
+ * @param outputFile
+ * @param module
+ * @param lang
+ * @param hid
+ * @param helpFiles
+ * @param additionalFiles
+ */
+
+ private HelpURLStreamHandlerFactory urlHandler = null;
+#endif
+};
+
+namespace URLEncoder
+{
+ static std::string encode(const std::string &rIn)
+ {
+ const char *good = "!$&'()*+,-.=@_";
+ static const char hex[17] = "0123456789ABCDEF";
+
+ std::string result;
+ for (size_t i=0; i < rIn.length(); ++i)
+ {
+ unsigned char c = rIn[i];
+ if (isalnum (c) || strchr (good, c))
+ result += c;
+ else {
+ result += '%';
+ result += hex[c >> 4];
+ result += hex[c & 0xf];
+ }
+ }
+ return result;
+ }
+}
+
+void HelpLinker::addBookmark( DB* dbBase, FILE* pFile_DBHelp, std::string thishid,
+ const std::string& fileB, const std::string& anchorB,
+ const std::string& jarfileB, const std::string& titleB)
+{
+ HCDBG(std::cerr << "HelpLinker::addBookmark " << thishid << " " <<
+ fileB << " " << anchorB << " " << jarfileB << " " << titleB << std::endl);
+
+ std::string temp = thishid;
+ std::transform (temp.begin(), temp.end(), temp.begin(), toupper);
+ std::replace(temp.begin(), temp.end(), ':', '_');
+ const std::string& translatedHid = hidlistTranslation[temp];
+ if (!translatedHid.empty())
+ thishid = translatedHid;
+
+ thishid = URLEncoder::encode(thishid);
+
+ DBT key;
+ memset(&key, 0, sizeof(key));
+ key.data = const_cast<char*>(thishid.c_str());
+ key.size = thishid.length();
+
+ int fileLen = fileB.length();
+ if (!anchorB.empty())
+ fileLen += (1 + anchorB.length());
+ int dataLen = 1 + fileLen + 1 + jarfileB.length() + 1 + titleB.length();
+
+ std::vector<unsigned char> dataB(dataLen);
+ size_t i = 0;
+ dataB[i++] = static_cast<unsigned char>(fileLen);
+ for (size_t j = 0; j < fileB.length(); ++j)
+ dataB[i++] = fileB[j];
+ if (!anchorB.empty())
+ {
+ dataB[i++] = '#';
+ for (size_t j = 0; j < anchorB.length(); ++j)
+ dataB[i++] = anchorB[j];
+ }
+ dataB[i++] = static_cast<unsigned char>(jarfileB.length());
+ for (size_t j = 0; j < jarfileB.length(); ++j)
+ dataB[i++] = jarfileB[j];
+
+ dataB[i++] = static_cast<unsigned char>(titleB.length());
+ for (size_t j = 0; j < titleB.length(); ++j)
+ dataB[i++] = titleB[j];
+
+ DBT data;
+ memset(&data, 0, sizeof(data));
+ data.data = &dataB[0];
+ data.size = dataB.size();
+
+ if( dbBase != NULL )
+ dbBase->put(dbBase, NULL, &key, &data, 0);
+
+ if( pFile_DBHelp != NULL )
+ {
+ std::string aValueStr( dataB.begin(), dataB.end() );
+ writeKeyValue_DBHelp( pFile_DBHelp, thishid, aValueStr );
+ }
+}
+
+void HelpLinker::initIndexerPreProcessor()
+{
+ if( m_pIndexerPreProcessor )
+ delete m_pIndexerPreProcessor;
+ std::string mod = module;
+ std::transform (mod.begin(), mod.end(), mod.begin(), tolower);
+ m_pIndexerPreProcessor = new IndexerPreProcessor( mod, indexDirParentName,
+ idxCaptionStylesheet, idxContentStylesheet );
+}
+
+/**
+*
+*/
+void HelpLinker::link() throw( HelpProcessingException )
+{
+ bool bIndexForExtension = true;
+
+ if( bExtensionMode )
+ {
+ indexDirParentName = sourceRoot;
+ }
+ else
+ {
+ indexDirParentName = zipdir;
+ fs::create_directory(indexDirParentName);
+ }
+
+#ifdef CMC_DEBUG
+ std::cerr << "will not delete tmpdir of " << indexDirParentName.native_file_string().c_str() << std::endl;
+#endif
+
+ std::string mod = module;
+ std::transform (mod.begin(), mod.end(), mod.begin(), tolower);
+
+ // do the work here
+ // continue with introduction of the overall process thing into the
+ // here all hzip files will be worked on
+ std::string appl = mod;
+ if (appl[0] == 's')
+ appl = appl.substr(1);
+
+ bool bUse_ = true;
+#ifdef DBHELP_ONLY
+ if( !bExtensionMode )
+ bUse_ = false;
+#endif
+
+ DB* helpText(0);
+#ifndef DBHELP_ONLY
+ fs::path helpTextFileName(indexDirParentName / (mod + ".ht"));
+ db_create(&helpText,0,0);
+ helpText->open(helpText, NULL, helpTextFileName.native_file_string().c_str(), NULL, DB_BTREE,
+ DB_CREATE | DB_TRUNCATE, 0644);
+#endif
+
+ fs::path helpTextFileName_DBHelp(indexDirParentName / (mod + (bUse_ ? ".ht_" : ".ht")));
+ FILE* pFileHelpText_DBHelp = fopen
+ ( helpTextFileName_DBHelp.native_file_string().c_str(), "wb" );
+
+ DB* dbBase(0);
+#ifndef DBHELP_ONLY
+ fs::path dbBaseFileName(indexDirParentName / (mod + ".db"));
+ db_create(&dbBase,0,0);
+ dbBase->open(dbBase, NULL, dbBaseFileName.native_file_string().c_str(), NULL, DB_BTREE,
+ DB_CREATE | DB_TRUNCATE, 0644);
+#endif
+
+ fs::path dbBaseFileName_DBHelp(indexDirParentName / (mod + (bUse_ ? ".db_" : ".db")));
+ FILE* pFileDbBase_DBHelp = fopen
+ ( dbBaseFileName_DBHelp.native_file_string().c_str(), "wb" );
+
+#ifndef DBHELP_ONLY
+ DB* keyWord(0);
+ fs::path keyWordFileName(indexDirParentName / (mod + ".key"));
+ db_create(&keyWord,0,0);
+ keyWord->open(keyWord, NULL, keyWordFileName.native_file_string().c_str(), NULL, DB_BTREE,
+ DB_CREATE | DB_TRUNCATE, 0644);
+#endif
+
+ fs::path keyWordFileName_DBHelp(indexDirParentName / (mod + (bUse_ ? ".key_" : ".key")));
+
+ HelpKeyword helpKeyword;
+
+ // catch HelpProcessingException to avoid locking data bases
+ try
+ {
+
+ std::ifstream fileReader(hid.c_str());
+ while (fileReader)
+ {
+ std::string key;
+ fileReader >> key;
+ std::transform (key.begin(), key.end(), key.begin(), toupper);
+ std::replace(key.begin(), key.end(), ':', '_');
+ std::string data;
+ fileReader >> data;
+ if (!key.empty() && !data.empty())
+ hidlistTranslation[key] = data;
+ }
+ fileReader.close();
+
+ // lastly, initialize the indexBuilder
+ if ( (!bExtensionMode || bIndexForExtension) && !helpFiles.empty())
+ initIndexerPreProcessor();
+
+ if( !bExtensionMode )
+ {
+ std::cout << "Making " << outputFile.native_file_string() <<
+ " from " << helpFiles.size() << " input files" << std::endl;
+ }
+
+ // here we start our loop over the hzip files.
+ HashSet::iterator end = helpFiles.end();
+ for (HashSet::iterator iter = helpFiles.begin(); iter != end; ++iter)
+ {
+ if( !bExtensionMode )
+ {
+ std::cout << ".";
+ std::cout.flush();
+ }
+
+ // process one file
+ // streamTable contains the streams in the hzip file
+ StreamTable streamTable;
+ const std::string &xhpFileName = *iter;
+
+ if (!bExtensionMode && xhpFileName.rfind(".xhp") != xhpFileName.length()-4)
+ {
+ // only work on .xhp - files
+ std::cerr <<
+ "ERROR: input list entry '"
+ << xhpFileName
+ << "' has the wrong extension (only files with extension .xhp "
+ << "are accepted)";
+ continue;
+ }
+
+ fs::path langsourceRoot(sourceRoot);
+ fs::path xhpFile;
+
+ if( bExtensionMode )
+ {
+ // langsourceRoot == sourceRoot for extensions
+ std::string xhpFileNameComplete( extensionPath );
+ xhpFileNameComplete.append( '/' + xhpFileName );
+ xhpFile = fs::path( xhpFileNameComplete );
+ }
+ else
+ {
+ langsourceRoot.append('/' + lang + '/');
+ xhpFile = fs::path(xhpFileName, fs::native);
+ }
+
+ HelpCompiler hc( streamTable, xhpFile, langsourceRoot,
+ embeddStylesheet, module, lang, bExtensionMode );
+
+ HCDBG(std::cerr << "before compile of " << xhpFileName << std::endl);
+ bool success = hc.compile();
+ HCDBG(std::cerr << "after compile of " << xhpFileName << std::endl);
+
+ if (!success && !bExtensionMode)
+ {
+ std::stringstream aStrStream;
+ aStrStream <<
+ "\nERROR: compiling help particle '"
+ << xhpFileName
+ << "' for language '"
+ << lang
+ << "' failed!";
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ const std::string documentBaseId = streamTable.document_id;
+ std::string documentPath = streamTable.document_path;
+ if (documentPath.find("/") == 0)
+ documentPath = documentPath.substr(1);
+
+ std::string documentJarfile = streamTable.document_module + ".jar";
+
+ std::string documentTitle = streamTable.document_title;
+ if (documentTitle.empty())
+ documentTitle = "<notitle>";
+
+#if 0
+ std::cout << "for " << xhpFileName << " documentBaseId is " << documentBaseId << "\n";
+ std::cout << "for " << xhpFileName << " documentPath is " << documentPath << "\n";
+ std::cout << "for " << xhpFileName << " documentJarfile is " << documentJarfile << "\n";
+ std::cout << "for " << xhpFileName << " documentPath is " << documentTitle << "\n";
+#endif
+
+ const std::string& fileB = documentPath;
+ const std::string& jarfileB = documentJarfile;
+ std::string& titleB = documentTitle;
+
+ // add once this as its own id.
+ addBookmark(dbBase, pFileDbBase_DBHelp, documentPath, fileB, std::string(), jarfileB, titleB);
+
+ // first the database *.db
+ // ByteArrayInputStream bais = null;
+ // ObjectInputStream ois = null;
+
+ const HashSet *hidlist = streamTable.appl_hidlist;
+ if (!hidlist)
+ hidlist = streamTable.default_hidlist;
+ if (hidlist && !hidlist->empty())
+ {
+ // now iterate over all elements of the hidlist
+ HashSet::const_iterator aEnd = hidlist->end();
+ for (HashSet::const_iterator hidListIter = hidlist->begin();
+ hidListIter != aEnd; ++hidListIter)
+ {
+ std::string thishid = *hidListIter;
+
+ std::string anchorB;
+ size_t index = thishid.rfind('#');
+ if (index != std::string::npos)
+ {
+ anchorB = thishid.substr(1 + index);
+ thishid = thishid.substr(0, index);
+ }
+ addBookmark(dbBase, pFileDbBase_DBHelp, thishid, fileB, anchorB, jarfileB, titleB);
+ }
+ }
+
+ // now the keywords
+ const Hashtable *anchorToLL = streamTable.appl_keywords;
+ if (!anchorToLL)
+ anchorToLL = streamTable.default_keywords;
+ if (anchorToLL && !anchorToLL->empty())
+ {
+ std::string fakedHid = URLEncoder::encode(documentPath);
+ Hashtable::const_iterator aEnd = anchorToLL->end();
+ for (Hashtable::const_iterator enumer = anchorToLL->begin();
+ enumer != aEnd; ++enumer)
+ {
+ const std::string &anchor = enumer->first;
+ addBookmark(dbBase, pFileDbBase_DBHelp, documentPath, fileB,
+ anchor, jarfileB, titleB);
+ std::string totalId = fakedHid + "#" + anchor;
+ // std::cerr << hzipFileName << std::endl;
+ const LinkedList& ll = enumer->second;
+ LinkedList::const_iterator aOtherEnd = ll.end();
+ for (LinkedList::const_iterator llIter = ll.begin();
+ llIter != aOtherEnd; ++llIter)
+ {
+ helpKeyword.insert(*llIter, totalId);
+ }
+ }
+
+ }
+
+ // and last the helptexts
+ const Stringtable *helpTextHash = streamTable.appl_helptexts;
+ if (!helpTextHash)
+ helpTextHash = streamTable.default_helptexts;
+ if (helpTextHash && !helpTextHash->empty())
+ {
+ Stringtable::const_iterator aEnd = helpTextHash->end();
+ for (Stringtable::const_iterator helpTextIter = helpTextHash->begin();
+ helpTextIter != aEnd; ++helpTextIter)
+ {
+ std::string helpTextId = helpTextIter->first;
+ const std::string& helpTextText = helpTextIter->second;
+
+ std::string temp = helpTextId;
+ std::transform (temp.begin(), temp.end(), temp.begin(), toupper);
+ std::replace(temp.begin(), temp.end(), ':', '_');
+
+ const std::string& tHid = hidlistTranslation[temp];
+ if (!tHid.empty())
+ helpTextId = tHid;
+ helpTextId = URLEncoder::encode(helpTextId);
+
+ DBT keyDbt;
+ memset(&keyDbt, 0, sizeof(keyDbt));
+ keyDbt.data = const_cast<char*>(helpTextId.c_str());
+ keyDbt.size = helpTextId.length();
+
+ DBT textDbt;
+ memset(&textDbt, 0, sizeof(textDbt));
+ textDbt.data = const_cast<char*>(helpTextText.c_str());
+ textDbt.size = helpTextText.length();
+
+ if( helpText != NULL )
+ helpText->put(helpText, NULL, &keyDbt, &textDbt, 0);
+
+ if( pFileHelpText_DBHelp != NULL )
+ writeKeyValue_DBHelp( pFileHelpText_DBHelp, helpTextId, helpTextText );
+ }
+ }
+
+ //IndexerPreProcessor
+ if( !bExtensionMode || bIndexForExtension )
+ {
+ // now the indexing
+ xmlDocPtr document = streamTable.appl_doc;
+ if (!document)
+ document = streamTable.default_doc;
+ if (document)
+ {
+ std::string temp = module;
+ std::transform (temp.begin(), temp.end(), temp.begin(), tolower);
+ m_pIndexerPreProcessor->processDocument(document, URLEncoder::encode(documentPath) );
+ }
+ }
+
+ } // while loop over hzip files ending
+ if( !bExtensionMode )
+ std::cout << std::endl;
+
+ } // try
+ catch( HelpProcessingException& )
+ {
+ // catch HelpProcessingException to avoid locking data bases
+#ifndef DBHELP_ONLY
+ helpText->close(helpText, 0);
+ dbBase->close(dbBase, 0);
+ keyWord->close(keyWord, 0);
+#endif
+ if( pFileHelpText_DBHelp != NULL )
+ fclose( pFileHelpText_DBHelp );
+ if( pFileDbBase_DBHelp != NULL )
+ fclose( pFileDbBase_DBHelp );
+ throw;
+ }
+
+#ifndef DBHELP_ONLY
+ helpText->close(helpText, 0);
+ dbBase->close(dbBase, 0);
+ helpKeyword.dump(keyWord);
+ keyWord->close(keyWord, 0);
+#endif
+ if( pFileHelpText_DBHelp != NULL )
+ fclose( pFileHelpText_DBHelp );
+ if( pFileDbBase_DBHelp != NULL )
+ fclose( pFileDbBase_DBHelp );
+
+ helpKeyword.dump_DBHelp( keyWordFileName_DBHelp.native_file_string() );
+
+ if( !bExtensionMode )
+ {
+ // New index
+ Stringtable::iterator aEnd = additionalFiles.end();
+ for (Stringtable::iterator enumer = additionalFiles.begin(); enumer != aEnd;
+ ++enumer)
+ {
+ const std::string &additionalFileName = enumer->second;
+ const std::string &additionalFileKey = enumer->first;
+
+ fs::path fsAdditionalFileName( additionalFileName, fs::native );
+ std::string aNativeStr = fsAdditionalFileName.native_file_string();
+ const char* pStr = aNativeStr.c_str();
+ std::cerr << pStr;
+
+ fs::path fsTargetName( indexDirParentName / additionalFileKey );
+
+ fs::copy( fsAdditionalFileName, fsTargetName );
+ }
+ }
+
+/*
+ /////////////////////////////////////////////////////////////////////////
+ /// remove temprary directory for index creation
+ /////////////////////////////////////////////////////////////////////////
+#ifndef CMC_DEBUG
+ if( !bExtensionMode )
+ fs::remove_all( indexDirParentName );
+#endif
+*/
+}
+
+
+void HelpLinker::main(std::vector<std::string> &args, std::string* pExtensionPath)
+ throw( HelpProcessingException )
+{
+ rtl::OUString aOfficeHelpPath;
+
+ bExtensionMode = false;
+ if( pExtensionPath && pExtensionPath->length() > 0 )
+ {
+ helpFiles.clear();
+ bExtensionMode = true;
+ extensionPath = *pExtensionPath;
+ sourceRoot = fs::path(extensionPath);
+
+ aOfficeHelpPath = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("$OOO_BASE_DIR/help") );
+ rtl::Bootstrap::expandMacros( aOfficeHelpPath );
+ }
+ if (args.size() > 0 && args[0][0] == '@')
+ {
+ std::vector<std::string> stringList;
+ std::string strBuf;
+ std::ifstream fileReader(args[0].substr(1).c_str());
+
+ while (fileReader)
+ {
+ std::string token;
+ fileReader >> token;
+ if (!token.empty())
+ stringList.push_back(token);
+ }
+ fileReader.close();
+
+ args = stringList;
+ }
+
+ size_t i = 0;
+
+ while (i < args.size())
+ {
+ if (args[i].compare("-src") == 0)
+ {
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "sourceroot missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ if( !bExtensionMode )
+ sourceRoot = fs::path(args[i], fs::native);
+ }
+ else if (args[i].compare("-sty") == 0)
+ {
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "embeddingStylesheet missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ embeddStylesheet = fs::path(args[i], fs::native);
+ }
+ else if (args[i].compare("-zipdir") == 0)
+ {
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "idxtemp missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ zipdir = fs::path(args[i], fs::native);
+ }
+ else if (args[i].compare("-idxcaption") == 0)
+ {
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "idxcaption stylesheet missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ idxCaptionStylesheet = fs::path(args[i], fs::native);
+ }
+ else if (args[i].compare("-idxcontent") == 0)
+ {
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "idxcontent stylesheet missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ idxContentStylesheet = fs::path(args[i], fs::native);
+ }
+ else if (args[i].compare("-o") == 0)
+ {
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "outputfilename missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ outputFile = fs::path(args[i], fs::native);
+ }
+ else if (args[i].compare("-mod") == 0)
+ {
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "module name missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ module = args[i];
+ }
+ else if (args[i].compare("-lang") == 0)
+ {
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "language name missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ lang = args[i];
+ }
+ else if (args[i].compare("-hid") == 0)
+ {
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "hid list missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ hid = args[i];
+ }
+ else if (args[i].compare("-add") == 0)
+ {
+ std::string addFile, addFileUnderPath;
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "pathname missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ addFileUnderPath = args[i];
+ ++i;
+ if (i >= args.size())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "pathname missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+ addFile = args[i];
+ if (!addFileUnderPath.empty() && !addFile.empty())
+ additionalFiles[addFileUnderPath] = addFile;
+ }
+ else
+ helpFiles.push_back(args[i]);
+ ++i;
+ }
+
+ if (!bExtensionMode && zipdir.empty())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "no index dir given" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+ if (!bExtensionMode && idxCaptionStylesheet.empty())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "no index caption stylesheet given" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+ else if ( bExtensionMode )
+ {
+ rtl::OUString aIdxCaptionPathFileURL( aOfficeHelpPath );
+ aIdxCaptionPathFileURL += rtl::OUString::createFromAscii( "/idxcaption.xsl" );
+
+ rtl::OString aOStr_IdxCaptionPathFileURL( rtl::OUStringToOString
+ ( aIdxCaptionPathFileURL, fs::getThreadTextEncoding() ) );
+ std::string aStdStr_IdxCaptionPathFileURL( aOStr_IdxCaptionPathFileURL.getStr() );
+
+ idxCaptionStylesheet = fs::path( aStdStr_IdxCaptionPathFileURL );
+ }
+ if (!bExtensionMode && idxContentStylesheet.empty())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "no index content stylesheet given" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+ else if ( bExtensionMode )
+ {
+ rtl::OUString aIdxContentPathFileURL( aOfficeHelpPath );
+ aIdxContentPathFileURL += rtl::OUString::createFromAscii( "/idxcontent.xsl" );
+
+ rtl::OString aOStr_IdxContentPathFileURL( rtl::OUStringToOString
+ ( aIdxContentPathFileURL, fs::getThreadTextEncoding() ) );
+ std::string aStdStr_IdxContentPathFileURL( aOStr_IdxContentPathFileURL.getStr() );
+
+ idxContentStylesheet = fs::path( aStdStr_IdxContentPathFileURL );
+ }
+ if (!bExtensionMode && embeddStylesheet.empty())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "no embedding resolving file given" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+ if (sourceRoot.empty())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "no sourceroot given" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+ if (!bExtensionMode && outputFile.empty())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "no output file given" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+ if (module.empty())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "module missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+ if (!bExtensionMode && lang.empty())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "language missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+ if (!bExtensionMode && hid.empty())
+ {
+ std::stringstream aStrStream;
+ aStrStream << "hid list missing" << std::endl;
+ throw HelpProcessingException( HELPPROCESSING_GENERAL_ERROR, aStrStream.str() );
+ }
+
+ link();
+}
+
+int main(int argc, char**argv)
+{
+ sal_uInt32 starttime = osl_getGlobalTimer();
+ std::vector<std::string> args;
+ for (int i = 1; i < argc; ++i)
+ args.push_back(std::string(argv[i]));
+ try
+ {
+ HelpLinker* pHelpLinker = new HelpLinker();
+ pHelpLinker->main( args );
+ delete pHelpLinker;
+ }
+ catch( const HelpProcessingException& e )
+ {
+ std::cerr << e.m_aErrorMsg;
+ exit(1);
+ }
+ sal_uInt32 endtime = osl_getGlobalTimer();
+ std::cout << "time taken was " << (endtime-starttime)/1000.0 << " seconds" << std::endl;
+ return 0;
+}
+
+// Variable to set an exception in "C" StructuredXMLErrorFunction
+static const HelpProcessingException* GpXMLParsingException = NULL;
+
+extern "C" void StructuredXMLErrorFunction(void *userData, xmlErrorPtr error)
+{
+ (void)userData;
+ (void)error;
+
+ std::string aErrorMsg = error->message;
+ std::string aXMLParsingFile;
+ if( error->file != NULL )
+ aXMLParsingFile = error->file;
+ int nXMLParsingLine = error->line;
+ HelpProcessingException* pException = new HelpProcessingException( aErrorMsg, aXMLParsingFile, nXMLParsingLine );
+ GpXMLParsingException = pException;
+
+ // Reset error handler
+ xmlSetStructuredErrorFunc( NULL, NULL );
+}
+
+HelpProcessingErrorInfo& HelpProcessingErrorInfo::operator=( const struct HelpProcessingException& e )
+{
+ m_eErrorClass = e.m_eErrorClass;
+ rtl::OString tmpErrorMsg( e.m_aErrorMsg.c_str() );
+ m_aErrorMsg = rtl::OStringToOUString( tmpErrorMsg, fs::getThreadTextEncoding() );
+ rtl::OString tmpXMLParsingFile( e.m_aXMLParsingFile.c_str() );
+ m_aXMLParsingFile = rtl::OStringToOUString( tmpXMLParsingFile, fs::getThreadTextEncoding() );
+ m_nXMLParsingLine = e.m_nXMLParsingLine;
+ return *this;
+}
+
+
+// Returns true in case of success, false in case of error
+HELPLINKER_DLLPUBLIC bool compileExtensionHelp
+(
+ const rtl::OUString& aExtensionName,
+ const rtl::OUString& aExtensionLanguageRoot,
+ sal_Int32 nXhpFileCount, const rtl::OUString* pXhpFiles,
+ HelpProcessingErrorInfo& o_rHelpProcessingErrorInfo
+)
+{
+ bool bSuccess = true;
+
+ sal_Int32 argc = nXhpFileCount + 3;
+ const char** argv = new const char*[argc];
+ argv[0] = "";
+ argv[1] = "-mod";
+ rtl::OString aOExtensionName = rtl::OUStringToOString( aExtensionName, fs::getThreadTextEncoding() );
+ argv[2] = aOExtensionName.getStr();
+
+ for( sal_Int32 iXhp = 0 ; iXhp < nXhpFileCount ; ++iXhp )
+ {
+ rtl::OUString aXhpFile = pXhpFiles[iXhp];
+
+ rtl::OString aOXhpFile = rtl::OUStringToOString( aXhpFile, fs::getThreadTextEncoding() );
+ char* pArgStr = new char[aOXhpFile.getLength() + 1];
+ strcpy( pArgStr, aOXhpFile.getStr() );
+ argv[iXhp + 3] = pArgStr;
+ }
+
+ std::vector<std::string> args;
+ for( sal_Int32 i = 1; i < argc; ++i )
+ args.push_back(std::string( argv[i]) );
+
+ for( sal_Int32 iXhp = 0 ; iXhp < nXhpFileCount ; ++iXhp )
+ delete argv[iXhp + 3];
+ delete[] argv;
+
+ rtl::OString aOExtensionLanguageRoot = rtl::OUStringToOString( aExtensionLanguageRoot, fs::getThreadTextEncoding() );
+ const char* pExtensionPath = aOExtensionLanguageRoot.getStr();
+ std::string aStdStrExtensionPath = pExtensionPath;
+
+ // Set error handler
+ xmlSetStructuredErrorFunc( NULL, (xmlStructuredErrorFunc)StructuredXMLErrorFunction );
+ try
+ {
+ HelpLinker* pHelpLinker = new HelpLinker();
+ pHelpLinker->main( args,&aStdStrExtensionPath );
+ delete pHelpLinker;
+ }
+ catch( const HelpProcessingException& e )
+ {
+ if( GpXMLParsingException != NULL )
+ {
+ o_rHelpProcessingErrorInfo = *GpXMLParsingException;
+ delete GpXMLParsingException;
+ GpXMLParsingException = NULL;
+ }
+ else
+ {
+ o_rHelpProcessingErrorInfo = e;
+ }
+ bSuccess = false;
+ }
+ // Reset error handler
+ xmlSetStructuredErrorFunc( NULL, NULL );
+
+ // i83624: Tree files
+ ::rtl::OUString aTreeFileURL = aExtensionLanguageRoot;
+ aTreeFileURL += rtl::OUString::createFromAscii( "/help.tree" );
+ osl::DirectoryItem aTreeFileItem;
+ osl::FileBase::RC rcGet = osl::DirectoryItem::get( aTreeFileURL, aTreeFileItem );
+ osl::FileStatus aFileStatus( FileStatusMask_FileSize );
+ if( rcGet == osl::FileBase::E_None &&
+ aTreeFileItem.getFileStatus( aFileStatus ) == osl::FileBase::E_None &&
+ aFileStatus.isValid( FileStatusMask_FileSize ) )
+ {
+ sal_uInt64 ret, len = aFileStatus.getFileSize();
+ char* s = new char[ int(len) ]; // the buffer to hold the installed files
+ osl::File aFile( aTreeFileURL );
+ aFile.open( OpenFlag_Read );
+ aFile.read( s, len, ret );
+ aFile.close();
+
+ XML_Parser parser = XML_ParserCreate( 0 );
+ int parsed = XML_Parse( parser, s, int( len ), true );
+
+ if( parsed == 0 )
+ {
+ XML_Error nError = XML_GetErrorCode( parser );
+ o_rHelpProcessingErrorInfo.m_eErrorClass = HELPPROCESSING_XMLPARSING_ERROR;
+ o_rHelpProcessingErrorInfo.m_aErrorMsg = rtl::OUString::createFromAscii( XML_ErrorString( nError ) );;
+ o_rHelpProcessingErrorInfo.m_aXMLParsingFile = aTreeFileURL;
+ // CRAHSES!!! o_rHelpProcessingErrorInfo.m_nXMLParsingLine = XML_GetCurrentLineNumber( parser );
+ bSuccess = false;
+ }
+
+ XML_ParserFree( parser );
+ delete[] s;
+ }
+
+ return bSuccess;
+}
+
+// vnd.sun.star.help://swriter/52821?Language=en-US&System=UNIX
+/* vi:set tabstop=4 shiftwidth=4 expandtab: */
+
diff --git a/transex3/source/help/MANIFEST.MF b/transex3/source/help/MANIFEST.MF
new file mode 100644
index 000000000000..bf0e4ab46cb2
--- /dev/null
+++ b/transex3/source/help/MANIFEST.MF
@@ -0,0 +1,2 @@
+RegistrationClassName: com.sun.star.help.HelpComponent
+Class-Path: lucene-core-2.3.jar lucene-analyzers-2.3.jar
diff --git a/transex3/source/help/compilehelp.hxx b/transex3/source/help/compilehelp.hxx
new file mode 100644
index 000000000000..1e9a1c8604b8
--- /dev/null
+++ b/transex3/source/help/compilehelp.hxx
@@ -0,0 +1,80 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: compilehelp.hxx,v $
+ * $Revision: 1.3 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef COMPILE_HXX
+#define COMPILE_HXX
+
+#include "sal/types.h"
+
+#if defined(HELPLINKER_DLLIMPLEMENTATION)
+#define HELPLINKER_DLLPUBLIC SAL_DLLPUBLIC_EXPORT
+#else
+#define HELPLINKER_DLLPUBLIC SAL_DLLPUBLIC_IMPORT
+#endif
+#define HELPLINKER_DLLPRIVATE SAL_DLLPRIVATE
+
+
+//#include <helplinkerdllapi.h>
+#include <rtl/ustring.hxx>
+
+enum HelpProcessingErrorClass
+{
+ HELPPROCESSING_NO_ERROR,
+ HELPPROCESSING_GENERAL_ERROR, // Missing files, options etc.
+ HELPPROCESSING_INTERNAL_ERROR, // Unexpected problems
+ HELPPROCESSING_XMLPARSING_ERROR // Errors thrown by libxml
+};
+
+struct HelpProcessingErrorInfo
+{
+ HelpProcessingErrorClass m_eErrorClass;
+ rtl::OUString m_aErrorMsg;
+ rtl::OUString m_aXMLParsingFile;
+ sal_Int32 m_nXMLParsingLine;
+
+ HelpProcessingErrorInfo( void )
+ : m_eErrorClass( HELPPROCESSING_NO_ERROR )
+ , m_nXMLParsingLine( -1 )
+ {}
+
+ HelpProcessingErrorInfo& operator=( const struct HelpProcessingException& e );
+};
+
+
+// Returns true in case of success, false in case of error
+HELPLINKER_DLLPUBLIC bool compileExtensionHelp
+(
+ const rtl::OUString& aExtensionName,
+ const rtl::OUString& aExtensionLanguageRoot,
+ sal_Int32 nXhpFileCount, const rtl::OUString* pXhpFiles,
+ HelpProcessingErrorInfo& o_rHelpProcessingErrorInfo
+);
+
+#endif
diff --git a/transex3/source/help/helplinker.pmk b/transex3/source/help/helplinker.pmk
new file mode 100644
index 000000000000..569c5f4dbdee
--- /dev/null
+++ b/transex3/source/help/helplinker.pmk
@@ -0,0 +1,35 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: helplinker.pmk,v $
+#
+# $Revision: 1.4 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+# define HELPLINKER_DLLIMPLEMENTATION (see @ inc/xmlhelp/helplinkerdllapi.h)
+CDEFS += -DHELPLINKER_DLLIMPLEMENTATION
+
+VISIBILITY_HIDDEN=TRUE
diff --git a/transex3/source/help/makefile.mk b/transex3/source/help/makefile.mk
new file mode 100644
index 000000000000..f010e256368e
--- /dev/null
+++ b/transex3/source/help/makefile.mk
@@ -0,0 +1,139 @@
+#*************************************************************************
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# Copyright 2008 by Sun Microsystems, Inc.
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.38 $
+#
+# This file is part of OpenOffice.org.
+#
+# OpenOffice.org is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License version 3
+# only, as published by the Free Software Foundation.
+#
+# OpenOffice.org is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License version 3 for more details
+# (a copy is included in the LICENSE file that accompanied this code).
+#
+# You should have received a copy of the GNU Lesser General Public License
+# version 3 along with OpenOffice.org. If not, see
+# <http://www.openoffice.org/license.html>
+# for a copy of the LGPLv3 License.
+#
+#*************************************************************************
+
+PRJ = ..$/..
+PRJNAME = xmlhelp
+TARGET = HelpLinker
+LIBBASENAME = helplinker
+PACKAGE = com$/sun$/star$/help
+TARGETTYPE=CUI
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE : settings.mk
+.INCLUDE : helplinker.pmk
+
+.IF "$(SYSTEM_LIBXSLT)" == "YES"
+CFLAGS+= $(LIBXSLT_CFLAGS)
+.ELSE
+LIBXSLTINCDIR=external$/libxslt
+CFLAGS+= -I$(SOLARINCDIR)$/$(LIBXSLTINCDIR)
+.ENDIF
+
+.IF "$(SYSTEM_DB)" == "YES"
+CFLAGS+=-DSYSTEM_DB -I$(DB_INCLUDES)
+.ENDIF
+
+.IF "$(SYSTEM_EXPAT)" == "YES"
+CFLAGS+=-DSYSTEM_EXPAT
+.ENDIF
+
+OBJFILES=\
+ $(OBJ)$/HelpLinker.obj \
+ $(OBJ)$/HelpCompiler.obj
+SLOFILES=\
+ $(SLO)$/HelpLinker.obj \
+ $(SLO)$/HelpCompiler.obj
+
+EXCEPTIONSFILES=\
+ $(OBJ)$/HelpLinker.obj \
+ $(OBJ)$/HelpCompiler.obj \
+ $(SLO)$/HelpLinker.obj \
+ $(SLO)$/HelpCompiler.obj
+.IF "$(OS)" == "MACOSX" && "$(CPU)" == "P" && "$(COM)" == "GCC"
+# There appears to be a GCC 4.0.1 optimization error causing _file:good() to
+# report true right before the call to writeOut at HelpLinker.cxx:1.12 l. 954
+# but out.good() to report false right at the start of writeOut at
+# HelpLinker.cxx:1.12 l. 537:
+NOOPTFILES=\
+ $(OBJ)$/HelpLinker.obj \
+ $(SLO)$/HelpLinker.obj
+.ENDIF
+
+APP1TARGET= $(TARGET)
+APP1OBJS=\
+ $(OBJ)$/HelpLinker.obj \
+ $(OBJ)$/HelpCompiler.obj
+
+APP1STDLIBS+=$(SALLIB) $(BERKELEYLIB) $(XSLTLIB) $(EXPATASCII3RDLIB)
+
+SHL1TARGET =$(LIBBASENAME)$(DLLPOSTFIX)
+SHL1LIBS= $(SLB)$/$(TARGET).lib
+SHL1IMPLIB =i$(LIBBASENAME)
+SHL1DEF =$(MISC)$/$(SHL1TARGET).def
+SHL1STDLIBS =$(SALLIB) $(BERKELEYLIB) $(XSLTLIB) $(EXPATASCII3RDLIB)
+SHL1USE_EXPORTS =ordinal
+
+DEF1NAME =$(SHL1TARGET)
+DEFLIB1NAME =$(TARGET)
+
+JAVAFILES = \
+ HelpIndexerTool.java \
+ HelpFileDocument.java
+
+
+JAVACLASSFILES = \
+ $(CLASSDIR)$/$(PACKAGE)$/HelpIndexerTool.class \
+ $(CLASSDIR)$/$(PACKAGE)$/HelpFileDocument.class
+
+
+# $(CLASSDIR)$/$(PACKAGE)$/HelpSearch.class \
+# $(CLASSDIR)$/$(PACKAGE)$/HelpIndexer.class \
+# $(CLASSDIR)$/$(PACKAGE)$/HelpComponent.class \
+# $(CLASSDIR)$/$(PACKAGE)$/HelpFileDocument.class
+
+#JARFILES = ridl.jar jurt.jar unoil.jar juh.jar
+.IF "$(SYSTEM_LUCENE)" == "YES"
+XCLASSPATH!:=$(XCLASSPATH)$(PATH_SEPERATOR)$(LUCENE_CORE_JAR)$(PATH_SEPERATOR)$(LUCENE_ANALYZERS_JAR)
+COMP=fix_system_lucene
+.ELSE
+JARFILES += lucene-core-2.3.jar lucene-analyzers-2.3.jar
+.ENDIF
+JAVAFILES = $(subst,$(CLASSDIR)$/$(PACKAGE)$/, $(subst,.class,.java $(JAVACLASSFILES)))
+#JAVAFILES = $(JAVACLASSFILES)
+
+JARCLASSDIRS = $(PACKAGE)/*
+JARTARGET = HelpIndexerTool.jar
+JARCOMPRESS = TRUE
+#CUSTOMMANIFESTFILE = MANIFEST.MF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+.IF "$(JARTARGETN)"!=""
+$(JARTARGETN) : $(COMP)
+.ENDIF
+
+fix_system_lucene:
+ @echo "Fix Java Class-Path entry for Lucene libraries from system."
+ @$(SED) -r -e "s#^(Class-Path:).*#\1 file://$(LUCENE_CORE_JAR) file://$(LUCENE_ANALYZERS_JAR)#" \
+ -i ../../../../../$(INPATH)/class/HelpLinker/META-INF/MANIFEST.MF
diff --git a/vcl/workben/makefile.mk b/vcl/workben/makefile.mk
index 34316356a1a6..0b89f031651d 100644
--- a/vcl/workben/makefile.mk
+++ b/vcl/workben/makefile.mk
@@ -140,6 +140,7 @@ APP5STDLIBS+=-lsocket
.ENDIF
.INCLUDE : target.mk
+.IF "$(L10N_framework)"==""
ALLTAR : $(BIN)$/applicat.rdb
@@ -151,4 +152,4 @@ $(BIN)$/applicat.rdb : makefile.mk $(UNOUCRRDB)
$(REGCOMP) -register -r applicat.rdb \
-c i18nsearch.uno$(DLLPOST) \
-c i18npool.uno$(DLLPOST)
-
+.ENDIF