/******************************************************************************* * Copyright (c) 2013 Zend Technologies Ltd. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.zend.php.zendserver.deployment.core.utils; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ProjectScope; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.php.internal.server.core.Server; import org.eclipse.php.internal.server.core.manager.ServersManager; import org.osgi.service.prefs.BackingStoreException; import org.zend.php.zendserver.deployment.core.DeploymentCore; import org.zend.php.zendserver.deployment.core.targets.TargetsManagerService; import org.zend.php.zendserver.deployment.core.targets.ZendServerManager; import org.zend.sdklib.target.IZendTarget; /** * Utility class which exposes some useful methods related to deployment. * * * @author Wojciech Galanciak, 2013 * */ public class DeploymentUtils { /** * Returns application URL used for last deployment. * * @param projectName * @return application URL */ public static String getURLFromPreferences(String projectName) { IProject project = ResourcesPlugin.getWorkspace().getRoot() .getProject(projectName); IEclipsePreferences pref = new ProjectScope(project) .getNode(DeploymentCore.PLUGIN_ID); return pref.get("applicationURL", null); //$NON-NLS-1$ } /** * Returns target on which application was deployed recently. * * @param projectName * @return {@link IZendTarget} instance */ public static IZendTarget getTargetFromPreferences(String projectName) { IProject project = ResourcesPlugin.getWorkspace().getRoot() .getProject(projectName); IEclipsePreferences pref = new ProjectScope(project) .getNode(DeploymentCore.PLUGIN_ID); String targetId = pref.get("targetId", null); //$NON-NLS-1$ return TargetsManagerService.INSTANCE.getTargetManager().getTargetById( targetId); } /** * Returns list of project names which are banned. Name is banned if project * is created on a local server in htdocs file. In such case this name * cannot be used for deployment on a local server. * * @return list of banned project names */ @SuppressWarnings("restriction") public static List<String> getBannedNames() { List<String> result = new ArrayList<String>(); Server server = ServersManager.getDefaultServer(null); if (server != null) { String docRoot = server.getDocumentRoot(); if (docRoot != null && !docRoot.isEmpty()) { File root = new File(docRoot); File[] files = root.listFiles(); for (File file : files) { if (file.isDirectory()) { result.add(file.getName()); } } } } return result; } /** * Updates project properties related to the last deployment. * * @param project * @param targetId * @param applicationURL */ public static void updatePreferences(IProject project, String targetId, String applicationURL) { IZendTarget target = TargetsManagerService.INSTANCE.getTargetManager() .getTargetById(targetId); IEclipsePreferences pref = new ProjectScope(project) .getNode(DeploymentCore.PLUGIN_ID); if (target != null) { pref.put("targetId", targetId); //$NON-NLS-1$ pref.put("targetHost", target.getHost().toString()); //$NON-NLS-1$ } else { pref.remove("targetId"); //$NON-NLS-1$ pref.remove("targetHost"); //$NON-NLS-1$ } if (applicationURL != null) { pref.put("applicationURL", applicationURL); //$NON-NLS-1$ } else { pref.remove("applicationURL"); //$NON-NLS-1$ } try { pref.flush(); } catch (BackingStoreException e) { DeploymentCore.log(e); } } /** * Returns default target for specified project. It is returned base on * default server associated with it. If project does not have default PHP * server definied in its properties then this method returns * <code>null</code>. * * @param project * @return {@link IZendTarget} instance or <code>null</code> if there is no * default target for this project */ @SuppressWarnings("restriction") public static IZendTarget getDefaultTarget(IProject project) { Server server = ServersManager.getDefaultServer(project); String serverHost = server.getHost(); if (server != null) { IZendTarget[] targets = TargetsManagerService.INSTANCE .getTargetManager().getTargets(); if (targets != null) { for (IZendTarget target : targets) { if (serverHost.equals(target.getHost().toString())) { return target; } } } } return null; } public static boolean configureTargetSSH(String targetId) { IZendTarget target = TargetsManagerService.INSTANCE.getTargetManager() .getTargetById(targetId); if (target == null) { return false; } return true; } @SuppressWarnings("restriction") public static Server findExistingServer(IZendTarget target) { try { Server existingServer = ServersManager.getServer(target .getServerName()); if (existingServer != null) { return existingServer; } URL baseURL = target.getDefaultServerURL(); Server[] servers = ServersManager.getServers(); for (Server server : servers) { String zsPort = server.getAttribute( ZendServerManager.ZENDSERVER_PORT_KEY, "-1"); //$NON-NLS-1$ URL serverBaseURL = new URL(server.getBaseURL()); if (serverBaseURL.getHost().equals(baseURL.getHost()) && Integer.valueOf(zsPort) != -1) { return server; } } return null; } catch (MalformedURLException e) { DeploymentCore.log(e); // do nothing and return null } return null; } /** * @param target * @return base URL of PHP server associated with specified target */ @SuppressWarnings("restriction") public static URL getServerBaseURL(IZendTarget target) { Server server = findExistingServer(target); try { return new URL(server.getBaseURL()); } catch (MalformedURLException e) { DeploymentCore.log(e); } return null; } /** * Sets base URL of PHP server associated with specified target. * * @param target * @param baseUrl */ @SuppressWarnings("restriction") public static void setServerBaseURL(IZendTarget target, String baseUrl) { Server server = findExistingServer(target); if (server != null) { try { server.setBaseURL(baseUrl); ServersManager.save(); } catch (MalformedURLException e) { DeploymentCore.log(e); } } } @SuppressWarnings("restriction") protected static Server createPHPServer(URL baseURL, IZendTarget target) { try { URL url = new URL(baseURL.getProtocol(), baseURL.getHost(), baseURL.getPort(), ""); //$NON-NLS-1$ String urlString = url.toString(); Server server = new Server( "Zend Target (id: " + target.getId() + " host: " + url.getHost() //$NON-NLS-1$ //$NON-NLS-2$ + ")", target.getDefaultServerURL().toString(), urlString, ""); //$NON-NLS-1$ //$NON-NLS-2$ int zsPort = 10081; server.setAttribute(ZendServerManager.ZENDSERVER_PORT_KEY, String.valueOf(zsPort)); server.setAttribute(ZendServerManager.ZENDSERVER_ENABLED_KEY, "true"); //$NON-NLS-1$ server.setAttribute(ZendServerManager.DEFAULT_URL_KEY, "/ZendServer"); //$NON-NLS-1$ ServersManager.addServer(server); ServersManager.save(); return server; } catch (MalformedURLException e) { DeploymentCore.log(e); // ignore, verified earlier } return null; } }