Package org.modeshape.graph.connector.federation

ModeShape provides a federated connector that is able to access repository content from multiple external systems and make that content look like it exists in a single unified repository.

See:
          Description


Class Summary
FederatedRepositorySource A RepositorySource for a federated repository.
Projection A projection of content from a source into the integrated/federated repository.
Projection.PathRule A rule that is defined with a single path in source and a single path in repository, and which has a set of path exceptions (relative paths below the path in source).
Projection.Rule A rule used within a project do define how content within a source is projected into the federated repository.
ProjectionParser A parser library for projections and projection rules.
 

Package org.modeshape.graph.connector.federation Description

ModeShape provides a federated connector that is able to access repository content from multiple external systems and make that content look like it exists in a single unified repository. Like other connectors, a RepositorySource implementation is provided, called FederatedRepositorySource, that can be set up and configured to be used by a Graph or a JCR repository.

Projections

Each federated repository source provides a unified repository consisting of information that is dynamically federated from multiple other RepositorySource instances. The connector is configured with a number of projections that each describe where in the unified repository the federated connector should place the content from another source. Projections consist of the name of the source containing the content and a number of rules that define the path mappings, where each rule is defined as a string with this format:

       pathInFederatedRepository => pathInSourceRepository
 

Here, the pathInFederatedRepository is the string representation of the path in the unified (or federated) repository, and pathInSourceRepository is the string representation of the path of the actual content in the underlying source. For example:

       / => /
 

is a trivial rule that states that all of the content in the underlying source should be mapped into the unified repository such that the locations are the same. Therefore, a node at /a/b/c in the source would appear in the unified repository at /a/b/c. This is called a mirror projection, since the unified repository mirrors the underlying source repository.

Another example is an offset projection, which is similar to the mirror projection except that the federated path includes an offset not found in the source:

       /alpha/beta => /
 

Here, a node at /a/b/c in the source would actually appear in the unified repository at /alpha/beta/a/b/c. The offset path (/alpha/beta in this example) can have 1 or more segments. (If there are no segments, then it reduces to a mirror projection.)

Often a rule will map a path in one source into another path in the unified source:

       /alpha/beta => /foo/bar
 

Here, the content at /foo/bar is projected in the unified repository under /alpha/beta, meaning that the /foo/bar prefix never even appears in the unified repository. So the node at /foo/bar/baz/raz would appear in the unified repository at /alpha/beta/baz/raz. Again, the size of the two paths in the rule don't matter.

Multiple Projections

Federated repositories that use a single projection are useful, but they aren't as interesting or powerful as those that use multiple projections. Consider a federated repository that is defined by two projections:

       / => /                         for source "S1"
       /alpha => /foo/bar             for source "S2"
 

And consider that S1 contains the following structure:

      +- a
      |  +- i
      |  +- j
      +- b
         +- k
         +- m
         +- n
 
and S2 contains the following:
      +- foo
         +- bar
         |  +- baz
         |  |  +- taz
         |  |  +- zaz
         |  +- raz
         +- bum
            +- bot
 

The unified repository would then have this structure:

      +- a
      |  +- i
      |  +- j
      +- b
      |  +- k
      |  +- m
      |  +- n
      +- alpha
         +- baz
            +- taz
            |  +- zaz
            +- raz
 

Note how the /foo/bum branch does not even appear in the unified repository, since it is outside of the branch being projected. Also, the /alpha node doesn't exist in S1 or S2; it's what is called a placeholder node that exists purely so that the nodes below it have a place to exist. Placeholders are somewhat special: they allow any structure below them (including other placeholder nodes or real projected nodes), but they cannot be modified.

Even more interesting are cases that involve more projections. Consider a federated repository that contains information about different kinds of automobiles, aircraft, and spacecraft, except that the information about each kind of vehicle exists in a different source (and possibly a different kind of source, such as a database, or file, or web service).

First, the sources. The "Cars" source contains the following structure:

      +- Cars
         +- Hybrid
         |  +- Toyota Prius
         |  +- Toyota Highlander
         |  +- Nissan Altima
         +- Sports
         |  +- Aston Martin DB9
         |  +- Infinity G37
         +- Luxury
         |  +- Cadillac DTS
         |  +- Bentley Continental
         |  +- Lexus IS350
         +- Utility
            +- Land Rover LR2
            +- Land Rover LR3
            +- Hummer H3
            +- Ford F-150
 

