View | Details | Raw Unified | Return to bug 146331
Collapse All | Expand All

(-)model/org/eclipse/jdt/internal/core/CompilationUnit.java (-26 / +33 lines)
Lines 1021-1063 Link Here
1021
protected IBuffer openBuffer(IProgressMonitor pm, Object info) throws JavaModelException {
1021
protected IBuffer openBuffer(IProgressMonitor pm, Object info) throws JavaModelException {
1022
1022
1023
	// create buffer
1023
	// create buffer
1024
	BufferManager bufManager = getBufferManager();
1024
	boolean isWorkingCopy = isWorkingCopy();
1025
	boolean isWorkingCopy = isWorkingCopy();
1025
	IBuffer buffer = 
1026
	IBuffer buffer = 
1026
		isWorkingCopy 
1027
		isWorkingCopy 
1027
			? this.owner.createBuffer(this) 
1028
			? this.owner.createBuffer(this) 
1028
			: BufferManager.getDefaultBufferManager().createBuffer(this);
1029
			: bufManager.createBuffer(this);
1029
	if (buffer == null) return null;
1030
	if (buffer == null) return null;
1030
	
1031
	
1031
	// set the buffer source
1032
	// synchronize to ensure that 2 threads are not putting 2 different buffers at the same time
1032
	if (buffer.getCharacters() == null) {
1033
	// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=146331
1033
		if (isWorkingCopy) {
1034
	synchronized(bufManager) {
1034
			ICompilationUnit original;
1035
		IBuffer existingBuffer = bufManager.getBuffer(this);
1035
			if (!isPrimary() 
1036
		if (existingBuffer != null)
1036
					&& (original = new CompilationUnit((PackageFragment)getParent(), getElementName(), DefaultWorkingCopyOwner.PRIMARY)).isOpen()) {
1037
			return existingBuffer;
1037
				buffer.setContents(original.getSource());
1038
		
1038
			} else {
1039
		// set the buffer source
1039
				IFile file = (IFile)getResource();
1040
		if (buffer.getCharacters() == null) {
1040
				if (file == null || !file.exists()) {
1041
			if (isWorkingCopy) {
1041
					// initialize buffer with empty contents
1042
				ICompilationUnit original;
1042
					buffer.setContents(CharOperation.NO_CHAR);
1043
				if (!isPrimary() 
1044
						&& (original = new CompilationUnit((PackageFragment)getParent(), getElementName(), DefaultWorkingCopyOwner.PRIMARY)).isOpen()) {
1045
					buffer.setContents(original.getSource());
1043
				} else {
1046
				} else {
1044
					buffer.setContents(Util.getResourceContentsAsCharArray(file));
1047
					IFile file = (IFile)getResource();
1048
					if (file == null || !file.exists()) {
1049
						// initialize buffer with empty contents
1050
						buffer.setContents(CharOperation.NO_CHAR);
1051
					} else {
1052
						buffer.setContents(Util.getResourceContentsAsCharArray(file));
1053
					}
1045
				}
1054
				}
1055
			} else {
1056
				IFile file = (IFile)this.getResource();
1057
				if (file == null || !file.exists()) throw newNotPresentException();
1058
				buffer.setContents(Util.getResourceContentsAsCharArray(file));
1046
			}
1059
			}
1047
		} else {
1048
			IFile file = (IFile)this.getResource();
1049
			if (file == null || !file.exists()) throw newNotPresentException();
1050
			buffer.setContents(Util.getResourceContentsAsCharArray(file));
1051
		}
1060
		}
1052
	}
1053
1054
	// add buffer to buffer cache
1055
	BufferManager bufManager = getBufferManager();
1056
	bufManager.addBuffer(buffer);
1057
			
1058
	// listen to buffer changes
1059
	buffer.addBufferChangedListener(this);
1060
	
1061
	
1062
		// add buffer to buffer cache
1063
		bufManager.addBuffer(buffer);
1064
				
1065
		// listen to buffer changes
1066
		buffer.addBufferChangedListener(this);
1067
	}	
1061
	return buffer;
1068
	return buffer;
1062
}
1069
}
1063
protected void openParent(Object childInfo, HashMap newElements, IProgressMonitor pm) throws JavaModelException {
1070
protected void openParent(Object childInfo, HashMap newElements, IProgressMonitor pm) throws JavaModelException {

Return to bug 146331