OembedProviders.java
package jasper.component;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import jasper.domain.Ref;
import jasper.plugin.Oembed;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
@Component
public class OembedProviders {
private static final Logger logger = LoggerFactory.getLogger(OembedProviders.class);
@Autowired
Ingest ingest;
@Autowired
ConfigCache configs;
@Value("classpath:providers.json")
Resource defaultProviders;
@Autowired
ObjectMapper objectMapper;
@Async
public void defaults(String origin) throws IOException {
create(origin, objectMapper.readValue(defaultProviders.getFile(), new TypeReference<List<Oembed>>() {}));
}
public void create(String origin, List<Oembed> providers) {
logger.info("{} Restoring default oEmbed providers...", origin);
for (var p : providers) {
var ref = new Ref();
ref.setUrl(p.getProvider_url());
ref.setTitle(p.getProvider_name());
ref.setTags(new ArrayList<>(List.of("public", "internal", "+plugin/oembed")));
var plugins = objectMapper.createObjectNode();
plugins.set("+plugin/oembed", objectMapper.convertValue(p, JsonNode.class));
ref.setPlugins(plugins);
ref.setOrigin(origin);
ingest.push(origin, ref, true, false);
}
logger.info("{} Done restoring default oEmbed providers.", origin);
}
public Oembed.Endpoints getProvider(String origin, String url) {
var providers = configs.getAllConfigs(origin, "+plugin/oembed", Oembed.class);
for (var p : providers) {
if (p == null) continue;
for (var e : p.getEndpoints()) {
if (e.getSchemes() == null || e.getSchemes().isEmpty()) {
if (url.startsWith(p.getProvider_url())) return e;
continue;
}
for (var s : e.getSchemes()) {
var regex = Pattern.quote(s).replace("*", "\\E.*\\Q");
if (url.matches(regex)) return e;
}
}
}
return null;
}
}