1 | |
|
2 | |
|
3 | |
|
4 | |
|
5 | |
|
6 | |
|
7 | |
|
8 | |
|
9 | |
|
10 | |
|
11 | |
|
12 | |
|
13 | |
|
14 | |
|
15 | |
|
16 | |
|
17 | |
package org.codehaus.mojo.nbm; |
18 | |
|
19 | |
import java.io.BufferedReader; |
20 | |
import java.io.ByteArrayInputStream; |
21 | |
import java.io.File; |
22 | |
import java.io.FileInputStream; |
23 | |
import java.io.FileOutputStream; |
24 | |
import java.io.IOException; |
25 | |
import java.io.InputStream; |
26 | |
import java.io.InputStreamReader; |
27 | |
import java.io.OutputStreamWriter; |
28 | |
import java.io.Reader; |
29 | |
import java.io.Writer; |
30 | |
import java.net.URL; |
31 | |
import java.util.Properties; |
32 | |
import java.util.StringTokenizer; |
33 | |
import java.util.jar.JarFile; |
34 | |
import org.apache.maven.plugin.MojoExecutionException; |
35 | |
import org.apache.maven.plugin.MojoFailureException; |
36 | |
import org.apache.maven.plugins.annotations.Component; |
37 | |
import org.apache.maven.plugins.annotations.LifecyclePhase; |
38 | |
import org.apache.maven.plugins.annotations.Mojo; |
39 | |
import org.apache.maven.project.MavenProject; |
40 | |
import org.apache.maven.project.MavenProjectHelper; |
41 | |
import org.apache.tools.ant.Project; |
42 | |
import org.apache.tools.ant.taskdefs.GenerateKey; |
43 | |
import org.apache.tools.ant.taskdefs.SignJar; |
44 | |
import org.apache.tools.ant.taskdefs.Taskdef; |
45 | |
import org.apache.tools.ant.types.FileSet; |
46 | |
import org.apache.tools.ant.types.Parameter; |
47 | |
import org.apache.tools.ant.types.selectors.AndSelector; |
48 | |
import org.apache.tools.ant.types.selectors.FilenameSelector; |
49 | |
import org.apache.tools.ant.types.selectors.OrSelector; |
50 | |
import org.codehaus.plexus.archiver.zip.ZipArchiver; |
51 | |
import org.codehaus.plexus.components.io.resources.PlexusIoResource; |
52 | |
import org.codehaus.plexus.util.DirectoryScanner; |
53 | |
import org.codehaus.plexus.util.FileUtils; |
54 | |
import org.codehaus.plexus.util.IOUtil; |
55 | |
import org.codehaus.plexus.util.InterpolationFilterReader; |
56 | |
import org.netbeans.nbbuild.MakeJNLP; |
57 | |
import org.netbeans.nbbuild.ModuleSelector; |
58 | |
import org.netbeans.nbbuild.VerifyJNLP; |
59 | |
|
60 | |
|
61 | |
|
62 | |
|
63 | |
|
64 | |
|
65 | |
|
66 | |
@Mojo(name="webstart-app", defaultPhase= LifecyclePhase.PACKAGE ) |
67 | 0 | public class CreateWebstartAppMojo |
68 | |
extends AbstractNbmMojo |
69 | |
{ |
70 | |
|
71 | |
|
72 | |
|
73 | |
|
74 | |
|
75 | |
@org.apache.maven.plugins.annotations.Parameter(required=true, readonly=true, property="project") |
76 | |
private MavenProject project; |
77 | |
|
78 | |
@Component |
79 | |
protected MavenProjectHelper projectHelper; |
80 | |
|
81 | |
|
82 | |
|
83 | |
|
84 | |
@org.apache.maven.plugins.annotations.Parameter(required=true, property="netbeans.branding.token") |
85 | |
protected String brandingToken; |
86 | |
|
87 | |
|
88 | |
|
89 | |
|
90 | |
@org.apache.maven.plugins.annotations.Parameter(required=true, defaultValue="${project.build.directory}") |
91 | |
private File outputDirectory; |
92 | |
|
93 | |
|
94 | |
|
95 | |
|
96 | |
|
97 | |
@org.apache.maven.plugins.annotations.Parameter(required=true, defaultValue="${project.build.directory}/${project.artifactId}-${project.version}-jnlp.war") |
98 | |
private File destinationFile; |
99 | |
|
100 | |
|
101 | |
|
102 | |
|
103 | |
|
104 | |
@org.apache.maven.plugins.annotations.Parameter(defaultValue="webstart", property="nbm.webstart.classifier") |
105 | |
private String webstartClassifier; |
106 | |
|
107 | |
|
108 | |
|
109 | |
|
110 | |
|
111 | |
@org.apache.maven.plugins.annotations.Parameter(property="nbm.webstart.codebase") |
112 | |
private String codebase; |
113 | |
|
114 | |
|
115 | |
|
116 | |
|
117 | |
|
118 | |
|
119 | |
|
120 | |
|
121 | |
|
122 | |
|
123 | |
|
124 | |
|
125 | |
|
126 | |
|
127 | |
|
128 | |
|
129 | |
|
130 | |
@org.apache.maven.plugins.annotations.Parameter |
131 | |
private File masterJnlpFile; |
132 | |
|
133 | |
|
134 | |
|
135 | |
|
136 | |
|
137 | |
|
138 | |
|
139 | |
@org.apache.maven.plugins.annotations.Parameter(property="master.jnlp.file.name") |
140 | |
private String masterJnlpFileName; |
141 | |
|
142 | |
|
143 | |
|
144 | |
|
145 | |
@org.apache.maven.plugins.annotations.Parameter(property="keystore") |
146 | |
private String keystore; |
147 | |
|
148 | |
|
149 | |
|
150 | |
|
151 | |
@org.apache.maven.plugins.annotations.Parameter(property="keystorepass") |
152 | |
private String keystorepassword; |
153 | |
|
154 | |
|
155 | |
|
156 | |
|
157 | |
@org.apache.maven.plugins.annotations.Parameter(property="keystorealias") |
158 | |
private String keystorealias; |
159 | |
|
160 | |
|
161 | |
|
162 | |
|
163 | |
|
164 | |
@org.apache.maven.plugins.annotations.Parameter(property="keystoretype") |
165 | |
private String keystoretype; |
166 | |
|
167 | |
|
168 | |
|
169 | |
|
170 | |
|
171 | |
|
172 | |
|
173 | |
|
174 | |
|
175 | |
|
176 | |
@org.apache.maven.plugins.annotations.Parameter(defaultValue="false", property="nbm.webstart.versions") |
177 | |
private boolean processJarVersions; |
178 | |
|
179 | |
|
180 | |
|
181 | |
|
182 | |
|
183 | |
@org.apache.maven.plugins.annotations.Parameter(property="netbeans.run.params") |
184 | |
private String additionalArguments; |
185 | |
|
186 | |
|
187 | |
|
188 | |
|
189 | |
|
190 | |
|
191 | |
@Override |
192 | |
public void execute() |
193 | |
throws MojoExecutionException, MojoFailureException |
194 | |
{ |
195 | 0 | if ( !"nbm-application".equals( project.getPackaging() ) ) |
196 | |
{ |
197 | 0 | throw new MojoExecutionException( |
198 | |
"This goal only makes sense on project with nbm-application packaging." ); |
199 | |
} |
200 | 0 | Project antProject = antProject(); |
201 | |
|
202 | 0 | getLog().warn( "WARNING: Unsigned and self-signed WebStart applications are deprecated from JDK7u21 onwards. To ensure future correct functionality please use trusted certificate."); |
203 | |
|
204 | 0 | if ( keystore != null && keystorealias != null && keystorepassword != null ) |
205 | |
{ |
206 | 0 | File ks = new File( keystore ); |
207 | 0 | if ( !ks.exists() ) |
208 | |
{ |
209 | 0 | throw new MojoFailureException( "Cannot find keystore file at " + ks.getAbsolutePath() ); |
210 | |
} |
211 | |
else |
212 | |
{ |
213 | |
|
214 | |
} |
215 | 0 | } |
216 | 0 | else if ( keystore != null || keystorepassword != null || keystorealias != null ) |
217 | |
{ |
218 | 0 | throw new MojoFailureException( |
219 | |
"If you want to sign the jnlp application, you need to define all three keystore related parameters." ); |
220 | |
} |
221 | |
else |
222 | |
{ |
223 | 0 | File generatedKeystore = new File( outputDirectory, "generated.keystore" ); |
224 | 0 | if ( ! generatedKeystore.exists() ) |
225 | |
{ |
226 | 0 | getLog().warn( "Keystore related parameters not set, generating a default keystore." ); |
227 | 0 | GenerateKey genTask = (GenerateKey) antProject.createTask( "genkey" ); |
228 | 0 | genTask.setAlias( "jnlp" ); |
229 | 0 | genTask.setStorepass( "netbeans" ); |
230 | 0 | genTask.setDname( "CN=" + System.getProperty( "user.name" ) ); |
231 | 0 | genTask.setKeystore( generatedKeystore.getAbsolutePath() ); |
232 | 0 | genTask.execute(); |
233 | |
} |
234 | 0 | keystore = generatedKeystore.getAbsolutePath(); |
235 | 0 | keystorepassword = "netbeans"; |
236 | 0 | keystorealias = "jnlp"; |
237 | |
} |
238 | |
|
239 | 0 | Taskdef taskdef = (Taskdef) antProject.createTask( "taskdef" ); |
240 | 0 | taskdef.setClassname( "org.netbeans.nbbuild.MakeJNLP" ); |
241 | 0 | taskdef.setName( "makejnlp" ); |
242 | 0 | taskdef.execute(); |
243 | |
|
244 | 0 | taskdef = (Taskdef) antProject.createTask( "taskdef" ); |
245 | 0 | taskdef.setClassname( "org.netbeans.nbbuild.VerifyJNLP" ); |
246 | 0 | taskdef.setName( "verifyjnlp" ); |
247 | 0 | taskdef.execute(); |
248 | |
|
249 | |
|
250 | |
try |
251 | |
{ |
252 | 0 | File webstartBuildDir = new File( |
253 | |
outputDirectory + File.separator + "webstart" + File.separator + brandingToken ); |
254 | 0 | if ( webstartBuildDir.exists() ) |
255 | |
{ |
256 | 0 | FileUtils.deleteDirectory( webstartBuildDir ); |
257 | |
} |
258 | 0 | webstartBuildDir.mkdirs(); |
259 | 0 | final String localCodebase = codebase != null ? codebase : webstartBuildDir.toURI().toString(); |
260 | 0 | getLog().info( "Generating webstartable binaries at " + webstartBuildDir.getAbsolutePath() ); |
261 | |
|
262 | 0 | File nbmBuildDirFile = new File( outputDirectory, brandingToken ); |
263 | |
|
264 | |
|
265 | |
|
266 | 0 | MakeJNLP jnlpTask = (MakeJNLP) antProject.createTask( "makejnlp" ); |
267 | 0 | jnlpTask.setDir( webstartBuildDir ); |
268 | 0 | jnlpTask.setCodebase( localCodebase ); |
269 | |
|
270 | 0 | jnlpTask.setVerify( false ); |
271 | 0 | jnlpTask.setPermissions( "<security><all-permissions/></security>" ); |
272 | 0 | jnlpTask.setSignJars( true ); |
273 | |
|
274 | 0 | jnlpTask.setAlias( keystorealias ); |
275 | 0 | jnlpTask.setKeystore( keystore ); |
276 | 0 | jnlpTask.setStorePass( keystorepassword ); |
277 | 0 | if ( keystoretype != null ) |
278 | |
{ |
279 | 0 | jnlpTask.setStoreType( keystoretype ); |
280 | |
} |
281 | 0 | jnlpTask.setProcessJarVersions( processJarVersions ); |
282 | |
|
283 | 0 | FileSet fs = jnlpTask.createModules(); |
284 | 0 | fs.setDir( nbmBuildDirFile ); |
285 | 0 | OrSelector or = new OrSelector(); |
286 | 0 | AndSelector and = new AndSelector(); |
287 | 0 | FilenameSelector inc = new FilenameSelector(); |
288 | 0 | inc.setName( "*/modules/**/*.jar" ); |
289 | 0 | or.addFilename( inc ); |
290 | 0 | inc = new FilenameSelector(); |
291 | 0 | inc.setName( "*/lib/**/*.jar" ); |
292 | 0 | or.addFilename( inc ); |
293 | 0 | inc = new FilenameSelector(); |
294 | 0 | inc.setName( "*/core/**/*.jar" ); |
295 | 0 | or.addFilename( inc ); |
296 | |
|
297 | 0 | ModuleSelector ms = new ModuleSelector(); |
298 | 0 | Parameter included = new Parameter(); |
299 | 0 | included.setName( "includeClusters" ); |
300 | 0 | included.setValue( "" ); |
301 | 0 | Parameter excluded = new Parameter(); |
302 | 0 | excluded.setName( "excludeClusters" ); |
303 | 0 | excluded.setValue( "" ); |
304 | 0 | Parameter exModules = new Parameter(); |
305 | 0 | exModules.setName( "excludeModules" ); |
306 | 0 | exModules.setValue( "" ); |
307 | 0 | ms.setParameters( new Parameter[] |
308 | |
{ |
309 | |
included, |
310 | |
excluded, |
311 | |
exModules |
312 | |
} ); |
313 | 0 | and.add( or ); |
314 | 0 | and.add( ms ); |
315 | 0 | fs.addAnd( and ); |
316 | 0 | jnlpTask.execute(); |
317 | |
|
318 | |
|
319 | 0 | String extSnippet = generateExtensions( fs, antProject, "" ); |
320 | |
|
321 | 0 | if ( masterJnlpFileName == null ) |
322 | |
{ |
323 | 0 | masterJnlpFileName = brandingToken; |
324 | |
} |
325 | |
|
326 | 0 | Properties props = new Properties(); |
327 | 0 | props.setProperty( "jnlp.codebase", localCodebase ); |
328 | 0 | props.setProperty( "app.name", brandingToken ); |
329 | 0 | props.setProperty( "app.title", project.getName() ); |
330 | 0 | if ( project.getOrganization() != null ) |
331 | |
{ |
332 | 0 | props.setProperty( "app.vendor", project.getOrganization().getName() ); |
333 | |
} |
334 | |
else |
335 | |
{ |
336 | 0 | props.setProperty( "app.vendor", "Nobody" ); |
337 | |
} |
338 | 0 | String description = project.getDescription() != null ? project.getDescription() : "No Project Description"; |
339 | 0 | props.setProperty( "app.description", description ); |
340 | 0 | props.setProperty( "branding.token", brandingToken ); |
341 | 0 | props.setProperty( "master.jnlp.file.name", masterJnlpFileName ); |
342 | 0 | props.setProperty( "netbeans.jnlp.fixPolicy", "false" ); |
343 | |
|
344 | 0 | StringBuilder stBuilder = new StringBuilder(); |
345 | 0 | if ( additionalArguments != null ) |
346 | |
{ |
347 | 0 | StringTokenizer st = new StringTokenizer( additionalArguments ); |
348 | 0 | while ( st.hasMoreTokens() ) |
349 | |
{ |
350 | 0 | String arg = st.nextToken(); |
351 | 0 | if ( arg.startsWith( "-J" ) ) |
352 | |
{ |
353 | 0 | if ( stBuilder.length() > 0 ) |
354 | |
{ |
355 | 0 | stBuilder.append( ' ' ); |
356 | |
} |
357 | 0 | stBuilder.append( arg.substring( 2 ) ); |
358 | |
} |
359 | 0 | } |
360 | |
} |
361 | 0 | props.setProperty( "netbeans.run.params", stBuilder.toString() ); |
362 | |
|
363 | 0 | File masterJnlp = new File( |
364 | |
webstartBuildDir.getAbsolutePath() + File.separator + masterJnlpFileName + ".jnlp" ); |
365 | 0 | filterCopy( masterJnlpFile, "master.jnlp", masterJnlp, props ); |
366 | |
|
367 | |
|
368 | 0 | File startup = copyLauncher( outputDirectory, nbmBuildDirFile ); |
369 | 0 | File jnlpDestination = new File( |
370 | |
webstartBuildDir.getAbsolutePath() + File.separator + "startup.jar" ); |
371 | |
|
372 | 0 | SignJar signTask = (SignJar) antProject.createTask( "signjar" ); |
373 | 0 | signTask.setKeystore( keystore ); |
374 | 0 | signTask.setStorepass( keystorepassword ); |
375 | 0 | signTask.setAlias( keystorealias ); |
376 | 0 | if ( keystoretype != null ) |
377 | |
{ |
378 | 0 | signTask.setStoretype( keystoretype ); |
379 | |
} |
380 | 0 | signTask.setSignedjar( jnlpDestination ); |
381 | 0 | signTask.setJar( startup ); |
382 | 0 | signTask.execute(); |
383 | |
|
384 | |
|
385 | 0 | DirectoryScanner ds = new DirectoryScanner(); |
386 | 0 | ds.setBasedir( nbmBuildDirFile ); |
387 | 0 | ds.setIncludes( new String[] |
388 | |
{ |
389 | |
"**/locale/*.jar" |
390 | |
} ); |
391 | 0 | ds.scan(); |
392 | 0 | String[] includes = ds.getIncludedFiles(); |
393 | 0 | StringBuilder brandRefs = new StringBuilder(); |
394 | 0 | if ( includes != null && includes.length > 0 ) |
395 | |
{ |
396 | 0 | File brandingDir = new File( webstartBuildDir, "branding" ); |
397 | 0 | brandingDir.mkdirs(); |
398 | 0 | for ( String incBran : includes ) |
399 | |
{ |
400 | 0 | File source = new File( nbmBuildDirFile, incBran ); |
401 | 0 | File dest = new File( brandingDir, source.getName() ); |
402 | 0 | FileUtils.copyFile( source, dest ); |
403 | 0 | brandRefs.append( " <jar href=\'branding/" ).append( dest.getName() ).append( "\'/>\n" ); |
404 | |
} |
405 | |
|
406 | 0 | signTask = (SignJar) antProject.createTask( "signjar" ); |
407 | 0 | signTask.setKeystore( keystore ); |
408 | 0 | signTask.setStorepass( keystorepassword ); |
409 | 0 | signTask.setAlias( keystorealias ); |
410 | 0 | if ( keystoretype != null ) |
411 | |
{ |
412 | 0 | signTask.setStoretype( keystoretype ); |
413 | |
} |
414 | |
|
415 | 0 | FileSet set = new FileSet(); |
416 | 0 | set.setDir( brandingDir ); |
417 | 0 | set.setIncludes( "*.jar" ); |
418 | 0 | signTask.addFileset( set ); |
419 | 0 | signTask.execute(); |
420 | |
} |
421 | |
|
422 | 0 | File modulesJnlp = new File( |
423 | |
webstartBuildDir.getAbsolutePath() + File.separator + "modules.jnlp" ); |
424 | 0 | props.setProperty( "jnlp.branding.jars", brandRefs.toString() ); |
425 | 0 | props.setProperty( "jnlp.resources", extSnippet ); |
426 | 0 | filterCopy( null, "branding.jnlp", modulesJnlp, props ); |
427 | |
|
428 | 0 | getLog().info( "Verifying generated webstartable content." ); |
429 | 0 | VerifyJNLP verifyTask = (VerifyJNLP) antProject.createTask( "verifyjnlp" ); |
430 | 0 | FileSet verify = new FileSet(); |
431 | 0 | verify.setFile( masterJnlp ); |
432 | 0 | verifyTask.addConfiguredFileset( verify ); |
433 | 0 | verifyTask.execute(); |
434 | |
|
435 | |
|
436 | |
|
437 | 0 | if ( destinationFile.exists() ) |
438 | |
{ |
439 | 0 | destinationFile.delete(); |
440 | |
} |
441 | 0 | ZipArchiver archiver = new ZipArchiver(); |
442 | 0 | if ( codebase != null ) |
443 | |
{ |
444 | 0 | getLog().warn( "Defining <codebase>/${nbm.webstart.codebase} is generally unnecessary" ); |
445 | 0 | archiver.addDirectory( webstartBuildDir ); |
446 | |
} |
447 | |
else |
448 | |
{ |
449 | 0 | archiver.addDirectory( webstartBuildDir, null, new String[] { "**/*.jnlp" } ); |
450 | 0 | for ( final File jnlp : webstartBuildDir.listFiles() ) |
451 | |
{ |
452 | 0 | if ( !jnlp.getName().endsWith( ".jnlp" ) ) |
453 | |
{ |
454 | 0 | continue; |
455 | |
} |
456 | 0 | archiver.addResource( new PlexusIoResource() { |
457 | |
public @Override InputStream getContents() throws IOException |
458 | |
{ |
459 | 0 | return new ByteArrayInputStream( FileUtils.fileRead( jnlp, "UTF-8" ).replace( localCodebase, "$$codebase" ).getBytes( "UTF-8" ) ); |
460 | |
} |
461 | |
public @Override long getLastModified() |
462 | |
{ |
463 | 0 | return jnlp.lastModified(); |
464 | |
} |
465 | |
public @Override boolean isExisting() |
466 | |
{ |
467 | 0 | return true; |
468 | |
} |
469 | |
public @Override long getSize() |
470 | |
{ |
471 | 0 | return UNKNOWN_RESOURCE_SIZE; |
472 | |
} |
473 | |
public @Override URL getURL() throws IOException |
474 | |
{ |
475 | 0 | return null; |
476 | |
} |
477 | |
public @Override String getName() |
478 | |
{ |
479 | 0 | return jnlp.getAbsolutePath(); |
480 | |
} |
481 | |
public @Override boolean isFile() |
482 | |
{ |
483 | 0 | return true; |
484 | |
} |
485 | |
public @Override boolean isDirectory() |
486 | |
{ |
487 | 0 | return false; |
488 | |
} |
489 | |
}, jnlp.getName(), archiver.getDefaultFileMode() ); |
490 | |
} |
491 | |
} |
492 | 0 | File jdkhome = new File( System.getProperty( "java.home" ) ); |
493 | 0 | File servlet = new File( jdkhome, "sample/jnlp/servlet/jnlp-servlet.jar" ); |
494 | 0 | if ( ! servlet.isFile() ) |
495 | |
{ |
496 | 0 | servlet = new File( jdkhome.getParentFile(), "sample/jnlp/servlet/jnlp-servlet.jar" ); |
497 | |
} |
498 | 0 | if ( servlet.isFile() ) |
499 | |
{ |
500 | 0 | archiver.addFile( servlet, "WEB-INF/lib/jnlp-servlet.jar" ); |
501 | 0 | archiver.addResource( new PlexusIoResource() { |
502 | |
public @Override InputStream getContents() throws IOException |
503 | |
{ |
504 | 0 | return new ByteArrayInputStream( ( "" + |
505 | |
"<web-app>\n" + |
506 | |
" <servlet>\n" + |
507 | |
" <servlet-name>JnlpDownloadServlet</servlet-name>\n" + |
508 | |
" <servlet-class>jnlp.sample.servlet.JnlpDownloadServlet</servlet-class>\n" + |
509 | |
" </servlet>\n" + |
510 | |
" <servlet-mapping>\n" + |
511 | |
" <servlet-name>JnlpDownloadServlet</servlet-name>\n" + |
512 | |
" <url-pattern>*.jnlp</url-pattern>\n" + |
513 | |
" </servlet-mapping>\n" + |
514 | |
"</web-app>\n" ).getBytes() ); |
515 | |
} |
516 | |
public @Override long getLastModified() |
517 | |
{ |
518 | 0 | return UNKNOWN_MODIFICATION_DATE; |
519 | |
} |
520 | |
public @Override boolean isExisting() |
521 | |
{ |
522 | 0 | return true; |
523 | |
} |
524 | |
public @Override long getSize() |
525 | |
{ |
526 | 0 | return UNKNOWN_RESOURCE_SIZE; |
527 | |
} |
528 | |
public @Override URL getURL() throws IOException |
529 | |
{ |
530 | 0 | return null; |
531 | |
} |
532 | |
public @Override String getName() |
533 | |
{ |
534 | 0 | return "web.xml"; |
535 | |
} |
536 | |
public @Override boolean isFile() |
537 | |
{ |
538 | 0 | return true; |
539 | |
} |
540 | |
public @Override boolean isDirectory() |
541 | |
{ |
542 | 0 | return false; |
543 | |
} |
544 | |
}, "WEB-INF/web.xml", archiver.getDefaultFileMode() ); |
545 | |
} |
546 | 0 | archiver.setDestFile( destinationFile ); |
547 | 0 | archiver.createArchive(); |
548 | |
|
549 | |
|
550 | 0 | projectHelper.attachArtifact( project, "war", webstartClassifier, destinationFile ); |
551 | |
|
552 | |
} |
553 | 0 | catch ( Exception ex ) |
554 | |
{ |
555 | 0 | throw new MojoExecutionException( "Error creating webstartable binary.", ex ); |
556 | 0 | } |
557 | 0 | } |
558 | |
|
559 | |
|
560 | |
|
561 | |
|
562 | |
|
563 | |
private File copyLauncher( File standaloneBuildDir, File builtInstallation ) |
564 | |
throws IOException |
565 | |
{ |
566 | 0 | File jnlpStarter = |
567 | |
new File( builtInstallation.getAbsolutePath() + File.separator + "harness" + File.separator + "jnlp" |
568 | |
+ File.separator + "jnlp-launcher.jar" ); |
569 | |
|
570 | 0 | InputStream source = null; |
571 | 0 | FileOutputStream outstream = null; |
572 | |
try |
573 | |
{ |
574 | 0 | if ( !jnlpStarter.exists() ) |
575 | |
{ |
576 | 0 | source = getClass().getClassLoader().getResourceAsStream( |
577 | |
"harness/jnlp/jnlp-launcher.jar" ); |
578 | |
} |
579 | |
else |
580 | |
{ |
581 | 0 | source = new FileInputStream( jnlpStarter ); |
582 | |
} |
583 | 0 | File jnlpDestination = new File( |
584 | |
standaloneBuildDir.getAbsolutePath() + File.separator + "jnlp-launcher.jar" ); |
585 | |
|
586 | 0 | outstream = new FileOutputStream( jnlpDestination ); |
587 | 0 | IOUtil.copy( source, outstream ); |
588 | 0 | return jnlpDestination; |
589 | |
} |
590 | |
finally |
591 | |
{ |
592 | 0 | IOUtil.close( source ); |
593 | 0 | IOUtil.close( outstream ); |
594 | |
} |
595 | |
} |
596 | |
|
597 | |
private void filterCopy( File sourceFile, String resourcePath, File destinationFile, Properties filterProperties ) |
598 | |
throws IOException |
599 | |
{ |
600 | |
|
601 | 0 | Reader source = null; |
602 | 0 | Writer destination = null; |
603 | |
try |
604 | |
{ |
605 | |
InputStream instream; |
606 | 0 | if ( sourceFile != null ) |
607 | |
{ |
608 | 0 | instream = new FileInputStream( sourceFile ); |
609 | |
} |
610 | |
else |
611 | |
{ |
612 | 0 | instream = getClass().getClassLoader().getResourceAsStream( resourcePath ); |
613 | |
} |
614 | 0 | FileOutputStream outstream = new FileOutputStream( destinationFile ); |
615 | |
|
616 | 0 | source = new BufferedReader( new InputStreamReader( instream, "UTF-8" ) ); |
617 | 0 | destination = new OutputStreamWriter( outstream, "UTF-8" ); |
618 | |
|
619 | |
|
620 | 0 | Reader reader = new InterpolationFilterReader( source, filterProperties, "${", "}" ); |
621 | |
|
622 | 0 | IOUtil.copy( reader, destination ); |
623 | |
} |
624 | |
finally |
625 | |
{ |
626 | 0 | IOUtil.close( source ); |
627 | 0 | IOUtil.close( destination ); |
628 | 0 | } |
629 | 0 | } |
630 | |
|
631 | |
|
632 | |
|
633 | |
|
634 | |
|
635 | |
|
636 | |
|
637 | |
|
638 | |
|
639 | |
private String generateExtensions( FileSet files, Project antProject, String masterPrefix ) |
640 | |
throws IOException |
641 | |
{ |
642 | 0 | StringBuilder buff = new StringBuilder(); |
643 | 0 | for ( String nm : files.getDirectoryScanner( antProject ).getIncludedFiles() ) |
644 | |
{ |
645 | 0 | File jar = new File( files.getDir( antProject ), nm ); |
646 | |
|
647 | 0 | if ( !jar.canRead() ) |
648 | |
{ |
649 | 0 | throw new IOException( "Cannot read file: " + jar ); |
650 | |
} |
651 | |
|
652 | 0 | JarFile theJar = new JarFile( jar ); |
653 | 0 | String codenamebase = theJar.getManifest().getMainAttributes().getValue( "OpenIDE-Module" ); |
654 | 0 | if ( codenamebase == null ) |
655 | |
{ |
656 | 0 | throw new IOException( "Not a NetBeans Module: " + jar ); |
657 | |
} |
658 | |
{ |
659 | 0 | int slash = codenamebase.indexOf( '/' ); |
660 | 0 | if ( slash >= 0 ) |
661 | |
{ |
662 | 0 | codenamebase = codenamebase.substring( 0, slash ); |
663 | |
} |
664 | |
} |
665 | 0 | String dashcnb = codenamebase.replace( '.', '-' ); |
666 | |
|
667 | 0 | buff.append( " <extension name='" ).append( codenamebase ).append( "' href='" ).append( masterPrefix ).append( dashcnb ).append( ".jnlp' />\n" ); |
668 | 0 | theJar.close(); |
669 | |
} |
670 | 0 | return buff.toString(); |
671 | |
|
672 | |
} |
673 | |
} |