User development,

The document "JBossToolsWTPProjectStructures", was updated Jan 20, 2010
by Max Andersen.

To view the document, visit:
http://community.jboss.org/docs/DOC-14212#cf

Document:
--------------------------------------------------------------
JBossTools is moving into standardizing default project structures as WTP 
projects.  The deployment structure of these projects are primarily manipulated 
via the Virtual Component Framework at the bottom, and a Module Factory and 
associated classes at the top. Differences between our implementations of some 
of these classes and WTP's examples stem mainly from my efforts to streamline 
and clean up these classes, making the virtual component draw cleanly from its 
references, and the module delegate to similarly act as a simple overlay to the 
VCF.
 
 
VCF
 
The Virtual Component Framework (VCF) draws primarily from it's descriptor file 
.settings/org.eclipse.wst.common.component. The primary pieces of this 
framework are a project's "component", the mapped in "folders", and finally 
references. A component is the primary representation of a project in the VCF. 
It's root folder can be accessed, as can its references. The root folder will 
automatically fold any and all resources mapped in the component's xml file, 
however it will *not* combine in any references. This means any and all 
<wb-resource> elements will fold in automatically. This logic is in the 
VirtualFolder class, a core class, and reads the component.xml file to 
accomplish this.
 
Next are references. References are *not* automatically mapped in, and it is 
the job of the Module Factory (and associated classes) to properly take these 
references and combine them into thet list of deployable artifacts.  
"References" must refer to other virtual components. These virtual components 
would then expose *their* root folder, and set of files. References can be one 
of two types: "USES" or "CONSUMES".
 
 
Deployment Factories using VCF
 
Deployable modules can be asked for two things.The first is a full complete 
list of member artifacts, and the second is child modules. A full list of 
member artifacts is not the same as asking the virtual component for it's 
members. Often, a virtual component's references will also need to be exposed 
as members, and these items would need to be combined with the VCF's list.  
Also, as WTP does, sometimes a file which is mapped in directly via the VCF 
might want to declare itself to be a child module and exposed that way instead. 
In that case, that file needs to be removed from the current list of members.
 
While there's no official javadoc demanding any behaviour, past usage from WTP 
seems to indicate that a "used" referenced component should be exposed as a 
child module and not combined with the current component's resources. So for 
example, an ear project which "uses" a web project should expose the web 
project as a child, and in the final deployment have a path such as 
SomeEar.ear/SomeWar.war/each/resource.file.
 
"Consumed" references, however, *should* be combined with the current module's 
resources as if this consumed resource was actually already placed inside the 
project. The name of consumed references should not be appended or used at all 
when consuming these resources. Here, for example, if one utility project 
"Util1" consumes another "Util2", then all classes and other resources from 
Util2 should appear as if they were in Util1 all along. So, the class 
org.example.consumed.Roar should be exposed as 
Util1.jar/org/example/consumed/Roar.class. You'll notice Util2.jar is not 
mentioned at all.
 
Deployment Factory Strategy
 
WTP's Deployment factories have very complicated members() implementations 
which try to draw from too many places. Perhaps worse, these locations are not 
persisted in the project's component.xml and seem to be added as if by magic  
Our efforts here are to replace "automatically added" pieces of WTP content 
with persistable and understandable individual units of work, specifically 
consumed references. New consumed-type references which have been added to 
JBTools are listed below.
 
These new reference types are translated by the "ReferenceResolver" API 
org.jboss.ide.eclipse.as.wtp.core project.  A handle / uri is converted into an 
IVirtualReference for each of these. In the current implementation, each new 
reference type also has an associated component type, and its own reference 
resolver.
 
 
Persisted WTP References
 
WTP currently has 3 types of references that are presisted in the 
component.xml. One is a project reference (a reference to a child project), one 
is a reference to a jar (either in the workspace or out), and the last is a 
reference to a variable entry.
 
Project References
 
