/*******************************************************************************
* 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;
}
}