/** * Aptana Studio * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions). * Please see the license.html included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.aptana.ide.syncing.core; import java.util.ArrayList; import java.util.List; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import com.aptana.ide.core.io.ConnectionPointUtils; import com.aptana.ide.core.io.IConnectionPoint; /** * @author Max Stepanov * @author Michael Xia */ public final class SiteConnectionUtils { /** * */ private SiteConnectionUtils() { } /** * Creates a new site connection with specific source and destination. * * @param name * the name of the site connection * @param source * the source connection point * @param destination * the destination connection point * @return the site connection */ public static ISiteConnection createSite(String name, IConnectionPoint source, IConnectionPoint destination) { ISiteConnection site = SiteConnectionManager.getInstance().createSiteConnection(); site.setName(name); site.setSource(source); site.setDestination(destination); return site; } /** * Retrieves a list of all available sites that have the object as the source (i.e. an IContainer or * FilesystemObject). * * @param object * the source object * @return the list as an array */ public static ISiteConnection[] findSitesForSource(IAdaptable object) { return findSitesForSource(object, false); } /** * Retrieves a list of all available sites that have the object as the source (i.e. an IContainer or * FilesystemObject). * * @param object * the source object * @param strict * true if only to get the exact matches, false if the parent folder is allowed * @return the list as an array */ public static ISiteConnection[] findSitesForSource(IAdaptable object, boolean strict) { return findSitesForSource(object, strict, false); } /** * Retrieves a list of all available sites that have the object as the source (i.e. an IContainer or * FilesystemObject). * * @param object * the source object * @param strict * true if only to get the exact matches, false if the parent folder is allowed * @param includeChildren * true if the child elements which are the sources of any site connection should be included, false * otherwise * @return the list as an array */ public static ISiteConnection[] findSitesForSource(IAdaptable object, boolean strict, boolean includeChildren) { List<ISiteConnection> list = new ArrayList<ISiteConnection>(); ISiteConnection[] allsites = SyncingPlugin.getSiteConnectionManager().getSiteConnections(); IConnectionPoint connectionPoint = (IConnectionPoint) object.getAdapter(IConnectionPoint.class); if (connectionPoint != null) { for (ISiteConnection i : allsites) { if (connectionPoint.equals(i.getSource())) { list.add(i); } } } else { IResource resource = (IResource) object.getAdapter(IResource.class); if (resource != null) { for (ISiteConnection i : allsites) { IConnectionPoint sourceConnectionPoint = i.getSource(); if (sourceConnectionPoint != null) { IContainer connectionRoot = (IContainer) sourceConnectionPoint.getAdapter(IResource.class); if (connectionRoot != null) { if (connectionRoot.equals(resource) || (!strict && contains(connectionRoot, resource)) || (includeChildren && contains(resource, connectionRoot))) { IConnectionPoint destination = i.getDestination(); if (destination != null && ConnectionPointUtils.findConnectionPoint(destination.getRootURI()) != null) { list.add(i); } } } } } } else { IFileStore fileStore = (IFileStore) object.getAdapter(IFileStore.class); if (fileStore != null) { for (ISiteConnection i : allsites) { IConnectionPoint sourceConnectionPoint = i.getSource(); if (sourceConnectionPoint != null) { try { IFileStore root = sourceConnectionPoint.getRoot(); if (root != null) { if (root.equals(fileStore) || (!strict && root.isParentOf(fileStore)) || (includeChildren && fileStore.isParentOf(root))) { IConnectionPoint destination = i.getDestination(); if (destination != null && ConnectionPointUtils.findConnectionPoint(destination.getRootURI()) != null) { list.add(i); } } } } catch (CoreException ignore) { } } } } } } return list.toArray(new ISiteConnection[list.size()]); } /** * Retrieves a list of all available sites that have the connection point as the destination. * * @param destination * the connection point * @return the list as an array */ public static ISiteConnection[] findSitesWithDestination(IAdaptable object) { return findSitesWithDestination(object, false); } /** * Retrieves a list of all available sites that have the object as the destination. * * @param object * the source object * @param strict * true if only to get the exact matches, false if the parent folder is allowed * @return the list as an array */ public static ISiteConnection[] findSitesWithDestination(IAdaptable object, boolean strict) { List<ISiteConnection> list = new ArrayList<ISiteConnection>(); ISiteConnection[] allsites = SyncingPlugin.getSiteConnectionManager().getSiteConnections(); IConnectionPoint connectionPoint = (IConnectionPoint) object.getAdapter(IConnectionPoint.class); if (connectionPoint != null) { for (ISiteConnection i : allsites) { if (connectionPoint.equals(i.getDestination())) { list.add(i); } } } else { IResource resource = (IResource) object.getAdapter(IResource.class); if (resource != null) { for (ISiteConnection i : allsites) { IConnectionPoint destinationConnectionPoint = i.getDestination(); if (destinationConnectionPoint != null) { IContainer connectionRoot = (IContainer) destinationConnectionPoint.getAdapter(IResource.class); if (connectionRoot != null) { if (connectionRoot.equals(resource) || (!strict && contains(connectionRoot, resource))) { list.add(i); } } } } } else { IFileStore fileStore = (IFileStore) object.getAdapter(IFileStore.class); if (fileStore != null) { for (ISiteConnection i : allsites) { IConnectionPoint destinationConnectionPoint = i.getDestination(); if (destinationConnectionPoint != null) { try { IFileStore root = destinationConnectionPoint.getRoot(); if (root != null) { if (root.equals(fileStore) || (!strict && root.isParentOf(fileStore))) { list.add(i); } } } catch (CoreException ignore) { } } } } } } return list.toArray(new ISiteConnection[list.size()]); } /** * Retrieves a list of all available sites that have the specific source and destination. * * @param source * the source object * @param destination * the connection point as destination * @return the list as an array */ public static ISiteConnection[] findSites(IAdaptable source, IConnectionPoint destination) { List<ISiteConnection> list = new ArrayList<ISiteConnection>(); ISiteConnection[] sites = findSitesForSource(source, true); for (ISiteConnection site : sites) { if (site.getDestination() == destination) { list.add(site); } } return list.toArray(new ISiteConnection[list.size()]); } public static ISiteConnection getSiteWithDestination(String destinationName, ISiteConnection[] sites) { IConnectionPoint destination; for (ISiteConnection site : sites) { destination = site.getDestination(); if (destination != null && destination.getName().equals(destinationName)) { return site; } } return null; } private static boolean contains(IResource container, IResource resource) { return container.getFullPath().isPrefixOf(resource.getFullPath()); } /** * Returns the uniqueness of the site name * * @param siteName * @return whether or not the name is unique among current sites */ public static boolean isSiteNameUnique(String siteName) { ISiteConnection[] siteConnections = SyncingPlugin.getSiteConnectionManager().getSiteConnections(); for (ISiteConnection connection : siteConnections) { if (connection.getName().equalsIgnoreCase(siteName)) { return false; } } return true; } }