Archive for the ‘Java’ Category

The rule of thumb

Posted on January 3rd, 2008 in EN, Java, Tools | 1 Comment »

If you may configure something using Spring — never ever try to configure the same thing with Hibernate.

Sorry, Gavin.

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • Reddit
  • Scoopeo

Playing around with IntelliJ IDEA 7

Posted on October 30th, 2007 in EN, Java, Tools | 1 Comment »

There is something charming in those small things IDE developers make for us.

idea7-lookup.png

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • Reddit
  • Scoopeo

Source code inspection framework wanted

Posted on June 11th, 2007 in C#, EN, Ideas, Java | No Comments »

Another example of problem similar to hashCode() mutability is an option for broken «consistent with equals» contract imposed by implementation of java.util.TreeSet while implementing java.util.Comparator.

Actually, both of these cases (as well as a numerous others) are just an evidence of much wider problem - the requirement to follow some kind of contract various infrastructure implementations rely on and lack of ability to validate/impose such a constraints using existing IDEs and tools. The basic of this is the fact no IDE vendor can track an implementations of an infrastructure libraries existing (the best support feasible to achieve is Microsoft-style solution: an inspection for .Net framework libraries embedded into Visual Studio) and thus creating inspections “by reaction” will always loose the battle.

The best way to avoid the gap between software component and the inspections is to eliminate the “broken phone” between the software developer, the documentation developer and the inspections developer. This presents an «inspection by creator» paradigm - inspections are developed in parallel with a software component (and in ideal case by the the same software developer), embedded within the component, and shipped with it.

Summarizing the basic requirements for such a framework:

  • Development simplicity: the inspection language should provide a way to create an inspections in declarative manner, rather than by reflection-style coding.
  • Lexical compliance: the inspections declaration language should be close enough to the syntax of programming language constructs inspections apply to (thus, there should coexist inspections framework implementations of the common functionality for the different platforms like Java and .Net and different per programming language extensions on the same platform like C# and VB.Net).
  • Multiple inspection sources: there should be and option for predefined inspections (shipped with the framework), vendor inspections (developed and shipped with particular software component) and ad-hoc custom inspections (in-house development of software component users).
  • Binding: there should be a way to associate the inspections with the related code structures (classes, methods, fields and properties) and ideally — keep and maintain them within the code.
  • Universality: inspections should be applied in «to subject» and «to object» manners (i.e. relate to the code structure associated with the inspection or to the code caller).

Upon meeting the two first requirements the last three can be easily accomplished by using existing standard mechanisms like annotations and attributes.

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • Reddit
  • Scoopeo

Back to hashCode() mutability

Posted on May 29th, 2007 in C#, EN, Java, Tools | 4 Comments »

My «HashSet.contains(): does your basket contain something?» post got too expected responses: «There is no way to avoid this behavior, why should you expect something else?».

Sure this behavior can not be changed — it’s in nature of any hashed collection. I do not expect anyone to tilt at windmills. What I do expect is, first, ensure I will never stuck with this bug again and, second, prevent others from falling into the same trap. And this is definitely the point I expect the software vendors to help me.
Let’s look one more into the root of the problem: hash code should not be mutable while the entity exists in the collection. Actually, since we can newer be sure it does not, the hash code should never change since the entity was created. Thus, hash code calculation should be independent of object state, i.e. of its mutable fields.

Thus, the following suspicious code patterns should get a special attention in this context (I’ll generally use Java notation, the C# variation is trivial):

  • Mutable hash code: hashCode() accesses fields that are not final, or calls methods that access fields that are not final or call methods that… and so on.
  • Using overridden hashCode(): an instance of class with overriden hashCode() is added into hash-based collection (or one of its interfaces). More general - to any collection instance.
  • Broken contract: hashCode() and equals() do not access the same fields or do not call the same methods (that do not access the same fields… and so on).

What can prevent or warn us about the patterns mentioned?

  • Language level: not really can be taken into account, since providing language-level object identity is almost equal to just forbidding hashCode() override.
  • C# 3.0 anonymous classes make use of similar approach - the hash code of an object is immutable since both equals() and getHashCode() are compiler generated and both fields and properties are read-only.

  • Compiler warning level: may be nice, also implementing recursive method inspection will require new paradigms definition and will add unnecessary complexity. In addition, this require implementing this functionality separate for each platform language.
  • Code inspection: the most desirable option that should act at bytecode level and can be easily integrated into existing IDEs.
  • IntelliJ IDEA 6 inspections list presents a good inspection for mutable hashcode, and something not so powerful for broken contract.

This small and annoying point is just a tiny part of features missing from existing IDEs (expected to provide developer with an ability to concentrate on application business logic development rather than on language or infrastructure implementation details).

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • Reddit
  • Scoopeo

My private IDE war : small things make a big difference.

Posted on December 11th, 2006 in EN, Java, Tools | 7 Comments »

For the last three years I need to develop in both Java and C# side-by-side, which means almost simultaneous work with different IDEs. Thus the simple and intuitive interface is a must for keeping a productivity pace. And probably the most used and critical feature is a hot key shortcuts for navigating, debugging, refactoring and so on.
Ideally, I’d like to have the same hot key scheme in all my IDEs, so there will be no need to learn and remember how to do the same things twice.
I’m usually working with three commons: VisualStudio 2005, Easy Eclipse and IntelliJ IDEA.
So, what are the offerings?

  • Visual Studio 2005
    “Options -> Keyboard” dialog offers you eight different hot key mapping possibilities that can suite almost anyone used to work with Microsoft tools once. No surprise here: Microsoft, as usual, cares about “their” developers only, but provides a perfect solution.
    Visual Studio 2005 key mappings
  • IntelliJ IDEA 4.5
    “IDE Settings -> Keymap” has four built in possibilities including Mac OS X and Visual Studio schemes. Mac OS X scheme is nice, Eclipse bindings seems to be missing, but Visual Studio is surprising: “wow, they even remember about those migrating from .Net to Java!”. I did not check the later versions, but its probably not worse.
    Intellij IDEA key mappings
  • Easy Eclipse 1.2.1
    “Preferences -> General -> Keys” gives a two possibilities: default and emacs. These guys do not care about anyone using any tool other that their own? Don’t worth a screenshot.
    The most annoying thing is that they do think about this feature: Eclipse has a quick assistance for a hot keys, creating and modifying key bindings is an issue, developers complain about feature weakness and still nothing is done.

The very sad bottom line is: do not expect extra attention to your needs unless you pay…

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • Reddit
  • Scoopeo

HashSet.contains(): does your busket contain something?

Posted on October 1st, 2006 in EN, Java | 4 Comments »

When you put some good into your supermarket basket, you really suppose it will stay there, don’t you? Well, we’re living inside materialistic world. All of us, except Java programmers.

Consider the following Entity class:

public static class Entity {
   private String _name;
   private int _count;
 
  public Entity(String name, int count) {
    _name = name;
    _count = count;
  }
 
  public void setName(String name) {
    _name = name;
  }
 
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) 
      return false;
 
    final Entity entity = (Entity) o;
 
    if (_count != entity._count) return false;
    if (_name != null ? !_name.equals(entity._name) : entity._name != null) 
      return false;
 
    return true;
  }
 
  public int hashCode() {
    int result;
    result = (_name != null ? _name.hashCode() : 0);
    result = 29 * result + _count;
    return result;
  }
}

