/******************************************************************************* * 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.migration; import com.liferay.blade.api.AutoMigrateException; import com.liferay.blade.api.AutoMigrator; import com.liferay.blade.api.Problem; import com.liferay.ide.project.core.util.ProjectUtil; import com.liferay.ide.project.ui.ProjectUI; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; /** * @author Gregory Amerson * @author Terry Jia * @author Lovett Li */ public class AutoCorrectAction extends ProblemAction { private ISelectionProvider _provider; public AutoCorrectAction( ISelectionProvider provider ) { super( provider, "Correct automatically" ); _provider = provider; } @Override public void run() { final List<Problem> problems = MigrationUtil.getProblemsFromSelection( getSelection() ); runWithAutoCorrect( problems ); } public IStatus runWithAutoCorrect( final List<Problem> problems) { final IResource file = MigrationUtil.getIResourceFromProblem( problems.get( 0 ) ); final BundleContext context = FrameworkUtil.getBundle( AutoCorrectAction.class ).getBundleContext(); WorkspaceJob job = new WorkspaceJob( "Auto correcting migration problem." ) { @Override public IStatus runInWorkspace( IProgressMonitor monitor ) { IStatus retval = Status.OK_STATUS; try { final Problem problem = problems.get( 0 ); String autoCorrectKey = null; final int filterKeyIndex = problem.autoCorrectContext.indexOf( ":" ); if( filterKeyIndex > -1 ) { autoCorrectKey = problem.autoCorrectContext.substring( 0, filterKeyIndex ); } else { autoCorrectKey = problem.autoCorrectContext; } final Collection<ServiceReference<AutoMigrator>> refs = context.getServiceReferences( AutoMigrator.class, "(auto.correct=" + autoCorrectKey + ")" ); for( ServiceReference<AutoMigrator> ref : refs ) { final AutoMigrator autoMigrator = context.getService( ref ); int problemsCorrected = autoMigrator.correctProblems( problem.file, Collections.singletonList( problem ) ); if( problemsCorrected > 0 ) { IResource resource = MigrationUtil.getIResourceFromProblem( problem ); if( resource != null ) { IMarker problemMarker = resource.findMarker( problem.markerId ); if( problemMarker != null && problemMarker.exists() ) { problemMarker.delete(); } } } } file.refreshLocal( IResource.DEPTH_ONE, monitor ); MigrateProjectHandler migrateHandler = new MigrateProjectHandler(); Path path = new Path( problem.getFile().getPath() ); IProject[] projects = ProjectUtil.getAllPluginsSDKProjects(); String projectName = ""; for( IProject project : projects ) { if( problem.getFile().getPath().replaceAll( "\\\\", "/" ).startsWith( project.getLocation().toString() ) ) { projectName = project.getName(); break; } } for(Problem p : problems) { new MarkDoneAction().run( p, _provider ); } if( !projectName.equals( "" ) ) { migrateHandler.findMigrationProblems( new Path[] { path }, new String[] { projectName } ); } } catch( InvalidSyntaxException e ) { } catch( AutoMigrateException | CoreException e ) { return retval = ProjectUI.createErrorStatus( "Unable to auto correct problem", e ); } return retval; } }; job.schedule(); return Status.OK_STATUS; } @Override public void selectionChanged( IStructuredSelection selection ) { if (selection.isEmpty()) { setEnabled( false ); } else { boolean selectionCompatible = true; Iterator<?> items = selection.iterator(); Object lastItem = null; while( items.hasNext() ) { Object item = items.next(); if( !( item instanceof Problem ) ) { selectionCompatible = false; break; } Problem problem = (Problem) item; if( problem.autoCorrectContext == null ) { selectionCompatible = false; break; } if( lastItem != null ) { String prCurrentKey = ((Problem) item).autoCorrectContext.substring( 0, problem.autoCorrectContext.indexOf( ":" ) );; String prLastKey = ((Problem) lastItem).autoCorrectContext.substring( 0, problem.autoCorrectContext.indexOf( ":" ) ); if( !(prCurrentKey.equals( prLastKey)) ) { selectionCompatible = false; break; } } lastItem = item; } Iterator<?> items2 = selection.iterator(); List<String> autoCorrectContexts = new ArrayList<>(); while( items2.hasNext() ) { Object item = items2.next(); if( item instanceof Problem && ( (Problem) item ).autoCorrectContext != null ) { autoCorrectContexts.add( ( (Problem) item ).autoCorrectContext ); } } setEnabled( selectionCompatible ); List<String> allAutoCorrectContexts = new ArrayList<>(); if( _provider instanceof TableViewer ) { TableViewer viewer = (TableViewer) _provider; Object obj = viewer.getInput(); if( obj instanceof Object[] ) { Object[] problems = (Object[]) obj; for( Object o : problems ) { if( o instanceof Problem && ( (Problem) o ).autoCorrectContext != null ) { allAutoCorrectContexts.add( ( (Problem) o ).autoCorrectContext ); } } } else if( obj instanceof List<?> ) { List<?> list = (List<?>) obj; for( Object p : list ) { if( p instanceof Problem ) { Problem problem = (Problem) p; if( problem.autoCorrectContext != null ) { allAutoCorrectContexts.add( problem.autoCorrectContext ); } } } } } setText( "Correct automatically" ); } } @Override protected IStatus runWithMarker( Problem problem, IMarker marker ) { return null; } }