Search in sources :

Example 1 with JsModule

use of com.vaadin.flow.component.dependency.JsModule in project flow by vaadin.

the class LitTemplateParserImpl method getTemplateContent.

@Override
public TemplateData getTemplateContent(Class<? extends LitTemplate> clazz, String tag, VaadinService service) {
    List<Dependency> dependencies = AnnotationReader.getAnnotationsFor(clazz, JsModule.class).stream().map(jsModule -> new Dependency(Dependency.Type.JS_MODULE, jsModule.value(), // load mode doesn't
    LoadMode.EAGER)).collect(Collectors.toList());
    for (DependencyFilter filter : service.getDependencyFilters()) {
        dependencies = filter.filter(new ArrayList<>(dependencies), service);
    }
    Pair<Dependency, String> chosenDep = null;
    for (Dependency dependency : dependencies) {
        if (dependency.getType() != Dependency.Type.JS_MODULE) {
            continue;
        }
        String url = dependency.getUrl();
        String source = getSourcesFromTemplate(service, tag, url);
        if (source == null) {
            continue;
        }
        if (chosenDep == null) {
            chosenDep = new Pair<>(dependency, source);
        }
        if (dependencyHasTagName(dependency, tag)) {
            chosenDep = new Pair<>(dependency, source);
            break;
        }
    }
    Element templateElement = null;
    if (chosenDep != null) {
        templateElement = BundleLitParser.parseLitTemplateElement(chosenDep.getFirst().getUrl(), chosenDep.getSecond());
    }
    if (templateElement != null) {
        // Template needs to be wrapped in an element with id, to look
        // like a P2 template
        Element parent = new Element(tag);
        parent.attr("id", tag);
        templateElement.appendTo(parent);
        return new TemplateData(chosenDep.getFirst().getUrl(), templateElement);
    }
    getLogger().info("Couldn't find the " + "definition of the element with tag '{}' " + "in any lit template file declared using '@{}' annotations. " + "In a Spring Boot project, please ensure that the template's " + "groupId is added to the vaadin.whitelisted-packages " + "property. Otherwise, please Check the availability of the " + "template files in your WAR file or provide alternative " + "implementation of the method " + "LitTemplateParser.getTemplateContent() which should return " + "an element representing the content of the template file", tag, JsModule.class.getSimpleName());
    return null;
}
Also used : LitTemplateParser(com.vaadin.flow.component.littemplate.LitTemplateParser) URL(java.net.URL) BundleLitParser(com.vaadin.flow.component.littemplate.BundleLitParser) LoggerFactory(org.slf4j.LoggerFactory) Dependency(com.vaadin.flow.shared.ui.Dependency) FrontendUtils(com.vaadin.flow.server.frontend.FrontendUtils) ArrayList(java.util.ArrayList) Locale(java.util.Locale) Element(org.jsoup.nodes.Element) DependencyFilter(com.vaadin.flow.server.DependencyFilter) Lookup(com.vaadin.flow.di.Lookup) Constants(com.vaadin.flow.server.Constants) Logger(org.slf4j.Logger) Pair(com.vaadin.flow.internal.Pair) AnnotationReader(com.vaadin.flow.internal.AnnotationReader) IOException(java.io.IOException) ResourceProvider(com.vaadin.flow.di.ResourceProvider) LitTemplate(com.vaadin.flow.component.littemplate.LitTemplate) Collectors(java.util.stream.Collectors) List(java.util.List) VaadinService(com.vaadin.flow.server.VaadinService) LoadMode(com.vaadin.flow.shared.ui.LoadMode) JsModule(com.vaadin.flow.component.dependency.JsModule) FilenameUtils(org.apache.commons.io.FilenameUtils) InputStream(java.io.InputStream) JsModule(com.vaadin.flow.component.dependency.JsModule) Element(org.jsoup.nodes.Element) ArrayList(java.util.ArrayList) DependencyFilter(com.vaadin.flow.server.DependencyFilter) Dependency(com.vaadin.flow.shared.ui.Dependency)

Example 2 with JsModule

use of com.vaadin.flow.component.dependency.JsModule in project flow by vaadin.

