# HG changeset patch # User Subhashini Sooriarachchi # Date 1376287014 -19800 # Node ID e10b2e8563fce2595ea1cc7344a389e81aa83930 # Parent f9493e34684d0d3ed7509c8bc1ebd562e9a1de43 EADS-3749 encountering issues with the displaying of code in Developer Studio when code folding is enabled diff -r f9493e34684d -r e10b2e8563fc PLSQL/Execution/test/unit/data/expected/fndbasdr.sql.structure --- a/PLSQL/Execution/test/unit/data/expected/fndbasdr.sql.structure Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Execution/test/unit/data/expected/fndbasdr.sql.structure Mon Aug 12 11:26:54 2013 +0530 @@ -27,7 +27,6 @@ COMMENT BEGINEND COMMENT -COMMENT BEGINEND COMMENT BEGINEND @@ -35,7 +34,6 @@ COMMENT BEGINEND COMMENT -COMMENT BEGINEND COMMENT BEGINEND diff -r f9493e34684d -r e10b2e8563fc PLSQL/Execution/test/unit/src/org/netbeans/modules/plsql/execution/PlsqlExecutableBlocksMakerTest.java --- a/PLSQL/Execution/test/unit/src/org/netbeans/modules/plsql/execution/PlsqlExecutableBlocksMakerTest.java Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Execution/test/unit/src/org/netbeans/modules/plsql/execution/PlsqlExecutableBlocksMakerTest.java Mon Aug 12 11:26:54 2013 +0530 @@ -99,7 +99,7 @@ PlsqlExecutableBlocksMaker instance = new PlsqlExecutableBlocksMaker(doc); List makeExceutableObjects = instance.makeExceutableObjects(); - int size = makeExceutableObjects.size(); + int size = makeExceutableObjects.size(); assertEquals(12, size); processExecutableBLocksBlocks(plsqlFileName,makeExceutableObjects); @@ -220,7 +220,7 @@ List makeExceutableObjects = instance.makeExceutableObjects(); int size = makeExceutableObjects.size(); - assertEquals(83, size); + assertEquals(81, size); processExecutableBLocksBlocks(plsqlFileName,makeExceutableObjects); } catch (BadLocationException ex) { diff -r f9493e34684d -r e10b2e8563fc PLSQL/Folding/nbproject/project.xml --- a/PLSQL/Folding/nbproject/project.xml Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Folding/nbproject/project.xml Mon Aug 12 11:26:54 2013 +0530 @@ -102,6 +102,10 @@ org.netbeans.libs.junit4 + + org.netbeans.modules.nbjunit + + diff -r f9493e34684d -r e10b2e8563fc PLSQL/Folding/src/org/netbeans/modules/plsql/fold/FoldAdapter.java --- a/PLSQL/Folding/src/org/netbeans/modules/plsql/fold/FoldAdapter.java Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Folding/src/org/netbeans/modules/plsql/fold/FoldAdapter.java Mon Aug 12 11:26:54 2013 +0530 @@ -5,6 +5,7 @@ package org.netbeans.modules.plsql.fold; import org.netbeans.api.editor.fold.Fold; +import org.netbeans.api.editor.fold.FoldType; /** * @@ -25,4 +26,8 @@ int getEndOffset() { return fold.getEndOffset(); } + + FoldType getFoldType(){ + return fold.getType(); + } } diff -r f9493e34684d -r e10b2e8563fc PLSQL/Folding/src/org/netbeans/modules/plsql/fold/FoldSearchObject.java --- a/PLSQL/Folding/src/org/netbeans/modules/plsql/fold/FoldSearchObject.java Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Folding/src/org/netbeans/modules/plsql/fold/FoldSearchObject.java Mon Aug 12 11:26:54 2013 +0530 @@ -5,6 +5,7 @@ package org.netbeans.modules.plsql.fold; import java.io.Serializable; +import org.netbeans.api.editor.fold.FoldType; /** * @@ -15,15 +16,17 @@ private static final long serialVersionUID = 1L; private final int startOffset; private final int endOffset; + private FoldType foldType; private FoldAdapter fold; - FoldSearchObject(int startOffset, int endOffset) { + FoldSearchObject(int startOffset, int endOffset, FoldType foldType) { this.startOffset = startOffset; this.endOffset = endOffset; + this.foldType = foldType; } FoldSearchObject(FoldAdapter fold) { - this(-1, -1); + this(-1, -1,null); this.fold = fold; } @@ -40,7 +43,14 @@ } return endOffset; } - + + public FoldType getFoldType(){ + if (foldType == null) { + return fold.getFoldType(); + } + return foldType; + } + @Override public int hashCode() { int hash = 7; diff -r f9493e34684d -r e10b2e8563fc PLSQL/Folding/src/org/netbeans/modules/plsql/fold/NewPlsqlFoldManager.java --- a/PLSQL/Folding/src/org/netbeans/modules/plsql/fold/NewPlsqlFoldManager.java Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Folding/src/org/netbeans/modules/plsql/fold/NewPlsqlFoldManager.java Mon Aug 12 11:26:54 2013 +0530 @@ -42,12 +42,15 @@ package org.netbeans.modules.plsql.fold; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Observable; import java.util.Observer; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.event.DocumentEvent; +import javax.swing.text.AbstractDocument; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import org.netbeans.api.editor.fold.Fold; @@ -61,6 +64,7 @@ import org.netbeans.spi.editor.fold.FoldHierarchyTransaction; import org.netbeans.spi.editor.fold.FoldManager; import org.netbeans.spi.editor.fold.FoldOperation; +import org.openide.util.Exceptions; import org.openide.util.Lookup; import org.openide.util.RequestProcessor; @@ -70,281 +74,472 @@ */ public class NewPlsqlFoldManager implements FoldManager, Runnable, Observer { - private static final Logger LOG = Logger.getLogger(NewPlsqlFoldManager.class.getName()); - private static final RequestProcessor RP = new RequestProcessor(NewPlsqlFoldManager.class.getName(), 1, false, false); - private static final int TASK_DELAY = 1000; - private final RequestProcessor.Task task = RP.create(this); - private FoldOperation operation; - private Document doc; - // Note: FoldSearchObject need to be in a List, otherwise contains doesn't work. Seems HashSet keeps internal list of hash. - private final List foldSearchObjects = new ArrayList(); - private List removedFoldList = new ArrayList(3); - private boolean initial = true; - private PlsqlBlockFactory blockFactory; + private static final Logger LOG = Logger.getLogger(NewPlsqlFoldManager.class.getName()); + private static final RequestProcessor RP = new RequestProcessor(NewPlsqlFoldManager.class.getName(), 1, false, false); + private static final int TASK_DELAY = 100; + private final RequestProcessor.Task task = RP.create(this); + private FoldOperation operation; + private Document doc; + // Note: FoldSearchObject need to be in a List, otherwise contains doesn't work. Seems HashSet keeps internal list of hash. + private final List foldSearchObjects = new ArrayList(); + private List removedFoldList = new ArrayList(3); + private boolean initial = true; + private PlsqlBlockFactory blockFactory; - @Override - public void init(FoldOperation operation) { - this.operation = operation; - if (LOG.isLoggable(Level.FINE)) { - LOG.log(Level.FINE, "Initialized: {0}", System.identityHashCode(this)); - } - } + @Override + public void init(FoldOperation operation) { + this.operation = operation; + if (LOG.isLoggable(Level.FINE)) { + LOG.log(Level.FINE, "Initialized: {0}", System.identityHashCode(this)); + } + } - private FoldOperation getOperation() { - return operation; - } + private FoldOperation getOperation() { + return operation; + } - @Override - public void initFolds(FoldHierarchyTransaction transaction) { - doc = getOperation().getHierarchy().getComponent().getDocument(); - blockFactory = getBlockFactory(); - if (blockFactory != null) { - blockFactory.addObserver(this); - } - task.schedule(TASK_DELAY); - } + @Override + public void initFolds(FoldHierarchyTransaction transaction) { + doc = getOperation().getHierarchy().getComponent().getDocument(); + blockFactory = getBlockFactory(); + if (blockFactory != null) { + blockFactory.addObserver(this); + } + task.schedule(TASK_DELAY); + } - @Override - public void insertUpdate(DocumentEvent evt, FoldHierarchyTransaction transaction) { - if (LOG.isLoggable(Level.FINER)) { - LOG.log(Level.FINER, "insertUpdate: {0}", System.identityHashCode(this)); - } - processRemovedFolds(transaction); - } + @Override + public void insertUpdate(DocumentEvent evt, FoldHierarchyTransaction transaction) { + if (LOG.isLoggable(Level.FINER)) { + LOG.log(Level.FINER, "insertUpdate: {0}", System.identityHashCode(this)); + } + processRemovedFolds(transaction); + } - @Override - public void removeUpdate(DocumentEvent evt, FoldHierarchyTransaction transaction) { - if (LOG.isLoggable(Level.FINER)) { - LOG.log(Level.FINER, "removeUpdate: {0}", System.identityHashCode(this)); - } - processRemovedFolds(transaction); - } + @Override + public void removeUpdate(DocumentEvent evt, FoldHierarchyTransaction transaction) { + if (LOG.isLoggable(Level.FINER)) { + LOG.log(Level.FINER, "removeUpdate: {0}", System.identityHashCode(this)); + } + processRemovedFolds(transaction); + } - @Override - public void changedUpdate(DocumentEvent evt, FoldHierarchyTransaction transaction) { - } + @Override + public void changedUpdate(DocumentEvent evt, FoldHierarchyTransaction transaction) { + if (LOG.isLoggable(Level.FINER)) { + LOG.log(Level.FINER, "changeUpdate: {0}", System.identityHashCode(this)); + } + processRemovedFolds(transaction); + } - @Override - public void removeEmptyNotify(Fold emptyFold) { - if (LOG.isLoggable(Level.FINER)) { - LOG.log(Level.FINER, "removeEmptyNotify: {0}", System.identityHashCode(this)); - } - removeFoldNotify(emptyFold); - } + @Override + public void removeEmptyNotify(Fold emptyFold) { + if (LOG.isLoggable(Level.FINER)) { + LOG.log(Level.FINER, "removeEmptyNotify: {0}", System.identityHashCode(this)); + } + removeFoldNotify(emptyFold); + } - @Override - public void removeDamagedNotify(Fold damagedFold) { - if (LOG.isLoggable(Level.FINER)) { - LOG.log(Level.FINER, "removeDamagedNotify: {0}", System.identityHashCode(this)); - } - removeFoldNotify(damagedFold); - } + @Override + public void removeDamagedNotify(Fold damagedFold) { + if (LOG.isLoggable(Level.FINER)) { + LOG.log(Level.FINER, "removeDamagedNotify: {0}", System.identityHashCode(this)); + } + removeFoldNotify(damagedFold); + } - @Override - public void expandNotify(Fold expandedFold) { - } + @Override + public void expandNotify(Fold expandedFold) { + } - @Override - public void release() { - if (LOG.isLoggable(Level.FINE)) { - LOG.log(Level.FINE, "release: {0}", System.identityHashCode(this)); - } - } + @Override + public void release() { + if (LOG.isLoggable(Level.FINE)) { + LOG.log(Level.FINE, "release: {0}", System.identityHashCode(this)); + } + } - @Override - public void update(Observable o, Object arg) { - if (LOG.isLoggable(Level.FINER)) { - LOG.log(Level.FINER, "update: {0}", System.identityHashCode(this)); - } - task.schedule(TASK_DELAY); - } + @Override + public void update(Observable o, Object arg) { + if (LOG.isLoggable(Level.FINER)) { + LOG.log(Level.FINER, "update: {0}", System.identityHashCode(this)); + } + task.schedule(TASK_DELAY); + } - @Override - public void run() { - if (operation.isReleased()) { - if (LOG.isLoggable(Level.FINE)) { - LOG.log(Level.FINE, "Update skipped, already released: {0}", System.identityHashCode(this)); - } - return; - } - ((BaseDocument) doc).readLock(); - try { + @Override + public void run() { + if (operation.isReleased()) { + if (LOG.isLoggable(Level.FINE)) { + LOG.log(Level.FINE, "Update skipped, already released: {0}", System.identityHashCode(this)); + } + return; + } + ((BaseDocument) doc).readLock(); + try { + if (blockFactory != null) { + FoldHierarchy hierarchy = getOperation().getHierarchy(); - if (blockFactory != null) { - FoldHierarchy hierarchy = getOperation().getHierarchy(); - hierarchy.lock(); + hierarchy.lock(); + try { + if (operation.isReleased()) { + if (LOG.isLoggable(Level.FINE)) { + LOG.log(Level.FINE, "Update skipped, already released: {0}", System.identityHashCode(this)); + } + return; + } + if (LOG.isLoggable(Level.FINE)) { + LOG.log(Level.FINE, "Updating: {0}", System.identityHashCode(this)); + LOG.log(Level.FINE, "blockFactory.getBlockHierarchy().size(): {0}", blockFactory.getBlockHierarchy().size()); + LOG.log(Level.FINE, "blockFactory.getNewBlocks().size(): {0}", blockFactory.getNewBlocks().size()); + LOG.log(Level.FINE, "blockFactory.getRemovedBlocks().size(): {0}", blockFactory.getRemovedBlocks().size()); + } + FoldHierarchyTransaction transaction = getOperation().openTransaction(); + try { + + final Fold root = hierarchy.getRootFold(); + + if (initial) { + List blocks = blockFactory.getBlockHierarchy(); + updateFolds(blocks, transaction, null); + //Add custom fold blocks + updateFolds(blockFactory.getCustomFolds(), transaction, null); + initial = false; + } else { + final List collapsedFolds = new ArrayList(); + getCollapsedFolds(root, collapsedFolds); + final List oldBlocks = blockFactory.getRemovedBlocks(); + + //Remove non existing blocks + if (!oldBlocks.isEmpty()) { + final int childCount = root.getFoldCount(); + for (int i = (childCount - 1); i >= 0; i--) { + final Fold child = root.getFold(i); + removeWithChildren(child, oldBlocks, transaction); + } + } + //Add new blocks to the hierarchy + List blocks = blockFactory.getNewBlocks(); + updateFolds(blocks, transaction, collapsedFolds); + //Add custom fold blocks + updateFolds(blockFactory.getCustomFolds(), transaction, collapsedFolds); + } + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + } finally { + transaction.commit(); + } + } finally { + hierarchy.unlock(); + } + } + } finally { + ((BaseDocument) doc).readUnlock(); + } + } + + private void getCollapsedFolds(final Fold parent, final List foldInfoLst) { + if (parent.isCollapsed()) { + final FoldSearchObject tempInfo = new FoldSearchObject(parent.getStartOffset(), parent.getEndOffset(), parent.getType()); + foldInfoLst.add(tempInfo); + } + final int count = parent.getFoldCount(); + for (int i = 0; i < count; i++) { + final Fold temp = parent.getFold(i); + getCollapsedFolds(temp, foldInfoLst); + } + } + + /** + * Remove fold with its children + * + * @param fold + * @param blockHier + * @param transaction + * @return true if removed all the children + */ + private void removeWithChildren(final Fold fold, final List blockHier, final FoldHierarchyTransaction transaction) { + + final int childCount = fold.getFoldCount(); + for (int i = (childCount - 1); i >= 0; i--) { + final Fold child = fold.getFold(i); + removeWithChildren(child, blockHier, transaction); + } + + //If a custom fold remove + if (fold.getType() == PlsqlFoldTypes.CUSTOM || checkExists(fold, blockHier)) { + operation.removeFromHierarchy(fold, transaction); + foldSearchObjects.remove(new FoldSearchObject(new FoldAdapter(fold))); + } + } + + /** + * Method that will check whether given fold exists in block hier + * + * @param fold + * @param blockHier + * @return + */ + private boolean checkExists(final Fold fold, final List blockHier) { + final Comparator comparator = new Comparator() { + @Override + public int compare(final PlsqlBlock o1, final PlsqlBlock o2) { + Integer o1pos, o2pos; + if (o1.getStartOffset() > -1 && o2.getStartOffset() > -1) { + o1pos = Integer.valueOf(o1.getStartOffset()); + o2pos = Integer.valueOf(o2.getStartOffset()); + } else { + o1pos = Integer.valueOf(o1.getEndOffset()); + o2pos = Integer.valueOf(o2.getEndOffset()); + } + return o1pos.compareTo(o2pos); + } + }; + return checkExists(fold, blockHier, comparator); + } + + /** + * Method that will check whether given fold exists in block hier + * + * @param fold + * @param blockHier + * @param comparator + * @return + */ + private boolean checkExists(final Fold fold, final List blockHier, final Comparator comparator) { + final int size = blockHier.size(); + Collections.sort(blockHier, comparator); + if (size == 0) { + return false; + } + //make sure that the fold isn't before the first block or after the last block in the hierarchy. + if (fold.getStartOffset() > blockHier.get(size - 1).getEndOffset() + || fold.getEndOffset() < blockHier.get(0).getStartOffset()) { + return false; + } + for (int i = 0; i < size; i++) { + final PlsqlBlock block = blockHier.get(i); + if (block.getStartOffset() <= fold.getStartOffset() && block.getEndOffset() >= fold.getEndOffset()) { + return true; + } + if (block.getPreviousStart() <= fold.getStartOffset() && block.getPreviousEnd() >= fold.getEndOffset()) { + return true; + } + if ((block.getEndOffset() == fold.getEndOffset() || fold.getEndOffset() == block.getPreviousEnd() + || block.getStartOffset() == fold.getStartOffset() || block.getPreviousStart() == fold.getStartOffset()) + && (getFoldType(block.getType()).equals(fold.getType())) + && (getFoldDescription(block).equals(fold.getDescription()))) { + return true; + } + + if (checkExists(fold, block.getChildBlocks(), comparator)) { + return true; + } + } + + return false; + } + + private FoldType getFoldType(final PlsqlBlockType blockType) { + switch (blockType) { + case VIEW: + return PlsqlFoldTypes.VIEW; + case TABLE_COMMENT: + return PlsqlFoldTypes.TABLECOMMENT; + case COLUMN_COMMENT: + return PlsqlFoldTypes.COLUMNCOMMENT; + case COMMENT: + return PlsqlFoldTypes.COMMENT; + case PACKAGE: + return PlsqlFoldTypes.PACKAGE; + case PACKAGE_BODY: + return PlsqlFoldTypes.PACKAGEBODY; + case PROCEDURE_IMPL: + return PlsqlFoldTypes.PROCEDUREIMPL; + case FUNCTION_IMPL: + return PlsqlFoldTypes.FUNCTIONIMPL; + case PROCEDURE_DEF: + return PlsqlFoldTypes.PROCEDUREDEF; + case FUNCTION_DEF: + return PlsqlFoldTypes.FUNCTIONDEF; + case DECLARE_END: + return PlsqlFoldTypes.DECLAREEND; + case BEGIN_END: + return PlsqlFoldTypes.BEGINEND; + case TRIGGER: + return PlsqlFoldTypes.TRIGGER; + case IF: + return PlsqlFoldTypes.IF; + case CASE: + return PlsqlFoldTypes.CASE; + case WHILE_LOOP: + return PlsqlFoldTypes.WHILELOOP; + case FOR_LOOP: + return PlsqlFoldTypes.FORLOOP; + case LOOP: + return PlsqlFoldTypes.LOOP; + case CUSTOM_FOLD: + return PlsqlFoldTypes.CUSTOM; + case STATEMENT: + return PlsqlFoldTypes.STATEMENT; + case CURSOR: + return PlsqlFoldTypes.CURSOR; + case JAVA_SOURCE: + return PlsqlFoldTypes.JAVASOURCE; + default: + return null; + } + } + + /** + * Method that will return the fold description given the Plsql block Used + * when changing the descriptions only. + * + * @param block + * @return + */ + private String getFoldDescription(final PlsqlBlock block) { + switch (block.getType()) { + case VIEW: + return block.getPrefix() + "VIEW " + block.getName(); + case TABLE_COMMENT: + return "COMMENT ON TABLE " + block.getName(); + case COLUMN_COMMENT: + return "COLUMN COMMENTS ON TABLE " + block.getName(); + case COMMENT: + return block.getName(); + case PACKAGE: + return block.getPrefix() + "PACKAGE " + block.getName(); + case PACKAGE_BODY: + return block.getPrefix() + "PACKAGE BODY " + block.getName(); + case PROCEDURE_IMPL: + return block.getPrefix() + "PROCEDURE IMPLEMENTATION " + block.getName(); + case FUNCTION_IMPL: + return block.getPrefix() + "FUNCTION IMPLEMENTATION " + block.getName(); + case PROCEDURE_DEF: + return "PROCEDURE DEFINITION " + block.getName(); + case FUNCTION_DEF: + return "FUNCTION DEFINITION " + block.getName(); + case DECLARE_END: + return "DECLARE BLOCK"; + case BEGIN_END: + return "BEGIN BLOCK"; + case TRIGGER: + return block.getPrefix() + "TRIGGER " + block.getName(); + case IF: + return block.getName(); + case CASE: + return block.getName(); + case WHILE_LOOP: + return "WHILE " + block.getName(); + case FOR_LOOP: + return "FOR " + block.getName(); + case LOOP: + return "LOOP "; + case CUSTOM_FOLD: + return block.getName(); + case STATEMENT: + return block.getPrefix() + block.getName(); + case CURSOR: + return "CURSOR " + block.getName(); + case JAVA_SOURCE: + return block.getPrefix() + "JAVA SOURCE"; + default: + return ""; + } + } + + private void removeFoldNotify(Fold removedFold) { + removedFoldList.add(removedFold); + } + + private void processRemovedFolds(FoldHierarchyTransaction transaction) { + for (Fold removedFold : removedFoldList) { + operation.removeFromHierarchy(removedFold, transaction); + if (LOG.isLoggable(Level.FINE)) { + LOG.log(Level.FINE, "Fold={0} removed={1}", new Object[]{removedFold, true}); + } + } + removedFoldList.clear(); + } + + private Document getDocument() { + Object obj = null; + for (int i = 0; i < 10; i++) { + obj = getOperation().getHierarchy().getComponent().getDocument(); + if (obj instanceof AbstractDocument) { + return (Document) obj; + } try { - if (operation.isReleased()) { - if (LOG.isLoggable(Level.FINE)) { - LOG.log(Level.FINE, "Update skipped, already released: {0}", System.identityHashCode(this)); - } - return; - } - if (LOG.isLoggable(Level.FINE)) { - LOG.log(Level.FINE, "Updating: {0}", System.identityHashCode(this)); - LOG.log(Level.FINE, "blockFactory.getBlockHierarchy().size(): {0}", blockFactory.getBlockHierarchy().size()); - LOG.log(Level.FINE, "blockFactory.getNewBlocks().size(): {0}", blockFactory.getNewBlocks().size()); - LOG.log(Level.FINE, "blockFactory.getRemovedBlocks().size(): {0}", blockFactory.getRemovedBlocks().size()); - } - FoldHierarchyTransaction transaction = getOperation().openTransaction(); - try { - //Add new blocks to the hierarchy - List blocks = blockFactory.getNewBlocks(); - if (initial) { - blocks = blockFactory.getBlockHierarchy(); - initial = false; - } + Thread.currentThread().sleep(i); + } catch (InterruptedException e) { + } + } + throw new IllegalStateException("[PLSQLFolding] PLSQLFoldManager.getDocument() NOT returned AbstractDocument, but " + obj.getClass() + "!. This is caused by not yet resolved issue #49497."); //NOI18N + } - updateFolds(blocks, transaction); - //Add custom fold blocks - updateFolds(blockFactory.getCustomFolds(), transaction); - } finally { - transaction.commit(); - } - } finally { - hierarchy.unlock(); + private void updateFolds(final List blockHier, final FoldHierarchyTransaction transaction, final List collapsedFolds) throws BadLocationException { + final int count = blockHier.size(); + Document doc = getDocument(); + for (int i = 0; i < count; i++) { + final PlsqlBlock block = blockHier.get(i); + FoldType foldType = null; + final PlsqlBlockType type = block.getType(); + String description = ""; + + if (!(type == PlsqlBlockType.COMMENT && doc.getText(block.getStartOffset(), block.getEndOffset() - block.getStartOffset()).indexOf("\n") == -1)) { // check for single line comments + foldType = getFoldType(type); + description = getFoldDescription(block); + + if (doc.getEndPosition().getOffset() >= block.getEndOffset()) { + operation.addToHierarchy(foldType, description, isCollapsed(block, foldType, collapsedFolds), + block.getStartOffset(), block.getEndOffset(), 0, 0, null, transaction); + //check for any child folds and add them also + updateFolds(block.getChildBlocks(), transaction, collapsedFolds); + } } - } - } finally { - ((BaseDocument) doc).readUnlock(); - } - } + } + } - private void removeFoldNotify(Fold removedFold) { - removedFoldList.add(removedFold); - } + /** + * Method that will select and return the corresponding fold to parent from + * oldRoot fold hierarchy + * + * @param parent + * @param foldInfoLst + * @return + */ + private boolean isCollapsed(final PlsqlBlock block, final FoldType foldType, final List foldInfoLst) { + if (OptionsUtilities.isPlSqlExpandFolds()) { + return false; + } + if (foldInfoLst == null) { + return foldType == PlsqlFoldTypes.COMMENT; + } + final int size = foldInfoLst.size(); + for (int i = 0; i < size; i++) { + final FoldSearchObject temp = foldInfoLst.get(i); - private void processRemovedFolds(FoldHierarchyTransaction transaction) { - for (Fold removedFold : removedFoldList) { - boolean remove = foldSearchObjects.remove(new FoldSearchObject(new FoldAdapter(removedFold))); - if (LOG.isLoggable(Level.FINE)) { - LOG.log(Level.FINE, "Fold={0} removed={1}", new Object[]{removedFold, remove}); - } - } - removedFoldList.clear(); - } + if ((temp.getFoldType() == foldType) + && (temp.getStartOffset() == block.getPreviousStart()) + && (temp.getEndOffset() == block.getPreviousEnd())) { + return true; + } + } - private void updateFolds(List blocks, FoldHierarchyTransaction transaction) { - for (PlsqlBlock block : blocks) { + return false; + } - FoldType foldType = null; - final PlsqlBlockType type = block.getType(); - String description = null; - try { - if (!(type == PlsqlBlockType.COMMENT && doc.getText(block.getStartOffset(), block.getEndOffset() - block.getStartOffset()).indexOf("\n") == -1)) { // check for single line comments - if (type == PlsqlBlockType.VIEW) { - foldType = PlsqlFoldTypes.VIEW; - description = block.getPrefix() + "VIEW " + block.getName(); - } else if (type == PlsqlBlockType.TABLE_COMMENT) { - foldType = PlsqlFoldTypes.TABLECOMMENT; - description = "COMMENT ON TABLE " + block.getName(); - } else if (type == PlsqlBlockType.COLUMN_COMMENT) { - foldType = PlsqlFoldTypes.COLUMNCOMMENT; - description = "COLUMN COMMENTS ON TABLE " + block.getName(); - } else if (type == PlsqlBlockType.COMMENT) { - foldType = PlsqlFoldTypes.COMMENT; - description = block.getName(); - } else if (type == PlsqlBlockType.PACKAGE) { - foldType = PlsqlFoldTypes.PACKAGE; - description = block.getPrefix() + "PACKAGE " + block.getName(); - } else if (type == PlsqlBlockType.PACKAGE_BODY) { - foldType = PlsqlFoldTypes.PACKAGEBODY; - description = block.getPrefix() + "PACKAGE BODY " + block.getName(); - } else if (type == PlsqlBlockType.PROCEDURE_IMPL) { - foldType = PlsqlFoldTypes.PROCEDUREIMPL; - description = block.getPrefix() + "PROCEDURE IMPLEMENTATION " + block.getName(); - } else if (type == PlsqlBlockType.FUNCTION_IMPL) { - foldType = PlsqlFoldTypes.FUNCTIONIMPL; - description = block.getPrefix() + "FUNCTION IMPLEMENTATION " + block.getName(); - } else if (type == PlsqlBlockType.PROCEDURE_DEF) { - foldType = PlsqlFoldTypes.PROCEDUREDEF; - description = "PROCEDURE DEFINITION " + block.getName(); - } else if (type == PlsqlBlockType.FUNCTION_DEF) { - foldType = PlsqlFoldTypes.FUNCTIONDEF; - description = "FUNCTION DEFINITION " + block.getName(); - } else if (type == PlsqlBlockType.DECLARE_END) { - foldType = PlsqlFoldTypes.DECLAREEND; - description = "DECLARE BLOCK"; - } else if (type == PlsqlBlockType.BEGIN_END) { - foldType = PlsqlFoldTypes.BEGINEND; - description = "BEGIN BLOCK"; - } else if (type == PlsqlBlockType.TRIGGER) { - foldType = PlsqlFoldTypes.TRIGGER; - description = block.getPrefix() + "TRIGGER " + block.getName(); - } else if (type == PlsqlBlockType.IF) { - foldType = PlsqlFoldTypes.IF; - description = block.getName(); - } else if (type == PlsqlBlockType.CASE) { - foldType = PlsqlFoldTypes.CASE; - description = block.getName(); - } else if (type == PlsqlBlockType.WHILE_LOOP) { - foldType = PlsqlFoldTypes.WHILELOOP; - description = "WHILE " + block.getName(); - } else if (type == PlsqlBlockType.FOR_LOOP) { - foldType = PlsqlFoldTypes.FORLOOP; - description = "FOR " + block.getName(); - } else if (type == PlsqlBlockType.LOOP) { - foldType = PlsqlFoldTypes.LOOP; - description = "LOOP "; - } else if (type == PlsqlBlockType.CUSTOM_FOLD) { - foldType = PlsqlFoldTypes.CUSTOM; - description = block.getName(); - } else if (type == PlsqlBlockType.STATEMENT) { - foldType = PlsqlFoldTypes.STATEMENT; - description = block.getPrefix() + block.getName(); - } else if (type == PlsqlBlockType.CURSOR) { - foldType = PlsqlFoldTypes.CURSOR; - description = "CURSOR " + block.getName(); - } else if (type == PlsqlBlockType.JAVA_SOURCE) { - foldType = PlsqlFoldTypes.JAVASOURCE; - description = block.getPrefix() + "JAVA SOURCE"; - } - - final FoldSearchObject foldSearchObject = new FoldSearchObject(block.getStartOffset(), block.getEndOffset()); - if (!foldSearchObjects.contains(foldSearchObject)) { - try { - final Fold fold = operation.addToHierarchy(foldType, description, isCollapsed(foldType), block.getStartOffset(), block.getEndOffset(), 0, 0, null, transaction); - foldSearchObjects.add(new FoldSearchObject(new FoldAdapter(fold))); - } catch (BadLocationException ex) { - if (LOG.isLoggable(Level.FINE)) { - LOG.log(Level.FINE, "Ignore BadLocationException", ex); - } - } - } - updateFolds(block.getChildBlocks(), transaction); - } - } catch (BadLocationException ex) { - if (LOG.isLoggable(Level.FINE)) { - LOG.log(Level.FINE, "Ignore BadLocationException", ex); - } - } - } - } - - /** - * Method that will select and return the corresponding fold to parent from oldRoot fold hierarchy - * - * @param parent - * @param foldInfoLst - * @return - */ - private boolean isCollapsed(final FoldType foldType) { - if (OptionsUtilities.isPlSqlExpandFolds()) { - return false; - } - return foldType == PlsqlFoldTypes.COMMENT; - } - - /** - * Method that will return the relevant block factory - * - * @return - */ - private PlsqlBlockFactory getBlockFactory() { - final Object obj = doc.getProperty(Document.StreamDescriptionProperty); - if (obj instanceof Lookup.Provider) { - return ((Lookup.Provider) obj).getLookup().lookup(PlsqlBlockFactory.class); - } - return null; - } + /** + * Method that will return the relevant block factory + * + * @return + */ + private PlsqlBlockFactory getBlockFactory() { + final Object obj = doc.getProperty(Document.StreamDescriptionProperty); + if (obj instanceof Lookup.Provider) { + return ((Lookup.Provider) obj).getLookup().lookup(PlsqlBlockFactory.class); + } + return null; + } } diff -r f9493e34684d -r e10b2e8563fc PLSQL/Folding/src/org/netbeans/modules/plsql/fold/PlsqlFoldManagerFactory.java --- a/PLSQL/Folding/src/org/netbeans/modules/plsql/fold/PlsqlFoldManagerFactory.java Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Folding/src/org/netbeans/modules/plsql/fold/PlsqlFoldManagerFactory.java Mon Aug 12 11:26:54 2013 +0530 @@ -53,7 +53,7 @@ @Override public FoldManager createFoldManager() { - final String property = System.getProperty("plsql.fold.manager", "old"); + final String property = System.getProperty("plsql.fold.manager", "new"); if ("custom".equals(property)) { return new CustomFoldManager(); } diff -r f9493e34684d -r e10b2e8563fc PLSQL/Folding/test/unit/src/org/netbeans/modules/plsql/fold/FoldSearchObjectTest.java --- a/PLSQL/Folding/test/unit/src/org/netbeans/modules/plsql/fold/FoldSearchObjectTest.java Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Folding/test/unit/src/org/netbeans/modules/plsql/fold/FoldSearchObjectTest.java Mon Aug 12 11:26:54 2013 +0530 @@ -7,6 +7,7 @@ import org.junit.Test; import static org.junit.Assert.*; import static org.mockito.Mockito.*; +import org.netbeans.api.editor.fold.FoldType; /** * @@ -18,11 +19,13 @@ public void shouldBeEqualWithAndWithoutBackingFoldObject() { int startOffset = 100; int endOffset = 200; - FoldSearchObject searchObject1 = new FoldSearchObject(startOffset, endOffset); + FoldType foldType = PlsqlFoldTypes.COMMENT; + FoldSearchObject searchObject1 = new FoldSearchObject(startOffset, endOffset, foldType); FoldAdapter fold = mock(FoldAdapter.class); FoldSearchObject searchObject2 = new FoldSearchObject(fold); when(fold.getStartOffset()).thenReturn(startOffset); when(fold.getEndOffset()).thenReturn(endOffset); + when(fold.getFoldType()).thenReturn(foldType); assertEquals(searchObject1, searchObject2); } } \ No newline at end of file diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/src/org/netbeans/modules/plsql/lexer/PlsqlBlockFactory.java --- a/PLSQL/Lexer/src/org/netbeans/modules/plsql/lexer/PlsqlBlockFactory.java Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Lexer/src/org/netbeans/modules/plsql/lexer/PlsqlBlockFactory.java Mon Aug 12 11:26:54 2013 +0530 @@ -2524,6 +2524,10 @@ ts.moveNext(); //Calculate end offset + if(commentEnd.id() == PlsqlTokenId.WHITESPACE ){ + ts.movePrevious(); + commentEnd = ts.token(); + } int endOffset = commentEnd.offset(tokenHierarchy) + commentEnd.length(); return new PlsqlBlock(commentBegin.offset(tokenHierarchy), @@ -3870,7 +3874,7 @@ Token tmp = ts.token(); LOG.log(Level.FINE, "getNextNonWhitespaceForComments, tmp.id()={0}, tmp.text()={1}", new Object[]{tmp.id(), tmp.text().toString()}); while (moveNext) { - if (tmp.id() == PlsqlTokenId.WHITESPACE && "\n".equals(tmp.text())) { + if (tmp.id() == PlsqlTokenId.WHITESPACE && ("\n".equals(tmp.text()) || tmp.text().toString().contains("\n "))) { moveNext = ts.moveNext(); tmp = ts.token(); } else { diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/data/TestComments.apy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PLSQL/Lexer/test/unit/data/TestComments.apy Mon Aug 12 11:26:54 2013 +0530 @@ -0,0 +1,58 @@ +----------------------------------------------------------------------------- +-- +-- Logical unit: <<>> +-- +-- IFS Developer Studio Template Version 2.5 +-- +-- Date Sign History +-- ------ ------ --------------------------------------------------------- +----------------------------------------------------------------------------- + +DEFINE MODULE = <<>> +DEFINE LU = <<>> +DEFINE PKG = <<>> + +PROMPT Creating &PKG SPECIFICATION + +CREATE OR REPLACE PACKAGE BODY &PKG IS + +----------------------------------------------------------------------------- +-------------------- LU SPECIFIC IMPLEMENTATION METHODS --------------------- +----------------------------------------------------------------------------- + + +----------------------------------------------------------------------------- +-------------------- LU SPECIFIC PRIVATE METHODS ---------------------------- +----------------------------------------------------------------------------- + + +----------------------------------------------------------------------------- +-------------------- LU SPECIFIC PROTECTED METHODS -------------------------- +----------------------------------------------------------------------------- + + +----------------------------------------------------------------------------- +-------------------- LU SPECIFIC PUBLIC METHODS ----------------------------- +----------------------------------------------------------------------------- + +PROCEDURE Delete___ ( + objid_ IN VARCHAR2, + remrec_ IN &VIEW%ROWTYPE ) + +IS + key_ VARCHAR2(2000); + key_ VARCHAR2(2000); + type_ intface_header_tab.procedure_name%TYPE; +BEGIN + temp =: NULL; + -- + -- Call to Intface_Util_API.Register_Delete_ removed. + -- Logic is now handled in Intface_Util_API.Drop_IC_Table_ + -- + + key_ := remrec_.intface_name || '^' || remrec_.column_name || '^'; + Reference_SYS.Do_Cascade_Delete(lu_name_, key_); + DELETE + FROM intface_detail_tab + WHERE &OBJID = objid_; +END Delete___; diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/data/expected/Dictionary.apy.structure --- a/PLSQL/Lexer/test/unit/data/expected/Dictionary.apy.structure Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Lexer/test/unit/data/expected/Dictionary.apy.structure Mon Aug 12 11:26:54 2013 +0530 @@ -10,25 +10,6 @@ FUNCTION_IMPL CURSOR COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT CURSOR COMMENT CURSOR @@ -63,7 +44,6 @@ COMMENT FOR_LOOP COMMENT -COMMENT IF BEGIN_END COMMENT @@ -73,7 +53,6 @@ COMMENT FOR_LOOP COMMENT -COMMENT IF BEGIN_END COMMENT @@ -146,21 +125,16 @@ IF STATEMENT COMMENT -COMMENT STATEMENT COMMENT -COMMENT -COMMENT STATEMENT COMMENT STATEMENT PROCEDURE_IMPL COMMENT -COMMENT IF IF COMMENT -COMMENT IF STATEMENT IF @@ -170,8 +144,6 @@ IF STATEMENT COMMENT -COMMENT -COMMENT IF IF IF @@ -181,11 +153,8 @@ CURSOR CURSOR COMMENT -COMMENT -COMMENT IF COMMENT -COMMENT IF COMMENT STATEMENT @@ -223,7 +192,6 @@ IF IF COMMENT -COMMENT IF COMMENT COMMENT @@ -238,17 +206,12 @@ CURSOR CURSOR COMMENT -COMMENT -COMMENT IF COMMENT -COMMENT IF COMMENT STATEMENT COMMENT -COMMENT -COMMENT IF FOR_LOOP COMMENT @@ -265,17 +228,12 @@ CURSOR CURSOR COMMENT -COMMENT -COMMENT IF COMMENT -COMMENT IF COMMENT STATEMENT COMMENT -COMMENT -COMMENT IF FOR_LOOP IF @@ -287,13 +245,9 @@ FOR_LOOP COMMENT COMMENT -COMMENT -COMMENT IF IF COMMENT -COMMENT -COMMENT IF COMMENT FOR_LOOP @@ -307,25 +261,14 @@ STATEMENT COMMENT COMMENT -COMMENT IF IF COMMENT COMMENT -COMMENT -COMMENT STATEMENT COMMENT -COMMENT -COMMENT IF COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT IF IF COMMENT @@ -342,8 +285,6 @@ IF IF COMMENT -COMMENT -COMMENT IF COMMENT COMMENT @@ -370,12 +311,6 @@ COMMENT COMMENT COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT IF COMMENT COMMENT @@ -391,54 +326,30 @@ IF IF COMMENT -COMMENT -COMMENT IF COMMENT -COMMENT -COMMENT STATEMENT STATEMENT STATEMENT STATEMENT STATEMENT COMMENT -COMMENT -COMMENT -COMMENT -COMMENT STATEMENT COMMENT -COMMENT -COMMENT -COMMENT +STATEMENT COMMENT STATEMENT COMMENT COMMENT COMMENT COMMENT -STATEMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT PROCEDURE_IMPL CURSOR COMMENT COMMENT -COMMENT -COMMENT -COMMENT -COMMENT -COMMENT FOR_LOOP IF COMMENT -COMMENT -COMMENT PROCEDURE_IMPL PROCEDURE_IMPL PROCEDURE_IMPL diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/data/expected/FndEvent.apy.structure --- a/PLSQL/Lexer/test/unit/data/expected/FndEvent.apy.structure Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Lexer/test/unit/data/expected/FndEvent.apy.structure Mon Aug 12 11:26:54 2013 +0530 @@ -215,10 +215,6 @@ IF COMMENT COMMENT -COMMENT -COMMENT -COMMENT -COMMENT FOR_LOOP COMMENT COMMENT diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/data/expected/IdentityPayInfo.apy.structure --- a/PLSQL/Lexer/test/unit/data/expected/IdentityPayInfo.apy.structure Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Lexer/test/unit/data/expected/IdentityPayInfo.apy.structure Mon Aug 12 11:26:54 2013 +0530 @@ -225,7 +225,6 @@ COMMENT IF COMMENT -COMMENT IF COMMENT IF @@ -281,7 +280,6 @@ IF IF COMMENT -COMMENT IF PROCEDURE_IMPL CURSOR @@ -292,7 +290,6 @@ FOR_LOOP STATEMENT COMMENT -COMMENT IF PROCEDURE_IMPL CURSOR diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/data/expected/ScorecardInputValue.apy.structure --- a/PLSQL/Lexer/test/unit/data/expected/ScorecardInputValue.apy.structure Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Lexer/test/unit/data/expected/ScorecardInputValue.apy.structure Mon Aug 12 11:26:54 2013 +0530 @@ -704,8 +704,6 @@ PROCEDURE_IMPL CURSOR COMMENT -COMMENT -COMMENT FUNCTION_IMPL CURSOR PROCEDURE_IMPL @@ -716,11 +714,9 @@ IF IF COMMENT -COMMENT FOR_LOOP LOOP COMMENT -COMMENT IF IF IF @@ -822,7 +818,6 @@ IF COMMENT COMMENT -COMMENT FOR_LOOP COMMENT IF @@ -863,14 +858,9 @@ CURSOR CURSOR COMMENT -COMMENT -COMMENT -COMMENT -COMMENT IF COMMENT COMMENT -COMMENT IF IF IF @@ -896,9 +886,6 @@ COMMENT COMMENT COMMENT -COMMENT -COMMENT -COMMENT IF COMMENT COMMENT @@ -909,9 +896,6 @@ COMMENT COMMENT COMMENT -COMMENT -COMMENT -COMMENT IF COMMENT COMMENT diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/data/expected/TestComments.apy.structure --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PLSQL/Lexer/test/unit/data/expected/TestComments.apy.structure Mon Aug 12 11:26:54 2013 +0530 @@ -0,0 +1,8 @@ +COMMENT +COMMENT +COMMENT +COMMENT +COMMENT +PROCEDURE_IMPL +COMMENT +STATEMENT diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/data/expected/Trainer.apy.structure --- a/PLSQL/Lexer/test/unit/data/expected/Trainer.apy.structure Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Lexer/test/unit/data/expected/Trainer.apy.structure Mon Aug 12 11:26:54 2013 +0530 @@ -89,8 +89,6 @@ STATEMENT COMMENT COMMENT -COMMENT -COMMENT PROCEDURE_IMPL PROCEDURE_IMPL IF diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/data/expected/sys_IalObjectSlave.apy.structure --- a/PLSQL/Lexer/test/unit/data/expected/sys_IalObjectSlave.apy.structure Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Lexer/test/unit/data/expected/sys_IalObjectSlave.apy.structure Mon Aug 12 11:26:54 2013 +0530 @@ -23,7 +23,6 @@ COMMENT PROCEDURE_IMPL COMMENT -COMMENT PROCEDURE_IMPL CURSOR IF diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/data/expected/test2.apy.structure --- a/PLSQL/Lexer/test/unit/data/expected/test2.apy.structure Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Lexer/test/unit/data/expected/test2.apy.structure Mon Aug 12 11:26:54 2013 +0530 @@ -41,13 +41,11 @@ IF COMMENT COMMENT -COMMENT IF COMMENT IF COMMENT COMMENT -COMMENT IF IF IF @@ -116,21 +114,18 @@ IF IF COMMENT +IF COMMENT IF +IF +IF +IF +IF +IF +IF COMMENT COMMENT IF -IF -IF -IF -IF -IF -IF -COMMENT -COMMENT -IF -COMMENT COMMENT COMMENT FOR_LOOP diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/data/expected/txtser.ins.structure --- a/PLSQL/Lexer/test/unit/data/expected/txtser.ins.structure Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Lexer/test/unit/data/expected/txtser.ins.structure Mon Aug 12 11:26:54 2013 +0530 @@ -8,6 +8,4 @@ COMMENT IF COMMENT -COMMENT -COMMENT IF diff -r f9493e34684d -r e10b2e8563fc PLSQL/Lexer/test/unit/src/org/netbeans/modules/plsql/lexer/PlsqlBlockFactoryTest.java --- a/PLSQL/Lexer/test/unit/src/org/netbeans/modules/plsql/lexer/PlsqlBlockFactoryTest.java Mon Aug 12 10:50:10 2013 +0530 +++ b/PLSQL/Lexer/test/unit/src/org/netbeans/modules/plsql/lexer/PlsqlBlockFactoryTest.java Mon Aug 12 11:26:54 2013 +0530 @@ -568,6 +568,28 @@ } } + @Test + public void testForComments() throws IOException, BadLocationException { + System.out.println("Test for Comment blocks "); + final String plsqlFileName = "TestComments.apy"; + FileObject fileObject = fs.getRoot().createData(plsqlFileName); + assertNotNull(fileObject); + try { + PlsqlBlockFactory blockFac = loadAsTmpFile(fileObject, plsqlFileName); + assertNotNull(blockFac); + + List lstBlockFac = blockFac.getBlockHierarchy(); + //printHierarchy(lstBlockFac, ""); + //assertEquals(2, lstBlockFac.size()); + processBlocks(plsqlFileName, lstBlockFac); + + } finally { + if (fileObject != null) { + fileObject.delete(); + } + } + } + private PlsqlBlockFactory loadAsTmpFile(FileObject fileObj, String fileName) throws IOException, BadLocationException { InputStream inputStream = new FileInputStream(new File(getDataDir(), fileName));