Copyright (c) 2000, 2016 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation
/******************************************************************************* * Copyright (c) 2000, 2016 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
package org.eclipse.jdt.internal.corext.util; import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceStatus; import org.eclipse.core.resources.ResourceAttributes; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.jdt.core.manipulation.JavaManipulation; import org.eclipse.jdt.internal.core.manipulation.JavaManipulationPlugin; import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; import org.eclipse.jdt.internal.corext.CorextMessages; import org.eclipse.jdt.internal.ui.IJavaStatusConstants; import org.eclipse.jdt.internal.ui.JavaUIStatus; public class Resources { private Resources() { }
Checks if the given resource is in sync with the underlying file system.
Params:
  • resource – the resource to be checked
Returns:IStatus status describing the check's result. If status. isOK() returns true then the resource is in sync
/** * Checks if the given resource is in sync with the underlying file system. * * @param resource the resource to be checked * @return IStatus status describing the check's result. If <code>status. * isOK()</code> returns <code>true</code> then the resource is in sync */
public static IStatus checkInSync(IResource resource) { return checkInSync(new IResource[] {resource}); }
Checks if the given resources are in sync with the underlying file system.
Params:
  • resources – the resources to be checked
Returns:IStatus status describing the check's result. If status. isOK() returns true then the resources are in sync
/** * Checks if the given resources are in sync with the underlying file * system. * * @param resources the resources to be checked * @return IStatus status describing the check's result. If <code>status. * isOK() </code> returns <code>true</code> then the resources are in sync */
public static IStatus checkInSync(IResource[] resources) { IStatus result= null; for (int i= 0; i < resources.length; i++) { IResource resource= resources[i]; if (!resource.isSynchronized(IResource.DEPTH_INFINITE)) { result= addOutOfSync(result, resource); } } if (result != null) return result; return Status.OK_STATUS; }
Makes the given resource committable. Committable means that it is writeable and that its content hasn't changed by calling validateEdit for the given resource on IWorkspace.
Params:
  • resource – the resource to be checked
  • context – the context passed to validateEdit
See Also:
Returns:status describing the method's result. If status.isOK() returns true then the resources are committable.
/** * Makes the given resource committable. Committable means that it is * writeable and that its content hasn't changed by calling * <code>validateEdit</code> for the given resource on <tt>IWorkspace</tt>. * * @param resource the resource to be checked * @param context the context passed to <code>validateEdit</code> * @return status describing the method's result. If <code>status.isOK()</code> returns <code>true</code> then the resources are committable. * * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object) */
public static IStatus makeCommittable(IResource resource, Object context) { return makeCommittable(new IResource[] { resource }, context); }
Makes the given resources committable. Committable means that all resources are writeable and that the content of the resources hasn't changed by calling validateEdit for a given file on IWorkspace.
Params:
  • resources – the resources to be checked
  • context – the context passed to validateEdit
