| /* |
| * 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.core; |
| |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.apache.sling.ide.eclipse.core.internal.Activator; |
| import org.apache.sling.ide.eclipse.core.internal.SlingLaunchpadServer; |
| import org.apache.sling.ide.transport.Repository; |
| import org.apache.sling.ide.transport.RepositoryException; |
| import org.apache.sling.ide.transport.RepositoryFactory; |
| import org.apache.sling.ide.transport.RepositoryInfo; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.wst.server.core.IModule; |
| import org.eclipse.wst.server.core.IServer; |
| import org.eclipse.wst.server.core.IServerWorkingCopy; |
| import org.eclipse.wst.server.core.ServerCore; |
| |
| public abstract class ServerUtil { |
| |
| //TODO: SLING-3587 - following constants are from wst.Server - an internal class |
| // we should replace this with proper API - but afaik this information is not |
| // accessible via any API .. |
| private static final int AUTO_PUBLISH_DISABLE = 1; |
| private static final int AUTO_PUBLISH_RESOURCE = 2; |
| private static final int AUTO_PUBLISH_BUILD = 3; |
| private static final String PROP_AUTO_PUBLISH_SETTING = "auto-publish-setting"; |
| private static final String PROP_AUTO_PUBLISH_TIME = "auto-publish-time"; |
| |
| public static Repository getDefaultRepository(IProject project) { |
| IServer server = getDefaultServer(project); |
| if (server == null) { |
| return null; |
| } |
| try { |
| RepositoryFactory repository = Activator.getDefault().getRepositoryFactory(); |
| try { |
| RepositoryInfo repositoryInfo = getRepositoryInfo(server, new NullProgressMonitor()); |
| return repository.getRepository(repositoryInfo, true); |
| } catch (URISyntaxException | RuntimeException | RepositoryException e) { |
| throw new CoreException(new Status(Status.ERROR, Activator.PLUGIN_ID, e.getMessage(), e)); |
| } |
| } catch (CoreException e) { |
| Activator.getDefault().getPluginLogger().warn("Failed getting a repository for " + project, e); |
| return null; |
| } |
| } |
| |
| private static IServer getDefaultServer(IProject project) { |
| IModule module = org.eclipse.wst.server.core.ServerUtil.getModule(project); |
| if (module==null) { |
| // if there's no module for a project then there's no IServer for sure - which |
| // is what we need to create a RepositoryInfo |
| return null; |
| } |
| IServer server = ServerCore.getDefaultServer(module); |
| if (server!=null) { |
| return server; |
| } |
| // then we cannot create a repository |
| IServer[] allServers = ServerCore.getServers(); |
| out: for (int i = 0; i < allServers.length; i++) { |
| IServer aServer = allServers[i]; |
| IModule[] allModules = aServer.getModules(); |
| for (int j = 0; j < allModules.length; j++) { |
| IModule aMoudle = allModules[j]; |
| if (aMoudle.equals(module)) { |
| server = aServer; |
| break out; |
| } |
| } |
| } |
| return server; |
| } |
| |
| private static Set<IServer> getAllServers(IProject project) { |
| IModule module = org.eclipse.wst.server.core.ServerUtil.getModule(project); |
| if (module==null) { |
| // if there's no module for a project then there's no IServer for sure - which |
| // is what we need to create a RepositoryInfo |
| return null; |
| } |
| Set<IServer> result = new HashSet<>(); |
| IServer defaultServer = ServerCore.getDefaultServer(module); |
| if (defaultServer!=null) { |
| result.add(defaultServer); |
| } |
| |
| IServer[] allServers = ServerCore.getServers(); |
| for (int i = 0; i < allServers.length; i++) { |
| IServer aServer = allServers[i]; |
| IModule[] allModules = aServer.getModules(); |
| for (int j = 0; j < allModules.length; j++) { |
| IModule aMoudle = allModules[j]; |
| if (aMoudle.equals(module)) { |
| result.add(aServer); |
| break; |
| } |
| } |
| } |
| return result; |
| } |
| |
| public static Repository getConnectedRepository(IServer server, IProgressMonitor monitor) throws CoreException { |
| if (server==null) { |
| throw new CoreException(new Status(Status.WARNING, Activator.PLUGIN_ID, "No server available/selected.")); |
| } |
| if (server.getServerState()!=IServer.STATE_STARTED) { |
| throw new CoreException(new Status(Status.WARNING, Activator.PLUGIN_ID, "Server not started, please start server first.")); |
| } |
| RepositoryFactory repository = Activator.getDefault().getRepositoryFactory(); |
| try { |
| RepositoryInfo repositoryInfo = getRepositoryInfo(server, monitor); |
| return repository.getRepository(repositoryInfo, false); |
| } catch (RuntimeException | URISyntaxException | RepositoryException e) { |
| throw new CoreException(new Status(Status.ERROR, Activator.PLUGIN_ID, e.getMessage(), e)); |
| } |
| } |
| |
| public static Repository connectRepository(IServer server, IProgressMonitor monitor) throws CoreException { |
| RepositoryFactory repository = Activator.getDefault().getRepositoryFactory(); |
| try { |
| RepositoryInfo repositoryInfo = getRepositoryInfo(server, monitor); |
| return repository.connectRepository(repositoryInfo); |
| } catch (RuntimeException | URISyntaxException | RepositoryException e) { |
| throw new CoreException(new Status(Status.ERROR, Activator.PLUGIN_ID, e.getMessage(), e)); |
| } |
| } |
| |
| public static void stopRepository(IServer server, IProgressMonitor monitor) throws CoreException { |
| RepositoryFactory repository = Activator.getDefault().getRepositoryFactory(); |
| try { |
| RepositoryInfo repositoryInfo = getRepositoryInfo(server, monitor); |
| repository.disconnectRepository(repositoryInfo); |
| } catch (RuntimeException | URISyntaxException e) { |
| throw new CoreException(new Status(Status.ERROR, Activator.PLUGIN_ID, e.getMessage(), e)); |
| } |
| } |
| |
| |
| public static RepositoryInfo getRepositoryInfo(IServer server, IProgressMonitor monitor) throws URISyntaxException { |
| |
| ISlingLaunchpadServer launchpadServer = (ISlingLaunchpadServer) server.loadAdapter(SlingLaunchpadServer.class, |
| monitor); |
| |
| ISlingLaunchpadConfiguration configuration = launchpadServer.getConfiguration(); |
| |
| // TODO configurable scheme? |
| URI uri = new URI("http", null, server.getHost(), configuration.getPort(), configuration.getContextPath(), |
| null, null); |
| return new RepositoryInfo(configuration.getUsername(), |
| configuration.getPassword(), uri.toString()); |
| } |
| |
| private ServerUtil() { |
| |
| } |
| |
| public static void triggerIncrementalBuild(IResource anyResourceInThatProject, IProgressMonitor monitorOrNull) { |
| if (anyResourceInThatProject==null) { |
| throw new IllegalArgumentException("anyResourceInThatProject must not be null"); |
| } |
| IProject proj = anyResourceInThatProject.getProject(); |
| if (proj==null) { |
| throw new IllegalStateException("no project found for "+anyResourceInThatProject); |
| } |
| Set<IServer> servers = getAllServers(proj); |
| |
| if (servers!=null) { |
| if (monitorOrNull==null) { |
| monitorOrNull = new NullProgressMonitor(); |
| } |
| for (IServer server : servers) { |
| if (server!=null) { |
| int autoPublishSetting = server.getAttribute(PROP_AUTO_PUBLISH_SETTING, AUTO_PUBLISH_RESOURCE); |
| int autoPublishTime = server.getAttribute(PROP_AUTO_PUBLISH_TIME, 15); |
| if (autoPublishSetting==AUTO_PUBLISH_RESOURCE) { |
| //TODO: ignoring the autoPublishTime - SLING-3587 |
| server.publish(IServer.PUBLISH_INCREMENTAL, monitorOrNull); |
| } |
| } |
| } |
| } |
| } |
| |
| public static boolean runsOnLocalhost(IServerWorkingCopy server) { |
| |
| return "localhost".equals(server.getHost()); |
| } |
| } |