Let’s store our entity into various Java collections instances, both implementing Set interface:

Set<Entity> hashSet = new HashSet<Entity>();
Set<Entity> arraySet = new CopyOnWriteArraySet<Entity>();
 
Entity e = new Entity(�OldName�, 5);
 
hashSet.add(e);
arraySet.add(e);

Now, let’s see whenever the previously stored entity is still inside the collections:

// returns true
System.out.println(arraySet.contains(e));
// returns true
System.out.println(hashSet.contains(e));

Now, a simple mutation, changing an entity name:

e.setName(�NewName�);

And, voila � now the entity is still in ArraySet, but not in TreeSet:

// returns true
System.out.println(arraySet.contains(e));
// returns false
System.out.println(hashSet.contains(e));

This looks like a quite stupid bug from the first time, but googling aroung brings an answer: TreeSet implementation uses hashCode() and not equals() for storing and retrieving entities, thus TreeSet requires hashCode() of contained entity to be immutable!

Presonally I think it’s too smart to be good, but, let’s say “the big brother knows beter”. The really annoying thing is that the request for proper documentation of this feature was initially issued for Java 1.3.1 at 16 May, 2001 and nothing was done since that.

Shame on you, Sun Microsystems…

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • Reddit
  • Scoopeo

Bytecode viewer tools: Jclasslib vs Classfile Inspector.

Posted on August 24th, 2006 in EN, Java, Tools | No Comments »

Comparison overview of bytecode viewer applications Jclasslib Bytecode Viewer 3.0 by ej-technologies and Classfile Inspector 2.0 by Industrial Software Technology.

Introduction

