/******************************************************************************* * 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; import com.liferay.ide.core.util.StringPool; import com.liferay.ide.project.ui.ProjectUI; import com.liferay.ide.sdk.core.SDK; import com.liferay.ide.sdk.core.SDKUtil; import com.liferay.ide.server.tomcat.core.LiferayTomcatPlugin; import com.liferay.ide.server.tomcat.core.job.CleanAppServerJob; import com.liferay.ide.server.util.ServerUtil; import com.liferay.ide.ui.action.AbstractObjectAction; import java.io.FileInputStream; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.osgi.util.NLS; import org.eclipse.wst.server.core.IRuntime; import org.eclipse.wst.server.core.IRuntimeWorkingCopy; import org.eclipse.wst.server.core.TaskModel; import org.eclipse.wst.server.ui.internal.ServerUIPlugin; import org.eclipse.wst.server.ui.internal.wizard.TaskWizard; import org.eclipse.wst.server.ui.internal.wizard.WizardTaskUtil; import org.eclipse.wst.server.ui.wizard.WizardFragment; /** * @author Greg Amerson */ @SuppressWarnings( "restriction" ) public class CleanAppServerAction extends AbstractObjectAction { public CleanAppServerAction() { super(); } public void run( IAction action ) { try { if( !( fSelection instanceof IStructuredSelection ) ) { return; } Object elem = ( (IStructuredSelection) fSelection ).toArray()[0]; if( !( elem instanceof IProject ) ) { return; } IProject project = (IProject) elem; SDK sdk = SDKUtil.getSDK( project ); if( sdk == null ) { return; } IStatus status = sdk.validate(); if( !status.isOK() ) { MessageDialog.openError( null, Msgs.cleanAppServer, status.getChildren()[0].getMessage() ); return; } Map<String, Object> sdkProperties = sdk.getBuildProperties(); String bundleZipLocation = (String) sdkProperties.get( "app.server.zip.name" );//$NON-NLS-1$ status = validate( project, bundleZipLocation ); if( status.isOK() ) { cleanAppServer( project, bundleZipLocation ); } else { MessageDialog.openError( null, Msgs.cleanAppServer, status.getMessage() ); return; } } catch( Exception ex ) { ProjectUI.logError( ex ); } } protected void cleanAppServer( IProject project, String bundleZipLocation ) throws CoreException { String[] labels = new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL }; MessageDialog dialog = new MessageDialog( getDisplay().getActiveShell(), getTitle(), null, Msgs.deleteEntireTomcatDirectory, MessageDialog.WARNING, labels, 1 ); int retval = dialog.open(); if( retval == MessageDialog.OK ) { new CleanAppServerJob( project, bundleZipLocation ).schedule(); } } protected void editRuntime( IRuntime runtime ) { IRuntimeWorkingCopy runtimeWorkingCopy = runtime.createWorkingCopy(); if( showWizard( runtimeWorkingCopy ) != Window.CANCEL ) { try { runtimeWorkingCopy.save( false, null ); } catch( Exception ex ) { // ignore } } } protected String getTitle() { return Msgs.cleanAppServer; } protected int showWizard( final IRuntimeWorkingCopy runtimeWorkingCopy ) { String title = Msgs.wizEditRuntimeWizardTitle; final WizardFragment fragment2 = ServerUIPlugin.getWizardFragment( runtimeWorkingCopy.getRuntimeType().getId() ); if( fragment2 == null ) return Window.CANCEL; TaskModel taskModel = new TaskModel(); taskModel.putObject( TaskModel.TASK_RUNTIME, runtimeWorkingCopy ); WizardFragment fragment = new WizardFragment() { protected void createChildFragments( List<WizardFragment> list ) { list.add( (WizardFragment) fragment2.getChildFragments().get( 0 ) ); list.add( WizardTaskUtil.SaveRuntimeFragment ); } }; TaskWizard wizard = new TaskWizard( title, fragment, taskModel ); wizard.setForcePreviousAndNextButtons( true ); WizardDialog dialog = new WizardDialog( getDisplay().getActiveShell(), wizard ); return dialog.open(); } protected IStatus validate( IProject project, String bundleZipLocation ) throws CoreException { IStatus result = Status.OK_STATUS; if( bundleZipLocation == null ) { return result = LiferayTomcatPlugin.createErrorStatus( Msgs.bundleZipNotdefined ); } else { String rootEntryName = null; try { ZipInputStream zis = new ZipInputStream( new FileInputStream( bundleZipLocation ) ); ZipEntry rootEntry = zis.getNextEntry(); rootEntryName = new Path( rootEntry.getName() ).segment( 0 ); if( rootEntryName.endsWith( StringPool.FORWARD_SLASH ) ) { rootEntryName = rootEntryName.substring( 0, rootEntryName.length() - 1 ); } boolean foundBundle = false; ZipEntry entry = zis.getNextEntry(); while( entry != null && !foundBundle ) { String entryName = entry.getName(); if( entryName.startsWith( rootEntryName + "/tomcat-" ) ) //$NON-NLS-1$ { foundBundle = true; } else if( entryName.startsWith( rootEntryName + "/jboss-" ) ) //$NON-NLS-1$ { foundBundle = true; } entry = zis.getNextEntry(); }; zis.close(); } catch( Exception e ) { return result = LiferayTomcatPlugin.createErrorStatus( Msgs.bundleZipLocationNotValid ); } final IPath appServerDir = ServerUtil.getPortalBundle( project ).getAppServerDir(); String bundleDir = appServerDir.removeLastSegments( 1 ).lastSegment(); if( !bundleDir.equals( rootEntryName ) ) { return result = LiferayTomcatPlugin.createErrorStatus( NLS.bind( Msgs.runtimeLocationDirectoryNotMatch, bundleDir, rootEntryName ) ); } } return result; } private static class Msgs extends NLS { public static String bundleZipNotdefined; public static String bundleZipLocationNotValid; public static String runtimeLocationDirectoryNotMatch; public static String cleanAppServer; public static String deleteEntireTomcatDirectory; public static String wizEditRuntimeWizardTitle; static { initializeMessages( CleanAppServerAction.class.getName(), Msgs.class ); } } }