View Javadoc

1   package org.apache.maven.archiver;
2   
3   import org.apache.maven.artifact.Artifact;
4   import org.apache.maven.artifact.handler.ArtifactHandler;
5   
6   /*
7    * Licensed to the Apache Software Foundation (ASF) under one
8    * or more contributor license agreements.  See the NOTICE file
9    * distributed with this work for additional information
10   * regarding copyright ownership.  The ASF licenses this file
11   * to you under the Apache License, Version 2.0 (the
12   * "License"); you may not use this file except in compliance
13   * with the License.  You may obtain a copy of the License at
14   *
15   *   http://www.apache.org/licenses/LICENSE-2.0
16   *
17   * Unless required by applicable law or agreed to in writing,
18   * software distributed under the License is distributed on an
19   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
20   * KIND, either express or implied.  See the License for the
21   * specific language governing permissions and limitations
22   * under the License.
23   */
24  
25  /**
26   * Capture common manifest configuration.
27   *
28   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
29   * @version $Id: ManifestConfiguration.java 697981 2008-09-22 20:44:40Z jdcasey $
30   * @todo is this general enough to be in Plexus Archiver?
31   */
32  public class ManifestConfiguration
33  {
34      public static final String CLASSPATH_LAYOUT_TYPE_SIMPLE = "simple";
35  
36      public static final String CLASSPATH_LAYOUT_TYPE_REPOSITORY = "repository";
37  
38      public static final String CLASSPATH_LAYOUT_TYPE_CUSTOM = "custom";
39  
40      private String mainClass;
41  
42      private String packageName;
43  
44      private boolean addClasspath;
45  
46      private boolean addExtensions;
47  
48      /**
49       * This gets prefixed to all classpath entries.
50       */
51      private String classpathPrefix = "";
52  
53      /**
54       * Add default implementation entries if this is an extension specification.
55       *
56       * @since 2.1
57       */
58      private boolean addDefaultSpecificationEntries;
59  
60      /**
61       * Add default implementation entries if this is an extension.
62       *
63       * @since 2.1
64       */
65      private boolean addDefaultImplementationEntries;
66      
67      /**
68       * The generated Class-Path entry will contains paths that follow the
69       * Maven 2 repository layout:
70       * $groupId[0]/../${groupId[n]/$artifactId/$version/{fileName}
71       * @since 2.3
72       * @deprecated Use {@link ManifestConfiguration#classpathLayoutType} instead.
73       */
74      private boolean classpathMavenRepositoryLayout = false;
75      
76      private String classpathLayoutType = CLASSPATH_LAYOUT_TYPE_SIMPLE;
77      
78      private String customClasspathLayout;
79      
80      private boolean useUniqueVersions = true;
81  
82      public String getMainClass()
83      {
84          return mainClass;
85      }
86  
87      public String getPackageName()
88      {
89          return packageName;
90      }
91  
92      public boolean isAddClasspath()
93      {
94          return addClasspath;
95      }
96  
97      public boolean isAddDefaultImplementationEntries()
98      {
99          return addDefaultImplementationEntries;
100     }
101 
102     public boolean isAddDefaultSpecificationEntries()
103     {
104         return addDefaultSpecificationEntries;
105     }
106 
107     public boolean isAddExtensions()
108     {
109         return addExtensions;
110     }
111 
112     /**
113      * @deprecated Use {@link ManifestConfiguration#getClasspathLayoutType()}, and compare to
114      * CLASSPATH_LAYOUT_TYPE_SIMPLE or CLASSPATH_LAYOUT_TYPE_REPOSITORY, also declared in {@link ManifestConfiguration}.
115      */
116     public boolean isClasspathMavenRepositoryLayout()
117     {
118         return classpathMavenRepositoryLayout;
119     }
120 
121     public void setAddClasspath( boolean addClasspath )
122     {
123         this.addClasspath = addClasspath;
124     }
125 
126     public void setAddDefaultImplementationEntries( boolean addDefaultImplementationEntries )
127     {
128         this.addDefaultImplementationEntries = addDefaultImplementationEntries;
129     }
130 
131     public void setAddDefaultSpecificationEntries( boolean addDefaultSpecificationEntries )
132     {
133         this.addDefaultSpecificationEntries = addDefaultSpecificationEntries;
134     }
135 
136     public void setAddExtensions( boolean addExtensions )
137     {
138         this.addExtensions = addExtensions;
139     }
140 
141     /**
142      * @deprecated Use {@link ManifestConfiguration#setClasspathLayoutType(String)}, and use
143      * CLASSPATH_LAYOUT_TYPE_SIMPLE, CLASSPATH_LAYOUT_TYPE_CUSTOM, or CLASSPATH_LAYOUT_TYPE_REPOSITORY, 
144      * also declared in {@link ManifestConfiguration}.
145      */
146     public void setClasspathMavenRepositoryLayout( boolean classpathMavenRepositoryLayout )
147     {
148         this.classpathMavenRepositoryLayout = classpathMavenRepositoryLayout;
149     }
150 
151     public void setClasspathPrefix( String classpathPrefix )
152     {
153         this.classpathPrefix = classpathPrefix;
154     }
155 
156     public void setMainClass( String mainClass )
157     {
158         this.mainClass = mainClass;
159     }
160 
161     public void setPackageName( String packageName )
162     {
163         this.packageName = packageName;
164     }
165 
166     public String getClasspathPrefix()
167     {
168         String cpp = classpathPrefix.replaceAll( "\\\\", "/" );
169 
170         if ( cpp.length() != 0 && !cpp.endsWith( "/" ) )
171         {
172             cpp += "/";
173         }
174 
175         return cpp;
176     }
177 
178     /**
179      * Return the type of layout to use when formatting classpath entries.
180      * Default is taken from the constant CLASSPATH_LAYOUT_TYPE_SIMPLE, declared 
181      * in this class, which has a value of 'simple'. Other values are: 'repository'
182      * (CLASSPATH_LAYOUT_TYPE_REPOSITORY, or the same as a maven classpath layout),
183      * and 'custom' (CLASSPATH_LAYOUT_TYPE_CUSTOM).
184      * <br/>
185      * <b>NOTE:</b> If you specify a type of 'custom' you MUST set {@link ManifestConfiguration#setCustomClasspathLayout(String)}.
186      */
187     public String getClasspathLayoutType()
188     {
189         return CLASSPATH_LAYOUT_TYPE_SIMPLE.equals( classpathLayoutType ) && classpathMavenRepositoryLayout ? CLASSPATH_LAYOUT_TYPE_REPOSITORY
190                         : classpathLayoutType;
191     }
192 
193     /**
194      * Set the type of layout to use when formatting classpath entries.
195      * Should be one of: 'simple' (CLASSPATH_LAYOUT_TYPE_SIMPLE), 'repository'
196      * (CLASSPATH_LAYOUT_TYPE_REPOSITORY, or the same as a maven classpath layout),
197      * and 'custom' (CLASSPATH_LAYOUT_TYPE_CUSTOM). The constant names noted here
198      * are defined in the {@link ManifestConfiguration} class.
199      * <br/>
200      * <b>NOTE:</b> If you specify a type of 'custom' you MUST set {@link ManifestConfiguration#setCustomClasspathLayout(String)}.
201      */
202     public void setClasspathLayoutType( String classpathLayoutType )
203     {
204         this.classpathLayoutType = classpathLayoutType;
205     }
206 
207     /**
208      * Retrieve the layout expression for use when the layout type set in {@link ManifestConfiguration#setClasspathLayoutType(String)}
209      * has the value 'custom'. <b>The default value is null.</b>
210      * Expressions will be evaluated against the following ordered list of classpath-related objects:
211      * <ol>
212      *   <li>The current {@link Artifact} instance, if one exists.</li>
213      *   <li>The current {@link ArtifactHandler} instance from the artifact above.</li>
214      * </ol>
215      * <br/>
216      * <b>NOTE:</b> If you specify a layout type of 'custom' you MUST set this layout expression.
217      */
218     public String getCustomClasspathLayout()
219     {
220         return customClasspathLayout;
221     }
222 
223     /**
224      * Set the layout expression for use when the layout type set in {@link ManifestConfiguration#setClasspathLayoutType(String)}
225      * has the value 'custom'. Expressions will be evaluated against the following ordered list of classpath-related objects:
226      * <ol>
227      *   <li>The current {@link Artifact} instance, if one exists.</li>
228      *   <li>The current {@link ArtifactHandler} instance from the artifact above.</li>
229      * </ol>
230      * <br/>
231      * <b>NOTE:</b> If you specify a layout type of 'custom' you MUST set this layout expression.
232      */
233     public void setCustomClasspathLayout( String customClasspathLayout )
234     {
235         this.customClasspathLayout = customClasspathLayout;
236     }
237 
238     /**
239      * Retrieve the flag for whether snapshot artifacts should be added to the 
240      * classpath using the timestamp/buildnumber version (the default, when this
241      * flag is true), or using the generic -SNAPSHOT version (when the flag is
242      * false).
243      * <br/>
244      * <b>NOTE:</b> If the snapshot was installed locally, this flag will not 
245      * have an effect on that artifact's inclusion, since it will have the same
246      * version either way (i.e. -SNAPSHOT naming).
247      */
248     public boolean isUseUniqueVersions()
249     {
250         return useUniqueVersions;
251     }
252 
253     /**
254      * Set the flag for whether snapshot artifacts should be added to the 
255      * classpath using the timestamp/buildnumber version (the default, when this
256      * flag is true), or using the generic -SNAPSHOT version (when the flag is
257      * false).
258      * <br/>
259      * <b>NOTE:</b> If the snapshot was installed locally, this flag will not 
260      * have an effect on that artifact's inclusion, since it will have the same
261      * version either way (i.e. -SNAPSHOT naming).
262      */
263     public void setUseUniqueVersions( boolean useUniqueVersions )
264     {
265         this.useUniqueVersions = useUniqueVersions;
266     }
267 }