JavaPlugin.log(ex);
	public IStructureComparator getStructure(final Object input) {		String contents= null;		char[] buffer= null;		IDocument doc= DocumentManager.get(input);		if (doc == null) {			if (input instanceof IStreamContentAccessor) {				IStreamContentAccessor sca= (IStreamContentAccessor) input;							try {					contents= JavaCompareUtilities.readString(sca);				} catch (CoreException ex) {					JavaPlugin.log(ex);					return null;				}						}						if (contents != null) {				int n= contents.length();				buffer= new char[n];				contents.getChars(0, n, buffer, 0);								doc= new Document(contents);				DocumentManager.put(input, doc);				JavaCompareUtilities.setupDocument(doc);							}		}				if (doc != null) {			boolean isEditable= false;			if (input instanceof IEditableContent)				isEditable= ((IEditableContent) input).isEditable();						// we hook into the root node to intercept all node changes			JavaNode root= new JavaNode(doc, isEditable) {				void nodeChanged(JavaNode node) {					save(this, input);				}			};						if (buffer == null) {				contents= doc.get();				int n= contents.length();				buffer= new char[n];				contents.getChars(0, n, buffer, 0);			}			JavaParseTreeBuilder builder= new JavaParseTreeBuilder(root, buffer);			SourceElementParser parser= new SourceElementParser(builder,						new ProblemFactory(), new CompilerOptions(JavaCore.getOptions()));			try {				parser.parseCompilationUnit(builder, false);			} catch (ParseError ex) {				// NeedWork				// parse error: bail out				return null;			}			return root;		}		return null;	}