diff --git a/core/src/main/java/com/vml/es/aem/acm/core/assist/Assistancer.java b/core/src/main/java/com/vml/es/aem/acm/core/assist/Assistancer.java index e155fd86..9ddc8a09 100644 --- a/core/src/main/java/com/vml/es/aem/acm/core/assist/Assistancer.java +++ b/core/src/main/java/com/vml/es/aem/acm/core/assist/Assistancer.java @@ -57,6 +57,9 @@ public class Assistancer { @Reference private Executor executor; + @Reference + private CodeRepository codeRepository; + private List classCache = Collections.emptyList(); private Integer classCacheHashCode; @@ -103,7 +106,7 @@ public Assistance forWord(ResourceResolver resolver, SuggestionType suggestionTy private Stream variableSuggestions(String word) { return variablesCache.stream() .filter(v -> SearchUtils.containsWord(v.getName(), word)) - .map(VariableSuggestion::new); + .map(cf -> new VariableSuggestion(cf, codeRepository)); } private Stream snippetSuggestions(ResourceResolver resolver, String word) throws AcmException { @@ -116,7 +119,7 @@ private Stream snippetSuggestions(ResourceResolver resolver, private Stream classSuggestions(String word) { return classCache.stream() .filter(cf -> SearchUtils.containsWord(cf.getClassName(), word)) - .map(ClassSuggestion::new); + .map(cf -> new ClassSuggestion(cf, codeRepository)); } private Stream resourceSuggestions(ResourceResolver resolver, String word) { diff --git a/core/src/main/java/com/vml/es/aem/acm/core/assist/ClassSuggestion.java b/core/src/main/java/com/vml/es/aem/acm/core/assist/ClassSuggestion.java index 06b42b2a..90f1a6f9 100644 --- a/core/src/main/java/com/vml/es/aem/acm/core/assist/ClassSuggestion.java +++ b/core/src/main/java/com/vml/es/aem/acm/core/assist/ClassSuggestion.java @@ -9,9 +9,11 @@ public class ClassSuggestion implements Suggestion { private final ClassInfo classInfo; + private final CodeRepository codeRepository; - public ClassSuggestion(ClassInfo classInfo) { + public ClassSuggestion(ClassInfo classInfo, CodeRepository codeRepository) { this.classInfo = classInfo; + this.codeRepository = codeRepository; } @Override @@ -34,7 +36,7 @@ public String getInfo() { List info = new LinkedList<>(); info.add(String.format("Bundle: %s", classInfo.getBundle().getSymbolicName())); - CodeRepository.linkToClass(classInfo.getClassName()).ifPresent(link -> { + codeRepository.linkToClass(classInfo.getClassName()).ifPresent(link -> { info.add(String.format("Source Code: [Open on GitHub](%s)", link)); }); diff --git a/core/src/main/java/com/vml/es/aem/acm/core/assist/VariableSuggestion.java b/core/src/main/java/com/vml/es/aem/acm/core/assist/VariableSuggestion.java index bef44f2b..a766ce0d 100644 --- a/core/src/main/java/com/vml/es/aem/acm/core/assist/VariableSuggestion.java +++ b/core/src/main/java/com/vml/es/aem/acm/core/assist/VariableSuggestion.java @@ -9,9 +9,11 @@ public class VariableSuggestion implements Suggestion { private final Variable variable; + private final CodeRepository codeRepository; - public VariableSuggestion(Variable variable) { + public VariableSuggestion(Variable variable, CodeRepository codeRepository) { this.variable = variable; + this.codeRepository = codeRepository; } @Override @@ -34,7 +36,7 @@ public String getInfo() { List info = new LinkedList<>(); info.add(String.format("Type: %s", variable.getType())); - CodeRepository.linkToClass(variable.getType()).ifPresent(link -> { + codeRepository.linkToClass(variable.getType()).ifPresent(link -> { info.add(String.format("Source Code: [Open on GitHub](%s)", link)); }); diff --git a/core/src/main/java/com/vml/es/aem/acm/core/code/CodeRepository.java b/core/src/main/java/com/vml/es/aem/acm/core/code/CodeRepository.java index 716b88bd..fd8df8b0 100644 --- a/core/src/main/java/com/vml/es/aem/acm/core/code/CodeRepository.java +++ b/core/src/main/java/com/vml/es/aem/acm/core/code/CodeRepository.java @@ -4,24 +4,43 @@ import java.util.Map; import java.util.Optional; import org.apache.commons.lang3.StringUtils; +import org.osgi.service.component.annotations.Activate; +import org.osgi.service.component.annotations.Component; +import org.osgi.service.component.annotations.Modified; +import org.osgi.service.metatype.annotations.AttributeDefinition; +import org.osgi.service.metatype.annotations.Designate; +import org.osgi.service.metatype.annotations.ObjectClassDefinition; +@Component(immediate = true, service = CodeRepository.class) +@Designate(ocd = CodeRepository.Config.class) public class CodeRepository { - // TODO make it configurable - private static final Map CLASS_LINKS = new HashMap<>(); - - static { - CLASS_LINKS.put("com.vml.es.aem.acm.core", "https://github.com/wttech/acm/blob/main/core/src/main/java"); - CLASS_LINKS.put( - "org.apache.sling.api", - "https://github.com/apache/sling-org-apache-sling-api/tree/master/src/main/java"); + @ObjectClassDefinition(name = "AEM Content Manager - Code repository") + public @interface Config { + @AttributeDefinition( + name = "Class Links", + description = + "Mapping of class prefixes to their corresponding URLs in the format 'prefix=url'.") + String[] classLinks() default { + "com.vml.es.aem.acm.core=https://github.com/wttech/acm/blob/main/core/src/main/java", + "org.apache.sling.api=https://github.com/apache/sling-org-apache-sling-api/tree/master/src/main/java" + }; } - private CodeRepository() { - // intentionally empty + private final Map CLASS_LINKS = new HashMap<>(); + + @Activate + @Modified + public void activate(Config config) { + for (String classLink : config.classLinks()) { + String[] parts = classLink.split("="); + if (parts.length == 2) { + CLASS_LINKS.put(parts[0].trim(), parts[1].trim()); + } + } } - public static Optional linkToClass(String className) { + public Optional linkToClass(String className) { return CLASS_LINKS.entrySet().stream() .filter(entry -> StringUtils.startsWith(className, entry.getKey())) .findFirst()