/*******************************************************************************
* 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.project.ui.upgrade.animated;
import com.liferay.ide.core.ILiferayProject;
import com.liferay.ide.core.ILiferayProjectImporter;
import com.liferay.ide.core.LiferayCore;
import com.liferay.ide.core.LiferayLanguagePropertiesValidator;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.FileUtil;
import com.liferay.ide.core.util.IOUtil;
import com.liferay.ide.core.util.ZipUtil;
import com.liferay.ide.project.core.IProjectBuilder;
import com.liferay.ide.project.core.ProjectCore;
import com.liferay.ide.project.core.modules.BladeCLI;
import com.liferay.ide.project.core.modules.BladeCLIException;
import com.liferay.ide.project.core.util.LiferayWorkspaceUtil;
import com.liferay.ide.project.core.util.ProjectImportUtil;
import com.liferay.ide.project.core.util.ProjectUtil;
import com.liferay.ide.project.core.util.SearchFilesVisitor;
import com.liferay.ide.project.ui.IvyUtil;
import com.liferay.ide.project.ui.ProjectUI;
import com.liferay.ide.project.ui.upgrade.animated.UpgradeView.PageNavigatorListener;
import com.liferay.ide.sdk.core.ISDKConstants;
import com.liferay.ide.sdk.core.SDK;
import com.liferay.ide.sdk.core.SDKUtil;
import com.liferay.ide.server.core.LiferayServerCore;
import com.liferay.ide.server.core.portal.PortalRuntime;
import com.liferay.ide.server.core.portal.PortalServer;
import com.liferay.ide.server.util.ServerUtil;
import com.liferay.ide.ui.util.SWTUtil;
import com.liferay.ide.ui.util.UIUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.sapphire.Event;
import org.eclipse.sapphire.Listener;
import org.eclipse.sapphire.Property;
import org.eclipse.sapphire.ValuePropertyContentEvent;
import org.eclipse.sapphire.modeling.Status;
import org.eclipse.sapphire.platform.PathBridge;
import org.eclipse.sapphire.platform.StatusBridge;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
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.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.server.core.IRuntimeWorkingCopy;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.IServerLifecycleListener;
import org.eclipse.wst.server.core.IServerWorkingCopy;
import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.server.ui.ServerUIUtil;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import org.osgi.framework.Version;
/**
* @author Simon Jiang
* @author Terry Jia
*/
@SuppressWarnings( "unused" )
public class InitConfigureProjectPage extends Page implements IServerLifecycleListener, SelectionChangedListener
{
private class LiferayUpgradeValidationListener extends Listener
{
@Override
public void handle( Event event )
{
if( event instanceof ValuePropertyContentEvent )
{
ValuePropertyContentEvent propertyEvetn = (ValuePropertyContentEvent) event;
final Property property = propertyEvetn.property();
if( property.name().equals( "SdkLocation" ) )
{
org.eclipse.sapphire.modeling.Path sdkPath = dataModel.getSdkLocation().content();
if( sdkPath != null )
{
Status sdkStatus = sdkValidation.compute();
if( sdkStatus.ok() )
{
SDK sdk = SDKUtil.createSDKFromLocation( PathBridge.create( sdkPath ) );
String version = sdk.getVersion();
if( version != null )
{
Version sdkVersion = new Version( version );
int result = sdkVersion.compareTo( new Version( "7.0.0" ) );
if( result >= 0 )
{
UIUtil.async( new Runnable()
{
@Override
public void run()
{
if ( layoutComb.getSelectionIndex() != 0 )
{
layoutComb.select( 1 );
layoutComb.setEnabled( false );
dataModel.setLayout( layoutComb.getText() );
createBundleControl();
}
else
{
layoutComb.setEnabled( false );
dataModel.setLayout( layoutComb.getText() );
}
}
} );
}
else
{
layoutComb.setEnabled( true );
}
}
else
{
layoutComb.setEnabled( true );
}
}
else
{
layoutComb.setEnabled( true );
}
}
else
{
layoutComb.setEnabled( true );
}
}
}
startCheckThread();
}
}
public static final String defaultBundleUrl =
"https://sourceforge.net/projects/lportal/files/Liferay%20Portal/7.0.2%20GA3/liferay-ce-portal-tomcat-7.0-ga3-20160804222206210.zip";
private static Color GRAY;
private Label dirLabel;
private Text dirField;
private Combo layoutComb;
private Label layoutLabel;
private String[] layoutNames = { "Upgrade to Liferay Workspace", "Upgrade to Liferay Plugins SDK 7" };
private Label serverLabel;
private Combo serverComb;
private Button serverButton;
private Button showAllPagesButton;
private Label bundleNameLabel;
private Label bundleUrlLabel;
private Text bundleNameField;
private Text bundleUrlField;
private Button backupSDK;
private boolean validationResult;
private Button importButton;
private Composite composite;
private Control createHorizontalSpacer;
private Control createSeparator;
private SdkLocationValidationService sdkValidation =
dataModel.getSdkLocation().service( SdkLocationValidationService.class );
private ProjectNameValidationService projectNameValidation =
dataModel.getProjectName().service( ProjectNameValidationService.class );
private BundleNameValidationService bundleNameValidation =
dataModel.getBundleName().service( BundleNameValidationService.class );
private BundleUrlValidationService bundleUrlValidation =
dataModel.getBundleUrl().service( BundleUrlValidationService.class );
private SdkLocationDefaultValueService sdkLocationDefaultService =
dataModel.getSdkLocation().service( SdkLocationDefaultValueService.class );
public InitConfigureProjectPage( final Composite parent, int style, LiferayUpgradeDataModel dataModel )
{
super( parent, style, dataModel, INIT_CONFIGURE_PROJECT_PAGE_ID, true );
dataModel.getSdkLocation().attach( new LiferayUpgradeValidationListener() );
dataModel.getBundleName().attach( new LiferayUpgradeValidationListener() );
dataModel.getBundleUrl().attach( new LiferayUpgradeValidationListener() );
composite = this;
createSeparator = createSeparator( this, 3 );
dirLabel = createLabel( composite, "Liferay Plugins SDK Location:" );
dirField = createTextField( composite, SWT.NONE );
dirField.addModifyListener( new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
dataModel.setSdkLocation( dirField.getText() );
}
});
SWTUtil.createButton( this, "Browse..." ).addSelectionListener( new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
final DirectoryDialog dd = new DirectoryDialog( getShell() );
dd.setMessage( "Select source SDK folder" );
final String selectedDir = dd.open();
if( selectedDir != null )
{
dirField.setText( selectedDir );
}
}
});
layoutLabel = createLabel( composite, "Select Migrate Layout:" );
layoutComb = new Combo( this, SWT.DROP_DOWN | SWT.READ_ONLY );
layoutComb.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
layoutComb.setItems( layoutNames );
layoutComb.select( 0 );
layoutComb.addSelectionListener( new SelectionListener()
{
@Override
public void widgetDefaultSelected( SelectionEvent e )
{
}
@Override
public void widgetSelected( SelectionEvent e )
{
int sel = layoutComb.getSelectionIndex();
if( sel == 1 )
{
disposeBundleElement();
disposeLayoutElement();
disposeImportElement();
createServerElement();
createImportElement();
}
else
{
disposeServerEelment();
disposeImportElement();
disposeBundleElement();
disposeLayoutElement();
createBundleElement();
createImportElement();
}
composite.layout();
dataModel.setLayout( layoutComb.getText() );
startCheckThread();
}
} );
dataModel.setLayout( layoutComb.getText() );
dirField.setText( getSDKDefaultValue() );
createBundleElement();
createImportElement();
startCheckThread();
}
public void addPortalRuntimeAndServer( String serverRuntimeName, String location, IProgressMonitor monitor )
throws CoreException
{
final IRuntimeWorkingCopy runtimeWC =
ServerCore.findRuntimeType( PortalRuntime.ID ).createRuntime( serverRuntimeName, monitor );
IPath runTimePath = new Path( location );
runtimeWC.setName( serverRuntimeName );
runtimeWC.setLocation( runTimePath.append( LiferayWorkspaceUtil.loadConfiguredHomeDir( location ) ) );
runtimeWC.save( true, monitor );
final IServerWorkingCopy serverWC =
ServerCore.findServerType( PortalServer.ID ).createServer( serverRuntimeName, null, runtimeWC, monitor );
serverWC.setName( serverRuntimeName );
serverWC.save( true, monitor );
}
private void backupSDK( IProgressMonitor monitor )
{
Boolean backupSdk = dataModel.getBackupSdk().content();
if ( backupSdk == false )
{
return;
}
SubMonitor progress = SubMonitor.convert( monitor, 100 );
try
{
progress.setTaskName( "Backup sdk folder into Eclipse workspace...");
org.eclipse.sapphire.modeling.Path originalSDKPath = dataModel.getSdkLocation().content();
if( originalSDKPath != null )
{
IPath backupLocation = ResourcesPlugin.getWorkspace().getRoot().getLocation();
progress.worked( 30 );
ZipUtil.zip( originalSDKPath.toFile(), backupLocation.append( "backup.zip" ).toFile() );
progress.setWorkRemaining( 70 );
}
}
catch( IOException e )
{
ProjectUI.logError( "Error to backup original sdk folder.", e );
}
finally
{
progress.done();
}
}
public void checkAndConfigureIvy( final IProject project )
{
if( project != null && project.getFile( ISDKConstants.IVY_XML_FILE ).exists() )
{
new WorkspaceJob( "Configuring project with Ivy dependencies" ) //$NON-NLS-1$
{
@Override
public IStatus runInWorkspace( IProgressMonitor monitor ) throws CoreException
{
try
{
IvyUtil.configureIvyProject( project, monitor );
}
catch( CoreException e )
{
return ProjectCore.createErrorStatus(
ProjectCore.PLUGIN_ID, "Failed to configured ivy project.", e ); //$NON-NLS-1$
}
return StatusBridge.create( Status.createOkStatus() );
}
}.schedule();
}
}
private void checkProjectType( IProject project )
{
if( ProjectUtil.isPortletProject( project ) )
{
dataModel.setHasPortlet( true );
List<IFile> searchFiles = new SearchFilesVisitor().searchFiles( project, "service.xml" );
if( searchFiles.size() > 0 )
{
dataModel.setHasServiceBuilder( true );
}
}
else if( ProjectUtil.isHookProject( project ) )
{
dataModel.setHasHook( true );
}
else if( ProjectUtil.isLayoutTplProject( project ) )
{
dataModel.setHasLayout( true );
}
else if( ProjectUtil.isThemeProject( project ) )
{
dataModel.setHasTheme( true );
}
else if( ProjectUtil.isExtProject( project ) )
{
dataModel.setHasExt( true );
}
else if( ProjectUtil.isWebProject( project ) )
{
dataModel.setHasWeb( true );
}
}
private void clearWorkspaceSDKAndProjects( IPath targetSDKLocation, IProgressMonitor monitor ) throws CoreException
{
IProject sdkProject = SDKUtil.getWorkspaceSDKProject();
if( sdkProject != null && sdkProject.getLocation().equals( targetSDKLocation ) )
{
IProject[] projects = ProjectUtil.getAllPluginsSDKProjects();
for( IProject project : projects )
{
project.delete( false, true, monitor );
}
sdkProject.delete( false, true, monitor );
}
}
private void copyNewSDK( IPath targetSDKLocation, IProgressMonitor monitor ) throws CoreException
{
SubMonitor progress = SubMonitor.convert( monitor, 100 );
try
{
progress.beginTask( "Copy new SDK to override target SDK.", 100 );
final URL sdkZipUrl =
Platform.getBundle( "com.liferay.ide.project.ui" ).getEntry( "resources/sdk70ga2.zip" );
final File sdkZipFile = new File( FileLocator.toFileURL( sdkZipUrl ).getFile() );
final IPath stateLocation = ProjectCore.getDefault().getStateLocation();
File stateDir = stateLocation.toFile();
progress.worked( 30 );
ZipUtil.unzip( sdkZipFile, stateDir );
progress.worked( 60 );
IOUtil.copyDirToDir(
new File( stateDir, "com.liferay.portal.plugins.sdk-7.0" ), targetSDKLocation.toFile() );
progress.worked( 100 );
}
catch( Exception e )
{
ProjectUI.logError( e );
throw new CoreException( StatusBridge.create( Status.createErrorStatus( "Failed copy new SDK..", e ) ) );
}
finally
{
progress.done();
}
}
@Override
public void createSpecialDescriptor( Composite parent, int style )
{
Composite fillLayoutComposite = SWTUtil.createComposite( parent, 2, 2, GridData.FILL_HORIZONTAL );
final String descriptor =
"The first step will help you convert Liferay Plugins SDK 6.2 to Liferay Plugins SDK 7.0 or to Liferay Workspace. " +
"For more details, please see <a>dev.liferay.com</a>.";
String url = "https://dev.liferay.com/develop/tutorials";
SWTUtil.createHyperLink( fillLayoutComposite, SWT.NONE, descriptor, 1, url );
final String extensionDec =
"The first step will help you convert Liferay Plugins SDK 6.2 to Liferay Plugins SDK 7.0 or to Liferay Workspace.\n" +
"We will backup your project to a zip file in your eclipse workspace directory.\n" +
"Click the \"import\" button to import your project into Eclipse workspace" +
"(this process maybe need 5-10 mins for bundle init).\n" + "Note:\n" +
" In order to save time, downloading 7.0 ivy cache locally could be a good choice to upgrade to liferay plugins sdk 7. \n" +
" Theme and ext projects will be ignored for that we do not support to upgrade them in this tool currently. \n";
Label image = new Label( fillLayoutComposite, SWT.NONE);
image.setImage( loadImage("question.png") );
PopupDialog popupDialog = new PopupDialog( fillLayoutComposite.getShell(),
PopupDialog.INFOPOPUPRESIZE_SHELLSTYLE, true, false, false, false, false, null, null )
{
private static final int CURSOR_SIZE = 15;
protected Point getInitialLocation( Point initialSize )
{
Display display = getShell().getDisplay();
Point location = display.getCursorLocation();
location.x += CURSOR_SIZE;
location.y += CURSOR_SIZE;
return location;
}
protected Control createDialogArea( Composite parent )
{
Label label = new Label( parent, SWT.WRAP );
label.setText( extensionDec );
label.setFont( new Font( null, "Times New Roman", 11, SWT.NORMAL ) );
GridData gd = new GridData( GridData.BEGINNING | GridData.FILL_BOTH );
gd.horizontalIndent = PopupDialog.POPUP_HORIZONTALSPACING;
gd.verticalIndent = PopupDialog.POPUP_VERTICALSPACING;
label.setLayoutData( gd );
return label;
}
};
image.addListener(SWT.MouseHover, new org.eclipse.swt.widgets.Listener()
{
@Override
public void handleEvent( org.eclipse.swt.widgets.Event event )
{
popupDialog.open();
}
});
image.addListener(SWT.MouseExit, new org.eclipse.swt.widgets.Listener()
{
@Override
public void handleEvent( org.eclipse.swt.widgets.Event event )
{
popupDialog.close();
}
});
}
private void createBundleControl()
{
disposeServerEelment();
disposeImportElement();
disposeBundleElement();
disposeLayoutElement();
createBundleElement();
createImportElement();
composite.layout();
}
private void createBundleElement()
{
bundleNameLabel = createLabel( composite, "Server Name:" );
bundleNameField = createTextField( composite, SWT.NONE );
bundleNameField.addModifyListener( new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
dataModel.setBundleName( bundleNameField.getText() );
}
} );
final String bundleName = dataModel.getBundleName().content();
bundleNameField.setText( bundleName != null ? bundleName : "" );
bundleUrlLabel = createLabel( composite, "Bundle URL:" );
bundleUrlField = createTextField( composite, SWT.NONE );
bundleUrlField.setForeground( composite.getDisplay().getSystemColor( SWT.COLOR_DARK_GRAY ) );
bundleUrlField.setText( defaultBundleUrl );
bundleUrlField.addModifyListener( new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
dataModel.setBundleUrl( bundleUrlField.getText() );
}
});
bundleUrlField.addFocusListener( new FocusListener()
{
@Override
public void focusGained( FocusEvent e )
{
String input = ( (Text) e.getSource() ).getText();
if( input.equals( defaultBundleUrl ) )
{
bundleUrlField.setText( "" );
}
bundleUrlField.setForeground( composite.getDisplay().getSystemColor( SWT.COLOR_BLACK ) );
}
@Override
public void focusLost( FocusEvent e )
{
String input = ( (Text) e.getSource() ).getText();
if( CoreUtil.isNullOrEmpty( input ) )
{
bundleUrlField.setForeground( composite.getDisplay().getSystemColor( SWT.COLOR_DARK_GRAY ) );
bundleUrlField.setText( defaultBundleUrl );
}
}
} );
dataModel.setBundleUrl( bundleUrlField.getText() );
}
private void createImportElement()
{
createHorizontalSpacer = createHorizontalSpacer( this, 3 );
createSeparator = createSeparator( this, 3 );
String backupFolderName = "Backup SDK into folder(" + CoreUtil.getWorkspaceRoot().getLocation().toOSString() + ").";
backupSDK = SWTUtil.createCheckButton( composite, backupFolderName, null, false, 1 );
backupSDK.addSelectionListener( new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
dataModel.setBackupSdk( backupSDK.getSelection() );
}
});
importButton = SWTUtil.createButton( composite, "Import Projects" );
importButton.addSelectionListener( new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
try
{
Boolean importFinished = dataModel.getImportFinished().content();
if ( isPageValidate() && !importFinished )
{
saveSettings();
importButton.setEnabled( false );
importProject();
UpgradeView.resetPages();
PageNavigateEvent event = new PageNavigateEvent();
event.setTargetPage( 2 );
for( PageNavigatorListener listener : naviListeners )
{
listener.onPageNavigate( event );
}
setNextPage( true );
importButton.setEnabled( true );
setSelectedAction( getSelectedAction( "PageFinishAction" ) );
}
}
catch( CoreException ex )
{
ProjectUI.logError( ex );
PageValidateEvent pe = new PageValidateEvent();
pe.setMessage( ex.getMessage() );
pe.setType( PageValidateEvent.ERROR );
triggerValidationEvent( pe );
}
}
} );
dataModel.setBackupSdk( backupSDK.getSelection() );
}
private void createInitBundle( IProgressMonitor monitor ) throws CoreException
{
SubMonitor progress = SubMonitor.convert( monitor, 100 );
try
{
progress.beginTask( "Execute Liferay Worksapce Bundle Init Command...", 100 );
String layout = dataModel.getLayout().content();
if( layout.equals( layoutNames[0] ) )
{
IPath sdkLocation = PathBridge.create( dataModel.getSdkLocation().content() );
IProject project = CoreUtil.getProject( sdkLocation.lastSegment() );
final String bundleUrl = dataModel.getBundleUrl().content();
final String bundleName = dataModel.getBundleName().content();
IProjectBuilder projectBuilder = getProjectBuilder( project );
progress.worked( 30 );
if( bundleUrl != null )
{
projectBuilder.execInitBundle( project, "initBundle", bundleUrl, monitor );
}
progress.worked( 60 );
addPortalRuntimeAndServer( bundleName, sdkLocation.toPortableString(), monitor );
IServer bundleServer = ServerCore.findServer( dataModel.getBundleName().content() );
if( bundleServer != null )
{
org.eclipse.sapphire.modeling.Path newPath = dataModel.getSdkLocation().content();
SDK sdk = SDKUtil.createSDKFromLocation( PathBridge.create( newPath ).append( "plugins-sdk" ) );
IPath bundleLocation = bundleServer.getRuntime().getLocation();
sdk.addOrUpdateServerProperties( bundleLocation );
}
project.refreshLocal( IResource.DEPTH_INFINITE, monitor );
progress.worked( 100 );
}
}
catch( Exception e )
{
ProjectUI.logError( e );
throw new CoreException(
StatusBridge.create( Status.createErrorStatus( "Faild execute Liferay Workspace Bundle Init Command...", e ) ) );
}
finally
{
progress.done();
}
}
private void createLiferayWorkspace( IPath targetSDKLocation, IProgressMonitor monitor ) throws CoreException
{
SubMonitor progress = SubMonitor.convert( monitor, 100 );
try
{
progress.beginTask( "Initializaing Liferway Workspace...", 100 );
StringBuilder sb = new StringBuilder();
sb.append( "-b " );
sb.append( "\"" + targetSDKLocation.toFile().getAbsolutePath() + "\" " );
sb.append( "init -u" );
progress.worked( 30 );
BladeCLI.execute( sb.toString() );
progress.worked( 100 );
}
catch( BladeCLIException e )
{
ProjectUI.logError( e );
throw new CoreException(
StatusBridge.create( Status.createErrorStatus( "Faild execute Liferay Workspace Init Command...", e ) ) );
}
finally
{
progress.done();
}
}
private void createServerElement()
{
serverLabel = createLabel( composite, "Liferay Server Name:" );
serverComb = new Combo( composite, SWT.DROP_DOWN | SWT.READ_ONLY );
serverComb.setLayoutData( new GridData( GridData.FILL_HORIZONTAL ) );
serverButton = SWTUtil.createButton( composite, "Add Server..." );
serverButton.addSelectionListener( new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
ServerUIUtil.showNewServerWizard( composite.getShell(), "liferay.bundle", null, "com.liferay." );
}
} );
ServerCore.addServerLifecycleListener( this );
IServer[] servers = ServerCore.getServers();
List<String> serverNames = new ArrayList<String>();
if( !CoreUtil.isNullOrEmpty( servers ) )
{
for( IServer server : servers )
{
if( LiferayServerCore.newPortalBundle( server.getRuntime().getLocation() ) != null )
{
serverNames.add( server.getName() );
}
}
}
serverComb.setItems( serverNames.toArray( new String[serverNames.size()] ) );
serverComb.select( 0 );
}
private void deleteEclipseConfigFiles( File project )
{
for( File file : project.listFiles() )
{
if( file.getName().contentEquals( ".classpath" ) || file.getName().contentEquals( ".settings" ) ||
file.getName().contentEquals( ".project" ) )
{
if( file.isDirectory() )
{
FileUtil.deleteDir( file, true );
}
file.delete();
}
}
}
private void deleteSDKLegacyProjects( IPath sdkLocation )
{
String[] needDeletedPaths = new String[] { "shared/portal-http-service", "webs/resources-importer-web" };
for( String path : needDeletedPaths )
{
File file = sdkLocation.append( path ).toFile();
if( file.exists() )
{
FileUtil.deleteDir( file, true );
}
}
}
private void deleteServiceBuilderJarFile( IProject project, IProgressMonitor monitor )
{
try
{
IFolder docrootFolder = CoreUtil.getDefaultDocrootFolder( project );
if( docrootFolder != null )
{
IFile serviceJarFile = docrootFolder.getFile( "WEB-INF/lib/" + project.getName() + "-service.jar" );
if( serviceJarFile.exists() )
{
serviceJarFile.delete( true, monitor );
}
}
}
catch( CoreException e )
{
ProjectUI.logError( e );
}
}
private void disposeBundleElement()
{
if( bundleNameField != null && bundleUrlField != null )
{
bundleNameField.dispose();
bundleUrlField.dispose();
bundleNameLabel.dispose();
bundleUrlLabel.dispose();
}
}
private void disposeImportElement()
{
backupSDK.dispose();
createSeparator.dispose();
createHorizontalSpacer.dispose();
importButton.dispose();
}
private void disposeLayoutElement()
{
if( backupSDK != null && createSeparator != null && createHorizontalSpacer != null &&
serverLabel != null && serverComb != null && serverButton != null )
{
disposeImportElement();
serverLabel.dispose();
serverComb.dispose();
serverButton.dispose();
}
}
private void disposeServerEelment()
{
if( serverLabel != null && serverComb != null && serverButton != null )
{
serverLabel.dispose();
serverComb.dispose();
serverButton.dispose();
}
}
public int getGridLayoutCount()
{
return 2;
}
@Override
public boolean getGridLayoutEqualWidth()
{
return false;
}
private void getLiferayBundle( IPath targetSDKLocation, IProgressMonitor monitor ) throws BladeCLIException
{
StringBuilder sb = new StringBuilder();
sb.append( "-b " );
sb.append( "\"" + targetSDKLocation.toFile().getAbsolutePath() + "\" " );
sb.append( "init" );
BladeCLI.execute( sb.toString() );
}
@Override
public String getPageTitle()
{
return "Configure Project";
}
private IProjectBuilder getProjectBuilder( IProject project ) throws CoreException
{
final ILiferayProject liferayProject = LiferayCore.create( project );
if( liferayProject == null )
{
throw new CoreException( ProjectUI.createErrorStatus( "Can't find lifeay workspace project." ) );
}
final IProjectBuilder builder = liferayProject.adapt( IProjectBuilder.class );
if( builder == null )
{
throw new CoreException( ProjectUI.createErrorStatus( "Can't find lifeay gradel project builder." ) );
}
return builder;
}
protected String getSDKDefaultValue()
{
String retVal = "";
try
{
IProject sdk = SDKUtil.getWorkspaceSDKProject();
if( sdk != null )
{
retVal = sdk.getLocation().toString();
}
}
catch( CoreException e )
{
ProjectUI.logError( "Get workspace default sdk value failed.", e );
}
return retVal;
}
protected void importProject() throws CoreException
{
String layout = dataModel.getLayout().content();
IPath location = PathBridge.create( dataModel.getSdkLocation().content() );
try
{
PlatformUI.getWorkbench().getProgressService().run( true, true, new IRunnableWithProgress()
{
public void run( IProgressMonitor monitor ) throws InvocationTargetException, InterruptedException
{
try
{
String newPath = "";
backupSDK( monitor );
clearWorkspaceSDKAndProjects( location, monitor );
deleteEclipseConfigFiles( location.toFile() );
if( layout.equals( "Upgrade to Liferay Workspace" ) )
{
createLiferayWorkspace( location, monitor );
removeIvyPrivateSetting( location.append( "plugins-sdk" ) );
newPath = renameProjectFolder( location, monitor );
IPath sdkLocation = new Path( newPath ).append( "plugins-sdk" );
deleteSDKLegacyProjects( sdkLocation );
ILiferayProjectImporter importer = LiferayCore.getImporter( "gradle" );
importer.importProject( newPath, monitor );
createInitBundle( monitor );
importSDKProject( sdkLocation, monitor );
dataModel.setConvertLiferayWorkspace( true );
}
else
{
deleteEclipseConfigFiles( location.toFile() );
copyNewSDK( location, monitor );
removeIvyPrivateSetting( location );
deleteSDKLegacyProjects( location );
String serverName = dataModel.getLiferay70ServerName().content();
IServer server = ServerUtil.getServer( serverName );
newPath = renameProjectFolder( location, monitor );
SDK sdk = SDKUtil.createSDKFromLocation( new Path( newPath ) );
sdk.addOrUpdateServerProperties( ServerUtil.getLiferayRuntime( server ).getLiferayHome() );
SDKUtil.openAsProject( sdk, monitor );
importSDKProject( sdk.getLocation(), monitor );
}
dataModel.setImportFinished( true );
}
catch( Exception e )
{
ProjectUI.logError( e );
throw new InvocationTargetException( e, e.getMessage() );
}
}
} );
}
catch( Exception e )
{
ProjectUI.logError( e );
throw new CoreException( StatusBridge.create( Status.createErrorStatus( e.getMessage(), e ) ) );
}
}
private void importSDKProject( IPath targetSDKLocation, IProgressMonitor monitor )
{
Collection<File> eclipseProjectFiles = new ArrayList<File>();
Collection<File> liferayProjectDirs = new ArrayList<File>();
if( ProjectUtil.collectSDKProjectsFromDirectory(
eclipseProjectFiles, liferayProjectDirs, targetSDKLocation.toFile(), null, true, monitor ) )
{
for( File project : liferayProjectDirs )
{
try
{
deleteEclipseConfigFiles( project );
IProject importProject =
ProjectImportUtil.importProject( new Path( project.getPath() ), monitor, null );
if( importProject != null && importProject.isAccessible() && importProject.isOpen() )
{
checkProjectType( importProject );
deleteServiceBuilderJarFile( importProject, monitor );
}
if( ProjectUtil.isExtProject( importProject ) || ProjectUtil.isThemeProject( importProject ) )
{
importProject.delete( false, true, monitor );
}
checkAndConfigureIvy( importProject );
}
catch( CoreException e )
{
}
}
for( File project : eclipseProjectFiles )
{
try
{
deleteEclipseConfigFiles( project.getParentFile() );
IProject importProject =
ProjectImportUtil.importProject( new Path( project.getParent() ), monitor, null );
if( importProject != null && importProject.isAccessible() && importProject.isOpen() )
{
checkProjectType( importProject );
deleteServiceBuilderJarFile( importProject, monitor );
}
if( ProjectUtil.isExtProject( importProject ) || ProjectUtil.isThemeProject( importProject ) )
{
importProject.delete( false, true, monitor );
}
checkAndConfigureIvy( importProject );
}
catch( CoreException e )
{
}
}
}
}
@Override
public void onSelectionChanged( int targetSelection )
{
if( targetSelection == 1 )
{
startCheckThread();
}
}
@SuppressWarnings( "unchecked" )
private void removeIvyPrivateSetting( IPath sdkLocation ) throws CoreException
{
IPath ivySettingPath = sdkLocation.append( "ivy-settings.xml" );
File ivySettingFile = ivySettingPath.toFile();
SAXBuilder builder = new SAXBuilder( false );
builder.setValidation( false );
builder.setFeature( "http://xml.org/sax/features/validation", false );
builder.setFeature( "http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false );
builder.setFeature( "http://apache.org/xml/features/nonvalidating/load-external-dtd", false );
try(FileInputStream ivyInput = new FileInputStream( ivySettingFile ))
{
if( ivySettingFile.exists() )
{
Document doc = builder.build( ivyInput );
Element itemRem = null;
Element elementRoot = doc.getRootElement();
List<Element> resolversElements = elementRoot.getChildren( "resolvers" );
for( Iterator<Element> resolversIterator = resolversElements.iterator(); resolversIterator.hasNext(); )
{
Element resolversElement = (Element) resolversIterator.next();
List<Element> chainElements = resolversElement.getChildren( "chain" );
for( Iterator<Element> chainIterator = chainElements.iterator(); chainIterator.hasNext(); )
{
Element chainElement = (Element) chainIterator.next();
List<Element> resolverElements = chainElement.getChildren( "resolver" );
for( Iterator<Element> resolverIterator = resolverElements.iterator(); resolverIterator.hasNext(); )
{
Element resolverItem = (Element) resolverIterator.next();
String resolverRefItem = resolverItem.getAttributeValue( "ref" );
if (resolverRefItem.equals( "liferay-private" ))
{
resolverIterator.remove();
itemRem = resolverItem;
}
}
}
elementRoot.removeContent( itemRem );
List<Element> ibiblioElements = resolversElement.getChildren( "ibiblio" );
for( Iterator<Element> ibiblioIterator = ibiblioElements.iterator(); ibiblioIterator.hasNext(); )
{
Element ibiblioElement = (Element) ibiblioIterator.next();
String liferayPrivateName = ibiblioElement.getAttributeValue( "name" );
if (liferayPrivateName.equals( "liferay-private" ))
{
ibiblioIterator.remove();
itemRem = ibiblioElement;
}
}
elementRoot.removeContent( itemRem );
}
saveXML( ivySettingFile, doc );
}
}
catch( IOException|JDOMException|CoreException e)
{
ProjectUI.logError( e );
throw new CoreException(
StatusBridge.create( Status.createErrorStatus( "Failed to remove Liferay private url configuration of ivy-settings.xml.", e ) ) );
}
}
private String renameProjectFolder( IPath targetSDKLocation, IProgressMonitor monitor ) throws CoreException
{
// if( newName == null || newName.equals( "" ) )
// {
return targetSDKLocation.toString();
// }
// java.nio.file.Path newTargetPath;
// File newFolder = targetSDKLocation.removeLastSegments( 1 ).append( newName ).toFile();
// boolean renameStatus = targetSDKLocation.toFile().renameTo( newFolder );
// try
// {
// newTargetPath = Files.move( targetSDKLocation.toFile().toPath(), newFolder.toPath(),
// StandardCopyOption.REPLACE_EXISTING );
// }
// catch ( Exception e)
// {
// ProjectUI.logError( e );
// throw new CoreException( StatusBridge.create( Status.createErrorStatus( "Failed to reanme target SDK folder
// name.", e ) ) );
// }
// return newTargetPath.toAbsolutePath().toString();
// if ( renameStatus == false )
// {
// throw new CoreException( StatusBridge.create( Status.createErrorStatus( "Failed to reanme target SDK folder
// name." ) ) );
// }
// else
// {
// return newFolder.toPath().toString();
// }
//
}
private void saveSettings()
{
dataModel.setHasExt( false );
dataModel.setHasHook( false );
dataModel.setHasLayout( false );
dataModel.setHasPortlet( false );
dataModel.setHasServiceBuilder( false );
dataModel.setHasTheme( false );
dataModel.setHasWeb( false );
if( bundleNameField != null && !bundleNameField.isDisposed() )
{
dataModel.setLiferay70ServerName( bundleNameField.getText() );
}
if( serverComb != null && !serverComb.isDisposed() )
{
dataModel.setLiferay70ServerName( serverComb.getText() );
}
SDK sdk = SDKUtil.createSDKFromLocation( new Path( dirField.getText() ) );
try
{
if( sdk != null )
{
final String liferay62ServerLocation =
(String) ( sdk.getBuildProperties( true ).get( ISDKConstants.PROPERTY_APP_SERVER_PARENT_DIR ) );
dataModel.setLiferay62ServerLocation( liferay62ServerLocation );
}
}
catch( Exception xe )
{
ProjectUI.logError( xe );
}
}
private void saveXML( File templateFile, Document doc ) throws CoreException
{
XMLOutputter out = new XMLOutputter();
try(FileOutputStream fos = new FileOutputStream( templateFile );)
{
out.output( doc, fos );
}
catch( Exception e )
{
ProjectUI.logError( e );
throw new CoreException(
StatusBridge.create( Status.createErrorStatus( "Failed to save change for ivy-settings.xml.", e ) ) );
}
}
@Override
public void serverAdded( IServer server )
{
UIUtil.async( new Runnable()
{
@Override
public void run()
{
boolean serverExisted = false;
if( serverComb != null && !serverComb.isDisposed() )
{
String[] serverNames = serverComb.getItems();
List<String> serverList = new ArrayList<>( Arrays.asList( serverNames ) );
for( String serverName : serverList )
{
if( server.getName().equals( serverName ) )
{
serverExisted = true;
}
}
if( serverExisted == false )
{
serverList.add( server.getName() );
serverComb.setItems( serverList.toArray( new String[serverList.size()] ) );
serverComb.select( serverList.size() - 1 );
}
startCheckThread();
}
}
} );
}
@Override
public void serverChanged( IServer server )
{
}
@Override
public void serverRemoved( IServer server )
{
UIUtil.async( new Runnable()
{
@Override
public void run()
{
if( serverComb != null && !serverComb.isDisposed() )
{
String[] serverNames = serverComb.getItems();
List<String> serverList = new ArrayList<>( Arrays.asList( serverNames ) );
Iterator<String> serverNameiterator = serverList.iterator();
while( serverNameiterator.hasNext() )
{
String serverName = serverNameiterator.next();
if( server.getName().equals( serverName ) )
{
serverNameiterator.remove();
}
}
serverComb.setItems( serverList.toArray( new String[serverList.size()] ) );
serverComb.select( 0 );
startCheckThread();
}
}
} );
}
private void startCheckThread()
{
final Thread t = new Thread()
{
@Override
public void run()
{
validate();
}
};
t.start();
}
private void validate()
{
UIUtil.async( new Runnable()
{
@Override
public void run()
{
boolean inputValidation = true;
boolean layoutValidation = true;
String bundUrl = dataModel.getBundleUrl().content();
String message = "ok";
PageValidateEvent pe = new PageValidateEvent();
pe.setType( PageValidateEvent.ERROR );
if( !sdkValidation.compute().ok() )
{
message = sdkValidation.compute().message();
inputValidation = false;
}
else
{
inputValidation = true;
}
if( layoutComb.getSelectionIndex() == 1 )
{
final int itemCount = serverComb.getItemCount();
if( itemCount < 1 )
{
message = "You should add at least one Liferay 7 portal bundle.";
layoutValidation = false;
}
}
else if( layoutComb.getSelectionIndex() == 0 )
{
boolean liferayWorksapceValidation = true;
String workspaceValidationMessage = "ok";
try
{
if( LiferayWorkspaceUtil.hasLiferayWorkspace() )
{
liferayWorksapceValidation = false;
workspaceValidationMessage = LiferayWorkspaceUtil.hasLiferayWorkspaceMsg;
}
}
catch( CoreException e )
{
liferayWorksapceValidation = false;
workspaceValidationMessage = e.getMessage();
}
if( !liferayWorksapceValidation && inputValidation )
{
message = workspaceValidationMessage;
layoutValidation = false;
}
else if( !bundleNameValidation.compute().ok() )
{
message = bundleNameValidation.compute().message();
layoutValidation = false;
}
else if( bundUrl != null && bundUrl.length() > 0 && !bundleUrlValidation.compute().ok() )
{
message = bundleUrlValidation.compute().message();
layoutValidation = false;
}
else
{
layoutValidation = true;
}
}
if( dataModel.getImportFinished().content() )
{
message =
"Import has finished. If you want to reimport, please click Restart Upgrade icon in the toolbar.";
pe.setType( PageValidateEvent.WARNING );
inputValidation = false;
}
pe.setMessage( message );
triggerValidationEvent( pe );
validationResult = layoutValidation && inputValidation;
importButton.setEnabled( validationResult );
}
} );
}
private boolean isPageValidate()
{
return validationResult;
}
}