001: /*******************************************************************************
002: * Copyright (c) 2000, 2007 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: * Fabio Mancinelli <fm@fabiomancinelli.org> - bug 201308
011: *******************************************************************************/package org.eclipse.pde.internal.core;
012:
013: import org.eclipse.core.resources.IContainer;
014: import org.eclipse.core.resources.IFile;
015: import org.eclipse.core.resources.IFolder;
016: import org.eclipse.core.resources.IProject;
017: import org.eclipse.core.resources.IProjectDescription;
018: import org.eclipse.core.resources.IResource;
019: import org.eclipse.core.resources.team.FileModificationValidationContext;
020: import org.eclipse.core.resources.team.FileModificationValidator;
021: import org.eclipse.core.resources.team.IMoveDeleteHook;
022: import org.eclipse.core.resources.team.IResourceTree;
023: import org.eclipse.core.runtime.CoreException;
024: import org.eclipse.core.runtime.IProgressMonitor;
025: import org.eclipse.core.runtime.IStatus;
026: import org.eclipse.core.runtime.Status;
027: import org.eclipse.team.core.RepositoryProvider;
028:
029: public class BinaryRepositoryProvider extends RepositoryProvider {
030: private IMoveDeleteHook moveDeleteHook;
031: private FileModificationValidator fileModificationValidator;
032:
033: public static final String EXTERNAL_PROJECT_VALUE = "external"; //$NON-NLS-1$
034:
035: class BinaryMoveDeleteHook implements IMoveDeleteHook {
036: /**
037: * @see org.eclipse.core.resources.team.IMoveDeleteHook#deleteFile(org.eclipse.core.resources.team.IResourceTree, org.eclipse.core.resources.IFile, int, org.eclipse.core.runtime.IProgressMonitor)
038: */
039: public boolean deleteFile(IResourceTree tree, IFile file,
040: int updateFlags, IProgressMonitor monitor) {
041: if (isBinaryResource(file, true))
042: tree.failed(createProblemStatus());
043: else
044: tree.standardDeleteFile(file, updateFlags, monitor);
045: return true;
046: }
047:
048: /**
049: * @see org.eclipse.core.resources.team.IMoveDeleteHook#deleteFolder(org.eclipse.core.resources.team.IResourceTree, org.eclipse.core.resources.IFolder, int, org.eclipse.core.runtime.IProgressMonitor)
050: */
051: public boolean deleteFolder(IResourceTree tree, IFolder folder,
052: int updateFlags, IProgressMonitor monitor) {
053: if (isBinaryResource(folder, true))
054: tree.failed(createProblemStatus());
055: else
056: tree.standardDeleteFolder(folder, updateFlags, monitor);
057: return true;
058: }
059:
060: /**
061: * @see org.eclipse.core.resources.team.IMoveDeleteHook#deleteProject(org.eclipse.core.resources.team.IResourceTree, org.eclipse.core.resources.IProject, int, org.eclipse.core.runtime.IProgressMonitor)
062: */
063: public boolean deleteProject(IResourceTree tree,
064: IProject project, int updateFlags,
065: IProgressMonitor monitor) {
066: return false;
067: }
068:
069: /**
070: * @see org.eclipse.core.resources.team.IMoveDeleteHook#moveFile(org.eclipse.core.resources.team.IResourceTree, org.eclipse.core.resources.IFile, org.eclipse.core.resources.IFile, int, org.eclipse.core.runtime.IProgressMonitor)
071: */
072: public boolean moveFile(IResourceTree tree, IFile source,
073: IFile destination, int updateFlags,
074: IProgressMonitor monitor) {
075: if (isBinaryResource(source, false))
076: tree.failed(createProblemStatus());
077: else
078: tree.standardMoveFile(source, destination, updateFlags,
079: monitor);
080: return true;
081: }
082:
083: /**
084: * @see org.eclipse.core.resources.team.IMoveDeleteHook#moveFolder(org.eclipse.core.resources.team.IResourceTree, org.eclipse.core.resources.IFolder, org.eclipse.core.resources.IFolder, int, org.eclipse.core.runtime.IProgressMonitor)
085: */
086: public boolean moveFolder(IResourceTree tree, IFolder source,
087: IFolder destination, int updateFlags,
088: IProgressMonitor monitor) {
089: if (isBinaryResource(source, false))
090: tree.failed(createProblemStatus());
091: else
092: tree.standardMoveFolder(source, destination,
093: updateFlags, monitor);
094: return true;
095: }
096:
097: /**
098: * @see org.eclipse.core.resources.team.IMoveDeleteHook#moveProject(org.eclipse.core.resources.team.IResourceTree, org.eclipse.core.resources.IProject, org.eclipse.core.resources.IProjectDescription, int, org.eclipse.core.runtime.IProgressMonitor)
099: */
100: public boolean moveProject(IResourceTree tree, IProject source,
101: IProjectDescription description, int updateFlags,
102: IProgressMonitor monitor) {
103: return false;
104: }
105: }
106:
107: class BinaryFileModificationValidator extends
108: FileModificationValidator {
109: /**
110: * @see org.eclipse.core.resources.IFileModificationValidator#validateEdit(org.eclipse.core.resources.IFile, java.lang.Object)
111: */
112: public IStatus validateEdit(IFile[] files,
113: FileModificationValidationContext context) {
114: for (int i = 0; i < files.length; i++) {
115: if (isBinaryResource(files[i], false)) {
116: return createProblemStatus();
117: }
118: }
119: return createOKStatus();
120: }
121:
122: /**
123: * @see org.eclipse.core.resources.IFileModificationValidator#validateSave(org.eclipse.core.resources.IFile)
124: */
125: public IStatus validateSave(IFile file) {
126: if (isBinaryResource(file, false)) {
127: return createProblemStatus();
128: }
129: return createOKStatus();
130: }
131: }
132:
133: public BinaryRepositoryProvider() {
134: moveDeleteHook = new BinaryMoveDeleteHook();
135: fileModificationValidator = new BinaryFileModificationValidator();
136: }
137:
138: /**
139: * @see org.eclipse.team.core.RepositoryProvider#configureProject()
140: */
141: public void configureProject() throws CoreException {
142: IProject project = getProject();
143: project.setPersistentProperty(
144: PDECore.EXTERNAL_PROJECT_PROPERTY,
145: EXTERNAL_PROJECT_VALUE);
146: }
147:
148: /**
149: * @see org.eclipse.core.resources.IProjectNature#deconfigure()
150: */
151: public void deconfigure() throws CoreException {
152: IProject project = getProject();
153: project.setPersistentProperty(
154: PDECore.EXTERNAL_PROJECT_PROPERTY, null);
155: }
156:
157: /**
158: * @see org.eclipse.team.core.RepositoryProvider#getFileModificationValidator2()
159: */
160: public FileModificationValidator getFileModificationValidator2() {
161: return fileModificationValidator;
162: }
163:
164: /**
165: * @see org.eclipse.team.core.RepositoryProvider#getID()
166: */
167: public String getID() {
168: return PDECore.BINARY_REPOSITORY_PROVIDER;
169: }
170:
171: /**
172: * @see org.eclipse.team.core.RepositoryProvider#getMoveDeleteHook()
173: */
174: public IMoveDeleteHook getMoveDeleteHook() {
175: return moveDeleteHook;
176: }
177:
178: private boolean isBinaryResource(IResource resource,
179: boolean excludeProjectChildren) {
180: IContainer parent = resource.getParent();
181:
182: // Test for resource links
183: if (!excludeProjectChildren || !(parent instanceof IProject)) {
184: if (resource.isLinked())
185: return true;
186: }
187:
188: // Test for resources that are in linked folders
189:
190: while (parent instanceof IFolder) {
191: IFolder folder = (IFolder) parent;
192: if (folder.isLinked())
193: return true;
194: parent = folder.getParent();
195: }
196: return false;
197: }
198:
199: private IStatus createProblemStatus() {
200: String message = PDECoreMessages.BinaryRepositoryProvider_veto;
201: return new Status(IStatus.ERROR, PDECore.PLUGIN_ID, IStatus.OK,
202: message, null);
203: }
204:
205: private IStatus createOKStatus() {
206: return new Status(IStatus.OK, PDECore.PLUGIN_ID, IStatus.OK,
207: "", //$NON-NLS-1$
208: null);
209: }
210:
211: public boolean canHandleLinkedResources() {
212: return true;
213: }
214: }
|