Author: stefanegli
Date: Thu Sep 12 13:16:49 2013
New Revision: 1522564

URL: http://svn.apache.org/r1522564
Log:
SLING-3009 : support batch-conversion of maven 'bundle' typed projects to 
'sling/osgi bundle' projects

Added:
    
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsPage.java
   (with props)
    
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsWizard.java
   (with props)
Modified:
    
sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java
    
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/Activator.java
    
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToBundleAction.java

Modified: 
sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java?rev=1522564&r1=1522563&r2=1522564&view=diff
==============================================================================
--- 
sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java
 (original)
+++ 
sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/ProjectHelper.java
 Thu Sep 12 13:16:49 2013
@@ -16,18 +16,32 @@
  */
 package org.apache.sling.ide.eclipse.core.internal;
 
+import org.apache.maven.model.Model;
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jdt.core.IJavaModel;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.m2e.core.MavenPlugin;
 import org.eclipse.wst.common.project.facet.core.IFacetedProject;
 import org.eclipse.wst.common.project.facet.core.IProjectFacet;
 import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
 
 public class ProjectHelper {
 
+       public static boolean isPotentialBundleProject(IProject project) {
+               Model mavenModel = getMavenModel(project);
+               return (mavenModel!=null && 
"bundle".equals(mavenModel.getPackaging()));
+       }
+       
+       public static boolean isPotentialContentProject(IProject project) {
+               Model mavenModel = ProjectHelper.getMavenModel(project);
+               return (mavenModel!=null && 
"content-package".equals(mavenModel.getPackaging()));
+       }
+       
        public static boolean isBundleProject(IProject project) {
                return containsFacet(project, 
SlingBundleModuleFactory.SLING_BUNDLE_FACET_ID);
        }
@@ -60,5 +74,20 @@ public class ProjectHelper {
                        return null;
                }
        }
+
+       public static Model getMavenModel(IProject project) {
+               IFile pomFile = project.getFile("pom.xml");
+               if (!pomFile.exists()) {
+                       return null;
+               }
+               try {
+                       Model model = 
MavenPlugin.getMavenModelManager().readMavenModel(pomFile);
+                       return model;
+               } catch (CoreException e) {
+                       // TODO proper logging
+                       e.printStackTrace();
+                       return null;
+               }
+       }
        
 }

Modified: 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/Activator.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/Activator.java?rev=1522564&r1=1522563&r2=1522564&view=diff
==============================================================================
--- 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/Activator.java
 (original)
+++ 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/Activator.java
 Thu Sep 12 13:16:49 2013
@@ -19,12 +19,12 @@ package org.apache.sling.ide.eclipse.ui.
 import org.apache.sling.ide.eclipse.core.ServiceUtil;
 import org.apache.sling.ide.filter.FilterLocator;
 import org.apache.sling.ide.serialization.SerializationManager;
-import org.eclipse.core.runtime.Plugin;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.event.EventAdmin;
 import org.osgi.util.tracker.ServiceTracker;
 
