This plug-in project demonstrates the implementation and use of an external design analysis.

How would you go about creating an external analysis?

First, create a family.  Analyses must exist in the context of a family.  A family
that declares the analysis here is in families/NiftyFamily.java.

In order to tell Acme about this family, one has to register the family in the plugin.xml
using the org.acmestudio.acme.FamilyDirectory extension point. By adding the 
plugin-relative path "families" to this extension point as a contributor,
AcmeStudio knows to scan this folder (the plugin-relative "families" folder) and 
load any Acme files declared therein.

Now, look again at the family.  The line to pay attention to at this step is the line:

external analysis niftyAnalysis( a : element, b: element) : boolean = 
	org.acmestudio.example.externalanalysis.NiftyAnalysis;
	
the "external" keyword tells Acme that the implementation of the analysis is a java file.
Then, there is the declaration of the types that are the arguments and return type of the
analysis. Finally, after the "=", there is the fully-qualified class name of the class
that implements the external design analysis.

Unfortuantely, in the Eclipse world, one cannot simply do Class.forName() and expect it
to work.  Therefore, we must politely inform eclipse of the existence of the class that
implements IExternalAnalysisExpressionNode.

This is accomplished in the plugin.xml. Specifically, one creates an extension
against the org.acmestudio.acme.ExternalDesignAnalysis extension point.
Then, one adds an analysis, so that the external analysis class is the same
fully-qualified java name of the class.

There is exactly one java file: NiftyAnalysis.java.  This code demonstrates the 
implementation  of an IExternalAnalysisExpressionNode to do a simple name comparison of
the names of the elements.  If one name is the reverse of the other, it returns true - 
e.g. "abc" and "cba" are opposites in this way, and would result in an evaluation to true.).

Once put all together, these demonstrate typechecking with an external analysis.  If you 
create a new system that exteds NiftyFamily, you inherit the rule niftyRule.
Then, you can see that it will not typecheck until you add a component and connector with
names reversed from one another.