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;
+        }
+    }
 }