blob: dca8da1d8b6b5dea6b49daace36a21a917409439 [file] [log] [blame]
Jake Slack03928ae2014-05-13 18:41:56 -07001//
2// ========================================================================
3// Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
4// ------------------------------------------------------------------------
5// All rights reserved. This program and the accompanying materials
6// are made available under the terms of the Eclipse Public License v1.0
7// and Apache License v2.0 which accompanies this distribution.
8//
9// The Eclipse Public License is available at
10// http://www.eclipse.org/legal/epl-v10.html
11//
12// The Apache License v2.0 is available at
13// http://www.opensource.org/licenses/apache2.0.php
14//
15// You may elect to redistribute this code under either of these licenses.
16// ========================================================================
17//
18
19package org.eclipse.jetty.webapp;
20
21
22import java.net.URI;
23import java.util.ArrayList;
24import java.util.List;
25import java.util.Locale;
26import java.util.jar.JarEntry;
27
28import org.eclipse.jetty.util.log.Log;
29import org.eclipse.jetty.util.log.Logger;
30import org.eclipse.jetty.util.resource.Resource;
31
32/**
33 * MetaInfConfiguration
34 *
35 * Scan META-INF of all jars in WEB-INF/lib to find:
36 * <ul>
37 * <li>tlds
38 * <li>web-fragment.xml
39 * <li>resources
40 * </ul>
41 */
42public class MetaInfConfiguration extends AbstractConfiguration
43{
44 private static final Logger LOG = Log.getLogger(MetaInfConfiguration.class);
45
46 public static final String METAINF_TLDS = TagLibConfiguration.TLD_RESOURCES;
47 public static final String METAINF_FRAGMENTS = FragmentConfiguration.FRAGMENT_RESOURCES;
48 public static final String METAINF_RESOURCES = WebInfConfiguration.RESOURCE_URLS;
49
50 @Override
51 public void preConfigure(final WebAppContext context) throws Exception
52 {
53 //Merge all container and webinf lib jars to look for META-INF resources
54
55 ArrayList<Resource> jars = new ArrayList<Resource>();
56 jars.addAll(context.getMetaData().getOrderedContainerJars());
57 jars.addAll(context.getMetaData().getWebInfJars());
58
59 JarScanner scanner = new JarScanner()
60 {
61 public void processEntry(URI jarUri, JarEntry entry)
62 {
63 try
64 {
65 MetaInfConfiguration.this.processEntry(context,jarUri,entry);
66 }
67 catch (Exception e)
68 {
69 LOG.warn("Problem processing jar entry " + entry, e);
70 }
71 }
72 };
73
74
75 //Scan jars for META-INF information
76 if (jars != null)
77 {
78 URI[] uris = new URI[jars.size()];
79 int i=0;
80 for (Resource r : jars)
81 {
82 uris[i++] = r.getURI();
83 }
84 scanner.scan(null, uris, true);
85 }
86 }
87 @Override
88 public void configure(WebAppContext context) throws Exception
89 {
90
91 }
92
93 @Override
94 public void deconfigure(WebAppContext context) throws Exception
95 {
96
97 }
98
99 @Override
100 public void postConfigure(WebAppContext context) throws Exception
101 {
102 context.setAttribute(METAINF_FRAGMENTS, null);
103 context.setAttribute(METAINF_RESOURCES, null);
104 context.setAttribute(METAINF_TLDS, null);
105 }
106
107 public void addResource (WebAppContext context, String attribute, Resource jar)
108 {
109 @SuppressWarnings("unchecked")
110 List<Resource> list = (List<Resource>)context.getAttribute(attribute);
111 if (list==null)
112 {
113 list=new ArrayList<Resource>();
114 context.setAttribute(attribute,list);
115 }
116 if (!list.contains(jar))
117 list.add(jar);
118 }
119
120
121 protected void processEntry(WebAppContext context, URI jarUri, JarEntry entry)
122 {
123 String name = entry.getName();
124
125 if (!name.startsWith("META-INF/"))
126 return;
127
128 try
129 {
130 if (name.equals("META-INF/web-fragment.xml") && context.isConfigurationDiscovered())
131 {
132 addResource(context,METAINF_FRAGMENTS,Resource.newResource(jarUri));
133 }
134 else if (name.equals("META-INF/resources/") && context.isConfigurationDiscovered())
135 {
136 addResource(context,METAINF_RESOURCES,Resource.newResource("jar:"+jarUri+"!/META-INF/resources"));
137 }
138 else
139 {
140 String lcname = name.toLowerCase(Locale.ENGLISH);
141 if (lcname.endsWith(".tld"))
142 {
143 addResource(context,METAINF_TLDS,Resource.newResource("jar:"+jarUri+"!/"+name));
144 }
145 }
146 }
147 catch(Exception e)
148 {
149 context.getServletContext().log(jarUri+"!/"+name,e);
150 }
151 }
152}