Search in sources :

Example 1 with Web25MetaData

use of org.jboss.metadata.web.spec.Web25MetaData in project wildfly by wildfly.

the class WarMetaDataProcessor method deploy.

@Override
public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
    final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
    if (!DeploymentTypeMarker.isType(DeploymentType.WAR, deploymentUnit)) {
        // Skip non web deployments
        return;
    }
    WarMetaData warMetaData = deploymentUnit.getAttachment(WarMetaData.ATTACHMENT_KEY);
    assert warMetaData != null;
    boolean isComplete = false;
    WebMetaData specMetaData = warMetaData.getWebMetaData();
    if (specMetaData != null) {
        if (specMetaData instanceof Web25MetaData) {
            isComplete |= ((Web25MetaData) specMetaData).isMetadataComplete();
        } else if (specMetaData instanceof Web30MetaData) {
            isComplete |= ((Web30MetaData) specMetaData).isMetadataComplete();
        } else {
            // As per Servlet 3.0 spec, metadata is not completed unless it's set to true in web.xml.
            // Hence, any web.xml 2.4 or earlier deployment is not metadata completed.
            isComplete = false;
        }
    }
    // Find all fragments that have been processed by deployers, and place
    // them in a map keyed by location
    LinkedList<String> order = new LinkedList<String>();
    List<WebOrdering> orderings = new ArrayList<WebOrdering>();
    HashSet<String> jarsSet = new HashSet<String>();
    Set<VirtualFile> overlays = new HashSet<VirtualFile>();
    Map<String, VirtualFile> scis = new HashMap<String, VirtualFile>();
    boolean fragmentFound = false;
    Map<String, WebFragmentMetaData> webFragments = warMetaData.getWebFragmentsMetaData();
    List<ResourceRoot> resourceRoots = deploymentUnit.getAttachmentList(Attachments.RESOURCE_ROOTS);
    for (ResourceRoot resourceRoot : resourceRoots) {
        if (resourceRoot.getRoot().getName().toLowerCase(Locale.ENGLISH).endsWith(".jar")) {
            jarsSet.add(resourceRoot.getRootName());
            // Find overlays
            VirtualFile overlay = resourceRoot.getRoot().getChild("META-INF/resources");
            if (overlay.exists()) {
                overlays.add(overlay);
            }
            // Find ServletContainerInitializer services
            VirtualFile sci = resourceRoot.getRoot().getChild("META-INF/services/javax.servlet.ServletContainerInitializer");
            if (sci.exists()) {
                scis.put(resourceRoot.getRootName(), sci);
            }
        }
    }
    if (!isComplete) {
        HashSet<String> jarsWithoutFragmentsSet = new HashSet<String>();
        jarsWithoutFragmentsSet.addAll(jarsSet);
        for (String jarName : webFragments.keySet()) {
            fragmentFound = true;
            WebFragmentMetaData fragmentMetaData = webFragments.get(jarName);
            webFragments.put(jarName, fragmentMetaData);
            WebOrdering webOrdering = new WebOrdering();
            webOrdering.setName(fragmentMetaData.getName());
            webOrdering.setJar(jarName);
            jarsWithoutFragmentsSet.remove(jarName);
            if (fragmentMetaData.getOrdering() != null) {
                if (fragmentMetaData.getOrdering().getAfter() != null) {
                    for (OrderingElementMetaData orderingElementMetaData : fragmentMetaData.getOrdering().getAfter().getOrdering()) {
                        if (orderingElementMetaData.isOthers()) {
                            webOrdering.setAfterOthers(true);
                        } else {
                            webOrdering.addAfter(orderingElementMetaData.getName());
                        }
                    }
                }
                if (fragmentMetaData.getOrdering().getBefore() != null) {
                    for (OrderingElementMetaData orderingElementMetaData : fragmentMetaData.getOrdering().getBefore().getOrdering()) {
                        if (orderingElementMetaData.isOthers()) {
                            webOrdering.setBeforeOthers(true);
                        } else {
                            webOrdering.addBefore(orderingElementMetaData.getName());
                        }
                    }
                }
            }
            orderings.add(webOrdering);
        }
        // fragment specifying no name and no order
        for (String jarName : jarsWithoutFragmentsSet) {
            WebOrdering ordering = new WebOrdering();
            ordering.setJar(jarName);
            orderings.add(ordering);
        }
    }
    if (!fragmentFound) {
        // Drop the order as there is no fragment in the webapp
        orderings.clear();
    }
    // Generate web fragments parsing order
    AbsoluteOrderingMetaData absoluteOrderingMetaData = null;
    if (!isComplete && specMetaData instanceof Web30MetaData) {
        absoluteOrderingMetaData = ((Web30MetaData) specMetaData).getAbsoluteOrdering();
    }
    if (absoluteOrderingMetaData != null) {
        // Absolute ordering from web.xml, any relative fragment ordering is ignored
        int otherPos = -1;
        int i = 0;
        for (OrderingElementMetaData orderingElementMetaData : absoluteOrderingMetaData.getOrdering()) {
            if (orderingElementMetaData.isOthers()) {
                if (otherPos >= 0) {
                    throw new DeploymentUnitProcessingException(UndertowLogger.ROOT_LOGGER.invalidMultipleOthers());
                }
                otherPos = i;
            } else {
                boolean found = false;
                for (WebOrdering ordering : orderings) {
                    if (orderingElementMetaData.getName().equals(ordering.getName())) {
                        order.add(ordering.getJar());
                        jarsSet.remove(ordering.getJar());
                        found = true;
                        break;
                    }
                }
                if (!found) {
                    UndertowLogger.ROOT_LOGGER.invalidAbsoluteOrdering(orderingElementMetaData.getName());
                } else {
                    i++;
                }
            }
        }
        if (otherPos >= 0) {
            order.addAll(otherPos, jarsSet);
            jarsSet.clear();
        }
    } else if (orderings.size() > 0) {
        // Resolve relative ordering
        try {
            resolveOrder(orderings, order);
        } catch (IllegalStateException e) {
            throw new DeploymentUnitProcessingException(UndertowLogger.ROOT_LOGGER.invalidRelativeOrdering(), e);
        }
        jarsSet.clear();
    } else {
        // No order specified
        order.addAll(jarsSet);
        jarsSet.clear();
        warMetaData.setNoOrder(true);
    }
    if (UndertowLogger.ROOT_LOGGER.isDebugEnabled()) {
        StringBuilder builder = new StringBuilder();
        builder.append("Resolved order: [ ");
        for (String jar : order) {
            builder.append(jar).append(' ');
        }
        builder.append(']');
        UndertowLogger.ROOT_LOGGER.debug(builder.toString());
    }
    warMetaData.setOrder(order);
    warMetaData.setOverlays(overlays);
    warMetaData.setScis(scis);
    Map<String, WebMetaData> annotationsMetaData = warMetaData.getAnnotationsMetaData();
    // The fragments and corresponding annotations will need to be merged in order
    // For each JAR in the order:
    // - Merge the annotation metadata into the fragment meta data (unless the fragment exists and is meta data complete)
    // - Merge the fragment metadata into merged fragment meta data
    WebCommonMetaData mergedFragmentMetaData = new WebCommonMetaData();
    if (specMetaData == null) {
        // If there is no web.xml, it has to be considered to be the latest version
        specMetaData = new Web31MetaData();
        specMetaData.setVersion("3.1");
    }
    // Augment with meta data from annotations in /WEB-INF/classes
    WebMetaData annotatedMetaData = annotationsMetaData.get("classes");
    if (annotatedMetaData == null && deploymentUnit.hasAttachment(Attachments.OSGI_MANIFEST)) {
        annotatedMetaData = annotationsMetaData.get(deploymentUnit.getName());
    }
    if (annotatedMetaData != null) {
        if (isComplete) {
            // Discard @WebFilter, @WebListener and @WebServlet
            annotatedMetaData.setFilters(null);
            annotatedMetaData.setFilterMappings(null);
            annotatedMetaData.setListeners(null);
            annotatedMetaData.setServlets(null);
            annotatedMetaData.setServletMappings(null);
        }
        WebCommonMetaDataMerger.augment(specMetaData, annotatedMetaData, null, true);
    }
    // Augment with meta data from fragments and annotations from the corresponding JAR
    for (String jar : order) {
        WebFragmentMetaData webFragmentMetaData = webFragments.get(jar);
        if (webFragmentMetaData == null || isComplete) {
            webFragmentMetaData = new WebFragmentMetaData();
            // Add non overriding default distributable flag
            webFragmentMetaData.setDistributable(new EmptyMetaData());
        }
        WebMetaData jarAnnotatedMetaData = annotationsMetaData.get(jar);
        if ((isComplete || webFragmentMetaData.isMetadataComplete()) && jarAnnotatedMetaData != null) {
            // Discard @WebFilter, @WebListener and @WebServlet
            jarAnnotatedMetaData.setFilters(null);
            jarAnnotatedMetaData.setFilterMappings(null);
            jarAnnotatedMetaData.setListeners(null);
            jarAnnotatedMetaData.setServlets(null);
            jarAnnotatedMetaData.setServletMappings(null);
        }
        if (jarAnnotatedMetaData != null) {
            // Merge annotations corresponding to the JAR
            WebCommonMetaDataMerger.augment(webFragmentMetaData, jarAnnotatedMetaData, null, true);
        }
        // Merge fragment meta data according to the conflict rules
        try {
            WebCommonMetaDataMerger.augment(mergedFragmentMetaData, webFragmentMetaData, specMetaData, false);
        } catch (Exception e) {
            throw new DeploymentUnitProcessingException(UndertowLogger.ROOT_LOGGER.invalidWebFragment(jar), e);
        }
    }
    // Augment with meta data from annotations from JARs excluded from the order
    for (String jar : jarsSet) {
        WebFragmentMetaData webFragmentMetaData = new WebFragmentMetaData();
        // Add non overriding default distributable flag
        webFragmentMetaData.setDistributable(new EmptyMetaData());
        WebMetaData jarAnnotatedMetaData = annotationsMetaData.get(jar);
        if (jarAnnotatedMetaData != null) {
            // Discard @WebFilter, @WebListener and @WebServlet
            jarAnnotatedMetaData.setFilters(null);
            jarAnnotatedMetaData.setFilterMappings(null);
            jarAnnotatedMetaData.setListeners(null);
            jarAnnotatedMetaData.setServlets(null);
            jarAnnotatedMetaData.setServletMappings(null);
        }
        if (jarAnnotatedMetaData != null) {
            // Merge annotations corresponding to the JAR
            WebCommonMetaDataMerger.augment(webFragmentMetaData, jarAnnotatedMetaData, null, true);
        }
        // Merge fragment meta data according to the conflict rules
        try {
            WebCommonMetaDataMerger.augment(mergedFragmentMetaData, webFragmentMetaData, specMetaData, false);
        } catch (Exception e) {
            throw new DeploymentUnitProcessingException(UndertowLogger.ROOT_LOGGER.invalidWebFragment(jar), e);
        }
    }
    WebCommonMetaDataMerger.augment(specMetaData, mergedFragmentMetaData, null, true);
    List<WebMetaData> additional = warMetaData.getAdditionalModuleAnnotationsMetadata();
    if (additional != null && !isComplete) {
        //augument with annotations from additional modules
        for (WebMetaData annotations : additional) {
            // Merge annotations corresponding to the JAR
            WebCommonMetaDataMerger.augment(specMetaData, annotations, null, true);
        }
    }
    // Override with meta data (JBossWebMetaData) Create a merged view
    JBossWebMetaData mergedMetaData = new JBossWebMetaData();
    JBossWebMetaData metaData = warMetaData.getJBossWebMetaData();
    JBossWebMetaDataMerger.merge(mergedMetaData, metaData, specMetaData);
    // FIXME: Incorporate any ear level overrides
    // Use the OSGi Web-ContextPath if not given otherwise
    String contextRoot = mergedMetaData.getContextRoot();
    Manifest manifest = deploymentUnit.getAttachment(Attachments.OSGI_MANIFEST);
    if (contextRoot == null && manifest != null) {
        contextRoot = manifest.getMainAttributes().getValue("Web-ContextPath");
        mergedMetaData.setContextRoot(contextRoot);
    }
    warMetaData.setMergedJBossWebMetaData(mergedMetaData);
    if (mergedMetaData.isMetadataComplete()) {
        MetadataCompleteMarker.setMetadataComplete(deploymentUnit, true);
    }
    //now attach any JNDI binding related information to the deployment
    if (mergedMetaData.getJndiEnvironmentRefsGroup() != null) {
        final DeploymentDescriptorEnvironment bindings = new DeploymentDescriptorEnvironment("java:module/env/", mergedMetaData.getJndiEnvironmentRefsGroup());
        deploymentUnit.putAttachment(org.jboss.as.ee.component.Attachments.MODULE_DEPLOYMENT_DESCRIPTOR_ENVIRONMENT, bindings);
    }
    //override module name if applicable
    if (mergedMetaData.getModuleName() != null && !mergedMetaData.getModuleName().isEmpty()) {
        final EEModuleDescription description = deploymentUnit.getAttachment(org.jboss.as.ee.component.Attachments.EE_MODULE_DESCRIPTION);
        description.setModuleName(mergedMetaData.getModuleName());
    }
    //WFLY-3102 EJB in WAR should inherit WAR's security domain
    if (mergedMetaData.getSecurityDomain() != null) {
        final EEModuleDescription description = deploymentUnit.getAttachment(org.jboss.as.ee.component.Attachments.EE_MODULE_DESCRIPTION);
        description.setDefaultSecurityDomain(mergedMetaData.getSecurityDomain());
    }
    //merge security roles from the ear
    DeploymentUnit parent = deploymentUnit.getParent();
    if (parent != null) {
        final EarMetaData earMetaData = parent.getAttachment(org.jboss.as.ee.structure.Attachments.EAR_METADATA);
        if (earMetaData != null) {
            SecurityRolesMetaData earSecurityRolesMetaData = earMetaData.getSecurityRoles();
            if (earSecurityRolesMetaData != null) {
                if (mergedMetaData.getSecurityRoles() == null) {
                    mergedMetaData.setSecurityRoles(new SecurityRolesMetaData());
                }
                SecurityRolesMetaDataMerger.merge(mergedMetaData.getSecurityRoles(), mergedMetaData.getSecurityRoles(), earSecurityRolesMetaData);
            }
        }
    }
}
Also used : Web25MetaData(org.jboss.metadata.web.spec.Web25MetaData) VirtualFile(org.jboss.vfs.VirtualFile) DeploymentUnitProcessingException(org.jboss.as.server.deployment.DeploymentUnitProcessingException) JBossWebMetaData(org.jboss.metadata.web.jboss.JBossWebMetaData) HashMap(java.util.HashMap) EmptyMetaData(org.jboss.metadata.javaee.spec.EmptyMetaData) WarMetaData(org.jboss.as.web.common.WarMetaData) ArrayList(java.util.ArrayList) SecurityRolesMetaData(org.jboss.metadata.javaee.spec.SecurityRolesMetaData) EarMetaData(org.jboss.metadata.ear.spec.EarMetaData) ResourceRoot(org.jboss.as.server.deployment.module.ResourceRoot) EEModuleDescription(org.jboss.as.ee.component.EEModuleDescription) DeploymentDescriptorEnvironment(org.jboss.as.ee.component.DeploymentDescriptorEnvironment) Web30MetaData(org.jboss.metadata.web.spec.Web30MetaData) Web31MetaData(org.jboss.metadata.web.spec.Web31MetaData) HashSet(java.util.HashSet) AbsoluteOrderingMetaData(org.jboss.metadata.web.spec.AbsoluteOrderingMetaData) Manifest(java.util.jar.Manifest) LinkedList(java.util.LinkedList) WebFragmentMetaData(org.jboss.metadata.web.spec.WebFragmentMetaData) DeploymentUnitProcessingException(org.jboss.as.server.deployment.DeploymentUnitProcessingException) OrderingElementMetaData(org.jboss.metadata.web.spec.OrderingElementMetaData) WebCommonMetaData(org.jboss.metadata.web.spec.WebCommonMetaData) DeploymentUnit(org.jboss.as.server.deployment.DeploymentUnit) JBossWebMetaData(org.jboss.metadata.web.jboss.JBossWebMetaData) WebMetaData(org.jboss.metadata.web.spec.WebMetaData)

