Table of Contents

PADL

PADL stands for Pattern and Abstract-level Description Language. It is a meta-model to describe programs at different levels of abstractions.

Levels of Models

There are four different levels of abstractions to model programs, collectively called abstract-level models:

The following diagram shows the hierarchy of the interface describing models. (This hierarchy has been built using the project Ptidej UI Viewer Standalone Swing.) The root of the models is the interface IAbstractModel, which describes any model that could be handled by most of Ptidej analyses and tools. This interface abstracts IAbstractLevelModel, which represents models of programs, and IDesignMotif, which represents models of design motifs.

Abstract Models

The PADL project also provides the interfaces:

Binary Class Relationships

The PADL meta-model includes an extensive hierarchy of interfaces to describes binary class relationships. The following figure highlights these relationships. (This hierarchy has been built using the project Ptidej UI Viewer Standalone Swing.) Of particular interest are the following relationships, presented in order from the most constraining to the least constraining. Whenever a relationship is identified between two entities, the following least constraining relationships are not included. For example, if an aggregation relationships exists between two classes A and B, no corresponding use relationship would exist:

Relationships

The existence of binary class relationships is inferred from an ICodeLevelModel based on the presence of certain fields and methods and method invocations in classes by the padl.analysis.repository.AACRelationshipsAnalysis.

Generators and Walkers

The PADL meta-model provides you with two distinct but related visitors: padl.visitor.IGenerator and padl.visitor.IWalker. Both visitors inherit from padl.visitor.IVisitor but provide different methods to retrieve the results of the visit: getCode() and getResult(), respectively. A typical example of using one of these visitors is:

final IWalker walker = new InheritanceImplementationCounter();
final ICodeLevelModel codeLevelModel =
     Primitive.getFactory().createCodeLevelModel("");
codeLevelModel.create(
    new CompleteClassFileCreator(
        DefaultFileRepository.getInstance(),
        new String[] { path },
        true));
final IIdiomLevelModel idiomLevelModel =
   (IIdiomLevelModel) new AACRelationshipsAnalysis().invoke(codeLevelModel);

walker.reset();
idiomLevelModel.walk(walker);
System.out.println(walker.getResult());

Obviously, the class padl.creator.classfile.test.creator.InheritanceImplementationCounter implements padl.visitor.IWalker.

Method Invocations

As part of an effort to improve code representation in PADL. The concept of method invocation has been added since 2004-2005. An interface padl.kernel.IMethodInvocation represents method invocations. This concept is as-of-today not quite clean and is used to describes both method invocations and field accesses. Therefore, the interface padl.kernel.IMethodInvocation (and its reference implementation) includes:

Names and Paths

The getName() always returns the simple name of a constituent. For binary-class relationships and method invocations, the name returned by getName() is less important, it could simply be Method Invocation, for example. For a first-class entity, though, it is important, for example getName() returns IConstituent for padl.kernel.IConstituent. Here are other examples of getName() values:

The paths are used to name and address each constituent uniquely within a model but consistently across models. The paths start with a '/' and the name of the model. Then, it includes the name, as in getName(), of each constituent to go through until the name of the current constituent is reached. Here are some examples of getPath() values:

The class padl.path.Finder in the PADL project can be used to walk the paths.