package net.sourceforge.phpeclipse.phpeditor; import java.io.IOException; import java.io.InputStream; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.text.source.ISourceViewer; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.editors.text.TextEditor; import test.PHPParserManager; import test.PHPParserSuperclass; public class PHPSyntaxParserThread extends Thread { private static String[] EXTENSIONS = { ".php", ".php3", ".php4", ".inc", ".phtml" }; private String text = ""; private String previousText = ""; private boolean stopValidation = false; private boolean validationTerminated = false; private boolean isActive = false; private TextEditor fTextEditor; private ISourceViewer fSourceViewer; private int previousHashCode = 0; // Defaults private int validationInterval = 2000; //millis private int waitForTermination = 400; // millis private int maxErrorsShown = 10; public PHPSyntaxParserThread( TextEditor textEditor, ISourceViewer viewer) { super(); fTextEditor = textEditor; fSourceViewer = viewer; } public void setText(String text) { if (!isActive) this.text = text; } public void setText(String text, boolean forceUpdate) { if (!isActive) { this.text = text; } if (forceUpdate) { this.previousText = ""; this.previousHashCode = 0; } } public String getText() { return text; } public void setInterval(int millis) { this.validationInterval = millis; } public int getInterval() { return validationInterval; } public void setErrorsShown(int number) { this.maxErrorsShown = number; } public int getErrorsShown() { return maxErrorsShown; } public void dispose() { this.stopValidation = true; if (validationTerminated == false) { try { Thread.sleep(waitForTermination); } catch (Exception e) { } } } public void run() { while (stopValidation == false) { try { this.isActive = true; boolean ret = this.validateSyntax(); this.previousText = this.text; this.isActive = false; Thread.sleep(validationInterval); } catch (Exception e) { e.printStackTrace(); } } this.validationTerminated = true; } public boolean validateSyntax() { boolean phpFlag = false; try { IFile fileToParse = getPHPFile(fTextEditor.getEditorInput()); if (fileToParse == null) { // should never happen System.err.println("Error : no file in the editor"); // should throw an exception return false; } String name = fileToParse.getName(); for (int i = 0; i 0) { // content.append(new String(buffer)); // } // in.close(); // // //jjjjjjj // // DEBUG start // System.out.println("-----------------------------------------"); // System.out.println(" OUTPUT"); // System.out.println("-----------------------------------------"); // System.out.println(content); // System.out.println("-----------------------------------------"); // // DEBUG END // // String line = null; // List lines = new ArrayList(); // int index; // // // Compare checksums // int hashCode = content.toString().hashCode(); // // if (previousHashCode == hashCode) { // // return true; // } // // previousHashCode = hashCode; // // StringTokenizer st = new StringTokenizer(content.toString(), "\n"); // // int lineCount = 0; // // while (st.hasMoreTokens()) { // line = st.nextToken(); // if (line.indexOf("\r") != -1) { // line = line.substring(0, line.indexOf("\r")); // } // // lines.add(line); // if (++lineCount >= maxErrorsShown) { // break; // } // // } // // //Delete markers // resource.deleteMarkers(IMarker.PROBLEM, true, 1); // // // Markers have to be added in reverse order // // Otherwise lower line number will appear at the end of the list // for (int i = lines.size() - 1; i >= 0; i--) { // line = (String) lines.get(i); // // // If error message is not from temporary file, skip // if (line.indexOf(tmpFileName) == -1) { // continue; // } // // // Delete filename from error message // StringBuffer lineSb = new StringBuffer(line); // replace(lineSb, tmpFileName + " ", "", true); // line = lineSb.toString(); // // if ((index = line.indexOf(PERL_ERROR_INDICATOR)) != -1) { // // // truncatedLIne is the stripped error-line up to the next " " after the line number if present // // To avoid cluttering with other "." and "," which might occur in the error message // String truncatedLine = line; // if (truncatedLine // .indexOf(" ", index + PERL_ERROR_INDICATOR.length() + 1) // != -1) { // truncatedLine = // truncatedLine.substring( // 0, // truncatedLine.indexOf( // " ", // index + PERL_ERROR_INDICATOR.length() + 1)); // } // // int endIndex; // if ((endIndex = truncatedLine.indexOf(".", index)) == -1) { // endIndex = truncatedLine.indexOf(",", index); // } // // if (endIndex == -1) { // continue; // } // // String lineNr = // truncatedLine.substring( // index + PERL_ERROR_INDICATOR.length(), // endIndex); // // // If there is an addition to the error message // if (i + 1 < lines.size()) { // if (((String) lines.get(i + 1)).startsWith(" ")) { // line += " " + (String) lines.get(i + 1); // } // } // // IMarker marker = resource.createMarker(IMarker.PROBLEM); // // // Check if it's a warning // boolean isWarning = false; // // for (int x = 0; x < WARNING_STRINGS.length; x++) { // if (truncatedLine.indexOf(WARNING_STRINGS[x]) != -1) { // isWarning = true; // } // } // // if (isWarning) { // marker.setAttribute( // IMarker.SEVERITY, // IMarker.SEVERITY_WARNING); // } else { // marker.setAttribute( // IMarker.SEVERITY, // IMarker.SEVERITY_ERROR); // } // // marker.setAttribute(IMarker.MESSAGE, line); // // marker.setAttribute( // IMarker.LINE_NUMBER, // Integer.parseInt(lineNr)); // // Position pos = // new Position( // fSourceViewer.getDocument().getLineOffset( // Integer.parseInt(lineNr) - 1)); // fSourceViewer.getAnnotationModel().addAnnotation( // new MarkerAnnotation(marker), // pos); // // } // } // // } catch (Exception e) { // e.printStackTrace(); // if (proc != null) { // killProcess(proc); // } // return false; // } finally { // try { // // Delete tmp file // new File(tmpFileName).delete(); // } catch (Exception ex) { // ex.printStackTrace(); // } // } return true; } /** * Finds the file that's currently opened in the PHP Text Editor */ protected IFile getPHPFile(IEditorInput editorInput) { if (editorInput instanceof IFileEditorInput) return ((IFileEditorInput) editorInput).getFile(); return null; } protected void parse(IFile fileToParse, InputStream iStream) { StringBuffer buf = new StringBuffer(); int c0; try { while ((c0 = iStream.read()) != (-1)) { buf.append((char) c0); } } catch (IOException e) { return; } String input = buf.toString(); PHPParserSuperclass parser = PHPParserManager.getParser(fileToParse); try { parser.parse(input); } catch (CoreException e) { } } private void killProcess(Process proc) { while (true) { try { proc.destroy(); proc.exitValue(); } catch (Exception ex) { continue; } break; } } // Replaces all instances of the String o with the String n in the // StringBuffer orig if all is true, or only the first instance if all is false. private static void replace( StringBuffer orig, String o, String n, boolean all) { if (orig == null || o == null || o.length() == 0 || n == null) throw new IllegalArgumentException("Null or zero-length String"); int i = 0; while (i + o.length() <= orig.length()) { if (orig.substring(i, i + o.length()).equals(o)) { orig.replace(i, i + o.length(), n); if (!all) break; else i += n.length(); } else i++; } } }