the class NpmTemplateParser method getTemplateContent.

@Override
public TemplateData getTemplateContent(Class<? extends PolymerTemplate<?>> clazz, String tag, VaadinService service) {
    List<Dependency> dependencies = AnnotationReader.getAnnotationsFor(clazz, JsModule.class).stream().map(jsModule -> new Dependency(Dependency.Type.JS_MODULE, jsModule.value(), // load mode doesn't
    LoadMode.EAGER)).collect(Collectors.toList());
    for (DependencyFilter filter : service.getDependencyFilters()) {
        dependencies = filter.filter(new ArrayList<>(dependencies), service);
    }
    Pair<Dependency, String> chosenDep = null;
    for (Dependency dependency : dependencies) {
        if (dependency.getType() != Dependency.Type.JS_MODULE) {
            continue;
        }
        String url = dependency.getUrl();
        String source = getSourcesFromTemplate(service, tag, url);
        if (source == null) {
            continue;
        }
        if (chosenDep == null) {
            chosenDep = new Pair<>(dependency, source);
        }
        if (dependencyHasTagName(dependency, tag)) {
            chosenDep = new Pair<>(dependency, source);
            break;
        }
    }
    if (chosenDep != null) {
        Element templateElement = BundleParser.parseTemplateElement(chosenDep.getFirst().getUrl(), chosenDep.getSecond());
        if (!JsoupUtils.getDomModule(templateElement, null).isPresent()) {
            // Template needs to be wrapped in an element with id, to look
            // like a P2 template
            Element parent = new Element(tag);
            parent.attr("id", tag);
            templateElement.appendTo(parent);
        }
        return new TemplateData(chosenDep.getFirst().getUrl(), templateElement);
    }
    throw new IllegalStateException(String.format("Couldn't find the " + "definition of the element with tag '%s' " + "in any template file declared using '@%s' annotations. " + "In a Spring Boot project, please ensure that the template's " + "groupId is added to the vaadin.whitelisted-packages " + "property. Otherwise, please Check the availability of the " + "template files in your WAR file or provide alternative " + "implementation of the method getTemplateContent() which " + "should return an element representing the content of the " + "template file", tag, JsModule.class.getSimpleName()));
}
Also used : Logger(org.slf4j.Logger) URL(java.net.URL) Pair(com.vaadin.flow.internal.Pair) AnnotationReader(com.vaadin.flow.internal.AnnotationReader) LoggerFactory(org.slf4j.LoggerFactory) IOException(java.io.IOException) ResourceProvider(com.vaadin.flow.di.ResourceProvider) Dependency(com.vaadin.flow.shared.ui.Dependency) Collectors(java.util.stream.Collectors) FrontendUtils(com.vaadin.flow.server.frontend.FrontendUtils) ArrayList(java.util.ArrayList) List(java.util.List) Locale(java.util.Locale) Element(org.jsoup.nodes.Element) VaadinService(com.vaadin.flow.server.VaadinService) LoadMode(com.vaadin.flow.shared.ui.LoadMode) DependencyFilter(com.vaadin.flow.server.DependencyFilter) Lookup(com.vaadin.flow.di.Lookup) Constants(com.vaadin.flow.server.Constants) JsModule(com.vaadin.flow.component.dependency.JsModule) FilenameUtils(org.apache.commons.io.FilenameUtils) InputStream(java.io.InputStream) JsModule(com.vaadin.flow.component.dependency.JsModule) Element(org.jsoup.nodes.Element) ArrayList(java.util.ArrayList) DependencyFilter(com.vaadin.flow.server.DependencyFilter) Dependency(com.vaadin.flow.shared.ui.Dependency)

Example 3 with JsModule

use of com.vaadin.flow.component.dependency.JsModule in project flow by vaadin.

the class ComponentMetaData method findDependencies.

