package net.sourceforge.phpeclipse.wiki.actions.mediawiki; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import net.sourceforge.phpeclipse.wiki.actions.mediawiki.config.IWikipedia; import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin; import net.sourceforge.phpeclipse.wiki.internal.Configuration; import net.sourceforge.phpeclipse.wiki.internal.ConfigurationManager; import net.sourceforge.phpeclipse.wiki.internal.IConfiguration; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceRuleFactory; import org.eclipse.core.resources.IResourceVisitor; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.jobs.MultiRule; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.ui.IActionDelegate; import org.eclipse.ui.IObjectActionDelegate; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.dialogs.ListSelectionDialog; import org.eclipse.ui.internal.dialogs.ListContentProvider; public class RefreshWikiFilesAction implements IObjectActionDelegate { private IWorkbenchPart workbenchPart; protected Configuration getConfigurationPrefix(String prefix) { List allConfigsList = ConfigurationManager.getInstance().getConfigurations(); ArrayList configsList = new ArrayList(); for (int i = 0; i < allConfigsList.size(); i++) { IConfiguration temp = (IConfiguration) allConfigsList.get(i); if (temp.getType().startsWith(prefix)) { configsList.add(temp); } } if (configsList.size() == 1) { return (Configuration) configsList.get(0); } Collections.sort(configsList); Configuration configuration = null; ListSelectionDialog listSelectionDialog = new ListSelectionDialog(WikiEditorPlugin.getDefault().getWorkbench() .getActiveWorkbenchWindow().getShell(), configsList, new ListContentProvider(), new LabelProvider(), "Select the refresh URL."); listSelectionDialog.setTitle("Multiple active configuration found"); if (listSelectionDialog.open() == Window.OK) { Object[] locations = listSelectionDialog.getResult(); if (locations != null) { for (int i = 0; i < locations.length; i++) { configuration = (Configuration) locations[i]; break; } } } return configuration; } protected Configuration getConfiguration() { return getConfigurationPrefix(WikiEditorPlugin.PREFIX_LOAD); } /** * */ public RefreshWikiFilesAction() { super(); } /** * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart) */ public void setActivePart(IAction action, IWorkbenchPart targetPart) { workbenchPart = targetPart; } public void run(IAction action) { try { ISelectionProvider selectionProvider = null; selectionProvider = workbenchPart.getSite().getSelectionProvider(); StructuredSelection selection = null; selection = (StructuredSelection) selectionProvider.getSelection(); //Shell shell = null; Iterator iterator = null; iterator = selection.iterator(); Configuration configuration = getConfiguration(); String wikiLocale = configuration.getType().substring(WikiEditorPlugin.PREFIX_LOAD.length()); IWikipedia wikipediaProperties = WikiEditorPlugin.getWikiInstance(wikiLocale); final HashSet set = new HashSet(); IResourceVisitor visitor = new IResourceVisitor() { public boolean visit(IResource resource) { switch (resource.getType()) { case IResource.FILE: if (resource.getFileExtension().equalsIgnoreCase(WikiEditorPlugin.WP_EXTENSION)) { set.add(resource); } break; } return true; } }; while (iterator.hasNext()) { // obj => selected object in the view Object obj = iterator.next(); // is it a resource if (obj instanceof IResource) { IResource resource = (IResource) obj; // check if it's a file resource switch (resource.getType()) { case IResource.FOLDER: case IResource.FILE: resource.accept(visitor); break; } } } if (set.size() > 0) { IFile[] files = new IFile[set.size()]; set.toArray(files); Job job = new RefreshJob(wikipediaProperties, files, configuration.getURL()); // job.setRule(modifyRule(files)); job.setRule(null); job.setUser(true); job.schedule(); } } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public ISchedulingRule modifyRule(IFile[] files) { ISchedulingRule combinedRule = null; IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory(); ISchedulingRule rule; for (int i = 0; i < files.length; i++) { rule = ruleFactory.modifyRule(files[i]); combinedRule = MultiRule.combine(rule, combinedRule); } return combinedRule; } /** * @see IActionDelegate#selectionChanged(IAction, ISelection) */ public void selectionChanged(IAction action, ISelection selection) { } }