SLING-8777: Changed base class of OsgiMailcapCommandMap from CommandMap to MailcapCommandMap
diff --git a/src/main/java/org/apache/sling/javax/activation/internal/OsgiMailcapCommandMap.java b/src/main/java/org/apache/sling/javax/activation/internal/OsgiMailcapCommandMap.java
index b2b8a4b..3bc5c3b 100755
--- a/src/main/java/org/apache/sling/javax/activation/internal/OsgiMailcapCommandMap.java
+++ b/src/main/java/org/apache/sling/javax/activation/internal/OsgiMailcapCommandMap.java
@@ -27,10 +27,11 @@
import java.util.Map;
import javax.activation.CommandInfo;
-import javax.activation.CommandMap;
import javax.activation.DataContentHandler;
+import javax.activation.MailcapCommandMap;
import org.osgi.framework.Bundle;
+import org.osgi.framework.FrameworkUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -47,12 +48,27 @@
* </p>
*
*/
-public class OsgiMailcapCommandMap extends CommandMap {
+public class OsgiMailcapCommandMap extends MailcapCommandMap {
private static final Logger log = LoggerFactory.getLogger(OsgiMailcapCommandMap.class);
private final Map<Bundle, MailcapFile> db = new HashMap<Bundle, MailcapFile>();
private final Object sync = new Object();
+ private volatile Caller caller = null;
+
+ @Override
+ public void addMailcap(String mailcap) {
+ if (caller == null) {
+ caller = new Caller();
+ }
+ Bundle bundle = caller.get();
+ if (bundle != null) {
+ synchronized(sync) {
+ db.computeIfAbsent(bundle, x -> new MailcapFile())
+ .appendToMailcap(mailcap);
+ }
+ }
+ }
public void addMailcapEntries(InputStream mailcapFile, Bundle originatingBundle) throws IOException {
@@ -232,6 +248,7 @@
return null;
}
+ @Override
public String[] getMimeTypes() {
List<String> mimeTypesList = new ArrayList<String>();
@@ -249,6 +266,29 @@
return mimeTypesList.toArray(new String[mimeTypesList.size()]);
}
+ @Override
+ public String[] getNativeCommands(String mimeType) {
+ List<String> cmdList = new ArrayList<String>();
+ if (mimeType != null) {
+ mimeType = mimeType.toLowerCase(Locale.ENGLISH);
+ }
+
+ synchronized (sync) {
+ for (Map.Entry<Bundle, MailcapFile> entry : db.entrySet()) {
+ String[] cmds = entry.getValue().getNativeCommands(mimeType);
+ if (cmds != null) {
+ for (String cmd : cmds) {
+ if (!cmdList.contains(cmd)) {
+ cmdList.add(cmd);
+ }
+ }
+ }
+ }
+ }
+
+ return cmdList.toArray(new String[cmdList.size()]);
+ }
+
private DataContentHandler getDataContentHandler(String name, Bundle bundle) {
try {
return (DataContentHandler) bundle.loadClass(name).newInstance();
@@ -276,4 +316,17 @@
return false;
}
+
+ private static final class Caller extends SecurityManager {
+ Bundle get() {
+ Class[] stack = getClassContext();
+ for (int i = 0; i < stack.length; i++) {
+ Bundle bundle = FrameworkUtil.getBundle(stack[i]);
+ if (bundle != null && !bundle.equals(FrameworkUtil.getBundle(getClass()))) {
+ return bundle;
+ }
+ }
+ return null;
+ }
+ }
}