001: /*******************************************************************************
002: * Copyright (c) 2000, 2006 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.jdt.internal.corext.refactoring.reorg;
011:
012: import org.eclipse.core.runtime.Assert;
013: import org.eclipse.core.runtime.CoreException;
014:
015: import org.eclipse.core.resources.IContainer;
016: import org.eclipse.core.resources.IFile;
017: import org.eclipse.core.resources.IResource;
018:
019: import org.eclipse.jdt.core.IClassFile;
020: import org.eclipse.jdt.core.IJavaElement;
021: import org.eclipse.jdt.core.IPackageFragment;
022: import org.eclipse.jdt.core.IPackageFragmentRoot;
023:
024: import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages;
025: import org.eclipse.jdt.internal.corext.util.Resources;
026:
027: class ReadOnlyResourceFinder {
028: private ReadOnlyResourceFinder() {
029: }
030:
031: static boolean confirmDeleteOfReadOnlyElements(
032: IJavaElement[] javaElements, IResource[] resources,
033: IReorgQueries queries) throws CoreException {
034: String queryTitle = RefactoringCoreMessages.ReadOnlyResourceFinder_0;
035: String question = RefactoringCoreMessages.ReadOnlyResourceFinder_1;
036: return ReadOnlyResourceFinder
037: .confirmOperationOnReadOnlyElements(queryTitle,
038: question, javaElements, resources, queries);
039: }
040:
041: static boolean confirmMoveOfReadOnlyElements(
042: IJavaElement[] javaElements, IResource[] resources,
043: IReorgQueries queries) throws CoreException {
044: String queryTitle = RefactoringCoreMessages.ReadOnlyResourceFinder_2;
045: String question = RefactoringCoreMessages.ReadOnlyResourceFinder_3;
046: return ReadOnlyResourceFinder
047: .confirmOperationOnReadOnlyElements(queryTitle,
048: question, javaElements, resources, queries);
049: }
050:
051: private static boolean confirmOperationOnReadOnlyElements(
052: String queryTitle, String question,
053: IJavaElement[] javaElements, IResource[] resources,
054: IReorgQueries queries) throws CoreException {
055: boolean hasReadOnlyResources = ReadOnlyResourceFinder
056: .hasReadOnlyResourcesAndSubResources(javaElements,
057: resources);
058: if (hasReadOnlyResources) {
059: IConfirmQuery query = queries.createYesNoQuery(queryTitle,
060: false, IReorgQueries.CONFIRM_READ_ONLY_ELEMENTS);
061: return query.confirm(question);
062: }
063: return true;
064: }
065:
066: private static boolean hasReadOnlyResourcesAndSubResources(
067: IJavaElement[] javaElements, IResource[] resources)
068: throws CoreException {
069: return (hasReadOnlyResourcesAndSubResources(resources) || hasReadOnlyResourcesAndSubResources(javaElements));
070: }
071:
072: private static boolean hasReadOnlyResourcesAndSubResources(
073: IJavaElement[] javaElements) throws CoreException {
074: for (int i = 0; i < javaElements.length; i++) {
075: if (hasReadOnlyResourcesAndSubResources(javaElements[i]))
076: return true;
077: }
078: return false;
079: }
080:
081: private static boolean hasReadOnlyResourcesAndSubResources(
082: IJavaElement javaElement) throws CoreException {
083: switch (javaElement.getElementType()) {
084: case IJavaElement.CLASS_FILE:
085: //if this assert fails, it means that a precondition is missing
086: Assert
087: .isTrue(((IClassFile) javaElement).getResource() instanceof IFile);
088: //fall thru
089: case IJavaElement.COMPILATION_UNIT:
090: IResource resource = ReorgUtils.getResource(javaElement);
091: return (resource != null && Resources.isReadOnly(resource));
092: case IJavaElement.PACKAGE_FRAGMENT:
093: IResource packResource = ReorgUtils
094: .getResource(javaElement);
095: if (packResource == null)
096: return false;
097: IPackageFragment pack = (IPackageFragment) javaElement;
098: if (Resources.isReadOnly(packResource))
099: return true;
100: Object[] nonJava = pack.getNonJavaResources();
101: for (int i = 0; i < nonJava.length; i++) {
102: Object object = nonJava[i];
103: if (object instanceof IResource
104: && hasReadOnlyResourcesAndSubResources((IResource) object))
105: return true;
106: }
107: return hasReadOnlyResourcesAndSubResources(pack
108: .getChildren());
109: case IJavaElement.PACKAGE_FRAGMENT_ROOT:
110: IPackageFragmentRoot root = (IPackageFragmentRoot) javaElement;
111: if (root.isArchive())
112: return false;
113: IResource pfrResource = ReorgUtils.getResource(javaElement);
114: if (pfrResource == null)
115: return false;
116: if (Resources.isReadOnly(pfrResource))
117: return true;
118: Object[] nonJava1 = root.getNonJavaResources();
119: for (int i = 0; i < nonJava1.length; i++) {
120: Object object = nonJava1[i];
121: if (object instanceof IResource
122: && hasReadOnlyResourcesAndSubResources((IResource) object))
123: return true;
124: }
125: return hasReadOnlyResourcesAndSubResources(root
126: .getChildren());
127:
128: case IJavaElement.FIELD:
129: case IJavaElement.IMPORT_CONTAINER:
130: case IJavaElement.IMPORT_DECLARATION:
131: case IJavaElement.INITIALIZER:
132: case IJavaElement.METHOD:
133: case IJavaElement.PACKAGE_DECLARATION:
134: case IJavaElement.TYPE:
135: return false;
136: default:
137: Assert.isTrue(false);//not handled here
138: return false;
139: }
140: }
141:
142: private static boolean hasReadOnlyResourcesAndSubResources(
143: IResource[] resources) throws CoreException {
144: for (int i = 0; i < resources.length; i++) {
145: if (hasReadOnlyResourcesAndSubResources(resources[i]))
146: return true;
147: }
148: return false;
149: }
150:
151: private static boolean hasReadOnlyResourcesAndSubResources(
152: IResource resource) throws CoreException {
153: if (Resources.isReadOnly(resource))
154: return true;
155: if (resource instanceof IContainer)
156: return hasReadOnlyResourcesAndSubResources(((IContainer) resource)
157: .members());
158: return false;
159: }
160: }
|