1 /*
2 * Copyright (c) 2002-2017, Mairie de Paris
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright notice
10 * and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright notice
13 * and the following disclaimer in the documentation and/or other materials
14 * provided with the distribution.
15 *
16 * 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 *
32 * License 1.0
33 */
34 package org.apache.pluto.portalImpl;
35
36
37 //import org.apache.xml.serialize.OutputFormat;
38 import com.sun.org.apache.xml.internal.serialize.OutputFormat;
39 import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
40
41 import org.apache.pluto.om.common.Parameter;
42 import org.apache.pluto.om.common.ParameterCtrl;
43 import org.apache.pluto.om.common.ParameterSet;
44 import org.apache.pluto.om.common.ParameterSetCtrl;
45 import org.apache.pluto.om.common.SecurityRoleRef;
46 import org.apache.pluto.om.common.SecurityRoleRefSet;
47 import org.apache.pluto.om.common.SecurityRoleRefSetCtrl;
48 import org.apache.pluto.om.common.SecurityRoleSet;
49 import org.apache.pluto.om.portlet.PortletDefinition;
50 import org.apache.pluto.om.servlet.ServletDefinition;
51 import org.apache.pluto.om.servlet.ServletDefinitionCtrl;
52 import org.apache.pluto.om.servlet.ServletDefinitionListCtrl;
53 import org.apache.pluto.portalImpl.om.common.impl.DescriptionImpl;
54 import org.apache.pluto.portalImpl.om.common.impl.DescriptionSetImpl;
55 import org.apache.pluto.portalImpl.om.common.impl.DisplayNameImpl;
56 import org.apache.pluto.portalImpl.om.common.impl.DisplayNameSetImpl;
57 import org.apache.pluto.portalImpl.om.portlet.impl.PortletApplicationDefinitionImpl;
58 import org.apache.pluto.portalImpl.om.servlet.impl.ServletDefinitionImpl;
59 import org.apache.pluto.portalImpl.om.servlet.impl.ServletMappingImpl;
60 import org.apache.pluto.portalImpl.om.servlet.impl.WebApplicationDefinitionImpl;
61 import org.apache.pluto.portalImpl.xml.Constants;
62 import org.apache.pluto.portalImpl.xml.XmlParser;
63 import org.apache.pluto.portlet.admin.PlutoAdminException;
64
65 //import org.apache.xml.serialize.XMLSerializer;
66 import org.exolab.castor.mapping.Mapping;
67 import org.exolab.castor.xml.Marshaller;
68 import org.exolab.castor.xml.Unmarshaller;
69
70 import java.io.BufferedReader;
71 import java.io.File;
72 import java.io.FileInputStream;
73 import java.io.FileOutputStream;
74 import java.io.FileWriter;
75 import java.io.IOException;
76 import java.io.InputStream;
77 import java.io.InputStreamReader;
78 import java.io.RandomAccessFile;
79 import java.io.Reader;
80 import java.io.StreamTokenizer;
81
82 import java.util.Collection;
83 import java.util.Enumeration;
84 import java.util.Iterator;
85 import java.util.Locale;
86 import java.util.StringTokenizer;
87 import java.util.Vector;
88 import java.util.jar.JarEntry;
89 import java.util.jar.JarFile;
90
91
92 /**
93 * @deprecated this deployment utility has been deprecated in
94 * favor of the one provided with the deploy subproject.
95 *
96 * @see org.apache.pluto.driver.deploy.CLI
97 *
98 */
99 public class Deploy
100 {
101 private static boolean debug = false;
102 private static String dirDelim = System.getProperty( "file.separator" );
103 private static String webInfDir = dirDelim + "WEB-INF" + dirDelim;
104 private static String webAppsDir;
105 private static String portalImplWebDir;
106 private static String plutoHome;
107
108 public static void deployArchive( String webAppsDir, String warFile )
109 throws IOException
110 {
111 String warFileName = warFile;
112
113 if ( warFileName.indexOf( "/" ) != -1 )
114 {
115 warFileName = warFileName.substring( warFileName.lastIndexOf( "/" ) + 1 );
116 }
117
118 if ( warFileName.indexOf( dirDelim ) != -1 )
119 {
120 warFileName = warFileName.substring( warFileName.lastIndexOf( dirDelim ) + 1 );
121 }
122
123 if ( warFileName.endsWith( ".war" ) )
124 {
125 warFileName = warFileName.substring( 0, warFileName.lastIndexOf( "." ) );
126 }
127
128 System.out.println( "deploying '" + warFileName + "' ..." );
129
130 String destination = webAppsDir + warFileName;
131
132 JarFile jarFile = new JarFile( warFile );
133 Enumeration files = jarFile.entries( );
134
135 while ( files.hasMoreElements( ) )
136 {
137 JarEntry entry = (JarEntry) files.nextElement( );
138
139 /* Check for use of '/WEB-INF/tld/portlet.tld' instead of 'http://java.sun.com/portlet' in taglib declaration*/
140 String fileName = entry.getName( );
141
142 if ( !entry.isDirectory( ) && entry.getName( ).endsWith( ".jsp" ) )
143 {
144 InputStream is = jarFile.getInputStream( entry );
145 Reader r = new BufferedReader( new InputStreamReader( is ) );
146 StreamTokenizer st = new StreamTokenizer( r );
147 st.quoteChar( '\'' );
148 st.quoteChar( '"' );
149
150 while ( st.nextToken( ) != StreamTokenizer.TT_EOF )
151 {
152 if ( ( st.ttype == '\'' ) || ( st.ttype == '"' ) )
153 {
154 String sval = st.sval;
155 String sqc = Character.toString( (char) st.ttype );
156
157 if ( sval.equals( "/WEB-INF/tld/portlet.tld" ) )
158 {
159 System.out.println( "Warning: " + sqc + st.sval + sqc + " has been found in file " +
160 fileName + ". Use instead " + sqc + "http://java.sun.com/portlet" + sqc +
161 " with your portlet taglib declaration!\n" );
162
163 break;
164 }
165 }
166 }
167 }
168
169 File file = new File( destination, fileName );
170 File dirF = new File( file.getParent( ) );
171 dirF.mkdirs( );
172
173 if ( entry.isDirectory( ) )
174 {
175 file.mkdirs( );
176 }
177 else
178 {
179 byte[] buffer = new byte[1024];
180 int length = 0;
181 InputStream fis = jarFile.getInputStream( entry );
182 FileOutputStream fos = new FileOutputStream( file );
183
184 while ( ( length = fis.read( buffer ) ) >= 0 )
185 {
186 fos.write( buffer, 0, length );
187 }
188
189 fos.close( );
190 }
191 }
192
193 System.out.println( "finished!" );
194 }
195
196 public static void prepareWebArchive( String webAppsDir, String warFile )
197 throws Exception, IOException
198 {
199 String webModule = warFile;
200
201 if ( webModule.indexOf( "/" ) != -1 )
202 {
203 webModule = webModule.substring( webModule.lastIndexOf( "/" ) + 1 );
204 }
205
206 if ( webModule.indexOf( dirDelim ) != -1 )
207 {
208 webModule = webModule.substring( webModule.lastIndexOf( dirDelim ) + 1 );
209 }
210
211 if ( webModule.endsWith( ".war" ) )
212 {
213 webModule = webModule.substring( 0, webModule.lastIndexOf( "." ) );
214 }
215
216 System.out.println( "prepare web archive '" + webModule + "' ..." );
217
218 Mapping mappingPortletXml = null;
219 Mapping mappingWebXml = null;
220
221 // get portlet xml mapping file
222 String _portlet_mapping = webAppsDir + portalImplWebDir + "WEB-INF" + dirDelim + "data" + dirDelim + "xml" +
223 dirDelim + "portletdefinitionmapping.xml";
224 mappingPortletXml = new Mapping( );
225
226 try
227 {
228 mappingPortletXml.loadMapping( _portlet_mapping );
229 }
230 catch ( Exception e )
231 {
232 System.out.println( "CASTOR-Exception: " + e );
233 throw new IOException( "Failed to load mapping file " + _portlet_mapping + ". Cause of mapping error: " +
234 e.getMessage( ) );
235 }
236
237 File portletXml = new File( webAppsDir + webModule + webInfDir + "portlet.xml" );
238
239 // get web xml mapping file
240 String _web_mapping = webAppsDir + portalImplWebDir + "WEB-INF" + dirDelim + "data" + dirDelim + "xml" +
241 dirDelim + "servletdefinitionmapping.xml";
242 mappingWebXml = new Mapping( );
243
244 try
245 {
246 mappingWebXml.loadMapping( _web_mapping );
247 }
248 catch ( Exception e )
249 {
250 throw new IOException( "Failed to load mapping file " + _web_mapping + ". Cause of mapping error: " +
251 e.getMessage( ) );
252 }
253
254 File webXml = new File( webAppsDir + webModule + webInfDir + "web.xml" );
255
256 try
257 {
258 org.w3c.dom.Document portletDocument = XmlParser.parsePortletXml( new FileInputStream( portletXml ) );
259
260 Unmarshaller unmarshaller = new Unmarshaller( mappingPortletXml );
261
262 // modified by YCLI: START :: to ignore extra elements and attributes
263 unmarshaller.setIgnoreExtraElements( true );
264 unmarshaller.setIgnoreExtraAttributes( true );
265
266 // modified by YCLI: END
267 PortletApplicationDefinitionImpl portletApp = (PortletApplicationDefinitionImpl) unmarshaller.unmarshal( portletDocument );
268
269 // refill structure with necessary information
270 Vector structure = new Vector( );
271 structure.add( webModule );
272 structure.add( null );
273 structure.add( null );
274 portletApp.preBuild( structure );
275
276 if ( debug )
277 {
278 System.out.println( portletApp );
279 }
280
281 // now generate web part
282 WebApplicationDefinitionImpl webApp = null;
283
284 if ( webXml.exists( ) )
285 {
286 org.w3c.dom.Document webDocument = XmlParser.parseWebXml( new FileInputStream( webXml ) );
287
288 Unmarshaller unmarshallerWeb = new Unmarshaller( mappingWebXml );
289
290 // modified by YCLI: START :: to ignore extra elements and attributes
291 unmarshallerWeb.setIgnoreExtraElements( true );
292 unmarshallerWeb.setIgnoreExtraAttributes( true );
293 // modified by YCLI: END
294 webApp = (WebApplicationDefinitionImpl) unmarshallerWeb.unmarshal( webDocument );
295 }
296 else
297 {
298 webApp = new WebApplicationDefinitionImpl( );
299
300 DisplayNameImpl dispName = new DisplayNameImpl( );
301 dispName.setDisplayName( webModule );
302 dispName.setLocale( Locale.ENGLISH );
303
304 DisplayNameSetImpl dispSet = new DisplayNameSetImpl( );
305 dispSet.add( dispName );
306 webApp.setDisplayNames( dispSet );
307
308 DescriptionImpl desc = new DescriptionImpl( );
309 desc.setDescription( "Automated generated Application Wrapper" );
310 desc.setLocale( Locale.ENGLISH );
311
312 DescriptionSetImpl descSet = new DescriptionSetImpl( );
313 descSet.add( desc );
314 webApp.setDescriptions( descSet );
315 }
316
317 org.apache.pluto.om.ControllerFactory controllerFactory = new org.apache.pluto.portalImpl.om.ControllerFactoryImpl( );
318
319 ServletDefinitionListCtrl servletDefinitionSetCtrl = (ServletDefinitionListCtrl) controllerFactory.get( webApp.getServletDefinitionList( ) );
320 Collection servletMappings = webApp.getServletMappings( );
321
322 Iterator portlets = portletApp.getPortletDefinitionList( ).iterator( );
323
324 while ( portlets.hasNext( ) )
325 {
326 PortletDefinition portlet = (PortletDefinition) portlets.next( );
327
328 // check if already exists
329 ServletDefinition servlet = webApp.getServletDefinitionList( ).get( portlet.getName( ) );
330
331 if ( servlet != null )
332 {
333 if ( !servlet.getServletClass( ).equals( "org.apache.pluto.core.PortletServlet" ) )
334 {
335 System.out.println( "Note: Replaced already existing the servlet with the name '" +
336 portlet.getName( ) + "' with the wrapper servlet." );
337 }
338
339 ServletDefinitionCtrl _servletCtrl = (ServletDefinitionCtrl) controllerFactory.get( servlet );
340 _servletCtrl.setServletClass( "org.apache.pluto.core.PortletServlet" );
341 }
342 else
343 {
344 servlet = servletDefinitionSetCtrl.add( portlet.getName( ), "org.apache.pluto.core.PortletServlet" );
345 }
346
347 ServletDefinitionCtrl servletCtrl = (ServletDefinitionCtrl) controllerFactory.get( servlet );
348
349 DisplayNameImpl dispName = new DisplayNameImpl( );
350 dispName.setDisplayName( portlet.getName( ) + " Wrapper" );
351 dispName.setLocale( Locale.ENGLISH );
352
353 DisplayNameSetImpl dispSet = new DisplayNameSetImpl( );
354 dispSet.add( dispName );
355 servletCtrl.setDisplayNames( dispSet );
356
357 DescriptionImpl desc = new DescriptionImpl( );
358 desc.setDescription( "Automated generated Portlet Wrapper" );
359 desc.setLocale( Locale.ENGLISH );
360
361 DescriptionSetImpl descSet = new DescriptionSetImpl( );
362 descSet.add( desc );
363 servletCtrl.setDescriptions( descSet );
364
365 ParameterSet parameters = servlet.getInitParameterSet( );
366
367 ParameterSetCtrl parameterSetCtrl = (ParameterSetCtrl) controllerFactory.get( parameters );
368
369 Parameter parameter1 = parameters.get( "portlet-class" );
370
371 if ( parameter1 == null )
372 {
373 parameterSetCtrl.add( "portlet-class", portlet.getClassName( ) );
374 }
375 else
376 {
377 ParameterCtrl parameterCtrl = (ParameterCtrl) controllerFactory.get( parameter1 );
378 parameterCtrl.setValue( portlet.getClassName( ) );
379 }
380
381 Parameter parameter2 = parameters.get( "portlet-guid" );
382
383 if ( parameter2 == null )
384 {
385 parameterSetCtrl.add( "portlet-guid", portlet.getId( ).toString( ) );
386 }
387 else
388 {
389 ParameterCtrl parameterCtrl = (ParameterCtrl) controllerFactory.get( parameter2 );
390 parameterCtrl.setValue( portlet.getId( ).toString( ) );
391 }
392
393 boolean found = false;
394 Iterator mappings = servletMappings.iterator( );
395
396 while ( mappings.hasNext( ) )
397 {
398 ServletMappingImpl servletMapping = (ServletMappingImpl) mappings.next( );
399
400 if ( servletMapping.getServletName( ).equals( portlet.getName( ) ) )
401 {
402 found = true;
403 servletMapping.setUrlPattern( "/" + portlet.getName( ).replace( ' ', '_' ) + "/*" );
404 }
405 }
406
407 if ( !found )
408 {
409 ServletMappingImpl servletMapping = new ServletMappingImpl( );
410 servletMapping.setServletName( portlet.getName( ) );
411 servletMapping.setUrlPattern( "/" + portlet.getName( ).replace( ' ', '_' ) + "/*" );
412 servletMappings.add( servletMapping );
413 }
414
415 SecurityRoleRefSet servletSecurityRoleRefs = ( (ServletDefinitionImpl) servlet ).getInitSecurityRoleRefSet( );
416
417 SecurityRoleRefSetCtrl servletSecurityRoleRefSetCtrl = (SecurityRoleRefSetCtrl) controllerFactory.get( servletSecurityRoleRefs );
418
419 SecurityRoleSet webAppSecurityRoles = webApp.getSecurityRoles( );
420
421 SecurityRoleRefSet portletSecurityRoleRefs = portlet.getInitSecurityRoleRefSet( );
422
423 Iterator p = portletSecurityRoleRefs.iterator( );
424
425 while ( p.hasNext( ) )
426 {
427 SecurityRoleRef portletSecurityRoleRef = (SecurityRoleRef) p.next( );
428
429 if ( ( portletSecurityRoleRef.getRoleLink( ) == null ) &&
430 ( webAppSecurityRoles.get( portletSecurityRoleRef.getRoleName( ) ) == null ) )
431 {
432 System.out.println(
433 "Note: The web application has no security role defined which matches the role name \"" +
434 portletSecurityRoleRef.getRoleName( ) +
435 "\" of the security-role-ref element defined for the wrapper-servlet with the name '" +
436 portlet.getName( ) + "'." );
437
438 break;
439 }
440
441 SecurityRoleRef servletSecurityRoleRef = servletSecurityRoleRefs.get( portletSecurityRoleRef.getRoleName( ) );
442
443 if ( null != servletSecurityRoleRef )
444 {
445 System.out.println(
446 "Note: Replaced already existing element of type <security-role-ref> with value \"" +
447 portletSecurityRoleRef.getRoleName( ) +
448 "\" for subelement of type <role-name> for the wrapper-servlet with the name '" +
449 portlet.getName( ) + "'." );
450 servletSecurityRoleRefSetCtrl.remove( servletSecurityRoleRef );
451 }
452
453 servletSecurityRoleRefSetCtrl.add( portletSecurityRoleRef );
454 }
455 }
456
457 if ( debug )
458 {
459 System.out.println( webApp );
460 }
461
462 OutputFormat of = new OutputFormat( );
463 of.setIndenting( true );
464 of.setIndent( 4 ); // 2-space indention
465 of.setLineWidth( 16384 );
466 // As large as needed to prevent linebreaks in text nodes
467 of.setDoctype( Constants.WEB_PORTLET_PUBLIC_ID, Constants.WEB_PORTLET_DTD );
468
469 FileWriter writer = new FileWriter( webAppsDir + webModule + System.getProperty( "file.separator" ) +
470 "WEB-INF" + System.getProperty( "file.separator" ) + "web.xml" );
471 XMLSerializer serializer = new XMLSerializer( writer, of );
472
473 try
474 {
475 Marshaller marshaller = new Marshaller( serializer.asDocumentHandler( ) );
476 marshaller.setMapping( mappingWebXml );
477 marshaller.marshal( webApp );
478 }
479 catch ( Exception e )
480 {
481 writer.close( );
482 e.printStackTrace( System.out );
483 throw new PlutoAdminException( "Error found in Deploy.prepareWebArchive()", e );
484 }
485
486 // REMOVED copy of tld b/c it's now included in the container distribution.
487 //String strTo = dirDelim + "WEB-INF" + dirDelim + "tld" + dirDelim + "portlet.tld";
488 //String strFrom = plutoHome + "portal" + dirDelim + "src" +
489 // dirDelim + "webapp" + strTo;
490
491 //copy(strFrom, webAppsDir + webModule + strTo);
492 }
493 catch ( Exception e )
494 {
495 e.printStackTrace( System.out );
496 throw new PlutoAdminException( "Error found in Deploy.prepareWebArchive()", e );
497 }
498
499 System.out.println( "finished!" );
500 }
501
502 public static void copy( String from, String to ) throws IOException
503 {
504 File f = new File( to );
505 f.getParentFile( ).mkdirs( );
506
507 byte[] buffer = new byte[1024];
508 int length = 0;
509 InputStream fis = new FileInputStream( from );
510 FileOutputStream fos = new FileOutputStream( f );
511
512 while ( ( length = fis.read( buffer ) ) >= 0 )
513 {
514 fos.write( buffer, 0, length );
515 }
516
517 fos.close( );
518 }
519
520 public static void main( String[] args )
521 {
522 String warFile;
523
524 if ( args.length < 4 )
525 {
526 System.out.println( "No argument specified. This command must be issued as:" );
527 System.out.println(
528 "deploy <TOMCAT-webapps-directory> <TOMCAT-pluto-webmodule-name> <web-archive> <pluto-home-dir> [-debug] [-addToEntityReg <app-id> [<portlet-id>:<portlet-name>]+]" );
529
530 return;
531 }
532
533 if ( args.length > 4 )
534 {
535 if ( ( args[4].equals( "-debug" ) ) || ( args[4].equals( "/debug" ) ) )
536 {
537 debug = true;
538 }
539 }
540
541 if ( debug )
542 {
543 for ( int i = 0; i < args.length; i++ )
544 {
545 System.out.println( "args[" + i + "]:" + args[i] );
546 }
547 }
548
549 webAppsDir = args[0];
550
551 if ( !webAppsDir.endsWith( dirDelim ) )
552 {
553 webAppsDir += dirDelim;
554 }
555
556 portalImplWebDir = args[1];
557
558 if ( !portalImplWebDir.endsWith( dirDelim ) )
559 {
560 portalImplWebDir += dirDelim;
561 }
562
563 warFile = args[2];
564
565 plutoHome = args[3];
566
567 if ( !plutoHome.endsWith( dirDelim ) )
568 {
569 plutoHome += dirDelim;
570 }
571
572 if ( args.length > 4 )
573 {
574 if ( ( args[4].equals( "-debug" ) ) || ( args[4].equals( "/debug" ) ) )
575 {
576 debug = true;
577 }
578
579 if ( ( args[4].equals( "-addToEntityReg" ) ) ||
580 ( ( args.length > 5 ) && ( args[5].equals( "-addToEntityReg" ) ) ) )
581 {
582 // parameters: app-id portlet application id; must be unique in portletentityregistry.xml
583 // portlet-id portlet id; must be unique inside the portlet application
584 // portlet-name the name of the portlet in portlet.xml
585 addToEntityReg( args );
586 }
587 }
588
589 try
590 {
591 deployArchive( webAppsDir, warFile );
592
593 // prepareWebArchive(webAppsDir, warFile);
594 }
595 catch ( PlutoAdminException e )
596 {
597 throw e;
598 }
599 catch ( Exception e )
600 {
601 e.printStackTrace( System.out );
602 throw new PlutoAdminException( "Error found in Deploy.main()", e );
603 }
604 }
605
606 static private void addToEntityReg( String[] args )
607 {
608 File portletAppFile = new File( args[2] );
609 String portletAppFileName = portletAppFile.getName( );
610 String portletApp = portletAppFileName.substring( 0, portletAppFileName.lastIndexOf( ".war" ) );
611 int o = ( args[4].equals( "-addToEntityReg" ) ? 5 : 6 );
612 String appId = args[o++];
613
614 try
615 {
616 String entityMapping = webAppsDir + portalImplWebDir + "WEB-INF/data/portletentityregistry.xml";
617 File file = new File( entityMapping );
618 RandomAccessFile ras = new RandomAccessFile( file, "rw" );
619 long length = ras.length( );
620 byte[] contentByte = new byte[(int) length];
621 ras.read( contentByte );
622
623 String contentString = new String( contentByte );
624 long pos = contentString.lastIndexOf( "</portlet-entity-registry>" );
625 ras.seek( pos );
626 ras.writeBytes( " <application id=\"" + appId + "\">\r\n" );
627 ras.writeBytes( " <definition-id>" + portletApp + "</definition-id>\r\n" );
628
629 StringTokenizer tokenizer;
630
631 for ( int i = o; i < args.length; ++i )
632 {
633 tokenizer = new StringTokenizer( args[i], ":" );
634
635 String portletId = tokenizer.nextToken( );
636 String portletName = tokenizer.nextToken( );
637 ras.writeBytes( " <portlet id=\"" + portletId + "\">\r\n" );
638 ras.writeBytes( " <definition-id>" + portletApp + "." + portletName +
639 "</definition-id>\r\n" );
640 ras.writeBytes( " </portlet>\r\n" );
641 }
642
643 ras.writeBytes( " </application>\r\n" );
644 ras.writeBytes( "</portlet-entity-registry>\r\n" );
645 ras.close( );
646 }
647 catch ( Exception e )
648 {
649 e.printStackTrace( System.out );
650 throw new PlutoAdminException( "Error found in Deploy.addToEntityReg()", e );
651 }
652 }
653 }