The important thing about a "framework" is that it is incomplete, and can do nothing on its own. You need to add your own code to it, build some sort of application using it, to get anything done. Thus, for example: Struts, JavaMail, Hibernate,
JSP etc. may be considered as frameworks.
A "tool", on the other hand, is usable directly. You may need to configure it, but you don't need to write code. Example tools might be Ant, XDoclet,
Tomcat etc.
There is a "gray area" between "tool" and "application". A tool might be considerd as an apppplication you use to get your job done.
"Engine" is the most vague term of the bunch. I have seen it used to describe both tools and frameworks. I have a feeling that it is often used to try and imply some sort of internal (hidden?) complexity or power. So for example Jess is described as an "engine" although to my mind it looks more like a framework. I guess if you wanted to you could describe Struts as a "web site engine". Sounds a bit pompous, somehow.