Object-oriented software engineering : using UML, patterns and java.