blob: 05603022b803885a185a16652e03515eaa513920 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tika.detect.apple;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.tika.detect.zip.StreamingDetectContext;
import org.apache.tika.detect.zip.ZipContainerDetector;
import org.apache.tika.io.TikaInputStream;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.iwork.IWorkPackageParser;
import org.apache.tika.parser.iwork.iwana.IWork13PackageParser;
import org.apache.tika.parser.iwork.iwana.IWork18PackageParser;
public class IWorkDetector implements ZipContainerDetector {
private static MediaType detectIWork13(ZipFile zip) {
if (zip.getEntry(IWork13PackageParser.IWORK13_COMMON_ENTRY) != null) {
return IWork13PackageParser.IWork13DocumentType.detect(zip);
}
return null;
}
private static MediaType detectIWork18(ZipFile zip) {
return IWork18PackageParser.IWork18DocumentType.detect(zip);
}
private static MediaType detectIWork(ZipFile zip) {
if (zip.getEntry(IWorkPackageParser.IWORK_COMMON_ENTRY) != null) {
// Locate the appropriate index file entry, and reads from that
// the root element of the document. That is used to the identify
// the correct type of the keynote container.
for (String entryName : IWorkPackageParser.IWORK_CONTENT_ENTRIES) {
IWorkPackageParser.IWORKDocumentType type = IWorkPackageParser.IWORKDocumentType
.detectType(zip.getEntry(entryName), zip);
if (type != null) {
return type.getType();
}
}
// Not sure, fallback to the container type
return MediaType.application("vnd.apple.iwork");
} else {
return null;
}
}
@Override
public MediaType detect(ZipFile zipFile, TikaInputStream tis) throws IOException {
MediaType mt = detectIWork18(zipFile);
if (mt != null) {
return mt;
}
mt = detectIWork13(zipFile);
if (mt != null) {
return mt;
}
return detectIWork(zipFile);
}
@Override
public MediaType streamingDetectUpdate(ZipArchiveEntry zae, InputStream zis,
StreamingDetectContext detectContext) {
String name = zae.getName();
EntryNames entryNames = detectContext.get(EntryNames.class);
if (entryNames == null) {
entryNames = new EntryNames();
detectContext.set(EntryNames.class, entryNames);
}
entryNames.names.add(name);
if (IWorkPackageParser.IWORK_CONTENT_ENTRIES.contains(name)) {
IWorkPackageParser.IWORKDocumentType type =
IWorkPackageParser.IWORKDocumentType.detectType(zis);
if (type != null) {
return type.getType();
}
}
MediaType mt = IWork18PackageParser.IWork18DocumentType.detectIfPossible(zae);
if (mt != null) {
return mt;
}
mt = IWork13PackageParser.IWork13DocumentType.detectIfPossible(zae);
if (mt != null) {
return mt;
}
return null;
}
@Override
public MediaType streamingDetectFinal(StreamingDetectContext detectContext) {
EntryNames entryNames = detectContext.get(EntryNames.class);
if (entryNames == null) {
return null;
}
//general iworks
if (entryNames.names.contains(IWorkPackageParser.IWORK_COMMON_ENTRY)) {
return MediaType.application("vnd.apple.iwork");
}
return null;
}
private static class EntryNames {
Set<String> names = new HashSet<>();
}
}