/******************************************************************************* * 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.IBundleProject; import com.liferay.ide.core.LiferayCore; import com.liferay.ide.project.core.util.ProjectUtil; import com.liferay.ide.project.ui.ProjectUI; import com.liferay.ide.project.ui.dialog.JavaProjectSelectionDialog; import com.liferay.ide.ui.util.SWTUtil; import com.liferay.ide.ui.util.UIUtil; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; import org.eclipse.sapphire.modeling.Status; import org.eclipse.sapphire.platform.StatusBridge; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; 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.Display; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Table; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.ide.IDE.SharedImages; /** * @author Joye Luo */ public class BuildPage extends Page { public BuildPage( Composite parent, int style, LiferayUpgradeDataModel dataModel ) { super( parent, style, dataModel, BUILD_PAGE_ID, true ); Composite container = new Composite( this, SWT.NONE ); container.setLayout( new GridLayout( 2, false ) ); container.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) ); tableViewer = new TableViewer( container ); tableViewer.setContentProvider( new TableViewContentProvider() ); tableViewer.addDoubleClickListener( new IDoubleClickListener() { @Override public void doubleClick( DoubleClickEvent event ) { final IStructuredSelection selection = (IStructuredSelection) event.getSelection(); final TableViewElement tableViewElement = (TableViewElement) selection.getFirstElement(); final String projectName = tableViewElement.projectName; final IProject project = ProjectUtil.getProject( projectName ); Boolean openNewLiferayProjectWizard = MessageDialog.openQuestion( UIUtil.getActiveShell(), "Build Project", "Do you want to build this project again?" ); if( openNewLiferayProjectWizard ) { final WorkspaceJob workspaceJob = new WorkspaceJob( "Build Project......" ) { @Override public IStatus runInWorkspace( IProgressMonitor monitor ) throws CoreException { monitor.beginTask( "Start to build project......", 100 ); monitor.setTaskName( "Build " + projectName + " Project..." ); monitor.worked( 100 ); if( monitor.isCanceled() ) { return StatusBridge.create( Status.createOkStatus() ); } boolean buildFlag = getBuildStatus( monitor, project ); for( int i = 0; i < tableViewElements.length; i++ ) { if( tableViewElements[i].projectName == projectName ) { if( buildFlag ) { tableViewElements[i].buildStatus = "Build Successful"; } else { tableViewElements[i].buildStatus = "Build Failed"; } } } UIUtil.async( new Runnable() { @Override public void run() { tableViewer.setInput( tableViewElements ); tableViewer.refresh(); } } ); return StatusBridge.create( Status.createOkStatus() ); } }; workspaceJob.setUser( true ); workspaceJob.schedule(); } } } ); TableViewerColumn colFirstName = new TableViewerColumn( tableViewer, SWT.NONE ); colFirstName.getColumn().setWidth( 400 ); colFirstName.getColumn().setText( "projectName" ); colFirstName.setLabelProvider( new ColumnLabelProvider() { @Override public Image getImage( Object element ) { return imageProject; } @Override public String getText( Object element ) { TableViewElement tableViewElement = (TableViewElement) element; return tableViewElement.projectName; } } ); TableViewerColumn colSecondName = new TableViewerColumn( tableViewer, SWT.NONE ); colSecondName.getColumn().setWidth( 200 ); colSecondName.getColumn().setText( "Build Status" ); colSecondName.setLabelProvider( new ColumnLabelProvider() { @Override public Image getImage( Object element ) { TableViewElement tableViewElement = (TableViewElement) element; if( tableViewElement.buildStatus.equals( "Build Successful" ) ) { return imageSuccess; } else if( tableViewElement.buildStatus.equals( "Build Failed" ) ) { return imageFail; } return null; } @Override public String getText( Object element ) { TableViewElement tableViewElement = (TableViewElement) element; return tableViewElement.buildStatus; } } ); final Table table = tableViewer.getTable(); final GridData tableData = new GridData( SWT.FILL, SWT.FILL, true, true, 1, 1 ); table.setLayoutData( tableData ); table.setLinesVisible( false ); Button buildButton = new Button( container, SWT.PUSH ); buildButton.setText( "Build..." ); buildButton.setLayoutData( new GridData( SWT.LEFT, SWT.TOP, false, false, 1, 1 ) ); buildButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { buildProjects(); } } ); } private TableViewer tableViewer; private Image imageProject; private Image imageSuccess; private Image imageFail; private TableViewElement[] tableViewElements; class TableViewElement { public String projectName; public String buildStatus; public TableViewElement( String projectName, String buildStatus ) { this.projectName = projectName; this.buildStatus = buildStatus; } } class TableViewContentProvider implements IStructuredContentProvider { @Override public void dispose() { } @Override public void inputChanged( Viewer viewer, Object oldInput, Object newInput ) { } @Override public Object[] getElements( Object inputElement ) { if( inputElement instanceof TableViewElement[] ) { return (TableViewElement[]) inputElement; } return new Object[] { inputElement }; } } private void buildProjects() { final List<IProject> selectProjectList = getSelectedProjects(); final IProject[] selectProjects = selectProjectList.toArray( new IProject[selectProjectList.size()] ); createImages(); try { final WorkspaceJob workspaceJob = new WorkspaceJob( "Build Project......" ) { @Override public IStatus runInWorkspace( IProgressMonitor monitor ) throws CoreException { final List<TableViewElement> tableViewElementList = new ArrayList<TableViewElement>(); int count = selectProjects.length; if( count <= 0 ) { return StatusBridge.create( Status.createOkStatus() ); } int unit = 100 / count; monitor.beginTask( "Start to build project......", 100 ); for( int i = 0; i < count; i++ ) { final IProject project = selectProjects[i]; final String projectName = project.getName(); TableViewElement tableViewElement = new TableViewElement( projectName, "Not Build" ); tableViewElementList.add( tableViewElement ); } UIUtil.async( new Runnable() { @Override public void run() { tableViewElements = tableViewElementList.toArray( new TableViewElement[tableViewElementList.size()] ); tableViewer.setInput( tableViewElements ); tableViewer.refresh(); } } ); for( int i = 0; i < count; i++ ) { monitor.worked( i + 1 * unit ); if( monitor.isCanceled() ) { break; } if( i == count - 1 ) { monitor.worked( 100 ); } TableViewElement viewElement = tableViewElementList.get( i ); final String projectName = viewElement.projectName; final IProject project = ProjectUtil.getProject( projectName ); monitor.setTaskName( "Build " + projectName + " Project..." ); boolean buildFlag = getBuildStatus( monitor, project ); if( buildFlag ) { viewElement.buildStatus = "Build Successful"; } else { viewElement.buildStatus = "Build Failed"; } UIUtil.async( new Runnable() { @Override public void run() { tableViewElements = tableViewElementList.toArray( new TableViewElement[tableViewElementList.size()] ); tableViewer.setInput( tableViewElements ); tableViewer.refresh(); } } ); } return StatusBridge.create( Status.createOkStatus() ); } }; workspaceJob.setUser( true ); workspaceJob.schedule(); } catch( Exception e ) { ProjectUI.logError( e ); } } private void createImages() { imageProject = PlatformUI.getWorkbench().getSharedImages().getImage( SharedImages.IMG_OBJ_PROJECT ); if( imageProject.isDisposed() ) { imageProject = PlatformUI.getWorkbench().getSharedImages().getImageDescriptor( SharedImages.IMG_OBJ_PROJECT ).createImage(); } URL greenTickUrl = ProjectUI.getDefault().getBundle().getEntry( "/images/greentick.png" ); imageSuccess = ImageDescriptor.createFromURL( greenTickUrl ).createImage(); imageSuccess.getImageData().scaledTo( 16, 16 ); imageFail = JFaceResources.getImage( Dialog.DLG_IMG_MESSAGE_ERROR ); } private boolean getBuildStatus( IProgressMonitor monitor, IProject project ) { IBundleProject bundleProject = LiferayCore.create( IBundleProject.class, project ); IPath outputBundlepath = null; try { outputBundlepath = bundleProject.getOutputBundle( false, monitor ); } catch( Exception e ) { } if( outputBundlepath != null && !outputBundlepath.isEmpty() ) { return true; } return false; } private List<IProject> getSelectedProjects() { List<IProject> projects = new ArrayList<>(); final JavaProjectSelectionDialog dialog = new JavaProjectSelectionDialog( Display.getCurrent().getActiveShell() ); if( dialog.open() == Window.OK ) { Object[] selectedProjects = dialog.getResult(); if( selectedProjects != null ) { for( Object project : selectedProjects ) { if( project instanceof IJavaProject ) { IJavaProject p = (IJavaProject) project; projects.add( p.getProject() ); } } } } return projects; } public void createSpecialDescriptor( Composite parent, int style ) { final String descriptor = "This step will help you to build all your projects.\n" + "You can rebuild the project by double-clicking it."; String url = ""; Link link = SWTUtil.createHyperLink( this, style, descriptor, 1, url ); link.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, true, false, 2, 1 ) ); } @Override public String getPageTitle() { return "Build"; } }