Recently I faced with a need to inspect a Java bytecode in order to create a tests for bytecode processing application. Googling around showed that the market of the bytecode viewers is narrow and actually there is no large variety of possibilities to choose from.

Viewing Java bytecode generated from the Java source is not too common task for most Java developers, so the choice of the tools in this area is quite narrow. In addition to the bytecode viewers discussed here I’ve found the following additional tools:

Feature comparison table

Jclasslib Bytecode Viewer 3.0 Classfile Inspector 2.0
General
Pricing Free 10�-99� per license (depends on license amount), free for students and
teachers
License GPL Commercial
Supported platforms Windows, Linux, Unix, Mac OS X 10.1/2 Windows, Linux and others (as plugin)
Installation Platform-specific installation package Jar file. Requires write privileges
Available plugins NetBeans module Eclipse 3.1 (and higher) plugin
Standalone version Yes No
Java versions supported 1.5 1.5
Usability Works smoothly Changing default output directory breaks an ability of viewing *.class file corresponding to java source
Features
Presentation Application windows Text file
Bytecode hierarchy presentation Application window “Outline” Eclipse view
Hierarchy link with bytecode editor Yes Yes
Viewing standalone *.class files No Yes
Exploring *.jar files Yes Yes
Binary data presentation No Yes
Bytecode presentation Yes. Separate presentation for each type (methods, fields, exceptions etc.) Yes. All-in-one text file containing binary data, bytecode instruction presentation and source code
Java source presentation No If available in project
Bytecode decompilation No No
Bytecode modification No Yes
Bytecode validation No No
Links inside bytecode Yes No
Export Method bytecode instructions can be copied to clipboard As any text file

Pros and cons

Jclasslib Bytecide Viewer 3.0
Pros:

  • Availability as a standalone application
  • Links inside bytecode presentation

Cons:

  • Limited export ability
  • No binary data presentation
  • No source code presentation

Classfile Inspector 2.0
Pros:

  • Eclipse integration
  • Mixed binary, instructions and java source presentation
  • Bytecode modification

Cons:

  • No available as standalone application
  • Limited usability

Summary

Classfile Inspector 2.0 is a very powerful bytecode viewer application, with good presentation features, giving an ability of inspecting bytecode created by compiler as a derivative of java source code. This provides a user with an opportunity to understand deeply the way bytecode is generated and the affects of different coding decisions on actual code execution. It looks to be an ultimate helper for anyone teaching or studying Java. The main application disadvantage is its tight binding to Eclipse platform, making it almost useless for those working with any other Java IDE.

Jclasslib Bytecide Viewer 3.0 is a good tool for developer that needs just an inspection view on the jar files containing bytecode created, with no ability to modify it or to follow the influence of source code changes on the bytecode generated. Plugins for IDEs other that NetBeans would be nice, even it always can be used as a standalone application.

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • Reddit
  • Scoopeo

A programming language pattern idea.

Posted on July 21st, 2005 in C#, EN, Ideas, Java | 2 Comments »

How many times have you seen somebodys code that acts like following:

public class ClassA
{
    private string _myPropertyContainer;
 
    public string MyProperty {
        get { return _myPropertyContainer; }
        set {
            doSomething1();
            _myPropertyContainer = value;
        }
    }
}

I guess it was at least more than a couple of times, including the code of your own. And if you ask the programmer: “Why did you choose to access (or even worse, modify) private member instead of property?” � his answer with 99.99% probability will be “I don’t want the code inside the property getter or setter to be involved here. I just want to access/change the private member value.” And if you ask “Don’t you think this is a symptom of bad design”, you’ll get an answer “Not at all, the overall design is perfect, only this one little thing does not suit into it. It’s ok.”

Thus, everybody understand this is one of the worst thing you can do to your code, but everybody continue doing it. Why do you think people do this? No, this is not because they are bad designers. No this is not because they don’t think that writing error-prone and maintainable code is no important. People do this because they can do.

Yes, I meant that. People write code as bad as language and compiler permit them. If the compiler was able to restrict the access to private member _myPropertyContainer from the Method method, the programmer was investigating more time in design and was creating more clean code.

You may think I’m stupid. What does it mean “have no access to private members”? There is no such a thing! Yes, you’re right. There is no such a thing. But I want it.

Let’s illustrate my basic idea:

public class ClassA
{
    public void ClassA(string s) {
        MyProperty.container = s;
    }
 
    public string MyProperty {
     get { return container; }
     set {
           doSomething1();
           container = value;
        }
    }
}

