Software Architecture with Java