Author: stefanegli Date: Wed Jul 31 14:49:54 2013 New Revision: 1508890 URL: http://svn.apache.org/r1508890 Log: SLING-2984 : improve import-content wizard: * made it a standard import wizard again (still also accessible via context menu) * warnings if project is not added to a server * restricting target location choice to a project and the option to change the jcr_root of that project * more beautify to come later (not scope of this ticket)
Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ISlingLaunchpadServer.java sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadServer.java sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF sling/trunk/tooling/ide/eclipse-ui/plugin.xml sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizardPage.java sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SelectionUtils.java Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ISlingLaunchpadServer.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ISlingLaunchpadServer.java?rev=1508890&r1=1508889&r2=1508890&view=diff ============================================================================== --- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ISlingLaunchpadServer.java (original) +++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/ISlingLaunchpadServer.java Wed Jul 31 14:49:54 2013 @@ -16,6 +16,8 @@ */ package org.apache.sling.ide.eclipse.core; +import org.eclipse.core.runtime.IProgressMonitor; + public interface ISlingLaunchpadServer { public static final int PUBLISH_STATE_NEVER = 1; @@ -27,7 +29,7 @@ public interface ISlingLaunchpadServer { public static final String PROP_CONTEXT_PATH = "launchpad.contextPath"; public static final String PROP_PORT = "launchpad.port"; - void setPublishState(int publishState); + void setPublishState(int publishState, IProgressMonitor monitor); int getPublishState(); Modified: sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadServer.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadServer.java?rev=1508890&r1=1508889&r2=1508890&view=diff ============================================================================== --- sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadServer.java (original) +++ sling/trunk/tooling/ide/eclipse-core/src/org/apache/sling/ide/eclipse/core/internal/SlingLaunchpadServer.java Wed Jul 31 14:49:54 2013 @@ -23,6 +23,7 @@ import org.eclipse.core.runtime.IProgres import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.wst.server.core.IModule; +import org.eclipse.wst.server.core.IServerWorkingCopy; import org.eclipse.wst.server.core.model.ServerDelegate; public class SlingLaunchpadServer extends ServerDelegate implements ISlingLaunchpadServer { @@ -133,11 +134,17 @@ public class SlingLaunchpadServer extend public int getPublishState() { return getAttribute(PROP_AUTO_PUBLISH_SETTING, PUBLISH_STATE_NEVER); } - + @Override - public void setPublishState(int publishState) { + public void setPublishState(int publishState, IProgressMonitor monitor) { System.out.println("[" + Thread.currentThread().getName() + "] Set " + PROP_AUTO_PUBLISH_SETTING + " to " + publishState); - setAttribute(PROP_AUTO_PUBLISH_SETTING, publishState); + IServerWorkingCopy wc = getServer().createWorkingCopy(); + wc.setAttribute(PROP_AUTO_PUBLISH_SETTING, publishState); + try { + wc.save(false, monitor); + } catch (CoreException e) { + throw new RuntimeException(e); + } } } Modified: sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF?rev=1508890&r1=1508889&r2=1508890&view=diff ============================================================================== --- sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF (original) +++ sling/trunk/tooling/ide/eclipse-ui/META-INF/MANIFEST.MF Wed Jul 31 14:49:54 2013 @@ -49,3 +49,4 @@ Import-Package: org.apache.sling.ide.ecl org.osgi.framework, org.osgi.util.tracker;version="1.5.0" Bundle-ActivationPolicy: lazy +Require-Bundle: org.eclipse.wst.common.project.facet.ui Modified: sling/trunk/tooling/ide/eclipse-ui/plugin.xml URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/plugin.xml?rev=1508890&r1=1508889&r2=1508890&view=diff ============================================================================== --- sling/trunk/tooling/ide/eclipse-ui/plugin.xml (original) +++ sling/trunk/tooling/ide/eclipse-ui/plugin.xml Wed Jul 31 14:49:54 2013 @@ -78,6 +78,23 @@ </enablement> </objectContribution> </extension> + <extension + point="org.eclipse.ui.importWizards"> + <category + id="org.apache.sling.ide.eclipse.ui.internal.sampleCategory" + name="Sling"> + </category> + <wizard + category="org.apache.sling.ide.eclipse.ui.internal.sampleCategory" + class="org.apache.sling.ide.eclipse.ui.internal.ImportWizard" + icon="icons/obj16/sling.gif" + id="org.apache.sling.ide.eclipse.ui.internal.ImportWizard" + name="Import from Sling Repository"> + <description> + Import a file from the local file system into the workspace. + </description> + </wizard> + </extension> <!-- Property page for project to select directory to sync --> <extension point="org.eclipse.ui.propertyPages"> @@ -96,5 +113,5 @@ </and> </enabledWhen> </page> - </extension> + </extension> </plugin> Modified: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java?rev=1508890&r1=1508889&r2=1508890&view=diff ============================================================================== --- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java (original) +++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizard.java Wed Jul 31 14:49:54 2013 @@ -1,300 +1,300 @@ -/* - * 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.internal; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.util.Map; - -import org.apache.sling.ide.eclipse.core.ISlingLaunchpadServer; -import org.apache.sling.ide.eclipse.core.ServerUtil; -import org.apache.sling.ide.filter.Filter; -import org.apache.sling.ide.filter.FilterLocator; -import org.apache.sling.ide.filter.FilterResult; -import org.apache.sling.ide.serialization.SerializationManager; -import org.apache.sling.ide.transport.Command; -import org.apache.sling.ide.transport.Repository; -import org.apache.sling.ide.transport.RepositoryException; -import org.apache.sling.ide.transport.ResourceProxy; -import org.apache.sling.ide.transport.Result; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IFolder; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.operation.IRunnableWithProgress; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.wizard.Wizard; -import org.eclipse.ui.IImportWizard; -import org.eclipse.ui.IWorkbench; -import org.eclipse.wst.server.core.IServer; - -/** - * Renders the import wizard container page for the Slingclipse repository - * import. - */ -public class ImportWizard extends Wizard implements IImportWizard { - private ImportWizardPage mainPage; - private SerializationManager serializationManager; - - /** - * Construct a new Import Wizard container instance. - */ - public ImportWizard() { - super(); - Activator activator = Activator.getDefault(); - serializationManager = activator.getSerializationManager(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.wizard.Wizard#performFinish() - */ - public boolean performFinish() { - - if (!mainPage.isPageComplete()) { - return false; - } - - final IServer server = mainPage.getServer(); - - IPath destinationPath = mainPage.getResourcePath(); - - final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(destinationPath.segments()[0]); - final IPath projectRelativePath = destinationPath.removeFirstSegments(1); - final String repositoryPath = mainPage.getRepositoryPath(); - final IFile filterFile = mainPage.getFilterFile(); - try { - getContainer().run(false, true, new IRunnableWithProgress() { - - @Override - public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { - Repository repository = ServerUtil.getRepository(server, monitor); - - monitor.setTaskName("Loading configuration..."); - ISlingLaunchpadServer launchpad = (ISlingLaunchpadServer) server.loadAdapter( - ISlingLaunchpadServer.class, monitor); - - int oldPublishState = launchpad.getPublishState(); - // TODO disabling publish does not work; since the publish is done async - // Not sure if there is a simple workaround. Anyway, the only side effect is that we - // make too many calls after the import, functionality is not affected - if (server.canPublish().isOK() && oldPublishState != ISlingLaunchpadServer.PUBLISH_STATE_NEVER) { - launchpad.setPublishState(ISlingLaunchpadServer.PUBLISH_STATE_NEVER); - } - - Filter filter = null; - if (filterFile != null) { - FilterLocator filterLocator = Activator.getDefault().getFilterLocator(); - InputStream contents = null; - try { - contents = filterFile.getContents(); - filter = filterLocator.loadFilter(contents); - } catch (IOException e) { - throw new InvocationTargetException(e); - } catch (CoreException e) { - throw new InvocationTargetException(e); - } finally { - if (contents != null) { - try { - contents.close(); - } catch (IOException e) { - // don't care - } - } - } - } - monitor.worked(5); - - try { - - // TODO: We should try to make this give 'nice' progress feedback (aka here's what I'm - // processing) - monitor.setTaskName("Importing..."); - monitor.worked(10); - - // we create the root node and assume this is a folder - createRoot(project, projectRelativePath, repositoryPath); - - crawlChildrenAndImport(repository, filter, repositoryPath, project, projectRelativePath); - - monitor.setTaskName("Import Complete"); - monitor.worked(100); - } catch (Exception e) { - throw new InvocationTargetException(e); - } finally { - if (oldPublishState != ISlingLaunchpadServer.PUBLISH_STATE_NEVER) { - launchpad.setPublishState(oldPublishState); - } - monitor.done(); - } - - } - - }); - } catch (InvocationTargetException e) { - Throwable cause = e.getCause(); - mainPage.setErrorMessage("Import error : " + cause.getMessage() - + " . Please see the error log for details."); - Activator.getDefault().getLog() - .log(new Status(Status.ERROR, Constants.PLUGIN_ID, "Repository import failed", cause)); - return false; - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - return false; - } - - return true; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, - * org.eclipse.jface.viewers.IStructuredSelection) - */ - public void init(IWorkbench workbench, IStructuredSelection selection) { - setWindowTitle("Repositoy Import"); // NON-NLS-1 - setNeedsProgressMonitor(true); - mainPage = new ImportWizardPage("Import from Repository", selection); // NON-NLS-1 - setDefaultPageImageDescriptor(SharedImages.SLING_LOG); - - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.wizard.IWizard#addPages() - */ - public void addPages() { - super.addPages(); - addPage(mainPage); - } - - private void createRoot(final IProject project, final IPath projectRelativePath, final String repositoryPath) - throws CoreException { - - IPath rootImportPath = projectRelativePath.append(repositoryPath); - - for (int i = rootImportPath.segmentCount() - 1; i > 0; i--) - createFolder(project, rootImportPath.removeLastSegments(i)); - } - - /** - * Crawls the repository and recursively imports founds resources - * - * @param repository the sling repository to import from - * @param filter - * @param path the current path to import from - * @param project the project to create resources in - * @param projectRelativePath the path, relative to the project root, where the resources should be created - * @param tracer - * @throws JSONException - * @throws RepositoryException - * @throws CoreException - * @throws IOException - */ - // TODO: This probably should be pushed into the service layer - private void crawlChildrenAndImport(Repository repository, Filter filter, String path, IProject project, - IPath projectRelativePath) throws RepositoryException, CoreException, IOException { - - System.out.println("crawlChildrenAndImport(" + repository + ", " + path + ", " + project + ", " - + projectRelativePath + ")"); - - ResourceProxy resource = executeCommand(repository.newListChildrenNodeCommand(path)); - String primaryType = (String) resource.getProperties().get(Repository.JCR_PRIMARY_TYPE); - - if (Repository.NT_FILE.equals(primaryType)){ - importFile(repository, path, project, projectRelativePath); - }else if (Repository.NT_FOLDER.equals(primaryType)){ - createFolder(project, projectRelativePath.append(path)); - }else if(Repository.NT_RESOURCE.equals(primaryType)){ - //DO NOTHING - } else { - createFolder(project, projectRelativePath.append(path)); - Map<String, Object> content = executeCommand(repository.newGetNodeContentCommand(path)); - - String out = serializationManager.buildSerializationData(content); - if (out != null) { - createFile(project, projectRelativePath.append(serializationManager.getSerializationFilePath(path)), - out.getBytes("UTF-8")); - } - } - - System.out.println("Children: " + resource.getChildren()); - - for (ResourceProxy child : resource.getChildren()) { - - if (Repository.NT_RESOURCE.equals(child.getProperties().get(Repository.JCR_PRIMARY_TYPE))) { - continue; - } - - if (filter != null) { - FilterResult filterResult = filter.filter(child.getPath()); - if (filterResult == FilterResult.DENY) { - continue; - } - } - - crawlChildrenAndImport(repository, filter, child.getPath(), project, - projectRelativePath); - } - } - - private <T> T executeCommand(Command<T> command) throws RepositoryException { - - Result<T> result = command.execute(); - return result.get(); - } - - private void importFile(Repository repository, String path, IProject project, IPath destinationPath) - throws RepositoryException, CoreException { - - System.out.println("importFile: " + path + " -> " + destinationPath); - - byte[] node = executeCommand(repository.newGetNodeCommand(path)); - createFile(project, destinationPath.append(path), node ); - } - - private void createFolder(IProject project, IPath destinationPath) throws CoreException{ - - IFolder destinationFolder = project.getFolder(destinationPath); - if ( destinationFolder.exists() ) - return; - - destinationFolder.create(true, true, null /* TODO progress monitor */); - } - - private void createFile(IProject project, IPath path, byte[] node) throws CoreException { - - IFile destinationFile = project.getFile(path); - if ( destinationFile.exists() ) { - /* TODO progress monitor */ - destinationFile.setContents(new ByteArrayInputStream(node), IResource.KEEP_HISTORY, null); - } else { - /* TODO progress monitor */ - destinationFile.create(new ByteArrayInputStream(node), true, null); - } - } -} +/* + * 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.internal; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.util.Map; + +import org.apache.sling.ide.eclipse.core.ISlingLaunchpadServer; +import org.apache.sling.ide.eclipse.core.ServerUtil; +import org.apache.sling.ide.filter.Filter; +import org.apache.sling.ide.filter.FilterLocator; +import org.apache.sling.ide.filter.FilterResult; +import org.apache.sling.ide.serialization.SerializationManager; +import org.apache.sling.ide.transport.Command; +import org.apache.sling.ide.transport.Repository; +import org.apache.sling.ide.transport.RepositoryException; +import org.apache.sling.ide.transport.ResourceProxy; +import org.apache.sling.ide.transport.Result; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.operation.IRunnableWithProgress; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.wizard.Wizard; +import org.eclipse.ui.IImportWizard; +import org.eclipse.ui.IWorkbench; +import org.eclipse.wst.server.core.IServer; + +/** + * Renders the import wizard container page for the Slingclipse repository + * import. + */ +public class ImportWizard extends Wizard implements IImportWizard { + private ImportWizardPage mainPage; + private SerializationManager serializationManager; + + /** + * Construct a new Import Wizard container instance. + */ + public ImportWizard() { + super(); + Activator activator = Activator.getDefault(); + serializationManager = activator.getSerializationManager(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.wizard.Wizard#performFinish() + */ + public boolean performFinish() { + + if (!mainPage.isPageComplete()) { + return false; + } + + final IServer server = mainPage.getServer(); + + IPath destinationPath = mainPage.getResourcePath(); + + final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(destinationPath.segments()[0]); + final IPath projectRelativePath = destinationPath.removeFirstSegments(1); + final String repositoryPath = mainPage.getRepositoryPath(); + final IFile filterFile = mainPage.getFilterFile(); + try { + getContainer().run(false, true, new IRunnableWithProgress() { + + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + Repository repository = ServerUtil.getRepository(server, monitor); + + monitor.setTaskName("Loading configuration..."); + ISlingLaunchpadServer launchpad = (ISlingLaunchpadServer) server.loadAdapter( + ISlingLaunchpadServer.class, monitor); + + int oldPublishState = launchpad.getPublishState(); + // TODO disabling publish does not work; since the publish is done async + // Not sure if there is a simple workaround. Anyway, the only side effect is that we + // make too many calls after the import, functionality is not affected + if (server.canPublish().isOK() && oldPublishState != ISlingLaunchpadServer.PUBLISH_STATE_NEVER) { + launchpad.setPublishState(ISlingLaunchpadServer.PUBLISH_STATE_NEVER, monitor); + } + + Filter filter = null; + if (filterFile != null && filterFile.exists()) { + FilterLocator filterLocator = Activator.getDefault().getFilterLocator(); + InputStream contents = null; + try { + contents = filterFile.getContents(); + filter = filterLocator.loadFilter(contents); + } catch (IOException e) { + throw new InvocationTargetException(e); + } catch (CoreException e) { + throw new InvocationTargetException(e); + } finally { + if (contents != null) { + try { + contents.close(); + } catch (IOException e) { + // don't care + } + } + } + } + monitor.worked(5); + + try { + + // TODO: We should try to make this give 'nice' progress feedback (aka here's what I'm + // processing) + monitor.setTaskName("Importing..."); + monitor.worked(10); + + // we create the root node and assume this is a folder + createRoot(project, projectRelativePath, repositoryPath); + + crawlChildrenAndImport(repository, filter, repositoryPath, project, projectRelativePath); + + monitor.setTaskName("Import Complete"); + monitor.worked(100); + } catch (Exception e) { + throw new InvocationTargetException(e); + } finally { + if (oldPublishState != ISlingLaunchpadServer.PUBLISH_STATE_NEVER) { + launchpad.setPublishState(oldPublishState, monitor); + } + monitor.done(); + } + + } + + }); + } catch (InvocationTargetException e) { + Throwable cause = e.getCause(); + mainPage.setErrorMessage("Import error : " + cause.getMessage() + + " . Please see the error log for details."); + Activator.getDefault().getLog() + .log(new Status(Status.ERROR, Constants.PLUGIN_ID, "Repository import failed", cause)); + return false; + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return false; + } + + return true; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, + * org.eclipse.jface.viewers.IStructuredSelection) + */ + public void init(IWorkbench workbench, IStructuredSelection selection) { + setWindowTitle("Repositoy Import"); // NON-NLS-1 + setNeedsProgressMonitor(true); + mainPage = new ImportWizardPage("Import from Repository", selection); // NON-NLS-1 + setDefaultPageImageDescriptor(SharedImages.SLING_LOG); + + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.wizard.IWizard#addPages() + */ + public void addPages() { + super.addPages(); + addPage(mainPage); + } + + private void createRoot(final IProject project, final IPath projectRelativePath, final String repositoryPath) + throws CoreException { + + IPath rootImportPath = projectRelativePath.append(repositoryPath); + + for (int i = rootImportPath.segmentCount() - 1; i > 0; i--) + createFolder(project, rootImportPath.removeLastSegments(i)); + } + + /** + * Crawls the repository and recursively imports founds resources + * + * @param repository the sling repository to import from + * @param filter + * @param path the current path to import from + * @param project the project to create resources in + * @param projectRelativePath the path, relative to the project root, where the resources should be created + * @param tracer + * @throws JSONException + * @throws RepositoryException + * @throws CoreException + * @throws IOException + */ + // TODO: This probably should be pushed into the service layer + private void crawlChildrenAndImport(Repository repository, Filter filter, String path, IProject project, + IPath projectRelativePath) throws RepositoryException, CoreException, IOException { + + System.out.println("crawlChildrenAndImport(" + repository + ", " + path + ", " + project + ", " + + projectRelativePath + ")"); + + ResourceProxy resource = executeCommand(repository.newListChildrenNodeCommand(path)); + String primaryType = (String) resource.getProperties().get(Repository.JCR_PRIMARY_TYPE); + + if (Repository.NT_FILE.equals(primaryType)){ + importFile(repository, path, project, projectRelativePath); + }else if (Repository.NT_FOLDER.equals(primaryType)){ + createFolder(project, projectRelativePath.append(path)); + }else if(Repository.NT_RESOURCE.equals(primaryType)){ + //DO NOTHING + } else { + createFolder(project, projectRelativePath.append(path)); + Map<String, Object> content = executeCommand(repository.newGetNodeContentCommand(path)); + + String out = serializationManager.buildSerializationData(content); + if (out != null) { + createFile(project, projectRelativePath.append(serializationManager.getSerializationFilePath(path)), + out.getBytes("UTF-8")); + } + } + + System.out.println("Children: " + resource.getChildren()); + + for (ResourceProxy child : resource.getChildren()) { + + if (Repository.NT_RESOURCE.equals(child.getProperties().get(Repository.JCR_PRIMARY_TYPE))) { + continue; + } + + if (filter != null) { + FilterResult filterResult = filter.filter(child.getPath()); + if (filterResult == FilterResult.DENY) { + continue; + } + } + + crawlChildrenAndImport(repository, filter, child.getPath(), project, + projectRelativePath); + } + } + + private <T> T executeCommand(Command<T> command) throws RepositoryException { + + Result<T> result = command.execute(); + return result.get(); + } + + private void importFile(Repository repository, String path, IProject project, IPath destinationPath) + throws RepositoryException, CoreException { + + System.out.println("importFile: " + path + " -> " + destinationPath); + + byte[] node = executeCommand(repository.newGetNodeCommand(path)); + createFile(project, destinationPath.append(path), node ); + } + + private void createFolder(IProject project, IPath destinationPath) throws CoreException{ + + IFolder destinationFolder = project.getFolder(destinationPath); + if ( destinationFolder.exists() ) + return; + + destinationFolder.create(true, true, null /* TODO progress monitor */); + } + + private void createFile(IProject project, IPath path, byte[] node) throws CoreException { + + IFile destinationFile = project.getFile(path); + if ( destinationFile.exists() ) { + /* TODO progress monitor */ + destinationFile.setContents(new ByteArrayInputStream(node), IResource.KEEP_HISTORY, null); + } else { + /* TODO progress monitor */ + destinationFile.create(new ByteArrayInputStream(node), true, null); + } + } +} Modified: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizardPage.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizardPage.java?rev=1508890&r1=1508889&r2=1508890&view=diff ============================================================================== --- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizardPage.java (original) +++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/ImportWizardPage.java Wed Jul 31 14:49:54 2013 @@ -1,287 +1,436 @@ -/* - * 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.internal; - - -import java.io.File; -import java.util.List; - -import org.apache.sling.ide.eclipse.core.ProjectUtil; -import org.apache.sling.ide.filter.FilterLocator; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IFolder; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.resources.ResourcesPlugin; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.Path; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.dialogs.WizardResourceImportPage; -import org.eclipse.wst.server.core.IServer; -import org.eclipse.wst.server.core.ServerCore; - -/** - * Wizard page for importing content from Sling Repositories. - */ -public class ImportWizardPage extends WizardResourceImportPage { - - private IStructuredSelection selection; - private Text path; - private ModifyListener modifyListener = new ModifyListener() { - @Override - public void modifyText(ModifyEvent event) { - determinePageCompletion(); - updateWidgetEnablements(); - } - }; - private Combo repositoryCombo; - private Label importLabel; - - /** - * Creates an import wizard page for importing from a Sling Repository. If - * the initial resource selection contains exactly one container resource - * then it will be used as the default import destination. Multiple - * selections are not supported, but are not disallowed. - * - * @param pageName - * the name of the page - * @param selection - * the current resource selection - */ - public ImportWizardPage(String pageName, IStructuredSelection selection) { - super(pageName, selection); - this.selection = selection; - setTitle(pageName); // NON-NLS-1 - setDescription("Import content from a Sling Repository into the workspace"); // NON-NLS-1 - - IProject project = getProject(selection); - setContainerFieldValue(project.getFullPath().append(ProjectUtil.getSyncDirectoryValue(project)).toOSString()); - } - - private IProject getProject(IStructuredSelection selection) { - return (IProject) selection.getFirstElement(); - } - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.ui.dialogs.WizardResourceImportPage#allowNewContainerName() - */ - @Override - protected boolean allowNewContainerName() { - return false; - } - - @Override - protected void createOptionsGroup(Composite parent) { - - // not really options but to placement is good enough - Composite container = new Composite(parent, SWT.NONE); - container.setLayout(new GridLayout()); - GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false); - container.setLayoutData(gridData); - - importLabel = new Label(container, SWT.NONE); - - } - - @Override - protected void createSourceGroup(Composite parent) { - - Composite container = new Composite(parent, SWT.NONE); - container.setLayout(new GridLayout(2, false)); - GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false); - gridData.minimumWidth = 450; - container.setLayoutData(gridData); - - new Label(container, SWT.NONE).setText("Repository: "); - - repositoryCombo = new Combo(container, SWT.DROP_DOWN); - repositoryCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - List<IServer> servers = SelectionUtils.getServersLinkedToProject(selection, new NullProgressMonitor()); - if (servers.size() > 1) { - repositoryCombo.add(""); // force selection only if there is more than one server - } - for (IServer server : servers) { - repositoryCombo.add(server.getId()); - } - - if (servers.size() == 1) { - repositoryCombo.select(0); - } - - Label pathLabel = new Label(container, SWT.NONE); - pathLabel.setText("Repository Path:"); - path = new Text(container, SWT.BORDER); - path.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - path.addModifyListener(modifyListener); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.dialogs.WizardResourceImportPage#getFileProvider() - */ - @Override - protected ITreeContentProvider getFileProvider() { - // TODO Not sure if I need to return anything here... - return null; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.dialogs.WizardResourceImportPage#getFolderProvider() - */ - @Override - protected ITreeContentProvider getFolderProvider() { - // TODO Not sure if I need to return anything here... - return null; - } - - /** - * Returns the path from which to import from the Sling Repository. - * - * @return the repository path - */ - public String getRepositoryPath() { - return path != null ? path.getText() : null; - } - - public void handleEvent(Event event) { - super.handleEvent(event); - determinePageCompletion(); - } - - @Override - public IPath getResourcePath() { - return super.getResourcePath(); - } - - public IServer getServer() { - for (IServer server : ServerCore.getServers()) - if (server.getId().equals(repositoryCombo.getText())) - return server; - - return null; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.dialogs.WizardDataTransferPage#validateOptionsGroup() - */ - @Override - protected boolean validateOptionsGroup() { - if (this.repositoryCombo == null || this.repositoryCombo.getSelectionIndex() == -1) { - setErrorMessage("Please select a valid index"); - return false; - } - - if ( !getRepositoryPath().startsWith("/") ) { - setErrorMessage("The repository path needs to be absolute"); - return false; - } - - IProject project = getProject(selection); - String syncDirectoryPath = ProjectUtil.getSyncDirectoryValue(project); - IFolder syncFolder = project.getFolder(syncDirectoryPath); - - if (!syncFolder.getFullPath().isPrefixOf(getResourcePath())) { - setErrorMessage("The destination directory must be " + syncFolder.getFullPath().toPortableString() - + " or one of its descendants."); - return false; - } - - return true; - } - - @Override - protected void updateWidgetEnablements() { - super.updateWidgetEnablements(); - - // called too early - if (importLabel == null) { - return; - } - - IResource syncLocation = getProject(selection).getWorkspace().getRoot().findMember(getResourcePath()); - // error message will be displayed, no need for the info label - if (syncLocation == null) { - importLabel.setVisible(false); - importLabel.getParent().layout(); - return; - } - - IFile filterFile = getFilter(syncLocation); - - if (filterFile.exists()) { - importLabel.setText("Will apply import filter from /" + filterFile.getProjectRelativePath() + "."); - } else { - importLabel.setText("No filter found at /" + filterFile.getProjectRelativePath() - + ", will import all resources."); - } - importLabel.setVisible(true); - importLabel.getParent().layout(); - } - - public IFile getFilterFile() { - - IResource syncLocation = getProject(selection).getWorkspace().getRoot().findMember(getResourcePath()); - if (syncLocation == null) { - return null; - } - - return getFilter(syncLocation); - } - - private IFile getFilter(IResource syncLocation) { - - FilterLocator filterLocator = Activator.getDefault().getFilterLocator(); - File filterLocation = filterLocator.findFilterLocation(syncLocation.getLocation().toFile()); - IPath filterPath = Path.fromOSString(filterLocation.getAbsolutePath()); - return ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(filterPath); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.dialogs.WizardDataTransferPage#validateSourceGroup() - */ - @Override - protected boolean validateSourceGroup() { - if (getRepositoryPath() == null - || getRepositoryPath().trim().length() == 0) { - setErrorMessage("Please enter a valid Sling Repository path"); - return false; - } - return true; - } -} +/* + * 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.internal; + + +import java.io.File; +import java.util.List; + +import org.apache.sling.ide.eclipse.core.ProjectUtil; +import org.apache.sling.ide.filter.FilterLocator; +import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.Path; +import org.eclipse.jface.preference.PreferenceDialog; +import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Link; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.dialogs.ContainerSelectionDialog; +import org.eclipse.ui.dialogs.ISelectionValidator; +import org.eclipse.ui.dialogs.PreferencesUtil; +import org.eclipse.ui.dialogs.WizardDataTransferPage; +import org.eclipse.wst.server.core.IServer; +import org.eclipse.wst.server.core.ServerCore; + +/** + * Wizard page for importing content from Sling Repositories. + */ +public class ImportWizardPage extends WizardDataTransferPage { + + private Text path; + private ModifyListener modifyListener = new ModifyListener() { + @Override + public void modifyText(ModifyEvent event) { + determinePageCompletion(); + updateWidgetEnablements(); + } + }; + private Combo repositoryCombo; + private Label importLabel; + private Button containerBrowseButton; + private IProject project; + private Text containerNameField; + private Label adjustJcrRootText; + + /** + * Creates an import wizard page for importing from a Sling Repository. If + * the initial resource selection contains exactly one container resource + * then it will be used as the default import destination. Multiple + * selections are not supported, but are not disallowed. + * + * @param pageName + * the name of the page + * @param selection + * the current resource selection + */ + public ImportWizardPage(String pageName, IStructuredSelection selection) { + super(pageName); + setTitle(pageName); // NON-NLS-1 + setDescription("Import content from a Sling Repository into the workspace"); // NON-NLS-1 + + if (selection!=null && selection.getFirstElement()!=null && (selection.getFirstElement() instanceof IProject)) { + this.project = (IProject) selection.getFirstElement(); + } + } + + IPath getResourcePath() { + String resourcePath = project.getFullPath().append(ProjectUtil.getSyncDirectoryValue(project)).toOSString(); + return new Path(resourcePath); + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.ui.dialogs.WizardResourceImportPage#allowNewContainerName() + */ + @Override + protected boolean allowNewContainerName() { + return false; + } + + @Override + protected void createOptionsGroup(Composite parent) { + + // not really options but to placement is good enough + Composite container = new Composite(parent, SWT.NONE); + container.setLayout(new GridLayout()); + GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false); + container.setLayoutData(gridData); + + importLabel = new Label(container, SWT.NONE); + + } + + @Override + public void createControl(Composite parent) { + Composite composite = new Composite(parent, SWT.NULL); + composite.setLayout(new GridLayout()); + composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL + | GridData.HORIZONTAL_ALIGN_FILL)); + composite.setSize(composite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); + + Composite container = new Composite(composite, SWT.NONE); + container.setLayout(new GridLayout(2, false)); + GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false); + gridData.minimumWidth = 450; + container.setLayoutData(gridData); + + new Label(container, SWT.NONE).setText("Repository: "); + + repositoryCombo = new Combo(container, SWT.DROP_DOWN); + repositoryCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + repositoryCombo.addSelectionListener(new SelectionListener() { + + @Override + public void widgetSelected(SelectionEvent e) { + determinePageCompletion(); + updateWidgetEnablements(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + determinePageCompletion(); + updateWidgetEnablements(); + } + }); + updateRepositoryList(); + + Label pathLabel = new Label(container, SWT.NONE); + pathLabel.setText("Repository Path:"); + path = new Text(container, SWT.BORDER); + path.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + path.addModifyListener(modifyListener); + + Composite containerGroup = new Composite(composite, SWT.NONE); + GridLayout layout = new GridLayout(); + layout.numColumns = 3; + containerGroup.setLayout(layout); + containerGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); + containerGroup.setFont(composite.getFont()); + + // container label + Label resourcesLabel = new Label(containerGroup, SWT.NONE); + resourcesLabel.setText("Import into:"); + resourcesLabel.setFont(composite.getFont()); + + containerNameField = new Text(containerGroup, SWT.SINGLE | SWT.BORDER); + containerNameField.addListener(SWT.Modify, this); + GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL + | GridData.GRAB_HORIZONTAL); + data.widthHint = SIZING_TEXT_FIELD_WIDTH; + containerNameField.setLayoutData(data); + containerNameField.setFont(composite.getFont()); + + containerBrowseButton = new Button(containerGroup, SWT.PUSH); + containerBrowseButton.setText("Select Project..."); + containerBrowseButton.setLayoutData(new GridData( + GridData.HORIZONTAL_ALIGN_FILL)); + containerBrowseButton.addListener(SWT.Selection, this); + containerBrowseButton.setFont(composite.getFont()); + setButtonLayoutData(containerBrowseButton); + + if (project!=null) { + containerNameField.setText(project.getName()); + } else { + setErrorMessage("Select a project first"); + } + + adjustJcrRootText = new Label(composite, SWT.NONE); + adjustJcrRootText.setFont(containerGroup.getFont()); + adjustJcrRootText(); + + Link openPropertiesLink = new Link(composite, SWT.NONE); + openPropertiesLink.setText("<a>Modify location here</a>"); + openPropertiesLink.addSelectionListener(new SelectionAdapter() { + + public void widgetSelected(SelectionEvent e) { + PreferenceDialog dialog = PreferencesUtil.createPropertyDialogOn(getShell(), project, + "org.apache.sling.ide.projectPropertyPage", + new String[] {"org.apache.sling.ide.projectPropertyPage"}, null); + dialog.open(); + updateWidgetEnablements(); + } + }); + + + + createOptionsGroup(composite); + + setControl(composite); + + setPageComplete(false); + } + + private void updateRepositoryList() { + repositoryCombo.removeAll(); + List<IServer> servers = SelectionUtils.getServersLinkedToProject(project, new NullProgressMonitor()); + if (servers.size() > 1) { + repositoryCombo.add(""); // force selection only if there is more than one server + } + for (IServer server : servers) { + repositoryCombo.add(server.getId()); + } + + if (servers.size() == 1) { + repositoryCombo.select(0); + } + } + + /** + * Returns the path from which to import from the Sling Repository. + * + * @return the repository path + */ + public String getRepositoryPath() { + return path != null ? path.getText() : null; + } + + public void handleEvent(Event event) { + if (event.widget == containerBrowseButton) { + handleContainerBrowseButtonPressed(); + } + + determinePageCompletion(); + } + + protected IPath queryForProject(IProject initialSelection, String msg, + String title) { + ContainerSelectionDialog dialog = new ContainerSelectionDialog( + getControl().getShell(), initialSelection, + allowNewContainerName(), msg); + if (title != null) { + dialog.setTitle(title); + } + dialog.showClosedProjects(false); + dialog.setValidator(new ISelectionValidator() { + + @Override + public String isValid(Object selection) { + if (!(selection instanceof IPath)) { + return "You must select a project"; + } + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + IContainer container = (IContainer) root + .findMember((IPath) selection); + if (container instanceof IProject) { + return null; + } else { + return "You must select a project"; + } + } + }); + dialog.open(); + Object[] result = dialog.getResult(); + if (result != null && result.length == 1) { + return (IPath) result[0]; + } + return null; + } + + private void handleContainerBrowseButtonPressed() { + IPath result = queryForProject(project, "Select a project to import data to", "Select project"); + if (result!=null) { + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + project = root + .findMember(result).getProject(); + + containerNameField.setText(project.getName()); + updateRepositoryList(); + } + } + + public IServer getServer() { + for (IServer server : ServerCore.getServers()) + if (server.getId().equals(repositoryCombo.getText())) + return server; + + return null; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.dialogs.WizardDataTransferPage#validateOptionsGroup() + */ + @Override + protected boolean validateOptionsGroup() { + if (getControl() == null) { + // still under construction + return true; + } + if (this.repositoryCombo == null || this.repositoryCombo.getSelectionIndex() == -1) { + setErrorMessage("Please select a valid index"); + return false; + } + + if ( !getRepositoryPath().startsWith("/") ) { + setErrorMessage("The repository path needs to be absolute"); + return false; + } + + String syncDirectoryPath = ProjectUtil.getSyncDirectoryValue(project); + IFolder syncFolder = project.getFolder(syncDirectoryPath); + + if (!syncFolder.getFullPath().isPrefixOf(getResourcePath())) { + setErrorMessage("The destination directory must be " + syncFolder.getFullPath().toPortableString() + + " or one of its descendants."); + return false; + } + + return true; + } + + @Override + protected void updateWidgetEnablements() { + super.updateWidgetEnablements(); + + boolean pageComplete = determinePageCompletion(); + setPageComplete(pageComplete); + if (pageComplete) { + setMessage(null); + } + + // called too early + if (importLabel == null) { + return; + } + + IResource syncLocation = project.getWorkspace().getRoot().findMember(getResourcePath()); + // error message will be displayed, no need for the info label + if (syncLocation == null) { + importLabel.setVisible(false); + importLabel.getParent().layout(); + return; + } + + IFile filterFile = getFilter(syncLocation); + + if (filterFile!=null && filterFile.exists()) { + importLabel.setText("Will apply import filter from /" + filterFile.getProjectRelativePath() + "."); + } else { + importLabel.setText("No filter found at /" + filterFile.getProjectRelativePath() + + ", will import all resources."); + } + importLabel.setVisible(true); + importLabel.getParent().layout(); + } + + public IFile getFilterFile() { + + IResource syncLocation = project.getWorkspace().getRoot().findMember(getResourcePath()); + if (syncLocation == null) { + return null; + } + + return getFilter(syncLocation); + } + + private IFile getFilter(IResource syncLocation) { + + FilterLocator filterLocator = Activator.getDefault().getFilterLocator(); + File filterLocation = filterLocator.findFilterLocation(syncLocation.getLocation().toFile()); + IPath filterPath = Path.fromOSString(filterLocation.getAbsolutePath()); + return ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(filterPath); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.dialogs.WizardDataTransferPage#validateSourceGroup() + */ + @Override + protected boolean validateSourceGroup() { + if (getControl() == null) { + // still under construction + return true; + } + if (project!=null && adjustJcrRootText!=null) { + adjustJcrRootText(); + adjustJcrRootText.pack(); + } + if (repositoryCombo.getItemCount() == 0 && project != null) { + setErrorMessage("The selected project is not configured with/added to any Sling server"); + return false; + } + if ((repositoryCombo.getSelectionIndex() == -1) || + (repositoryCombo.getText().length() == 0)) { + setErrorMessage("Please select a repository"); + return false; + } + if (getRepositoryPath() == null + || getRepositoryPath().trim().length() == 0) { + setErrorMessage("Please enter a valid Sling Repository path"); + return false; + } + return true; + } + + private void adjustJcrRootText() { + adjustJcrRootText.setText("Content will be stored under: "+project.getName()+"/"+ProjectUtil.getSyncDirectoryValue(project)); + } +} Modified: sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SelectionUtils.java URL: http://svn.apache.org/viewvc/sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SelectionUtils.java?rev=1508890&r1=1508889&r2=1508890&view=diff ============================================================================== --- sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SelectionUtils.java (original) +++ sling/trunk/tooling/ide/eclipse-ui/src/org/apache/sling/ide/eclipse/ui/internal/SelectionUtils.java Wed Jul 31 14:49:54 2013 @@ -43,7 +43,15 @@ public abstract class SelectionUtils { } IProject project = (IProject) first; - List<IServer> servers = new ArrayList<IServer>(); + return getServersLinkedToProject(project, monitor); + } + + public static List<IServer> getServersLinkedToProject(IProject project, + IProgressMonitor monitor) { + if (project == null) { + return Collections.emptyList(); + } + List<IServer> servers = new ArrayList<IServer>(); IModule module = ServerUtil.getModule(project); @@ -58,7 +66,7 @@ public abstract class SelectionUtils { } return servers; - } + } private SelectionUtils() {