/******************************************************************************* * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * *******************************************************************************/ package com.liferay.ide.server.tomcat.ui.wizard; import static com.liferay.ide.core.util.CoreUtil.empty; import com.liferay.ide.core.util.StringPool; import com.liferay.ide.server.tomcat.core.ILiferayTomcatRuntime; import com.liferay.ide.server.tomcat.core.util.LiferayTomcatUtil; import com.liferay.ide.server.ui.LiferayServerUI; import com.liferay.ide.ui.util.SWTUtil; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.Enumeration; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jst.server.core.IJavaRuntime; import org.eclipse.jst.server.tomcat.core.internal.ITomcatRuntimeWorkingCopy; import org.eclipse.jst.server.tomcat.ui.internal.TomcatRuntimeComposite; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.DirectoryDialog; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.Text; import org.eclipse.wst.server.core.IRuntimeWorkingCopy; import org.eclipse.wst.server.ui.wizard.IWizardHandle; /** * @author Greg Amerson */ @SuppressWarnings( { "restriction" } ) public class LiferayTomcatRuntimeOptionalComposite extends TomcatRuntimeComposite implements ModifyListener { public static void setFieldValue( Text field, String value ) { if( field != null && !field.isDisposed() ) { field.setText( value != null ? value : StringPool.EMPTY ); } } protected boolean ignoreModifyEvent; private Text javadocField; private Text sourceField; public LiferayTomcatRuntimeOptionalComposite( Composite parent, IWizardHandle wizard ) { super( parent, wizard ); wizard.setTitle( Msgs.liferayRuntimeTomcatBundle ); wizard.setDescription( Msgs.specifyExtraSettings ); wizard.setImageDescriptor( LiferayServerUI.getImageDescriptor( LiferayServerUI.IMG_WIZ_RUNTIME ) ); } protected Button createButton( String text, int style ) { Button button = new Button( this, style ); button.setText( text ); GridDataFactory.generate( button, 2, 1 ); return button; } @Override protected void createControl() { setLayout( createLayout() ); setLayoutData( new GridData( GridData.FILL_BOTH ) ); this.javadocField = createJavadocField( this ); this.javadocField.addModifyListener( this ); this.sourceField = createSourceField( this ); this.sourceField.addModifyListener( this ); init(); validate(); Dialog.applyDialogFont( this ); } public static Text createJavadocField( final Composite parent ) { final Text javadocField = createTextField( parent, Msgs.liferayJavadocURL ); SWTUtil.createButton( parent, Msgs.browseZip ).addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { FileDialog fd = new FileDialog( parent.getShell() ); fd.setText( Msgs.selectLiferayJavadocZipFile ); String selectedFile = fd.open(); if( selectedFile != null ) { String javadocZipURL = getJavadocZipURL( selectedFile ); if( javadocZipURL != null ) { javadocField.setText( javadocZipURL ); } else { MessageDialog.openInformation( parent.getShell(), Msgs.liferayTomcatRuntime, Msgs.fileNotValid ); } } } } ); SWTUtil.createLabel( parent, StringPool.EMPTY, 1 ); SWTUtil.createButton( parent, Msgs.browseDirectory ).addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { DirectoryDialog dd = new DirectoryDialog( parent.getShell() ); dd.setText( Msgs.selectLiferayJavadocDirectory ); dd.setFilterPath( javadocField.getText() ); String selectedFile = dd.open(); if( selectedFile != null ) { String javadocDirectoryURL = getJavadocDirectoryURL( selectedFile ); if( javadocDirectoryURL != null ) { javadocField.setText( javadocDirectoryURL ); } else { MessageDialog.openInformation( parent.getShell(), Msgs.liferayTomcatRuntime, Msgs.directoryNotValid ); } } } } ); return javadocField; } public static Text createSourceField( final Composite parent ) { final Text sourceField = createTextField( parent, Msgs.liferaysourceLocation ); SWTUtil.createButton( parent, Msgs.browseZip ).addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { FileDialog fd = new FileDialog( parent.getShell() ); fd.setText( Msgs.selectLiferaySourceZipFile ); String selectedFile = fd.open(); if( selectedFile != null && new File( selectedFile ).exists() ) { sourceField.setText( selectedFile ); } } } ); SWTUtil.createLabel( parent, StringPool.EMPTY, 1 ); SWTUtil.createButton( parent, Msgs.browseDirectory ).addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { DirectoryDialog dd = new DirectoryDialog( parent.getShell() ); dd.setText( Msgs.selectLiferaySourceDirectory ); dd.setFilterPath( sourceField.getText() ); String selectedFile = dd.open(); if( selectedFile != null && new File( selectedFile ).exists() ) { sourceField.setText( selectedFile ); } } } ); return sourceField; } protected static Label createLabel( Composite parent, String text ) { Label label = new Label( parent, SWT.NONE ); label.setText( text ); GridDataFactory.generate( label, 2, 1 ); return label; } protected Layout createLayout() { GridLayout layout = new GridLayout( 2, false ); return layout; } protected void createSpacer() { new Label( this, SWT.NONE ); } protected static Text createTextField( Composite parent, String labelText ) { createLabel( parent, labelText ); Text text = new Text( parent, SWT.BORDER ); text.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) ); return text; } protected static String getJavadocDirectoryURL( String selectedFile ) { String retval = null; File javadocDirectory = new File( selectedFile ); if( javadocDirectory.exists() && javadocDirectory.isDirectory() ) { // check one layer down File[] files = javadocDirectory.listFiles(); if( !empty( files ) ) { for( File nestedFile : files ) { if( nestedFile.getName().equals( "javadocs" ) ) //$NON-NLS-1$ { javadocDirectory = nestedFile; } } for( File nestedFile : files ) { if( nestedFile.getName().equals( "javadocs-all" ) ) //$NON-NLS-1$ { javadocDirectory = nestedFile; } } File liferayDir = new File( javadocDirectory, "com/liferay" ); //$NON-NLS-1$ if( liferayDir.exists() ) { try { retval = javadocDirectory.toURI().toURL().toExternalForm(); } catch( MalformedURLException e ) { } } } } return retval; } protected static String getJavadocZipURL( String selectedFile ) { String retval = null; try { String rootEntryName = null; ZipEntry javadocEntry = null; final File javadocFile = new File( selectedFile ); final ZipFile zipFile = new ZipFile( javadocFile ); Enumeration<? extends ZipEntry> zipEntries = zipFile.entries(); ZipEntry rootEntry = zipEntries.nextElement(); rootEntryName = new Path( rootEntry.getName() ).segment( 0 ); if( rootEntryName.endsWith( StringPool.FORWARD_SLASH ) ) { rootEntryName = rootEntryName.substring( 0, rootEntryName.length() - 1 ); } ZipEntry entry = zipEntries.nextElement(); while( entry != null && javadocEntry == null ) { String entryName = entry.getName(); if( entryName.startsWith( rootEntryName + "/javadocs" ) ) //$NON-NLS-1$ { ZipEntry allEntry = new ZipEntry( rootEntryName + "/javadocs-all" ); //$NON-NLS-1$ if( zipFile.getInputStream( allEntry ) != null ) { javadocEntry = allEntry; } else { javadocEntry = entry; } } entry = zipEntries.nextElement(); } if( javadocEntry != null ) { retval = "jar:" + javadocFile.toURI().toURL().toExternalForm() + "!/" + javadocEntry.getName(); //$NON-NLS-1$ //$NON-NLS-2$ } zipFile.close(); } catch( Exception e ) { // we couldn't find value zip url for whatever reason so just return } return retval; } protected IJavaRuntime getJavaRuntime() { return (IJavaRuntime) this.runtime; } protected ILiferayTomcatRuntime getLiferayTomcatRuntime() { return LiferayTomcatUtil.getLiferayTomcatRuntime( this.runtimeWC ); } protected IRuntimeWorkingCopy getRuntime() { return this.runtimeWC; } @Override protected void init() { if( getRuntime() == null ) { return; } String javadocURL = getLiferayTomcatRuntime().getJavadocURL(); setFieldValue( javadocField, javadocURL != null ? javadocURL : StringPool.EMPTY ); IPath sourceLocation = getLiferayTomcatRuntime().getSourceLocation(); setFieldValue( sourceField, sourceLocation != null ? sourceLocation.toOSString() : StringPool.EMPTY ); } public void modifyText( ModifyEvent e ) { if( ignoreModifyEvent ) { ignoreModifyEvent = false; return; } else if( e.getSource().equals( javadocField ) ) { String newJavadocURL = null; // if a file directory see if we need to correct String javadocValue = javadocField.getText(); try { URL javadocURL = new URL( javadocValue ); if( javadocURL.getProtocol() != null && javadocURL.getProtocol().startsWith( "http" ) ) //$NON-NLS-1$ { newJavadocURL = javadocValue; } if( newJavadocURL == null ) { File javadocFile = new File( javadocValue ); if( javadocFile.isFile() ) { newJavadocURL = javadocFile.toURI().toURL().toExternalForm(); } else if( javadocFile.isDirectory() ) { } else { newJavadocURL = javadocValue; } } } catch( MalformedURLException e1 ) { newJavadocURL = javadocValue; } getLiferayTomcatRuntime().setJavadocURL( newJavadocURL ); } else if( e.getSource().equals( sourceField ) ) { getLiferayTomcatRuntime().setSourceLocation( new Path( sourceField.getText() ) ); } validate(); } @Override public void setRuntime( IRuntimeWorkingCopy newRuntime ) { if( newRuntime == null ) { runtimeWC = null; runtime = null; } else { runtimeWC = newRuntime; runtime = (ITomcatRuntimeWorkingCopy) newRuntime.loadAdapter( ITomcatRuntimeWorkingCopy.class, null ); } init(); try { validate(); } catch( NullPointerException e ) { // ignore exception because this composite haven't been created and there are no shell } } private static class Msgs extends NLS { public static String browseDirectory; public static String browseZip; public static String directoryNotValid; public static String fileNotValid; public static String liferayJavadocURL; public static String liferayRuntimeTomcatBundle; public static String liferaysourceLocation; public static String liferayTomcatRuntime; public static String selectLiferayJavadocDirectory; public static String selectLiferayJavadocZipFile; public static String selectLiferaySourceDirectory; public static String selectLiferaySourceZipFile; public static String specifyExtraSettings; static { initializeMessages( LiferayTomcatRuntimeOptionalComposite.class.getName(), Msgs.class ); } } }