What does this piece of code changes? Note the private member _myPropertyContainer declaration has moved into MyProperty declaration. And I want that from now on _myPropertyContainer will not be visible for any class members except MyProperty.get and MyProperty.set. That is, if someone tries to access _myPropertyContainer from doSomething(), he will receive a compilation error. Thus a feature proposed will prevent a programmer from making a stupid mistakes by accessing a private member instead of the property.

Now lets take look on the paradigm proposed. First, if we want all of our properties to define a private member, we do not need to define this members at all � let compiler to perform this task instead of us.

public class ClassA
{
    public string MyProperty {
        get { return container; }
        set {
            doSomething1();
            container = value;
        }
    }
}

The piece of code above illustrates this approach: if you want to save a value as a private property member, you can use a special value container which corresponds to it. Of course, at the compile time each reference to this value is replaced by reference to actual property private member. If the container value never used inside property code, that means we have a read-only or calculated property. In this case compiler have no reason to generate private property member since it never used.
Sounds good? Yes, but not good enough. Sometimes you really need to access a private member, mostly in constructor when you want to initialize the property the the default value and any access to property set will change the object state (and, in general, the object is not fully initialized yet). So the second point is to enable an access to private property member from constructor, exactly as done for read only members.

public class ClassA
{
    public void ClassA(string s) {
        MyProperty.container = s;
    }
    public string MyProperty {
        get { return container; }
        set {
            doSomething1();
            container = value;
        }
    }
}

Now the picture is complete. MyProperty has a full access to its auto generated private member through container value. No one else from class members has an access to this property except constructor. Constructor accesses a private members by denoting them as MyProperty.container, so there is no ambiguity here.

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • Reddit
  • Scoopeo

Following in Herakles footsteps

Posted on July 6th, 2005 in EN, Grasshopper, Java | No Comments »

And next again she [Ekhidna] bore the unspeakable, unmanageable Kerberos, the savage, the bronze-barking dog of Hades, fifty-headed, and powerful, and without pity.

Hesiod, Theogony 310.

This week I’m playing with adding a Kerberos authentication into DirectoryServices. It seems that I’ll need to make some changes in Novell.Directory.Ldap architecture, so both handshaking initialization and response processing will fit into current flow.

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • Reddit
  • Scoopeo

The birth of new cross-platform technology

Posted on May 22nd, 2005 in .Net, EN, Grasshopper, Java | No Comments »

Mainsoft launched Developer Zone site, featuring Visual MainWin for J2EE — a Visual Studio .NET plug-in, which enables you use C# or VB.NET to develop, debug and deploy Web applications and Web services that run on Microsoft Windows, Linux and any Java-enabled platform. Grasshopper supports single-source code development, so you can develop an ASP.NET application that will compile and run on multiple platforms.

In addition, this new technology provides you with ability to consume pure Java software components, such as EJB’s, JDBC drivers etc., so you can call you Java components directly from C# code of your application.
This is definitely a new generation of cross-platform interoperability technology.

Grasshopper, the Developer edition of Visual MainVin for J2EE, is available for download from the Mainsoft Developer Zone site. Grasshopper bundles the Apache Tomcat application server and PostgreSQL database, so you get a complete cross-platform Visual Studio development environment for any platform running Apache Tomcat.

Grasshopper presents the following key feature points :

  • Visual Studio integration: it completely suits into VisualStudio environment, so you continue enjoying the full range of the Visual Studio .NET capabilities. Even more, it extends them into Java components, so advanced features like IntelliSense, code navigation and error detection are available when accessing Java components. Additional feature is a cross-platform debugger, which provides you and ability to debug both of your C# and Java code within the same application. In addition, Grasshopper help system integrates into MSDN collection of books and provides support for search, index, content, and dynamic help. Futhermore, Grasshopper provides a new MSDN book that describes the Java runtime classes and interfaces.
  • Access to external Java components: you can access external Java components with no depend of the Java environment they were initially developed. You can add JARs as a references to your C# or VB.NET project, accessing them as any other software components available in your application.
  • Open source .NET framework: Grasshopper provides the .NET Framework class library , implementing ASP.NET, ADO.NET, XML, Web services and .NET server-side runtime services. This .NET Framework sources are shared with Mono, the open source .NET implementation for Linux. The sources are packaged as Visual Studio projects, so you can download the source code, modify it, compile, debug and test the code, all from Visual Studio.

References :

These icons link to social bookmarking sites where readers can share and discover new web pages.
  • Digg
  • del.icio.us
  • Facebook
  • Google
  • Technorati
  • Reddit
  • Scoopeo