19package org.sleuthkit.autopsy.casemodule;
21import java.util.Collection;
22import java.util.Optional;
23import java.util.logging.Level;
24import java.util.logging.Logger;
25import org.apache.commons.lang3.StringUtils;
26import org.openide.util.Lookup;
27import org.sleuthkit.datamodel.ContentStreamProvider;
38class ContentProviderUtils {
40 private static final Logger logger = Logger.getLogger(ContentProviderUtils.class.getName());
42 private ContentProviderUtils() {
53 static Optional<int[]> parseProviderVersion(String name) {
55 return Optional.empty();
57 int lastUnderscore = name.lastIndexOf(
'_');
58 if (lastUnderscore < 0 || lastUnderscore == name.length() - 1) {
59 return Optional.empty();
61 String[] parts = name.substring(lastUnderscore + 1).split(
"\\.");
62 if (parts.length != 3) {
63 return Optional.empty();
66 return Optional.of(
new int[]{
67 Integer.parseInt(parts[0]),
68 Integer.parseInt(parts[1]),
69 Integer.parseInt(parts[2])
71 }
catch (NumberFormatException e) {
72 return Optional.empty();
83 static Optional<String> parseProviderBaseName(String name) {
84 if (!parseProviderVersion(name).isPresent()) {
85 return Optional.empty();
87 return Optional.of(name.substring(0, name.lastIndexOf(
'_')));
100 static boolean isVersionCompatible(String createdName, String moduleName) {
101 Optional<int[]> created = parseProviderVersion(createdName);
102 Optional<int[]> module = parseProviderVersion(moduleName);
103 if (!created.isPresent() || !module.isPresent()) {
106 Optional<String> createdBase = parseProviderBaseName(createdName);
107 Optional<String> moduleBase = parseProviderBaseName(moduleName);
108 if (!createdBase.isPresent() || !moduleBase.isPresent()
109 || !StringUtils.equalsIgnoreCase(createdBase.get(), moduleBase.get())) {
112 int[] c = created.get();
113 int[] m = module.get();
114 return c[0] == m[0] && c[1] == m[1] && m[2] >= c[2];
127 static Optional<AutopsyContentProvider> findInstalledProvider(String createdName) {
128 Optional<String> baseName = parseProviderBaseName(createdName);
129 if (!baseName.isPresent()) {
130 return Optional.empty();
132 Collection<? extends AutopsyContentProvider> providers
133 = Lookup.getDefault().lookupAll(AutopsyContentProvider.class);
134 for (AutopsyContentProvider provider : providers) {
135 Optional<String> providerBase = parseProviderBaseName(
136 provider !=
null ? provider.getName() :
null);
137 if (providerBase.isPresent()
138 && StringUtils.equalsIgnoreCase(baseName.get(), providerBase.get())) {
139 return Optional.of(provider);
142 return Optional.empty();
154 static ContentStreamProvider getContentProvider(String createdName) {
155 Collection<? extends AutopsyContentProvider> providers
156 = Lookup.getDefault().lookupAll(AutopsyContentProvider.class);
157 for (AutopsyContentProvider provider : providers) {
159 && (StringUtils.equalsIgnoreCase(createdName, provider.getName())
160 || isVersionCompatible(createdName, provider.getName()))) {
162 ContentStreamProvider contentProvider = provider.load();
163 if (contentProvider !=
null) {
164 return contentProvider;
166 }
catch (Exception ex) {
167 logger.log(Level.WARNING,
"Content provider " + provider.getName() +
" threw an exception during load(); skipping.", ex);