/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * 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 * * Contributors: * IBM Corporation - initial API and implementation * Sergey Prigogin (Google) *******************************************************************************/ package org.eclipse.cdt.internal.ui.refactoring.utils; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourceAttributes; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext; import org.eclipse.ltk.core.refactoring.participants.ResourceChangeChecker; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.internal.corext.util.CModelUtil; import org.eclipse.cdt.internal.corext.util.Resources; /** * This class defines a set of reusable static checks methods. */ public class Checks { /* * no instances */ private Checks(){ } public static boolean startsWithUpperCase(String s) { if (s == null) { return false; } else if ("".equals(s)) { //$NON-NLS-1$ return false; } else { // Workaround for JDK bug (see 26529) return s.charAt(0) == Character.toUpperCase(s.charAt(0)); } } public static boolean startsWithLowerCase(String s){ if (s == null) { return false; } else if ("".equals(s)) { //$NON-NLS-1$ return false; } else { // Workaround for JDK bug (see 26529) return s.charAt(0) == Character.toLowerCase(s.charAt(0)); } } public static boolean resourceExists(IPath resourcePath){ return ResourcesPlugin.getWorkspace().getRoot().findMember(resourcePath) != null; } public static boolean isReadOnly(Object element) throws CModelException { if (element instanceof IResource) return isReadOnly((IResource) element); if (element instanceof ICElement) { return isReadOnly(((ICElement) element).getResource()); } Assert.isTrue(false, "Not expected to get here"); //$NON-NLS-1$ return false; } public static boolean isReadOnly(IResource res) throws CModelException { ResourceAttributes attributes= res.getResourceAttributes(); if (attributes != null && attributes.isReadOnly()) return true; if (! (res instanceof IContainer)) return false; IContainer container= (IContainer)res; IResource[] children; try { children = container.members(); for (int i= 0; i < children.length; i++) { if (isReadOnly(children[i])) return true; } } catch (CModelException e){ throw e; } catch (CoreException e) { throw new CModelException(e); } return false; } //-------- validateEdit checks ---- public static RefactoringStatus validateModifiesFiles(IFile[] filesToModify, Object context) { RefactoringStatus result= new RefactoringStatus(); IStatus status= Resources.checkInSync(filesToModify); if (!status.isOK()) result.merge(RefactoringStatus.create(status)); status= Resources.makeCommittable(filesToModify, context); if (!status.isOK()) { result.merge(RefactoringStatus.create(status)); if (!result.hasFatalError()) { result.addFatalError(Messages.Checks_validateEdit); } } return result; } public static void addModifiedFilesToChecker(IFile[] filesToModify, CheckConditionsContext context) { ResourceChangeChecker checker= (ResourceChangeChecker) context.getChecker(ResourceChangeChecker.class); IResourceChangeDescriptionFactory deltaFactory= checker.getDeltaFactory(); for (int i= 0; i < filesToModify.length; i++) { deltaFactory.change(filesToModify[i]); } } public static RefactoringStatus validateEdit(ITranslationUnit tu, Object context) { IResource resource= CModelUtil.toOriginal(tu).getResource(); RefactoringStatus result= new RefactoringStatus(); if (resource == null) return result; IStatus status= Resources.checkInSync(resource); if (!status.isOK()) result.merge(RefactoringStatus.create(status)); status= Resources.makeCommittable(resource, context); if (!status.isOK()) { result.merge(RefactoringStatus.create(status)); if (!result.hasFatalError()) { result.addFatalError(Messages.Checks_validateEdit); } } return result; } }