Skip to content

Commit ccec84e

Browse files
authored
TIKA-4831: Add content-based detection and a parser for GeoGebra files (ggb, ggs, ggt) (#3044)
1 parent e2940fd commit ccec84e

24 files changed

Lines changed: 1274 additions & 1 deletion

File tree

CHANGES.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,21 @@ Release 4.1.0 - unreleased
227227
recursion/allocation; malformed files fall back to the legacy string dump
228228
(TIKA-4814).
229229

230+
* New GeoGebraParser for *.ggb/*.ggs/*.ggt: geogebra:* metadata, text and
231+
the thumbnail as a THUMBNAIL embedded document, with content-based
232+
detection. Previously typed application/zip with every entry as an
233+
attachment. *.ggs and *.ggp are new mime types; *.ggp is glob-only
234+
(TIKA-4831).
235+
236+
* RawTiffParser extracts the camera-generated JPEG previews embedded in
237+
TIFF-based raw images (Nikon NEF/NRW, Sony ARW/SRF/SR2, Pentax PEF/PTX,
238+
Adobe DNG and Canon CR2, including BigTIFF DNG containers) as thumbnail
239+
embedded documents. image/x-raw-{nikon,sony,pentax,adobe} are now
240+
sub-classes of image/tiff, so a named NEF/ARW/PEF/DNG that used to detect
241+
as image/tiff (TiffParser, metadata only) now detects as image/x-raw-* and
242+
emits thumbnail-N.jpg attachments in /rmeta and /unpack; CR2 keeps its
243+
detection but also gains the attachments. Disable via
244+
"raw-tiff-parser": {"extractPreviews": false} (TIKA-4824).
230245
* RawTiffParser extracts embedded JPEG previews from NEF/NRW, ARW/SRF/SR2,
231246
PEF/PTX, DNG and CR2 as thumbnail embedded documents. image/x-raw-* are
232247
now subtypes of image/tiff, so named raw files detect as image/x-raw-*.

tika-core/src/main/resources/org/apache/tika/mime/tika-mimetypes.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1591,10 +1591,24 @@
15911591
<glob pattern="*.txd"/>
15921592
</mime-type>
15931593
<mime-type type="application/vnd.geogebra.file">
1594+
<_comment>GeoGebra Worksheet</_comment>
15941595
<glob pattern="*.ggb"/>
1596+
<sub-class-of type="application/zip"/>
1597+
</mime-type>
1598+
<mime-type type="application/vnd.geogebra.pinboard">
1599+
<_comment>GeoGebra Pinboard</_comment>
1600+
<glob pattern="*.ggp"/>
1601+
<sub-class-of type="application/json"/>
1602+
</mime-type>
1603+
<mime-type type="application/vnd.geogebra.slides">
1604+
<_comment>GeoGebra Notes/Slides</_comment>
1605+
<glob pattern="*.ggs"/>
1606+
<sub-class-of type="application/zip"/>
15951607
</mime-type>
15961608
<mime-type type="application/vnd.geogebra.tool">
1609+
<_comment>GeoGebra Tool</_comment>
15971610
<glob pattern="*.ggt"/>
1611+
<sub-class-of type="application/zip"/>
15981612
</mime-type>
15991613
<mime-type type="application/vnd.geometry-explorer">
16001614
<glob pattern="*.gex"/>

tika-core/src/test/java/org/apache/tika/TikaDetectionTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ public void testHttpServerFileExtensions() {
239239
assertEquals("application/vnd.fuzzysheet", tika.detect("x.fzs"));
240240
assertEquals("application/vnd.genomatix.tuxedo", tika.detect("x.txd"));
241241
assertEquals("application/vnd.geogebra.file", tika.detect("x.ggb"));
242+
assertEquals("application/vnd.geogebra.pinboard", tika.detect("x.ggp"));
243+
assertEquals("application/vnd.geogebra.slides", tika.detect("x.ggs"));
242244
assertEquals("application/vnd.geogebra.tool", tika.detect("x.ggt"));
243245
assertEquals("application/vnd.geometry-explorer", tika.detect("x.gex"));
244246
assertEquals("application/vnd.geometry-explorer", tika.detect("x.gre"));

tika-metadata-schema/src/main/resources/org/apache/tika/metadata/metadata-key-fields.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -735,6 +735,12 @@
735735
{"class":"org.apache.tika.parser.gdal.GDALParser","field":"SIZE","key":"gdal:size"},
736736
{"class":"org.apache.tika.parser.gdal.GDALParser","field":"UPPER_LEFT","key":"gdal:upper-left"},
737737
{"class":"org.apache.tika.parser.gdal.GDALParser","field":"UPPER_RIGHT","key":"gdal:upper-right"},
738+
{"class":"org.apache.tika.parser.geogebra.GeoGebraParser","field":"APP_NAME","key":"geogebra:app-name"},
739+
{"class":"org.apache.tika.parser.geogebra.GeoGebraParser","field":"APP_VERSION","key":"geogebra:app-version"},
740+
{"class":"org.apache.tika.parser.geogebra.GeoGebraParser","field":"DATE","key":"geogebra:date"},
741+
{"class":"org.apache.tika.parser.geogebra.GeoGebraParser","field":"FORMAT_VERSION","key":"geogebra:format-version"},
742+
{"class":"org.apache.tika.parser.geogebra.GeoGebraParser","field":"ID","key":"geogebra:id"},
743+
{"class":"org.apache.tika.parser.geogebra.GeoGebraParser","field":"TOOL_NAME","key":"geogebra:toolName"},
738744
{"class":"org.apache.tika.parser.hdf.HDFParser","field":"FILE_TYPE_DESCRIPTION","key":"hdf:file-type-description"},
739745
{"class":"org.apache.tika.parser.iwork.KeynoteContentHandler","field":"PRESENTATION_HEIGHT","key":"keynote:slides-height"},
740746
{"class":"org.apache.tika.parser.iwork.KeynoteContentHandler","field":"PRESENTATION_WIDTH","key":"keynote:slides-width"},

tika-metadata-schema/src/main/resources/org/apache/tika/metadata/metadata-keys.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,12 @@
192192
{"key":"geo:lat","namespace":"geo","valueType":"REAL","cardinality":"SIMPLE","module":"tika-core"},
193193
{"key":"geo:long","namespace":"geo","valueType":"REAL","cardinality":"SIMPLE","module":"tika-core"},
194194
{"key":"geo:timestamp","namespace":"geo","valueType":"DATE","cardinality":"SIMPLE","module":"tika-core"},
195+
{"key":"geogebra:app-name","namespace":"geogebra","valueType":"TEXT","cardinality":"SIMPLE","module":"tika-parser-miscoffice-module"},
196+
{"key":"geogebra:app-version","namespace":"geogebra","valueType":"TEXT","cardinality":"SIMPLE","module":"tika-parser-miscoffice-module"},
197+
{"key":"geogebra:date","namespace":"geogebra","valueType":"TEXT","cardinality":"SIMPLE","module":"tika-parser-miscoffice-module"},
198+
{"key":"geogebra:format-version","namespace":"geogebra","valueType":"TEXT","cardinality":"SIMPLE","module":"tika-parser-miscoffice-module"},
199+
{"key":"geogebra:id","namespace":"geogebra","valueType":"TEXT","cardinality":"SIMPLE","module":"tika-parser-miscoffice-module"},
200+
{"key":"geogebra:toolName","namespace":"geogebra","valueType":"TEXT","cardinality":"BAG","module":"tika-parser-miscoffice-module"},
195201
{"key":"geotopic:latitude","namespace":"geotopic","valueType":"TEXT","cardinality":"SIMPLE","module":""},
196202
{"key":"geotopic:longitude","namespace":"geotopic","valueType":"TEXT","cardinality":"SIMPLE","module":""},
197203
{"key":"geotopic:name","namespace":"geotopic","valueType":"TEXT","cardinality":"SIMPLE","module":""},

tika-parsers/tika-parsers-standard/tika-parsers-standard-integration-tests/src/test/java/org/apache/tika/detect/TestContainerAwareDetector.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,12 @@ public void testDetectKMZ() throws Exception {
454454
assertTypeByData("testKMZ.kmz", "application/vnd.google-earth.kmz");
455455
}
456456

457+
@Test
458+
public void testDetectGeoGebra() throws Exception {
459+
assertTypeByData("testGeoGebra_classic.ggb", "application/vnd.geogebra.file");
460+
assertTypeByData("testGeoGebra_notes.ggs", "application/vnd.geogebra.slides");
461+
}
462+
457463
@Test
458464
public void testDetectIPA() throws Exception {
459465
assertTypeByNameAndData("testIPA.ipa", "application/x-itunes-ipa");

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-miscoffice-module/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@
8989
<artifactId>tika-parser-xmp-commons</artifactId>
9090
<version>${project.version}</version>
9191
</dependency>
92+
<!-- for the GeoGebra structure.json and inline text content -->
93+
<dependency>
94+
<groupId>com.fasterxml.jackson.core</groupId>
95+
<artifactId>jackson-databind</artifactId>
96+
</dependency>
9297
</dependencies>
9398

9499
<build>

0 commit comments

Comments
 (0)