Aggregations

ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 LinkedList (java.util.LinkedList)1 Manifest (java.util.jar.Manifest)1 DeploymentDescriptorEnvironment (org.jboss.as.ee.component.DeploymentDescriptorEnvironment)1 EEModuleDescription (org.jboss.as.ee.component.EEModuleDescription)1 DeploymentUnit (org.jboss.as.server.deployment.DeploymentUnit)1 DeploymentUnitProcessingException (org.jboss.as.server.deployment.DeploymentUnitProcessingException)1 ResourceRoot (org.jboss.as.server.deployment.module.ResourceRoot)1 WarMetaData (org.jboss.as.web.common.WarMetaData)1 EarMetaData (org.jboss.metadata.ear.spec.EarMetaData)1 EmptyMetaData (org.jboss.metadata.javaee.spec.EmptyMetaData)1 SecurityRolesMetaData (org.jboss.metadata.javaee.spec.SecurityRolesMetaData)1 JBossWebMetaData (org.jboss.metadata.web.jboss.JBossWebMetaData)1 AbsoluteOrderingMetaData (org.jboss.metadata.web.spec.AbsoluteOrderingMetaData)1 OrderingElementMetaData (org.jboss.metadata.web.spec.OrderingElementMetaData)1 Web25MetaData (org.jboss.metadata.web.spec.Web25MetaData)1 Web30MetaData (org.jboss.metadata.web.spec.Web30MetaData)1 Web31MetaData (org.jboss.metadata.web.spec.Web31MetaData)1