A project reference is persisted in the component.xml in the following way. 
It's handle uri begins with "module:/resource/".
 
<dependent-module archiveName="SomeUtil.jar" deploy-path="/" 
handle="module:/resource/SomeUtil/SomeUtil">
   <dependency-type>uses</dependency-type>
</dependent-module>
 
Jar References
 
Jar references are persisted in the component.xml in the following way. It's 
handle uri begins with "module:/classpath/lib"
 
<dependent-module archiveName="blah1.jar" deploy-path="/" 
handle="module:/classpath/lib//home/rob/tmp/blah1.jar">
   <dependency-type>uses</dependency-type>
</dependent-module>
 
Variable References
 
Variable references are persisted in the component.xml in the following way. 
It's handle uri begins with "module:/classpath/var".
 
<dependent-module archiveName="some2.jar" deploy-path="/" 
handle="module:/classpath/var/MEJAR">
   <dependency-type>uses</dependency-type>
</dependent-module>
 
Custom References
 
There are several types of references which are magically added in WTP's module 
factories / module delegates. I have tried to replicate them as persistable 
units here.

Output Folders 

 
WTP deployment factories purposely ignore files ending in .java from the VCF 
model and then later attempt to dereference these source folders into class 
folders and include those. Adding a reference to an 
OutputFoldersVirtualComponent will automatically map in the output folders of 
all source folders in the project. The constructor for this virtual component 
allows you to pass in any project. To add this reference to a component, you 
would first instantiate an OutputFoldersVirtualComponent via its constructor, 
and then use a utility method in org.jboss.ide.eclipse.as.wtp.core.util.VCFUtil 
to add the reference.  What URI this will have when persisted is determined 
100% by the OutputFoldersReferenceResolver, which turns this reference into a 
uri. The current implementation will return a prefix-id as the first segment, 
with an optional second segment listing the project who's output folders should 
be mapped in.
 
The output-folders references are persisted in the component.xml in the 
following way. It's handle uri begins with 
"module:/org.jboss.ide.eclipse.as.wtp.core.vcf.outputFolders"
 
<dependent-module deploy-path="/" 
handle="module:/org.jboss.ide.eclipse.as.wtp.core.vcf.outputFolders/[optional 
Project Name]">
   <dependency-type>consumes</dependency-type>
</dependent-module>
 
Exported Class Folders
 
Classpath entries which reference class folders in other projects are resolved 
by this type. In order to be resolved, the classpath entry must be exported 
*and* have an attribute set on it's classpath entry 
(org.eclipse.jst.component.dependency). If this seems like duplication to you, 
thats because it is. If it seems like the user will now need to keep two models 
in sync himself, he will. And if you don't like this, too bad. Unfortunately 
this is how it's done in WTP, and for parity, thats how it's done here. Not all 
exported classpath folders are automatically bundled. Only such entries which 
also have this flag are bundled. So... where is the UI to modify this flag? 
Unfortunately we still need to add an "edit reference" button and allow the 
wizard to present possible changes. For now, the user would need to remove the 
reference, and create it again. The wizard page in charge of adding this 
reference allows you to add or remove this flag from certain entries.
 
The exported class folders references are persisted in the component.xml in the 
following way. It's handle uri begins with
"module:/org.jboss.ide.eclipse.as.wtp.core.vcf.exportedClassFolders/"
 
<dependent-module deploy-path="/" 
handle="module:/org.jboss.ide.eclipse.as.wtp.core.vcf.exportedClassFolders/">
   <dependency-type>consumes</dependency-type>
</dependent-module>
 
The flag on these classpath entries is also persisted in the .classpath file. 
An example of this attribute is shown here:
 
    <classpathentry exported="true" kind="lib" path="/SomeUtil/build">
        <attributes>
            <attribute name="org.eclipse.jst.component.dependency" value="/"/>
        </attributes>
    </classpathentry>


--------------------------------------------------------------


_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to