This is an automated email from the ASF dual-hosted git repository. junichi11 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push: new c88b994179 Improved validation when creating a line breakpoint: - added check that the specified file is a php source file - added check that the specified line number is less than the maximum line number in the file new fa5e96b52b Merge pull request #6241 from troizet/improve_validation_php_line_breakpoint c88b994179 is described below commit c88b994179c6ea9de72f3c2fdc3e7f6b53fb23ae Author: Alexey Borokhvostov <troi...@gmail.com> AuthorDate: Fri Jul 21 18:43:17 2023 +0700 Improved validation when creating a line breakpoint: - added check that the specified file is a php source file - added check that the specified line number is less than the maximum line number in the file --- .../dbgp/ui/DbgpLineBreakpointCustomizerPanel.java | 103 +++++++++++++++++---- 1 file changed, 86 insertions(+), 17 deletions(-) diff --git a/php/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizerPanel.java b/php/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizerPanel.java index 0cc7903d94..4eb8eee752 100644 --- a/php/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizerPanel.java +++ b/php/php.dbgp/src/org/netbeans/modules/php/dbgp/ui/DbgpLineBreakpointCustomizerPanel.java @@ -21,32 +21,43 @@ package org.netbeans.modules.php.dbgp.ui; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.File; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.DefaultComboBoxModel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.text.Document; +import javax.swing.text.StyledDocument; import org.netbeans.api.debugger.DebuggerManager; import org.netbeans.api.debugger.Properties; +import org.netbeans.modules.php.api.util.FileUtils; import org.netbeans.modules.php.dbgp.breakpoints.LineBreakpoint; import org.netbeans.modules.php.dbgp.breakpoints.Utils; import org.netbeans.spi.debugger.ui.Controller; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; +import org.openide.cookies.EditorCookie; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; +import org.openide.loaders.DataObject; +import org.openide.loaders.DataObjectNotFoundException; import org.openide.text.Line; +import org.openide.text.NbDocument; import org.openide.util.NbBundle; public class DbgpLineBreakpointCustomizerPanel extends JPanel implements ControllerProvider { + private static final Logger LOGGER = Logger.getLogger(DbgpLineBreakpointCustomizerPanel.class.getName()); + private static final int MAX_SAVED_CONDITIONS = 10; private static final String BP_CONDITIONS = "BPConditions"; // NOI18N private static final String DEBUGGER_PHP = "debugger.php"; // NOI18N private static final long serialVersionUID = 6364512868561614302L; private final LineBreakpoint lineBreakpoint; - private final Controller controller; + private final CustomizerController controller; private boolean createBreakpoint; private static LineBreakpoint createLineBreakpoint() { @@ -97,7 +108,7 @@ public class DbgpLineBreakpointCustomizerPanel extends JPanel implements Control } private void processUpdate() { - ((CustomizerController) controller).firePropertyChange(); + controller.checkValid(); } }; fileTextField.setEditable(isEditable); @@ -112,6 +123,13 @@ public class DbgpLineBreakpointCustomizerPanel extends JPanel implements Control FileObject fo = line.getLookup().lookup(FileObject.class); updateComponents(fo, line.getLineNumber() + 1, lineBreakpoint.getCondition()); } + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + controller.checkValid(); + } + }); } private void updateComponents(FileObject fileObject, int lineNumber, String condition) { @@ -175,7 +193,7 @@ public class DbgpLineBreakpointCustomizerPanel extends JPanel implements Control .setArray(BP_CONDITIONS, conditions); } - private Controller createController() { + private CustomizerController createController() { return new CustomizerController(); } @@ -184,6 +202,28 @@ public class DbgpLineBreakpointCustomizerPanel extends JPanel implements Control return controller; } + private static int findNumLines(FileObject file) { + DataObject dataObject; + try { + dataObject = DataObject.find(file); + } catch (DataObjectNotFoundException ex) { + LOGGER.log(Level.WARNING, "Can''t find DataObject for {0}", file.getPath()); // NOI18N + return 0; + } + EditorCookie editortCookie = (EditorCookie) dataObject.getCookie(EditorCookie.class); + if (editortCookie == null) { + return 0; + } + editortCookie.prepareDocument().waitFinished(); + Document document = editortCookie.getDocument(); + if (!(document instanceof StyledDocument)) { + return 0; + } + StyledDocument styledDocument = (StyledDocument) document; + //NbDocument.findLineNumber() always returns a line number one less than the actual line number. + return NbDocument.findLineNumber(styledDocument, styledDocument.getLength()) + 1; + } + /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always @@ -307,10 +347,11 @@ public class DbgpLineBreakpointCustomizerPanel extends JPanel implements Control private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); private String errorMessage; + private volatile boolean valid; @Override public boolean ok() { - if (!isValid()) { + if (!valid) { final String message = getErrorMessage(); if (message != null) { if (SwingUtilities.isEventDispatchThread()) { @@ -367,49 +408,76 @@ public class DbgpLineBreakpointCustomizerPanel extends JPanel implements Control @NbBundle.Messages({ "CustomizerController.invalid.file=Existing file must be set.", - "CustomizerController.invalid.line=Valid line number must be set." + "CustomizerController.non.php.file=PHP source file is expected.", + "CustomizerController.invalid.line=Valid line number must be set.", + "# {0} - entered line number", + "# {1} - maximum line number in file", + "CustomizerController.too.big.line.number=The line number {0} is too big. Maximum line number is {1}." }) - @Override - public boolean isValid() { + public void checkValid() { boolean isValid = true; // file String fileName = fileTextField.getText(); if (fileName == null || fileName.trim().length() == 0) { setErrorMessage(Bundle.CustomizerController_invalid_file()); - return false; + setValid(false); + return; } File file = new File(fileName.trim()); if (!file.exists()) { setErrorMessage(Bundle.CustomizerController_invalid_file()); - return false; + setValid(false); + return; } FileObject fileObject = FileUtil.toFileObject(file); if (fileObject == null) { setErrorMessage(Bundle.CustomizerController_invalid_file()); - return false; + setValid(false); + return; + } else if (!FileUtils.isPhpFile(fileObject)) { + setErrorMessage(Bundle.CustomizerController_non_php_file()); + setValid(false); + return; } // line number String lineNumberString = lineNumberTextField.getText(); if (lineNumberString == null || lineNumberString.trim().length() == 0) { setErrorMessage(Bundle.CustomizerController_invalid_line()); - return false; + setValid(false); + return; } try { int lineNumber = Integer.parseInt(lineNumberTextField.getText()); if (lineNumber <= 0) { setErrorMessage(Bundle.CustomizerController_invalid_line()); - return false; + setValid(false); + return; + } + int maxLine = findNumLines(fileObject); + if (maxLine == 0) { // Not found + maxLine = Integer.MAX_VALUE - 1; // Not to bother the user when we did not find it + } + if (lineNumber > maxLine) { + setErrorMessage(Bundle.CustomizerController_too_big_line_number(Integer.toString(lineNumber), Integer.toString(maxLine))); + setValid(false); + return; } } catch (NumberFormatException nfe) { setErrorMessage(Bundle.CustomizerController_invalid_line()); + setValid(false); isValid = false; } if (isValid) { setErrorMessage(null); + setValid(true); } - return isValid; + } + + @Override + public boolean isValid() { + return valid; } @Override @@ -422,15 +490,16 @@ public class DbgpLineBreakpointCustomizerPanel extends JPanel implements Control propertyChangeSupport.removePropertyChangeListener(l); } - void firePropertyChange() { - propertyChangeSupport.firePropertyChange(Controller.PROP_VALID, null, null); - } - void setErrorMessage(String message) { errorMessage = message; propertyChangeSupport.firePropertyChange(NotifyDescriptor.PROP_ERROR_NOTIFICATION, null, message); } + private void setValid(boolean valid) { + this.valid = valid; + propertyChangeSupport.firePropertyChange(PROP_VALID, !valid, valid); + } + String getErrorMessage() { return errorMessage; } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists