View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.plugin.ide;
20  
21  import java.util.HashMap;
22  import java.util.Iterator;
23  import java.util.Map;
24  
25  import org.apache.maven.project.MavenProject;
26  
27  public class JeeUtils
28  {
29      public static final String ARTIFACT_MAVEN_EAR_PLUGIN = "org.apache.maven.plugins:maven-ear-plugin"; //$NON-NLS-1$
30  
31      public static final String ARTIFACT_MAVEN_WAR_PLUGIN = "org.apache.maven.plugins:maven-war-plugin"; //$NON-NLS-1$
32  
33      private static final Map ejbMap = new HashMap();
34  
35      private static final Map jeeMap = new HashMap();
36  
37      private static final Map jspMap = new HashMap();
38  
39      private static final Map servletMap = new HashMap();
40  
41      /** Names of artifacts of ejb APIs. */
42      // private static final String[] EJB_API_ARTIFACTS = new String[] { "ejb", "ejb-api", "geronimo-spec-ejb" };
43      // //$NON-NLS-1$
44      static
45      {
46      	addJEE( JeeDescriptor.JEE_6_0, JeeDescriptor.EJB_3_1, JeeDescriptor.SERVLET_3_0, JeeDescriptor.JSP_2_2 );
47          addJEE( JeeDescriptor.JEE_5_0, JeeDescriptor.EJB_3_0, JeeDescriptor.SERVLET_2_5, JeeDescriptor.JSP_2_1 );
48          addJEE( JeeDescriptor.JEE_1_4, JeeDescriptor.EJB_2_1, JeeDescriptor.SERVLET_2_4, JeeDescriptor.JSP_2_0 );
49          addJEE( JeeDescriptor.JEE_1_3, JeeDescriptor.EJB_2_0, JeeDescriptor.SERVLET_2_3, JeeDescriptor.JSP_1_2 );
50          addJEE( JeeDescriptor.JEE_1_2, JeeDescriptor.EJB_1_1, JeeDescriptor.SERVLET_2_2, JeeDescriptor.JSP_1_1 );
51  
52      }
53  
54      /**
55       * Returns the JEEDescriptor associated to an EJB specifications version.
56       * 
57       * @param ejbVersion An EJB version as defined by constants JeeDescriptor.EJB_x_x
58       * @return a JEEDescriptor
59       */
60      public final static JeeDescriptor getJeeDescriptorFromEjbVersion( String ejbVersion )
61      {
62          if ( ejbMap.containsKey( ejbVersion ) )
63              return (JeeDescriptor) ejbMap.get( ejbVersion );
64          else
65              return null;
66      }
67  
68      /**
69       * Returns the JEEDescriptor associated to a JEE specifications version.
70       * 
71       * @param jeeVersion A JEE version as defined by constants JeeDescriptor.JEE_x_x
72       * @return a JEEDescriptor
73       */
74      public final static JeeDescriptor getJeeDescriptorFromJeeVersion( String jeeVersion )
75      {
76          if ( jeeMap.containsKey( jeeVersion ) )
77              return (JeeDescriptor) jeeMap.get( jeeVersion );
78          else
79              return null;
80      }
81  
82      /**
83       * Returns the JEEDescriptor associated to a JSP specifications version.
84       * 
85       * @param jspVersion A JSP version as defined by constants JeeDescriptor.JSP_x_x
86       * @return a JEEDescriptor
87       */
88      public final static JeeDescriptor getJeeDescriptorFromJspVersion( String jspVersion )
89      {
90          if ( jspMap.containsKey( jspVersion ) )
91              return (JeeDescriptor) jspMap.get( jspVersion );
92          else
93              return null;
94      }
95  
96      /**
97       * Returns the JEEDescriptor associated to a Servlet specifications version.
98       * 
99       * @param servletVersion A Servlet version as defined by constants JeeDescriptor.SERVLET_x_x
100      * @return a JEEDescriptor
101      */
102     public final static JeeDescriptor getJeeDescriptorFromServletVersion( String servletVersion )
103     {
104         if ( servletMap.containsKey( servletVersion ) )
105             return (JeeDescriptor) servletMap.get( servletVersion );
106         else
107             return null;
108     }
109 
110     /**
111      * Search in dependencies a version of EJB APIs (or of JEE APIs).
112      * 
113      * @param artifacts The list of dependencies where we search the information
114      * @return An EJB version as defined by constants JeeDescriptor.EJB_x_x. By default, if nothing is found, returns
115      *         JeeDescriptor.EJB_2_1.
116      */
117     public static String resolveEjbVersion( MavenProject project )
118     {
119         String version = findEjbVersionInDependencies( project );
120 
121         if ( version == null )
122         {
123             // No ejb dependency detected. Try to resolve the ejb
124             // version from J2EE/JEE.
125             JeeDescriptor descriptor = getJeeDescriptorFromJeeVersion( findJeeVersionInDependencies( project ) );
126             if ( descriptor != null )
127                 version = descriptor.getEjbVersion();
128         }
129         return version == null ? JeeDescriptor.EJB_2_1 : version; //$NON-NLS-1$
130     }
131 
132     /**
133      * Search in dependencies a version of JEE APIs.
134      * 
135      * @param artifacts The list of dependencies where we search the information
136      * @return A JEE version as defined by constants JeeDescriptor.JEE_x_x. By default, if nothing is found, returns
137      *         JeeDescriptor.JEE_1_4.
138      */
139     public static String resolveJeeVersion( MavenProject project )
140     {
141         // try to find version in dependencies
142         String version = findJeeVersionInDependencies( project );
143         if ( version == null )
144         {
145             // No JEE dependency detected. Try to resolve the JEE
146             // version from EJB.
147             JeeDescriptor descriptor = getJeeDescriptorFromEjbVersion( findEjbVersionInDependencies( project ) );
148             if ( descriptor != null )
149                 version = descriptor.getJeeVersion();
150         }
151         if ( version == null )
152         {
153             // No JEE dependency detected. Try to resolve the JEE
154             // version from SERVLET.
155             JeeDescriptor descriptor = getJeeDescriptorFromServletVersion( findServletVersionInDependencies( project ) );
156             if ( descriptor != null )
157                 version = descriptor.getJeeVersion();
158         }
159         if ( version == null )
160         {
161             // No JEE dependency detected. Try to resolve the JEE
162             // version from JSP.
163             JeeDescriptor descriptor = getJeeDescriptorFromJspVersion( findJspVersionInDependencies( project ) );
164             if ( descriptor != null )
165                 version = descriptor.getJeeVersion();
166         }
167         return version == null ? JeeDescriptor.JEE_1_4 : version; //$NON-NLS-1$
168     }
169 
170     /**
171      * Search in dependencies a version of JSP APIs (or from JEE APIs, or from Servlet APIs).
172      * 
173      * @param artifacts The list of dependencies where we search the information
174      * @return A JSP version as defined by constants JeeDescriptor.JSP_x_x. By default, if nothing is found, returns
175      *         JeeDescriptor.JSP_2_0.
176      */
177 
178     public static String resolveJspVersion( MavenProject project )
179     {
180         String version = findJspVersionInDependencies( project );
181 
182         if ( version == null )
183         {
184             // No jsp dependency detected. Try to resolve the jsp
185             // version from J2EE/JEE.
186             JeeDescriptor descriptor = getJeeDescriptorFromJeeVersion( findJeeVersionInDependencies( project ) );
187             if ( descriptor != null )
188                 version = descriptor.getJspVersion();
189         }
190         if ( version == null )
191         {
192             // No jsp dependency detected. Try to resolve the jsp
193             // version from Servlet.
194             JeeDescriptor descriptor = getJeeDescriptorFromServletVersion( findServletVersionInDependencies( project ) );
195             if ( descriptor != null )
196                 version = descriptor.getJspVersion();
197         }
198         return version == null ? JeeDescriptor.JSP_2_0 : version; //$NON-NLS-1$
199     }
200 
201     /**
202      * Search in dependencies a version of Servlet APIs (or of JEE APIs).
203      * 
204      * @param artifacts The list of dependencies where we search the information
205      * @return A SERVLET version as defined by constants JeeDescriptor.SERLVET_x_x. By default, if nothing is found,
206      *         returns JeeDescriptor.SERVLET_2_4.
207      */
208     public static String resolveServletVersion( MavenProject project )
209     {
210         String version = findServletVersionInDependencies( project );
211 
212         if ( version == null )
213         {
214             // No servlet dependency detected. Try to resolve the servlet
215             // version from J2EE/JEE.
216             JeeDescriptor descriptor = getJeeDescriptorFromJeeVersion( findJeeVersionInDependencies( project ) );
217             if ( descriptor != null )
218                 version = descriptor.getServletVersion();
219         }
220         return version == null ? JeeDescriptor.SERVLET_2_4 : version; //$NON-NLS-1$
221     }
222 
223     private static void addJEE( String jeeVersion, String ejbVersion, String servletVersion, String jspVersion )
224     {
225         JeeDescriptor descriptor = new JeeDescriptor( jeeVersion, ejbVersion, servletVersion, jspVersion );
226         jeeMap.put( jeeVersion, descriptor );
227         ejbMap.put( ejbVersion, descriptor );
228         servletMap.put( servletVersion, descriptor );
229         jspMap.put( jspVersion, descriptor );
230     }
231 
232     private static String findEjbVersionInDependencies( MavenProject project )
233     {
234 
235         String version =
236             IdeUtils.getArtifactVersion( new String[] { "ejb", "ejb-api", "geronimo-spec-ejb" },
237                                          project.getDependencies(), 3 );
238         // For new Geronimo APIs, the version of the artifact isn't the one of the spec
239         if ( version == null )
240         {
241             if ( IdeUtils.getArtifactVersion( new String[] { "geronimo-ejb_2.1_spec" }, project.getDependencies(), 3 ) != null )
242                 return JeeDescriptor.EJB_2_1;
243         }
244         if ( version == null )
245         {
246             if ( IdeUtils.getArtifactVersion( new String[] { "geronimo-ejb_3.0_spec" }, project.getDependencies(), 3 ) != null )
247                 return JeeDescriptor.EJB_3_0;
248         }
249 
250         // if no version found try dependencies of referenced projects
251         if ( version == null )
252         {
253             Iterator it = project.getProjectReferences().keySet().iterator();
254             while ( it.hasNext() )
255             {
256                 Object key = it.next();
257                 MavenProject refProject = (MavenProject) project.getProjectReferences().get( key );
258                 version = findEjbVersionInDependencies( refProject );
259                 if ( version != null ) // version found in dependencies
260                 {
261                     break;
262                 }
263             }
264         }
265         return version;
266     }
267 
268     private static String findJeeVersionInDependencies( MavenProject project )
269     {
270         String version =
271             IdeUtils.getArtifactVersion( new String[] { "javaee-api", "j2ee", "geronimo-spec-j2ee" },
272                                          project.getDependencies(), 3 );
273 
274         // For new Geronimo APIs, the version of the artifact isn't the one of the spec
275         if ( version == null )
276         {
277             if ( IdeUtils.getArtifactVersion( new String[] { "geronimo-j2ee_1.4_spec" }, project.getDependencies(), 3 ) != null )
278                 return JeeDescriptor.JEE_1_4;
279         }
280 
281         // if no version found try dependencies of referenced projects
282         if ( version == null )
283         {
284             Iterator it = project.getProjectReferences().keySet().iterator();
285             while ( it.hasNext() )
286             {
287                 Object key = it.next();
288                 MavenProject refProject = (MavenProject) project.getProjectReferences().get( key );
289                 version = findJeeVersionInDependencies( refProject );
290                 if ( version != null ) // version found in dependencies
291                 {
292                     break;
293                 }
294             }
295         }
296 
297         return version;
298     }
299 
300     private static String findJspVersionInDependencies( MavenProject project )
301     {
302         return null;
303     }
304 
305     private static String findServletVersionInDependencies( MavenProject project )
306     {
307         String version =
308             IdeUtils.getArtifactVersion( new String[] { "servlet-api", "servletapi", "geronimo-spec-servlet" },
309                                          project.getDependencies(), 3 );
310 
311         // For new Geronimo APIs, the version of the artifact isn't the one of the spec
312         if ( version == null )
313         {
314             if ( IdeUtils.getArtifactVersion( new String[] { "geronimo-servlet_2.4_spec" }, project.getDependencies(),
315                                               3 ) != null )
316                 return JeeDescriptor.SERVLET_2_4;
317         }
318         if ( version == null )
319         {
320             if ( IdeUtils.getArtifactVersion( new String[] { "geronimo-servlet_2.5_spec" }, project.getDependencies(),
321                                               3 ) != null )
322                 return JeeDescriptor.SERVLET_2_5;
323         }
324 
325         // if no version found try dependencies of referenced projects
326         if ( version == null )
327         {
328             Iterator it = project.getProjectReferences().keySet().iterator();
329             while ( it.hasNext() )
330             {
331                 Object key = it.next();
332                 MavenProject refProject = (MavenProject) project.getProjectReferences().get( key );
333                 version = findServletVersionInDependencies( refProject );
334                 if ( version != null ) // version found in dependencies
335                 {
336                     break;
337                 }
338             }
339         }
340         return version;
341     }
342 }