See Also:
Returns:IStatus status describing the method's result. If status. isOK() returns true then the add resources are committable
/** * Makes the given resources committable. Committable means that all * resources are writeable and that the content of the resources hasn't * changed by calling <code>validateEdit</code> for a given file on * <tt>IWorkspace</tt>. * * @param resources the resources to be checked * @param context the context passed to <code>validateEdit</code> * @return IStatus status describing the method's result. If <code>status. * isOK()</code> returns <code>true</code> then the add resources are * committable * * @see org.eclipse.core.resources.IWorkspace#validateEdit(org.eclipse.core.resources.IFile[], java.lang.Object) */
public static IStatus makeCommittable(IResource[] resources, Object context) { List<IResource> readOnlyFiles= new ArrayList<>(); for (int i= 0; i < resources.length; i++) { IResource resource= resources[i]; if (resource.getType() == IResource.FILE && isReadOnly(resource)) readOnlyFiles.add(resource); } if (readOnlyFiles.size() == 0) return Status.OK_STATUS; Map<IFile, Long> oldTimeStamps= createModificationStampMap(readOnlyFiles); IStatus status= ResourcesPlugin.getWorkspace().validateEdit( readOnlyFiles.toArray(new IFile[readOnlyFiles.size()]), context); if (!status.isOK()) return status; IStatus modified= null; Map<IFile, Long> newTimeStamps= createModificationStampMap(readOnlyFiles); for (Iterator<IFile> iter= oldTimeStamps.keySet().iterator(); iter.hasNext();) { IFile file= iter.next(); if (!oldTimeStamps.get(file).equals(newTimeStamps.get(file))) modified= addModified(modified, file); } if (modified != null) return modified; return Status.OK_STATUS; } private static Map<IFile, Long> createModificationStampMap(List<IResource> files){ Map<IFile, Long> map= new HashMap<>(); for (Iterator<IResource> iter= files.iterator(); iter.hasNext(); ) { IFile file= (IFile)iter.next(); map.put(file, Long.valueOf(file.getModificationStamp())); } return map; } private static IStatus addModified(IStatus status, IFile file) { IStatus entry= JavaUIStatus.createError( IJavaStatusConstants.VALIDATE_EDIT_CHANGED_CONTENT, Messages.format(CorextMessages.Resources_fileModified, BasicElementLabels.getPathLabel(file.getFullPath(), false)), null); if (status == null) { return entry; } else if (status.isMultiStatus()) { ((MultiStatus)status).add(entry); return status; } else { MultiStatus result= new MultiStatus(JavaManipulation.getPreferenceNodeId(), IJavaStatusConstants.VALIDATE_EDIT_CHANGED_CONTENT, CorextMessages.Resources_modifiedResources, null); result.add(status); result.add(entry); return result; } } private static IStatus addOutOfSync(IStatus status, IResource resource) { IStatus entry= new Status( IStatus.ERROR, ResourcesPlugin.PI_RESOURCES, IResourceStatus.OUT_OF_SYNC_LOCAL, Messages.format(CorextMessages.Resources_outOfSync, BasicElementLabels.getPathLabel(resource.getFullPath(), false)), null); if (status == null) { return entry; } else if (status.isMultiStatus()) { ((MultiStatus)status).add(entry); return status; } else { MultiStatus result= new MultiStatus( ResourcesPlugin.PI_RESOURCES, IResourceStatus.OUT_OF_SYNC_LOCAL, CorextMessages.Resources_outOfSyncResources, null); result.add(status); result.add(entry); return result; } }
This method is used to generate a list of local locations to be used in DnD for file transfers.
Params:
  • resources – the array of resources to get the local locations for
Returns:the local locations
/** * This method is used to generate a list of local locations to * be used in DnD for file transfers. * * @param resources the array of resources to get the local * locations for * @return the local locations */
public static String[] getLocationOSStrings(IResource[] resources) { List<String> result= new ArrayList<>(resources.length); for (int i= 0; i < resources.length; i++) { IPath location= resources[i].getLocation(); if (location != null) result.add(location.toOSString()); } return result.toArray(new String[result.size()]); }
Returns the location of the given resource. For local resources this is the OS path in the local file system. For remote resource this is the URI.
Params:
  • resource – the resource
Returns:the location string or null if the location URI of the resource is null
/** * Returns the location of the given resource. For local * resources this is the OS path in the local file system. For * remote resource this is the URI. * * @param resource the resource * @return the location string or <code>null</code> if the * location URI of the resource is <code>null</code> */
public static String getLocationString(IResource resource) { URI uri= resource.getLocationURI(); if (uri == null) return null; return EFS.SCHEME_FILE.equalsIgnoreCase(uri.getScheme()) ? new File(uri).getAbsolutePath() : uri.toString(); } public static boolean isReadOnly(IResource resource) { ResourceAttributes resourceAttributes = resource.getResourceAttributes(); if (resourceAttributes == null) // not supported on this platform for this resource return false; return resourceAttributes.isReadOnly(); } static void setReadOnly(IResource resource, boolean readOnly) { ResourceAttributes resourceAttributes = resource.getResourceAttributes(); if (resourceAttributes == null) // not supported on this platform for this resource return; resourceAttributes.setReadOnly(readOnly); try { resource.setResourceAttributes(resourceAttributes); } catch (CoreException e) { JavaManipulationPlugin.log(e); } } }