-public class Activator extends Plugin {
+public class Activator extends AbstractUIPlugin {
 
     public static final String PLUGIN_ID = "org.apache.sling.ide.eclipse-core";
     public static Activator INSTANCE;

Added: 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsPage.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsPage.java?rev=1522564&view=auto
==============================================================================
--- 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsPage.java
 (added)
+++ 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsPage.java
 Thu Sep 12 13:16:49 2013
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.ide.eclipse.ui.wizards;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+/** In parts adapted from 
org.eclipse.pde.internal.ui.wizards.tools.ConvertedProjectPage **/
+public class ConvertProjectsPage extends WizardPage {
+       private IProject[] initialSelection;
+       private List<IProject> projects;
+       private Label counterLabel;
+       private CheckboxTableViewer ctv;
+       private List<IProject> resultingSelection;
+
+       public class ProjectLabelProvider extends LabelProvider implements 
ITableLabelProvider {
+               public String getColumnText(Object element, int columnIndex) {
+                       if (columnIndex == 0 && (element instanceof IProject)) {
+                               return ((IProject)element).getName();
+                       } else {
+                               return "";
+                       }
+               }
+
+               public Image getColumnImage(Object obj, int index) {
+                       return 
PlatformUI.getWorkbench().getSharedImages().getImage(IDE.SharedImages.IMG_OBJ_PROJECT);
+               }
+       }
+
+       public ConvertProjectsPage(List<IProject> projects, List<IProject> 
initialSelection, String title, String description) {
+               super("convertSlingProjects"); //$NON-NLS-1$
+               setTitle(title);
+               setDescription(description);
+               this.initialSelection = initialSelection.toArray(new 
IProject[0]);
+               this.projects = projects;
+       }
+
+       public void createControl(Composite parent) {
+               Composite container = new Composite(parent, SWT.NONE);
+               GridLayout layout = new GridLayout();
+               layout.numColumns = 2;
+               layout.marginHeight = 0;
+               layout.marginWidth = 5;
+               container.setLayout(layout);
+               
+               Table table = new Table(container, SWT.MULTI | SWT.CHECK | 
SWT.BORDER);
+               GridData gd = new GridData(GridData.FILL_BOTH);
+               table.setLayoutData(gd);
+               ctv = new CheckboxTableViewer(table);
+               ctv.setLabelProvider(new ProjectLabelProvider());
+               ctv.add(projects.toArray());
+               ctv.setCheckedElements(initialSelection);
+
+               setControl(container);
+               Dialog.applyDialogFont(container);
+       }
+
+       @SuppressWarnings("unchecked")
+       public boolean finish() {
+               resultingSelection = new LinkedList<IProject>(
+                               (Collection<? extends IProject>) 
Arrays.asList(ctv.getCheckedElements()));
+               return true;
+       }
+
+       public List<IProject> getSelectedProjects() {
+               return resultingSelection;
+       }
+
+}

Propchange: 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsPage.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsWizard.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsWizard.java?rev=1522564&view=auto
==============================================================================
--- 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsWizard.java
 (added)
+++ 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsWizard.java
 Thu Sep 12 13:16:49 2013
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.sling.ide.eclipse.ui.wizards;
+
+import java.util.List;
+
+import org.apache.sling.ide.eclipse.ui.internal.Activator;
+import org.apache.sling.ide.eclipse.ui.internal.SharedImages;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.wizard.Wizard;
+
+/** In parts adapted from 
org.eclipse.pde.internal.ui.wizards.tools.ConvertedProjectWizard **/
+public class ConvertProjectsWizard extends Wizard {
+       private ConvertProjectsPage mainPage;
+       private List<IProject> initialSelection;
+       private List<IProject> projects;
+       private String title;
+       private String description;
+
+       public ConvertProjectsWizard(List<IProject> projects, List<IProject> 
initialSelection, String title, String description) {
+               setDefaultPageImageDescriptor(SharedImages.SLING_LOG);
+               setWindowTitle(title);
+               setDialogSettings(Activator.getDefault().getDialogSettings());
+               setNeedsProgressMonitor(true);
+               this.title = title;
+               this.description = description;
+               this.initialSelection = initialSelection;
+               this.projects = projects;
+       }
+
+       public void addPages() {
+               mainPage = new ConvertProjectsPage(projects, initialSelection, 
title, description);
+               addPage(mainPage);
+       }
+
+       public boolean performFinish() {
+               return mainPage.finish();
+       }
+
+       public List<IProject> getSelectedProjects() {
+               return mainPage.getSelectedProjects();
+       }
+}

Propchange: 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertProjectsWizard.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToBundleAction.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToBundleAction.java?rev=1522564&r1=1522563&r2=1522564&view=diff
==============================================================================
--- 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToBundleAction.java
 (original)
+++ 
sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/wizards/ConvertToBundleAction.java
 Thu Sep 12 13:16:49 2013
@@ -17,23 +17,31 @@
 package org.apache.sling.ide.eclipse.ui.wizards;
 
 import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 
-import org.apache.maven.model.Model;
 import org.apache.sling.ide.eclipse.core.internal.ProjectHelper;
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.custom.BusyIndicator;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.ui.IObjectActionDelegate;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.PlatformUI;
 
-public class ConvertToBundleAction  implements IObjectActionDelegate {
+public class ConvertToBundleAction implements IObjectActionDelegate {
 
        private ISelection fSelection;
 
@@ -53,33 +61,77 @@ public class ConvertToBundleAction  impl
         */
        public void run(IAction action) {
                if (fSelection instanceof IStructuredSelection) {
-                       final IProject project = (IProject) 
((IStructuredSelection) fSelection).getFirstElement();
+                       List<IProject> applicableProjects = new 
LinkedList<IProject>();
+                       IProject[] allProjects = 
ResourcesPlugin.getWorkspace().getRoot().getProjects();
+                       for (int i = 0; i < allProjects.length; i++) {
+                               IProject p = allProjects[i];
+                               if (p.isOpen() && 
!ProjectHelper.isBundleProject(p) && ProjectHelper.isPotentialBundleProject(p)) 
{
+                                       applicableProjects.add(p);
+                               }
+                       }
+                       Object[] elems = ((IStructuredSelection) 
fSelection).toArray();
+                       List<IProject> initialSelection = new 
ArrayList<IProject>(elems.length);
+
+                       for (int i = 0; i < elems.length; i++) {
+                               Object elem = elems[i];
+                               IProject project = null;
+
+                               if (elem instanceof IFile) {
+                                       IFile file = (IFile) elem;
+                                       project = file.getProject();
+                               } else if (elem instanceof IProject) {
+                                       project = (IProject) elem;
+                               } else if (elem instanceof IJavaProject) {
+                                       project = ((IJavaProject) 
elem).getProject();
+                               }
+                               if (project != null)
+                                       initialSelection.add(project);
+                       }
 
-                       boolean confirmed = 
MessageDialog.openConfirm(getDisplay().getActiveShell(), "Convert to Sling/OSGi 
Bundle Project", 
-                                       "Confirm the conversion of this project 
to a Sling/OSGi Bundle Project");
-                       
-                       if (confirmed) {
-                               IRunnableWithProgress r = new 
IRunnableWithProgress() {
-                                       
-                                       @Override
-                                       public void run(IProgressMonitor 
monitor) throws InvocationTargetException,
-                                                       InterruptedException {
-                                               try {
+                       ConvertProjectsWizard wizard = new 
ConvertProjectsWizard(applicableProjects, initialSelection, 
+                                       "Convert Project(s) to Sling/OSGi 
Bundle(s)",
+                                       "Select project(s) to convert to 
Sling/OSGi bundle project(s)");
+
+                       final Display display = getDisplay();
+                       final WizardDialog dialog = new 
WizardDialog(display.getActiveShell(), wizard);
+                       BusyIndicator.showWhile(display, new Runnable() {
+                               public void run() {
+                                       dialog.open();
+                               }
+                       });
+                       if (dialog.getReturnCode()!=WizardDialog.OK) {
+                               // user did not click OK
+                               return;
+                       }
+                       final List<IProject> selectedProjects = 
wizard.getSelectedProjects();
+                       if (selectedProjects == null || 
selectedProjects.size()==0) {
+                               // no project was selected
+                               return;
+                       }
+                       IRunnableWithProgress r = new IRunnableWithProgress() {
+                               
+                               @Override
+                               public void run(IProgressMonitor monitor) 
throws InvocationTargetException,
+                                               InterruptedException {
+                                       try {
+                                               for (Iterator<IProject> it = 
selectedProjects.iterator(); it
+                                                               .hasNext();) {
+                                                       IProject project = 
it.next();
                                                        
ConfigurationHelper.convertToBundleProject(project);
-                                               } catch (CoreException e) {
-                                                       e.printStackTrace();
-                                                       
MessageDialog.openError(getDisplay().getActiveShell(), "Could not convert 
project",
-                                                                       
e.getMessage());
                                                }
+                                       } catch (CoreException e) {
+                                               e.printStackTrace();
+                                               
MessageDialog.openError(getDisplay().getActiveShell(), "Could not convert 
project",
+                                                               e.getMessage());
                                        }
-                               };
-                               try {
-                                       
PlatformUI.getWorkbench().getProgressService().busyCursorWhile(r);
-                               } catch (Exception e) {
-                                       e.printStackTrace();
-                                       
MessageDialog.openError(getDisplay().getActiveShell(), "Could not convert 
project",
-                                                       e.getMessage());
                                }
+                       };
+                       try {
+                               
PlatformUI.getWorkbench().getProgressService().busyCursorWhile(r);
+                       } catch (Exception e) {
+                               e.printStackTrace();
+                               
MessageDialog.openError(getDisplay().getActiveShell(), "Could not convert 
project",
+                                               e.getMessage());
                        }
                }
        }
@@ -94,26 +146,30 @@ public class ConvertToBundleAction  impl
                fSelection = selection;
                if (selection instanceof IStructuredSelection) {
                        final IStructuredSelection iss = (IStructuredSelection) 
selection;
-                       if (iss.toList().size()!=1) {
+                       Iterator<Object> it = iss.iterator();
+                       if (!it.hasNext()) {
                                action.setEnabled(false);
-                       } else {
-                               Object firstElement = iss.getFirstElement();
-                               if (firstElement!=null && (firstElement 
instanceof IProject)) {
-                                       final IProject project = (IProject) 
firstElement;
+                               return;
+                       }
+                       while(it.hasNext()) {
+                               Object elem = it.next();
+                               if (elem!=null && (elem instanceof IProject)) {
+                                       final IProject project = (IProject) 
elem;
                                        if 
(ProjectHelper.isBundleProject(project)) {
                                                action.setEnabled(false);
+                                               return;
+                                       } else if 
(ProjectHelper.isPotentialBundleProject(project)) {
+                                               continue;
                                        } else {
-                                               Model mavenModel = 
MavenHelper.getMavenModel(project);
-                                               if (mavenModel!=null && 
"bundle".equals(mavenModel.getPackaging())) {
-                                                       action.setEnabled(true);
-                                               } else {
-                                                       
action.setEnabled(false);
-                                               }
+                                               action.setEnabled(false);
+                                               return;
                                        }
                                } else {
                                        action.setEnabled(false);
+                                       return;
                                }
                        }
+                       action.setEnabled(true);
                } else {
                        action.setEnabled(false);
                }


Reply via email to