private static DependencyInfo findDependencies(VaadinService service, Class<? extends Component> componentClass, DependencyInfo dependencyInfo, Set<Class<? extends Component>> scannedClasses) {
    assert !scannedClasses.contains(componentClass);
    scannedClasses.add(componentClass);
    List<JsModule> jsModules = AnnotationReader.getJsModuleAnnotations(componentClass);
    dependencyInfo.jsModules.addAll(jsModules);
    dependencyInfo.javaScripts.addAll(AnnotationReader.getJavaScriptAnnotations(componentClass));
    dependencyInfo.styleSheets.addAll(AnnotationReader.getStyleSheetAnnotations(componentClass));
    dependencyInfo.cssImports.addAll(AnnotationReader.getCssImportAnnotations(componentClass));
    List<Uses> usesList = AnnotationReader.getAnnotationsFor(componentClass, Uses.class);
    for (Uses uses : usesList) {
        Class<? extends Component> otherClass = uses.value();
        if (!scannedClasses.contains(otherClass)) {
            findDependencies(service, otherClass, dependencyInfo, scannedClasses);
        }
    }
    return dependencyInfo;
}
Also used : JsModule(com.vaadin.flow.component.dependency.JsModule) Uses(com.vaadin.flow.component.dependency.Uses)

Example 4 with JsModule

use of com.vaadin.flow.component.dependency.JsModule in project flow by vaadin.

the class UIInternals method addFallbackDependencies.

private void addFallbackDependencies(DependencyInfo dependency) {
    if (isFallbackChunkLoaded) {
        return;
    }
    VaadinContext context = ui.getSession().getService().getContext();
    FallbackChunk chunk = context.getAttribute(FallbackChunk.class);
    if (chunk == null) {
        if (getLogger().isDebugEnabled()) {
            getLogger().debug("Fallback chunk is not available, skipping fallback dependencies load");
        }
        return;
    }
    Set<String> modules = chunk.getModules();
    Set<CssImportData> cssImportsData = chunk.getCssImports();
    if (modules.isEmpty() && cssImportsData.isEmpty()) {
        getLogger().debug("Fallback chunk is empty, skipping fallback dependencies load");
        return;
    }
    List<CssImport> cssImports = dependency.getCssImports();
    List<JavaScript> javaScripts = dependency.getJavaScripts();
    List<JsModule> jsModules = dependency.getJsModules();
    if (jsModules.stream().map(JsModule::value).anyMatch(modules::contains)) {
        loadFallbackChunk();
        return;
    }
    if (javaScripts.stream().map(JavaScript::value).anyMatch(modules::contains)) {
        loadFallbackChunk();
        return;
    }
    if (cssImports.stream().map(this::buildData).anyMatch(cssImportsData::contains)) {
        loadFallbackChunk();
        return;
    }
}
Also used : JsModule(com.vaadin.flow.component.dependency.JsModule) CssImport(com.vaadin.flow.component.dependency.CssImport) VaadinContext(com.vaadin.flow.server.VaadinContext) FallbackChunk(com.vaadin.flow.server.frontend.FallbackChunk) JavaScript(com.vaadin.flow.component.dependency.JavaScript) CssImportData(com.vaadin.flow.server.frontend.FallbackChunk.CssImportData)

Aggregations

JsModule (com.vaadin.flow.component.dependency.JsModule)4 Lookup (com.vaadin.flow.di.Lookup)2 ResourceProvider (com.vaadin.flow.di.ResourceProvider)2 AnnotationReader (com.vaadin.flow.internal.AnnotationReader)2 Pair (com.vaadin.flow.internal.Pair)2 Constants (com.vaadin.flow.server.Constants)2 DependencyFilter (com.vaadin.flow.server.DependencyFilter)2 VaadinService (com.vaadin.flow.server.VaadinService)2 FrontendUtils (com.vaadin.flow.server.frontend.FrontendUtils)2 Dependency (com.vaadin.flow.shared.ui.Dependency)2 LoadMode (com.vaadin.flow.shared.ui.LoadMode)2 IOException (java.io.IOException)2 InputStream (java.io.InputStream)2 URL (java.net.URL)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 Locale (java.util.Locale)2 Collectors (java.util.stream.Collectors)2 FilenameUtils (org.apache.commons.io.FilenameUtils)2 Element (org.jsoup.nodes.Element)2