Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » OCL » UML profile / how to attach and evaluate OCL constraints
UML profile / how to attach and evaluate OCL constraints [message #661175] Wed, 23 March 2011 13:07 Go to next message
Eclipse User
Originally posted by: ss.thinkersfoot.net

dear group,

for the last two days i have been digging around in the eclipse docs,
tutorials, and newsgroup archives; trying to find a way to attach OCL
constraints to an UML profile and have them evaluated for models refined
by that very profile (using the stock "UML editor", I don't have the
need for a custom editor or the like). while i found explicit hints at
similar issues, i cannot turn them into solutions for me. so forgive me,
if i am asking the obvious. to be honest, i feel kind of lost given all
the options and the contined evolution of the frameworks, and the docs
pointing to different evolution stages (e.g. "defining" profiles vs.
code generation; that one took me a while!).

what i accomplished so far:

1. i created a uml profile
2. i applied the ePackage stereotype and annotated the profile
accordingly (most importantly the "NS Uri" attribute).
3. i can create UML models from thereon, apply my custom profile (using
"UML editor", papyrus, ...) and set stereotypes.

as for "attaching" OCL, from reading the materials by Christian etc.,
there are a couple of options, right?

MDT/OCL approach:
1. Embedding the OCL constraints in the profile model directly
(Constraint > Opaque Expression)

EMF VALIDATION approaches:
2. ConstraintProvider strategy 1: "Static" constraints in plugin.xml
3. ConstraintProvider strategy 2: "Dynamic" constraints in separate
*.ocl (or simply text) file
4. ConstraintProvider strategy 3: In previous postings, Christian
pointed to a way of gathering embedded constraints from the UML profile,
i.e. from the stereotypes

The main crux for me is, however, how to trigger the OCL validation
(whatever the approach for specifying and attaching OCL) when looking at
a model under my profile from the standard "UML editor". By now, I am
aware that there is a difference between the OCL/EMF validation
approaches (and even between the two in EMF validation: ValidateAction
vs. ModelValidationService), but for a first step:

1. When triggering the ValidationAction of the stock UML editor (not a
custom editor!), how can I have custom OCL constraints (specified from
the stereotype-perspective, i.e., self.base_*) been evaluated over a
given UML model whose elements are tagged by these stereotypes?!

2. Is code generation from the UML profile (*.profile.uml > *.genmodel >
model code) a prerequisite for all approaches (or just for those who
require an EPackage, e.g. the OCL approach). I ask because I am probably
still confused about the exact difference between the "Define Profile"
vs. "Profile to Code" tactics.

I'd appreciate your guidance! Thanks!

//stefan
Re: UML profile / how to attach and evaluate OCL constraints [message #661185 is a reply to message #661175] Wed, 23 March 2011 13:31 Go to previous messageGo to next message
Ed Willink is currently offline Ed Willink
Messages: 4086
Registered: July 2009
Senior Member
Hi Stefan

Apologies for the confusion. To be honest, I don't know the answer. I'd
like to know it too.

There have been three different attempts to integrate OCL into Ecore/UML
to add model executability. The first two were not very satisfactory
which is why Christian started the work on EMF delegates. Kenn completed
this for EMF and then I completed it for OCL too. This was available in
the Helios release (EMF 2.6). The delegates approach is much more
satisfactory, with OCLinEcore editor support, but does not have UML support.

My UML knowledge is limited, but improving. I've discovered that there
is an OCL expression capability for the UML to Ecore conversion and UML
genmodel exploits it, but there seems to be a disconnect through use of
inconsistent annotation source URIs.

I'm currently trying to close the UML gap on the new OCL functionality,
so if you can send me a very simple nearly working example of what
you're trying to do, it may help me by providing a 'realistic' use case.

I'm afraid this doesn't help you today. If anyone else can help the OCL
team here please join the discussion.

Regards

Ed Willink

On 23/03/2011 06:07, Stefan Sobernig wrote:
> dear group,
>
> for the last two days i have been digging around in the eclipse docs,
> tutorials, and newsgroup archives; trying to find a way to attach OCL
> constraints to an UML profile and have them evaluated for models
> refined by that very profile (using the stock "UML editor", I don't
> have the need for a custom editor or the like). while i found explicit
> hints at similar issues, i cannot turn them into solutions for me. so
> forgive me, if i am asking the obvious. to be honest, i feel kind of
> lost given all the options and the contined evolution of the
> frameworks, and the docs pointing to different evolution stages (e.g.
> "defining" profiles vs. code generation; that one took me a while!).
>
> what i accomplished so far:
>
> 1. i created a uml profile
> 2. i applied the ePackage stereotype and annotated the profile
> accordingly (most importantly the "NS Uri" attribute).
> 3. i can create UML models from thereon, apply my custom profile
> (using "UML editor", papyrus, ...) and set stereotypes.
>
> as for "attaching" OCL, from reading the materials by Christian etc.,
> there are a couple of options, right?
>
> MDT/OCL approach:
> 1. Embedding the OCL constraints in the profile model directly
> (Constraint > Opaque Expression)
>
> EMF VALIDATION approaches:
> 2. ConstraintProvider strategy 1: "Static" constraints in plugin.xml
> 3. ConstraintProvider strategy 2: "Dynamic" constraints in separate
> *.ocl (or simply text) file
> 4. ConstraintProvider strategy 3: In previous postings, Christian
> pointed to a way of gathering embedded constraints from the UML
> profile, i.e. from the stereotypes
>
> The main crux for me is, however, how to trigger the OCL validation
> (whatever the approach for specifying and attaching OCL) when looking
> at a model under my profile from the standard "UML editor". By now, I
> am aware that there is a difference between the OCL/EMF validation
> approaches (and even between the two in EMF validation: ValidateAction
> vs. ModelValidationService), but for a first step:
>
> 1. When triggering the ValidationAction of the stock UML editor (not a
> custom editor!), how can I have custom OCL constraints (specified from
> the stereotype-perspective, i.e., self.base_*) been evaluated over a
> given UML model whose elements are tagged by these stereotypes?!
>
> 2. Is code generation from the UML profile (*.profile.uml > *.genmodel
> > model code) a prerequisite for all approaches (or just for those who
> require an EPackage, e.g. the OCL approach). I ask because I am
> probably still confused about the exact difference between the "Define
> Profile" vs. "Profile to Code" tactics.
>
> I'd appreciate your guidance! Thanks!
>
> //stefan
Re: UML profile / how to attach and evaluate OCL constraints [message #661192 is a reply to message #661185] Wed, 23 March 2011 14:03 Go to previous messageGo to next message
Eclipse User
Originally posted by: ss.thinkersfoot.net

Ed,

Thx for your immediate reply!

> There have been three different attempts to integrate OCL into Ecore/UML
> to add model executability. The first two were not very satisfactory
> which is why Christian started the work on EMF delegates. Kenn completed
> this for EMF and then I completed it for OCL too. This was available in
> the Helios release (EMF 2.6).

I am working on Helios and I used to follow the discussion on the
EValidator vs. ValidationDelegate (if i remember the wording correctly)

> My UML knowledge is limited, but improving. I've discovered that there
> is an OCL expression capability for the UML to Ecore conversion and UML
> genmodel exploits it, but there seems to be a disconnect through use of
> inconsistent annotation source URIs.

Initially, last week, I was looking at the OCLinEcore & friends
environment. I converted my *.uml.profile to ecore (using the UML to
Ecore conversion) and from there define OCL over the ecore rep. It would
be fine for me (apart from working and maintaining two reps), but the
models using the profile remain UML (crafted in Papyrus, for instance).
The UML to Ecore conversion does not help much here, as I want the UML
models to be validated directly.
Therefore, I moved on to EMF VALIDATION. Here, I am stuck on how to
make the validation work with the "default/stock/native" UML editor
(ValidateAction) and (as a next step) how to "restrict" validation to
models applying my profile only.

> I'm currently trying to close the UML gap on the new OCL functionality,
> so if you can send me a very simple nearly working example of what
> you're trying to do, it may help me by providing a 'realistic' use case.

Just wondering: Do yo expect the "working example" to be Eclipse
project, containing a simplistic UML profile, a UML model applying
elements of the profile and a sample OCL constraint (attached to one of
the stereotypes).

> I'm afraid this doesn't help you today. If anyone else can help the OCL
> team here please join the discussion.

Your response *does* help! I could certainly figure out many details,
but I must admit, I miss the big picture and the overall workflow that I
am expected to realise (given multiple options and a use case that
slightly deviates from the
" define-model-generate-code-thereform-fire-up-model-editor-an d-validate "
setting).

//stefan
Re: UML profile / how to attach and evaluate OCL constraints [message #661236 is a reply to message #661192] Wed, 23 March 2011 15:59 Go to previous messageGo to next message
Eclipse User
Originally posted by: ss.thinkersfoot.net

Ed,

Sorry for bothering you again, but maybe you could briefly comment on
the following. When I wrote ...

> as for "attaching" OCL, from reading the materials by Christian etc., there are a couple of options, right?
>
> MDT/OCL approach:
> 1. Embedding the OCL constraints in the profile model directly (Constraint > Opaque Expression)

.... I referred to two postings by Christian on embedding OCL constraints
in profiles and "support" by MDT/OCL to this newsgroup:

1.
http://www.eclipse.org/forums/index.php?S=0cc989452e060dba0c 83f37fbd81d2f3&t=msg&th=21244

>> The MDT OCL implementation supports the evaluation of OCL constraints
>> that are defined in the context of a Stereotype on the model Elements to
>> which the stereotype is applied. See how this works in the
>> org.eclipse.ocl.uml.tests.ProfilesTest JUnit test class.

2.
http://dev.eclipse.org/newslists/news.eclipse.modeling.mdt.o cl/msg00138.html

>> The MDT OCL API
>> supports the evaluation of stereotype-defined constraints (where the
>> stereotype is the contextual classifier) on the elements to which those
>> stereotypes are applied, by following exactly the same procedure as I
>> outlined, above. For an example of this, have a look at the
>> org.eclipse.ocl.uml.tests.ProfilesTest JUnit test class, in particular, the
>> test_parseStereotypeConstraint() method.

I got ProfilesTest using

cvs -d :pserver:anonymous@dev.eclipse.org:/cvsroot/modeling checkout
org.eclipse.mdt/org.eclipse.ocl/tests

Even if this is not what i am looking for (a certain UI-level
integration), it shows me, that the essentials are there. do you have
some pointers for me how I can get there using this programming-level
support based on uml2 and ocl helpers to e.g. create my EMF validation
constraint provider or the like?!

thx again for taking the time to respond!

//stefan
Re: UML profile / how to attach and evaluate OCL constraints [message #661281 is a reply to message #661236] Wed, 23 March 2011 20:39 Go to previous messageGo to next message
Ed Willink is currently offline Ed Willink
Messages: 4086
Registered: July 2009
Senior Member
Hi Stefan

You have the correct ProfilesTest; it forms part of the current JUnit
test suite so it continues to work as written in Helios and Indigo releases.

A quick scan of the first test shows that it manually creates a
Constraint with a textual body and then uses it. Internally thereis a
"base_xxx " name which worries me. I recall that EMF evolution causes
"base_xxx" names in UML models to be reported as validation failures;
this was fixed after discussion that suggested that it was unclear what
the precise semantcs of UML profiles was. It is possible that something
has changed here.

You are trying to use the EMF Validation framework to achieve the same
Constraint creation in XML. Simplistically, I can duck out and just say
this is an EMF Validation problem. A bit more helpfully I can ask if you
have looked at
http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse. emf.validation.doc/references/examples/oclValidationExample. html
I recommend replicating that example to see if it helps.

However the above uses CDATA and XML editing, which I recognise as the
first unsatisfactory approach.

http://www.eclipse.org/articles/article.php?file=Article-EMF -Codegen-with-OCL/index.html
is the second unsatisfactory approach that at least allows editing
within the Sample Ecore Editor.

Regards

Ed Willink

On 23/03/2011 08:59, Stefan Sobernig wrote:
> Ed,
>
> Sorry for bothering you again, but maybe you could briefly comment on
> the following. When I wrote ...
>
>> as for "attaching" OCL, from reading the materials by Christian etc.,
>> there are a couple of options, right?
>>
>> MDT/OCL approach:
>> 1. Embedding the OCL constraints in the profile model directly
>> (Constraint > Opaque Expression)
>
> .... I referred to two postings by Christian on embedding OCL
> constraints in profiles and "support" by MDT/OCL to this newsgroup:
>
> 1.
> http://www.eclipse.org/forums/index.php?S=0cc989452e060dba0c 83f37fbd81d2f3&t=msg&th=21244
>
>>> The MDT OCL implementation supports the evaluation of OCL constraints
>>> that are defined in the context of a Stereotype on the model
>>> Elements to
>>> which the stereotype is applied. See how this works in the
>>> org.eclipse.ocl.uml.tests.ProfilesTest JUnit test class.
>
> 2.
> http://dev.eclipse.org/newslists/news.eclipse.modeling.mdt.o cl/msg00138.html
>
>>> The MDT OCL API
>>> supports the evaluation of stereotype-defined constraints (where the
>>> stereotype is the contextual classifier) on the elements to which those
>>> stereotypes are applied, by following exactly the same procedure as I
>>> outlined, above. For an example of this, have a look at the
>>> org.eclipse.ocl.uml.tests.ProfilesTest JUnit test class, in
>>> particular, the
>>> test_parseStereotypeConstraint() method.
>
> I got ProfilesTest using
>
> cvs -d :pserver:anonymous@dev.eclipse.org:/cvsroot/modeling checkout
> org.eclipse.mdt/org.eclipse.ocl/tests
>
> Even if this is not what i am looking for (a certain UI-level
> integration), it shows me, that the essentials are there. do you have
> some pointers for me how I can get there using this programming-level
> support based on uml2 and ocl helpers to e.g. create my EMF validation
> constraint provider or the like?!
>
> thx again for taking the time to respond!
>
> //stefan
>
>
>
Re: UML profile / how to attach and evaluate OCL constraints [message #661406 is a reply to message #661281] Thu, 24 March 2011 14:36 Go to previous messageGo to next message
Eclipse User
Originally posted by: ss.thinkersfoot.net

Ed,

> You are trying to use the EMF Validation framework to achieve the same
> Constraint creation in XML. Simplistically, I can duck out and just say
> this is an EMF Validation problem. A bit more helpfully I can ask if you
> have looked at
> http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse. emf.validation.doc/references/examples/oclValidationExample. html
> I recommend replicating that example to see if it helps.

I had a look, but I have the problem that the storyline of the example
does not really match my needs: The EMF Examples are about adding
validation to a plug-in application, based on a custom meta-model. To
begin with, I don't have a custom meta-model (-> UML extension based on
a profile) and I don't want to build a plug-in; in particular I don't
want a special-purpose editor, but the default UML editor!

This plug-in issue relates to the way OCL constraints are provided to
the EMF validation framework and how validation is triggered. The three
examples (General, OCL, Adapter) all provide interesting insights (e.g.,
how to define a ValidateAction for a plug-in editor which triggers
validation of the OCL constraint through the ModelValidationService),
but i miss the link how to hook this OCL constraint
registration/evaluation scheme into the plain UML editor.

Another approach would be to provide a plug-in, but reuse the UML editor
in there. This was already attacked by someone brighter than me, though
it adds to the series of undocumented stories:

http://www.eclipse.org/forums/index.php?t=tree&goto=4909 62&#page_top

Another problem is that in order to have the constraints actually
registered (with the Constraint Registry), I need to serve the
constraintProviders extension point which I have failed to do so far (in
whatever EMF validation example above). I can't make the my constraints
(categories) appear in the preferences UI. I need to investigate that
further. When is the constraintProviders extension point actually
crawled by the EMF validation framework, do you know?!

Yet another approach would be to assemble a standalone/headless
application, using the MDT/OCL API directly.

Another question: In the standalone Papyrus project, there used to be an
validation mode. Right-click on a *.uml resource > Validation >
"Validate OCL constraints defined in UML profile". Where (or better WHY)
is this gone in MDT Papyrus?!

Thx
//stefan
Re: UML profile / how to attach and evaluate OCL constraints [message #661414 is a reply to message #661406] Thu, 24 March 2011 14:53 Go to previous messageGo to next message
Ed Willink is currently offline Ed Willink
Messages: 4086
Registered: July 2009
Senior Member
Hi Stefan

I wrote at the outset that the old approaches were unsatisfactory and
that I am working hard to get a counterpart of the Ecore delegates for
Indigo.

If you want to try to get something working now, you're pretty much on
your own. I can just point you at
https://bugs.eclipse.org/bugs/show_bug.cgi?id=286931 which provides a
patch to make OpaqueExpression work on the fly. Unfortunately the patch
had side effects that made it difficult to accept. It might help you though.

I'm afraid I know nothing about the Papyrus Validate actions.

Regards

Ed Willink

On 24/03/2011 07:36, Stefan Sobernig wrote:
> Ed,
>
>> You are trying to use the EMF Validation framework to achieve the same
>> Constraint creation in XML. Simplistically, I can duck out and just say
>> this is an EMF Validation problem. A bit more helpfully I can ask if you
>> have looked at
>> http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse. emf.validation.doc/references/examples/oclValidationExample. html
>>
>> I recommend replicating that example to see if it helps.
>
> I had a look, but I have the problem that the storyline of the example
> does not really match my needs: The EMF Examples are about adding
> validation to a plug-in application, based on a custom meta-model. To
> begin with, I don't have a custom meta-model (-> UML extension based
> on a profile) and I don't want to build a plug-in; in particular I
> don't want a special-purpose editor, but the default UML editor!
>
> This plug-in issue relates to the way OCL constraints are provided to
> the EMF validation framework and how validation is triggered. The
> three examples (General, OCL, Adapter) all provide interesting
> insights (e.g., how to define a ValidateAction for a plug-in editor
> which triggers validation of the OCL constraint through the
> ModelValidationService), but i miss the link how to hook this OCL
> constraint registration/evaluation scheme into the plain UML editor.
>
> Another approach would be to provide a plug-in, but reuse the UML
> editor in there. This was already attacked by someone brighter than
> me, though it adds to the series of undocumented stories:
>
> http://www.eclipse.org/forums/index.php?t=tree&goto=4909 62&#page_top
>
> Another problem is that in order to have the constraints actually
> registered (with the Constraint Registry), I need to serve the
> constraintProviders extension point which I have failed to do so far
> (in whatever EMF validation example above). I can't make the my
> constraints (categories) appear in the preferences UI. I need to
> investigate that further. When is the constraintProviders extension
> point actually crawled by the EMF validation framework, do you know?!
>
> Yet another approach would be to assemble a standalone/headless
> application, using the MDT/OCL API directly.
>
> Another question: In the standalone Papyrus project, there used to be
> an validation mode. Right-click on a *.uml resource > Validation >
> "Validate OCL constraints defined in UML profile". Where (or better
> WHY) is this gone in MDT Papyrus?!
>
> Thx
> //stefan
Re: UML profile / how to attach and evaluate OCL constraints [message #661582 is a reply to message #661414] Fri, 25 March 2011 13:35 Go to previous messageGo to next message
Eclipse User
Originally posted by: ss.thinkersfoot.net

Ed,

> I wrote at the outset that the old approaches were unsatisfactory and
> that I am working hard to get a counterpart of the Ecore delegates for
> Indigo.

I didn't mean to act or appear pushy, sorry if I did. I would not
dismiss "the old approaches" as unsatisfactory categorically (though I
certainly miss the internals here). In RSA 8 (based on 3.6.2 itself),
there is OCL/Java constraint support for UML profiles based on EMF
validation (ModelValidationService), at least all of the details smell
like the EMF validation examples available for Helios:

http://www.ibm.com/developerworks/rational/library/08/0429_m isic1/
http://www.ibm.com/developerworks/rational/library/08/0429_m isic2/

(and it is certainly not by accident that Christian Damus is thanked for
in the acks :) Christian even pointed to the approach which seems
realised in RSA in some newsgroup postings I came across (i.e., taking
the OCLConstraintProvider example and have it extract the raw OCL
constraints from the Stereotypes rather than from a text file).

So, embedding OCLs in UML profiles and their validation (admittedly
limited to invariant constraints) has been realised, based on the
existing Helios infrastructure (!).

For now, I don't have the time to experiment, but I am confident that
someone more proficient than me in Eclipse/MDT matters could fix this
for us. But I might be missing sth. here.

For now, I draft my OCLs over UML in Eclipse under Interactive OCL
constraint (from the element perspect) and then, for the final release,
embed them into my profile (translated for the the stereotype
perspective). For having models evaluated, I run validation under RSA.

> If you want to try to get something working now, you're pretty much on
> your own. I can just point you at
> https://bugs.eclipse.org/bugs/show_bug.cgi?id=286931 which provides a
> patch to make OpaqueExpression work on the fly. Unfortunately the patch
> had side effects that made it difficult to accept. It might help you
> though.

When the time comes, I will have a closer look, thx!

> I'm afraid I know nothing about the Papyrus Validate actions.

ok

thx again for your time!

//stefan
Re: UML profile / how to attach and evaluate OCL constraints [message #661762 is a reply to message #661582] Sun, 27 March 2011 16:23 Go to previous message
Ed Willink is currently offline Ed Willink
Messages: 4086
Registered: July 2009
Senior Member
Hi Stefan

The relationship between IBM and MDT/OCL was a little tangled. Some
things, particularly UML-related functionality, seem to have been done
to suit IBM, with perhaps some of the functionality only useable in IBM
proprietary products. In the case of the OCL console, I suspect that an
IBM variant evolved independently; when shown a demo of it, it seemed
distinctly inferior, so I think MDT/OCL grew something better perhaps later.

Since IBM have declined to provide me with a copy of RSA, I do not feel
motivated to spend my own money to purchase a proprietary product and so
assess the impact of the Eclipse OCL evolution on that product. If you
find RSA helpful fine, but please report only problems related to
Eclipse code.

I am endeavouring to provide useful UML functionality for Open Source
Eclipse users. If IBM proprietary practices differ, I can do nothing
about it since I have no information on those practices; it is quite
likely that those practices will suffer some accidental bit rot as old
seemingly broken EAnnotations are discarded in favour of EMF Delegate
EAnnotations.

Regards

Ed Willink


On 25/03/2011 06:35, Stefan Sobernig wrote:
> Ed,
>
>> I wrote at the outset that the old approaches were unsatisfactory and
>> that I am working hard to get a counterpart of the Ecore delegates for
>> Indigo.
>
> I didn't mean to act or appear pushy, sorry if I did. I would not
> dismiss "the old approaches" as unsatisfactory categorically (though I
> certainly miss the internals here). In RSA 8 (based on 3.6.2 itself),
> there is OCL/Java constraint support for UML profiles based on EMF
> validation (ModelValidationService), at least all of the details smell
> like the EMF validation examples available for Helios:
>
> http://www.ibm.com/developerworks/rational/library/08/0429_m isic1/
> http://www.ibm.com/developerworks/rational/library/08/0429_m isic2/
>
> (and it is certainly not by accident that Christian Damus is thanked
> for in the acks :) Christian even pointed to the approach which seems
> realised in RSA in some newsgroup postings I came across (i.e., taking
> the OCLConstraintProvider example and have it extract the raw OCL
> constraints from the Stereotypes rather than from a text file).
>
> So, embedding OCLs in UML profiles and their validation (admittedly
> limited to invariant constraints) has been realised, based on the
> existing Helios infrastructure (!).
>
> For now, I don't have the time to experiment, but I am confident that
> someone more proficient than me in Eclipse/MDT matters could fix this
> for us. But I might be missing sth. here.
>
> For now, I draft my OCLs over UML in Eclipse under Interactive OCL
> constraint (from the element perspect) and then, for the final
> release, embed them into my profile (translated for the the stereotype
> perspective). For having models evaluated, I run validation under RSA.
>
>> If you want to try to get something working now, you're pretty much on
>> your own. I can just point you at
>> https://bugs.eclipse.org/bugs/show_bug.cgi?id=286931 which provides a
>> patch to make OpaqueExpression work on the fly. Unfortunately the patch
>> had side effects that made it difficult to accept. It might help you
>> though.
>
> When the time comes, I will have a closer look, thx!
>
>> I'm afraid I know nothing about the Papyrus Validate actions.
>
> ok
>
> thx again for your time!
>
> //stefan
Previous Topic:Derived attributes differ randomly
Next Topic:base_* semantics in stereotype generalizations
Goto Forum:
  


Current Time: Mon Oct 20 13:16:49 GMT 2014

Powered by FUDForum. Page generated in 0.03916 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software