1 11 package org.eclipse.team.internal.ui.synchronize; 12 13 import java.io.*; 14 15 import org.eclipse.compare.ISharedDocumentAdapter; 16 import org.eclipse.compare.ResourceNode; 17 import org.eclipse.core.resources.IFile; 18 import org.eclipse.core.resources.IResource; 19 import org.eclipse.core.runtime.*; 20 import org.eclipse.ui.IEditorInput; 21 22 39 public class LocalResourceTypedElement extends ResourceNode implements IAdaptable { 40 41 private boolean fDirty = false; 42 private EditableSharedDocumentAdapter sharedDocumentAdapter; 43 private long timestamp; 44 private boolean exists; 45 private boolean useSharedDocument = true; 46 private EditableSharedDocumentAdapter.ISharedDocumentAdapterListener sharedDocumentListener; 47 48 52 public LocalResourceTypedElement(IResource resource) { 53 super(resource); 54 exists = resource.exists(); 55 } 56 57 60 public void setContent(byte[] contents) { 61 fDirty = true; 62 super.setContent(contents); 63 } 64 65 76 public void commit(IProgressMonitor monitor) throws CoreException { 77 if (isDirty()) { 78 if (isConnected()) { 79 saveDocument(true, monitor); 80 } else { 81 IResource resource = getResource(); 82 if (resource instanceof IFile) { 83 ByteArrayInputStream is = new ByteArrayInputStream(getContent()); 84 try { 85 IFile file = (IFile) resource; 86 if (file.exists()) 87 file.setContents(is, false, true, monitor); 88 else 89 file.create(is, false, monitor); 90 fDirty = false; 91 } finally { 92 fireContentChanged(); 93 if (is != null) 94 try { 95 is.close(); 96 } catch (IOException ex) { 97 } 98 } 99 } 100 updateTimestamp(); 101 } 102 } 103 } 104 105 108 public InputStream getContents() throws CoreException { 109 if (exists) 110 return super.getContents(); 111 return null; 112 } 113 114 117 public Object getAdapter(Class adapter) { 118 if (adapter == ISharedDocumentAdapter.class) { 119 if (isSharedDocumentsEnable()) 120 return getSharedDocumentAdapter(); 121 else 122 return null; 123 } 124 return Platform.getAdapterManager().getAdapter(this, adapter); 125 } 126 127 131 private synchronized ISharedDocumentAdapter getSharedDocumentAdapter() { 132 if (sharedDocumentAdapter == null) 133 sharedDocumentAdapter = new EditableSharedDocumentAdapter(new EditableSharedDocumentAdapter.ISharedDocumentAdapterListener() { 134 public void handleDocumentConnected() { 135 LocalResourceTypedElement.this.updateTimestamp(); 136 if (sharedDocumentListener != null) 137 sharedDocumentListener.handleDocumentConnected(); 138 } 139 public void handleDocumentFlushed() { 140 LocalResourceTypedElement.this.fireContentChanged(); 141 if (sharedDocumentListener != null) 142 sharedDocumentListener.handleDocumentFlushed(); 143 } 144 public void handleDocumentDeleted() { 145 LocalResourceTypedElement.this.update(); 146 if (sharedDocumentListener != null) 147 sharedDocumentListener.handleDocumentDeleted(); 148 } 149 public void handleDocumentSaved() { 150 LocalResourceTypedElement.this.updateTimestamp(); 151 if (sharedDocumentListener != null) 152 sharedDocumentListener.handleDocumentSaved(); 153 } 154 public void handleDocumentDisconnected() { 155 if (sharedDocumentListener != null) 156 sharedDocumentListener.handleDocumentDisconnected(); 157 } 158 }); 159 return sharedDocumentAdapter; 160 } 161 162 165 public boolean isEditable() { 166 IResource resource = getResource(); 168 return resource.getType() == IResource.FILE && exists; 169 } 170 171 177 public boolean isConnected() { 178 return sharedDocumentAdapter != null 179 && sharedDocumentAdapter.isConnected(); 180 } 181 182 192 public boolean saveDocument(boolean overwrite, IProgressMonitor monitor) throws CoreException { 193 if (isConnected()) { 194 IEditorInput input = sharedDocumentAdapter.getDocumentKey(this); 195 sharedDocumentAdapter.saveDocument(input, overwrite, monitor); 196 updateTimestamp(); 197 return true; 198 } 199 return false; 200 } 201 202 205 protected InputStream createStream() throws CoreException { 206 InputStream inputStream = super.createStream(); 207 updateTimestamp(); 208 return inputStream; 209 } 210 211 214 void updateTimestamp() { 215 if (getResource().exists()) 216 timestamp = getResource().getLocalTimeStamp(); 217 else 218 exists = false; 219 } 220 221 225 private long getTimestamp() { 226 return timestamp; 227 } 228 229 232 public int hashCode() { 233 return getResource().hashCode(); 234 } 235 236 239 public boolean equals(Object other) { 240 if (other instanceof LocalResourceTypedElement) { 241 LocalResourceTypedElement otherElement = (LocalResourceTypedElement) other; 242 return otherElement.getResource().equals(getResource()) 243 && exists == otherElement.exists; 244 } 245 return super.equals(other); 246 } 247 248 254 public void update() { 255 exists = getResource().exists(); 256 } 257 258 266 public boolean isSynchronized() { 267 long current = getResource().getLocalTimeStamp(); 268 return current == getTimestamp(); 269 } 270 271 277 public boolean exists() { 278 return exists; 279 } 280 281 284 protected void fireContentChanged() { 285 super.fireContentChanged(); 286 } 287 288 296 public void discardBuffer() { 297 if (sharedDocumentAdapter != null) 298 sharedDocumentAdapter.releaseBuffer(); 299 super.discardBuffer(); 300 } 301 302 306 public boolean isSharedDocumentsEnable() { 307 return useSharedDocument && getResource().getType() == IResource.FILE && exists; 308 } 309 310 315 public void enableSharedDocument(boolean enablement) { 316 this.useSharedDocument = enablement; 317 } 318 319 328 public boolean isDirty() { 329 return fDirty || (sharedDocumentAdapter != null && sharedDocumentAdapter.hasBufferedContents()); 330 } 331 332 public void setSharedDocumentListener( 333 EditableSharedDocumentAdapter.ISharedDocumentAdapterListener sharedDocumentListener) { 334 this.sharedDocumentListener = sharedDocumentListener; 335 } 336 337 } 338 | Popular Tags |