The "Aircraft" source contains the following structure:

      +- Aviation
         +- Business
         |  +- Gulfstream V
         |  +- Learjet 45
         +- Commercial
         |  +- Boeing 777
         |  +- Boeing 767
         |  +- Boeing 787
         |  +- Boeing 757
         |  +- Airbus A380
         |  +- Airbus A340
         |  +- Airbus A310
         |  +- Embraer RJ-175
         +- Vintage
         |  +- Fokker Trimotor
         |  +- P-38 Lightning
         |  +- A6M Zero
         |  +- Bf 109
         |  +- Wright Flyer
         +- Homebuilt
            +- Long-EZ
            +- Cirrus VK-30
            +- Van's RV-4
 

Finally, our "Spacecraft" source contains the following structure:

      +- Space Vehicles
         +- Manned
         |  +- Space Shuttle
         |  +- Soyuz
         |  +- Skylab
         |  +- ISS
         +- Unmanned
         |  +- Sputnik
         |  +- Explorer
         |  +- Vanguard
         |  +- Pioneer
         |  +- Marsnik
         |  +- Mariner
         |  +- Mars Pathfinder
         |  +- Mars Observer
         |  +- Mars Polar Lander
         +- Launch Vehicles
         |  +- Saturn V
         |  +- Aries
         |  +- Delta
         |  +- Delta II
         |  +- Orion
         +- X-Prize
            +- SpaceShipOne
            +- WildFire
            +- Spirit of Liberty
 

So, we can define our unified "Vehicles" source with the following projections:

       /Vehicles => /                                  for source "Cars"
       /Vehicles/Aircraft => /Aviation                 for source "Aircraft"
       /Vehicles/Spacecraft => /Space Vehicles         for source "Cars"
 

The result is a unified repository with the following structure:

      +- Vehicles
         +- Cars
         |  +- Hybrid
         |   |  +- Toyota Prius
         |   |  +- Toyota Highlander
         |   |  +- Nissan Altima
         |   +- Sports
         |   |  +- Aston Martin DB9
         |   |  +- Infinity G37
         |   +- Luxury
         |   |  +- Cadillac DTS
         |   |  +- Bentley Continental
         |  +- Lexus IS350
         |  +- Utility
         |     +- Land Rover LR2
         |     +- Land Rover LR3
         |     +- Hummer H3
         |     +- Ford F-150
         +- Aircraft
         |   +- Business
         |   |  +- Gulfstream V
         |   |  +- Learjet 45
         |   +- Commercial
         |   |  +- Boeing 777
         |   |  +- Boeing 767
         |   |  +- Boeing 787
         |   |  +- Boeing 757
         |   |  +- Airbus A380
         |   |  +- Airbus A340
         |   |  +- Airbus A310
         |   |  +- Embraer RJ-175
         |   +- Vintage
         |   |  +- Fokker Trimotor
         |   |  +- P-38 Lightning
         |   |  +- A6M Zero
         |   |  +- Bf 109
         |   |  +- Wright Flyer
         |   +- Homebuilt
         |      +- Long-EZ
         |      +- Cirrus VK-30
         |      +- Van's RV-4
         +- Spacecraft
            +- Manned
            |  +- Space Shuttle
            |  +- Soyuz
            |  +- Skylab
            |  +- ISS
            +- Unmanned
            |  +- Sputnik
            |  +- Explorer
            |  +- Vanguard
            |  +- Pioneer
            |  +- Marsnik
            |  +- Mariner
            |  +- Mars Pathfinder
            |  +- Mars Observer
            |  +- Mars Polar Lander
            +- Launch Vehicles
            |  +- Saturn V
            |  +- Aries
            |  +- Delta
            |  +- Delta II
            |  +- Orion
            +- X-Prize
               +- SpaceShipOne
               +- WildFire
               +- Spirit of Liberty
 

Other combinations are of course possible.



Copyright © 2008-2012 JBoss, a division of Red Hat. All Rights Reserved.