Extreme Java When vanilla Java is not enough

11Mar/071

The quest for the Java Portal – inside Liferay, ep. 1

Liferay is running slowly on my JBoss server, crashes lots of times, but works. I have decided to play with its source code, maybe optimizing here and there. NetBeans Profiler is perfect for this job, but Liferay was written with Eclipse. NetBeans project importer worked, but it didn't help, because the Liferay source structure is monolithic. Since I had some free time this weekend, I'm manually converting the project. I converted about 15%, but look what I found so far:

  • Tab size = 8. This is a HUGE tab size. Usually Java projects use 4. But this is a matter of taste.
  • Actually, this is what I didn't found: documentation. No JavaDocs on classes I opened. I don't know how they can work on classes without any documentation. I always forget the use of any class I don't open often... :)
  • Lots of third part libraries. And I'm not talking about the classic ones (like commons-logging). I found things like EasyConf (looks like Java Preferences API), OSCache (object cache that works on cluster environments) and Trone (yet another Collections framework). This explains the need for a bigger PermSize.

Liferay is a great product, but it really needs a good cleanup. Some of their optimization tricks creates overheads, like using Colt (yet another Collections framework - yes, they have TWO different YACF). Colt have some "sync collections" that works using the same synchronization principle as Hashtable and Vector. The question is: why they leave synchronization to the collection? What about using the "synchronized(xxx)" structure?

I will follow GrOG's tip (in last blog's comments): report my discoveries to the community. I preferred to report only after deciding which Portal I will use, but the decision is taking me too deep on each implementation I'm testing.

11Sep/060

NetBeans Code Folding

Tired of lose the fight against NetBeans MDR stuff, I decided to check out Code Folding. Pretty easy, indeed. I haven't done a full code fold example, but I was able to use NB 'editor-fold' pseudo-tag. Considering that you have the syntax support (see NBP Tutorials), the steps are:

  1. The first step is not obvious, but it is the most important step. Without it, you will never activate folding (this was hard to find out - like any other "non-layer.xml" stuff). On your SettingsInitializer, you need to add this line:
    settingsMap.put(SettingsNames.CODE_FOLDING_ENABLE, Boolean.TRUE);
  2. Next, we need to tell CustomFold which tokens it must use to find the pseudo-tag. On your EditorKit, you need to implement the SyntaxUpdateTokens class and put it as a document property. Like this:
    public class MyEditorKit extends NbEditorKit {
      [ ... ]
     
      protected void initDocument(BaseDocument doc) {
        doc.putProperty(SyntaxUpdateTokens.class, new SUT());
      }
     
      public class SUT extends SyntaxUpdateTokens {
        private List list;
     
        public void syntaxUpdateStart() {
          list = new ArrayList();
        }
     
        public List syntaxUpdateEnd() {
          return list;
        }
     
        public void syntaxUpdateToken(TokenID tid, TokenContextPath tcp,
                                      int offset, int len) {
          if (tokenID == MyTokenContext.LINE_COMMENT) {
            list.add(new TokenInfo(tid, tcp, offset, len));
          }
        }
      }
    }
  3. This is a weird step. I don't know why there's no ready-to-go class to do this job. You need to create a three-line class to add the sidebar to the editor:
    public class MyFoldingSideBarFactory implements SideBarFactory {
      public JComponent createSideBar(JTextComponent jTextComponent) {
        return new CodeFoldingSideBar(jTextComponent);
      }
    }
  4. Now, glue everything in your layer.xml, under "Editor/MIME" folder:
    <folder name="SideBar">
      <file name="mypkg-MyFoldingSideBarFactory.instance"/>
      <attr name="org-netbeans-editor-GlyphGutter.instance
            /mypkg-MyFoldingSideBarFactory.instance"
            boolvalue="true"/>
    </folder>
    <folder name="FoldManager">
      <file name="org-netbeans-editor-CustomFoldManager$Factory.instance"/>
    </folder>

Small note: implementations of FoldManager can be chained, just like the SideBar. Making it easy to add a "real" code fold based on tokens.

9Sep/060

First post – current misson brief

This is the first post. I don't have any ready tip yet, but I'll post my "current mission":

I'm trying to understand how to add a new language to NetBeans. I want everything Java Editor has: Code Completion, Code Folding, etc. In theory, it's simple: I just need to add editor support and create a metamodel to feed other subsystems.

The first part is well explained on NetBeans Platform web site (actually, it's incredibly simple to add syntax highlight), but there aren't good docs about how the "Java Language Model" works on NB.

And now my problem: I've created a metadata repository using NetBeans' MDR stuff, but I simply do not know how to populate the repository using source files (and how to create source files from the repository).

Filed under: NetBeans No Comments