Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF "Technology" (Ecore Tools, EMFatic, etc)  » How do I override doSave and doLoad?(It is already overridden by XMLResourceImpl)
How do I override doSave and doLoad? [message #521188] Tue, 16 March 2010 16:57 Go to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
I read in a file named emftutorial31.pdf that "... implementing a specialized resource involves overriding the doSave and doLoad methods of ResourceImpl...".

I would like to break into the saving and loading code to slightly change the output format of the saved model files, and convert them back when the files are read in.

I noticed that doSave and doLoad are already overridden by XMLResourceImpl in org.eclipse.emf.ecore.xmi.<ver>.jar.

What would be the best way to approach this task?

Thanks.



Re: How do I override doSave and doLoad? [message #521194 is a reply to message #521188] Tue, 16 March 2010 17:06 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Herb,

What kind of slight changes are you looking to achieve? Simple tweaking
of the XML format, i.e., controlling the element/attribute names, can be
accomplished with extended meta data annotations.


Herb Miller wrote:
> I read in a file named emftutorial31.pdf that "... implementing a
> specialized resource involves overriding the doSave and doLoad methods
> of ResourceImpl...".
>
> I would like to break into the saving and loading code to slightly
> change the output format of the saved model files, and convert them
> back when the files are read in.
>
> I noticed that doSave and doLoad are already overridden by
> XMLResourceImpl in org.eclipse.emf.ecore.xmi.<ver>.jar.
>
> What would be the best way to approach this task?
>
> Thanks.
>
>
>
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: How do I override doSave and doLoad? [message #521198 is a reply to message #521188] Tue, 16 March 2010 17:34 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
Just remember this is not my idea, but here goes.

Included is a short sample file and under that is the same file with changes. The changes are to remove the "kms_ns:" and the "xsi:" when saving the files, and to replace them when loading the files.

Thanks.

=== Existing===========================
<?xml version="1.0" encoding="UTF-8"?>

<kms_ns:Item
xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:kms_ns="com.cohesionforce.kms"
URI="URI-000001"
Description="Placeholder for head of list. See: http://www.eclipse.org/articles/Article-EMF-goes-RCP/rcp.htm l"
Title="Root"
DesignatedAuthority="" ResponsibleParty="">

<Type>ITEM_ITEM_LITERAL</Type>
<Category>BLANK_CATEGORY_LITERAL</Category>
<itemList
xsi:type="kms_ns:Observation"
URI="URI-000002"
Description="Could not add a sibling to root - duh!"
Title="1st child"
Originator="Herb"
OccurrenceDate="0007-12-31T00:00:00.000-0600">
<Type>OBSERVATION_ITEM_LITERAL</Type>
<Category>BLANK_CATEGORY_LITERAL</Category>
<itemList
xsi:type="kms_ns:Observation"
URI="URI-000003"
Description="Able to add child here"
Title="Child for 2"
DesignatedAuthority="anyone"
ResponsibleParty=""
Originator="Herb"
OccurrenceDate="0007-10-01T00:00:00.000-0600">
<Type>OBSERVATION_ITEM_LITERAL</Type>
<Category>BLANK_CATEGORY_LITERAL</Category>
</itemList>
</itemList>

<itemList
xsi:type="kms_ns:Observation"
URI="URI-000004"
Description="Able to add sibling"
Title="Sibling for 2"
Originator="Herb"
OccurrenceDate="0007-08-31T00:00:00.000-0600">
<Type>OBSERVATION_ITEM_LITERAL</Type>
<Category>BLANK_CATEGORY_LITERAL</Category>
</itemList>

<itemList
xsi:type="kms_ns:Decision"
URI=""
/>

</kms_ns:Item>


=== Proposed New=======================
<?xml version="1.0" encoding="UTF-8"?>

<Item
xmi:version="2.0"
xmlns:xmi="http://www.omg.org/XMI"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="com.cohesionforce.kms"
URI="URI-000001"
Description="Placeholder for head of list. See: http://www.eclipse.org/articles/Article-EMF-goes-RCP/rcp.htm l"
Title="Root"
DesignatedAuthority="" ResponsibleParty="">

<Type>ITEM_ITEM_LITERAL</Type>
<Category>BLANK_CATEGORY_LITERAL</Category>
<itemList
type="Observation"
URI="URI-000002"
Description="Could not add a sibling to root - duh!"
Title="1st child"
Originator="Herb"
OccurrenceDate="0007-12-31T00:00:00.000-0600">
<Type>OBSERVATION_ITEM_LITERAL</Type>
<Category>BLANK_CATEGORY_LITERAL</Category>
<itemList
type="Observation"
URI="URI-000003"
Description="Able to add child here"
Title="Child for 2"
DesignatedAuthority="anyone"
ResponsibleParty=""
Originator="Herb"
OccurrenceDate="0007-10-01T00:00:00.000-0600">
<Type>OBSERVATION_ITEM_LITERAL</Type>
<Category>BLANK_CATEGORY_LITERAL</Category>
</itemList>
</itemList>

<itemList
type="Observation"
URI="URI-000004"
Description="Able to add sibling"
Title="Sibling for 2"
Originator="Herb"
OccurrenceDate="0007-08-31T00:00:00.000-0600">
<Type>OBSERVATION_ITEM_LITERAL</Type>
<Category>BLANK_CATEGORY_LITERAL</Category>
</itemList>

<itemList
type="Decision"
URI=""
/>

</Item>


Re: How do I override doSave and doLoad? [message #521206 is a reply to message #521198] Tue, 16 March 2010 17:53 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
This is a multi-part message in MIME format.
--------------070004040702040401010907
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

Herb,

Comments below.

Herb Miller wrote:
> Just remember this is not my idea, but here goes.
A disclaimer. Whose idea might it be?
>
> Included is a short sample file and under that is the same file with
> changes. The changes are to remove the "kms_ns:"
Given it's an XMI serialization, I'm not sure the sense in removing the
namespace qualification for the root element. Who could possibly stand
to benefit by making the corresponding package/schema unknowable? You
could look at the extended meta data annotations and generated resource
factory impl for a no target namespace schema for how to achieve this.
> and the "xsi:" when saving the files, and to replace them when loading
> the files.
And what would you do in place of xsi? The deserializer will need to
know what type of object to create. I.e., an Observation verses a
Decision? You could use substitution groups:
<http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html>

http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html

>
> Thanks.
>
> === Existing===========================
> <?xml version="1.0" encoding="UTF-8"?>
>
> <kms_ns:Item
> xmi:version="2.0"
> xmlns:xmi="http://www.omg.org/XMI"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns:kms_ns="com.cohesionforce.kms"
> URI="URI-000001"
> Description="Placeholder for head of list. See:
> http://www.eclipse.org/articles/Article-EMF-goes-RCP/rcp.htm l"
> Title="Root"
> DesignatedAuthority="" ResponsibleParty="">
>
> <Type>ITEM_ITEM_LITERAL</Type>
> <Category>BLANK_CATEGORY_LITERAL</Category>
> <itemList
> xsi:type="kms_ns:Observation"
> URI="URI-000002"
> Description="Could not add a sibling to root - duh!"
> Title="1st child"
> Originator="Herb"
> OccurrenceDate="0007-12-31T00:00:00.000-0600">
> <Type>OBSERVATION_ITEM_LITERAL</Type>
> <Category>BLANK_CATEGORY_LITERAL</Category>
> <itemList
> xsi:type="kms_ns:Observation"
> URI="URI-000003"
> Description="Able to add child here"
> Title="Child for 2"
> DesignatedAuthority="anyone"
> ResponsibleParty=""
> Originator="Herb"
> OccurrenceDate="0007-10-01T00:00:00.000-0600">
> <Type>OBSERVATION_ITEM_LITERAL</Type>
> <Category>BLANK_CATEGORY_LITERAL</Category>
> </itemList>
> </itemList>
>
> <itemList
> xsi:type="kms_ns:Observation"
> URI="URI-000004"
> Description="Able to add sibling"
> Title="Sibling for 2"
> Originator="Herb"
> OccurrenceDate="0007-08-31T00:00:00.000-0600">
> <Type>OBSERVATION_ITEM_LITERAL</Type>
> <Category>BLANK_CATEGORY_LITERAL</Category>
> </itemList>
>
> <itemList
> xsi:type="kms_ns:Decision"
> URI=""
> />
>
> </kms_ns:Item>
>
>
> === Proposed New=======================
> <?xml version="1.0" encoding="UTF-8"?>
>
> <Item
> xmi:version="2.0"
> xmlns:xmi="http://www.omg.org/XMI"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> xmlns="com.cohesionforce.kms"
> URI="URI-000001"
> Description="Placeholder for head of list. See:
> http://www.eclipse.org/articles/Article-EMF-goes-RCP/rcp.htm l"
> Title="Root"
> DesignatedAuthority="" ResponsibleParty="">
>
> <Type>ITEM_ITEM_LITERAL</Type>
> <Category>BLANK_CATEGORY_LITERAL</Category>
> <itemList
> type="Observation"
> URI="URI-000002"
> Description="Could not add a sibling to root - duh!"
> Title="1st child"
> Originator="Herb"
> OccurrenceDate="0007-12-31T00:00:00.000-0600">
> <Type>OBSERVATION_ITEM_LITERAL</Type>
> <Category>BLANK_CATEGORY_LITERAL</Category>
> <itemList
> type="Observation"
> URI="URI-000003"
> Description="Able to add child here"
> Title="Child for 2"
> DesignatedAuthority="anyone"
> ResponsibleParty=""
> Originator="Herb"
> OccurrenceDate="0007-10-01T00:00:00.000-0600">
> <Type>OBSERVATION_ITEM_LITERAL</Type>
> <Category>BLANK_CATEGORY_LITERAL</Category>
> </itemList>
> </itemList>
>
> <itemList
> type="Observation"
> URI="URI-000004"
> Description="Able to add sibling"
> Title="Sibling for 2"
> Originator="Herb"
> OccurrenceDate="0007-08-31T00:00:00.000-0600">
> <Type>OBSERVATION_ITEM_LITERAL</Type>
> <Category>BLANK_CATEGORY_LITERAL</Category>
> </itemList>
>
> <itemList
> type="Decision"
> URI=""
> />
>
> </Item>
>
>
>

--------------070004040702040401010907
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 8bit

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Herb,<br>
<br>
Comments below.<br>
<br>
Herb Miller wrote:
<blockquote cite="mid:hnofeg$nqr$1@build.eclipse.org" type="cite">Just
remember this is not my idea, but here goes.
<br>
</blockquote>
A disclaimer.  Whose idea might it be?<br>
<blockquote cite="mid:hnofeg$nqr$1@build.eclipse.org" type="cite"><br>
Included is a short sample file and under that is the same file with
changes.  The changes are to remove the "kms_ns:" </blockquote>
Given it's an XMI serialization, I'm not sure the sense in removing the
namespace qualification for the root element.  Who could possibly stand
to benefit by making the corresponding package/schema unknowable?  You
could look at the extended meta data annotations and generated resource
factory impl for a no target namespace schema for how to achieve this.<br>
<blockquote cite="mid:hnofeg$nqr$1@build.eclipse.org" type="cite">and
the "xsi:" when saving the files, and to replace them when loading the
files.
<br>
</blockquote>
And what would you do in place of xsi?  The deserializer will need to
know what type of object to create.  I.e., an Observation verses a
Decision? You could use substitution groups:<a
href="http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html"><br>
</a>
<blockquote><a
href="http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html">http://ed-merks.blogspot.com/2007/12/winters-icy-grip.html</a><br>
</blockquote>
<blockquote cite="mid:hnofeg$nqr$1@build.eclipse.org" type="cite"><br>
Thanks.
<br>
<br>
=== Existing===========================
<br>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
<br>
<br>
&lt;kms_ns:Item
<br>
 xmi:version="2.0"
<br>
 xmlns:xmi=<a class="moz-txt-link-rfc2396E" href="http://www.omg.org/XMI">"http://www.omg.org/XMI"</a>
<br>
 xmlns:xsi=<a class="moz-txt-link-rfc2396E" href="http://www.w3.org/2001/XMLSchema-instance">"http://www.w3.org/2001/XMLSchema-instance"</a>
<br>
 xmlns:kms_ns="com.cohesionforce.kms"
<br>
 URI="URI-000001"
<br>
 Description="Placeholder for head of list.  See: 
<a class="moz-txt-link-freetext" href=" http://www.eclipse.org/articles/Article-EMF-goes-RCP/rcp.htm l"> http://www.eclipse.org/articles/Article-EMF-goes-RCP/rcp.htm l</a>"
<br>
 Title="Root"
<br>
 DesignatedAuthority="" ResponsibleParty=""&gt;
<br>
<br>
 &lt;Type&gt;ITEM_ITEM_LITERAL&lt;/Type&gt;
<br>
 &lt;Category&gt;BLANK_CATEGORY_LITERAL&lt;/Cat egory&gt;
<br>
 &lt;itemList
<br>
    xsi:type="kms_ns:Observation"
<br>
    URI="URI-000002"
<br>
    Description="Could not add a sibling to root - duh!"
<br>
    Title="1st child"
<br>
    Originator="Herb"
<br>
    OccurrenceDate="0007-12-31T00:00:00.000-0600"&gt;
<br>
    &lt;Type&gt;OBSERVATION_ITEM_LITERAL&lt;/Type&am p;gt;
<br>
    &lt;Category&gt;BLANK_CATEGORY_LITERAL&lt;/Categ ory&gt;
<br>
    &lt;itemList
<br>
       xsi:type="kms_ns:Observation"
<br>
       URI="URI-000003"
<br>
       Description="Able to add child here"
<br>
       Title="Child for 2"
<br>
       DesignatedAuthority="anyone"
<br>
       ResponsibleParty=""
<br>
       Originator="Herb"
<br>
       OccurrenceDate="0007-10-01T00:00:00.000-0600"&gt;
<br>
       &lt;Type&gt;OBSERVATION_ITEM_LITERAL&lt;/Type&am p;gt;
<br>
       &lt;Category&gt;BLANK_CATEGORY_LITERAL&lt;/Categ ory&gt;
<br>
    &lt;/itemList&gt;
<br>
 &lt;/itemList&gt;
<br>
<br>
 &lt;itemList
<br>
    xsi:type="kms_ns:Observation"
<br>
    URI="URI-000004"
<br>
    Description="Able to add sibling"
<br>
    Title="Sibling for 2"
<br>
    Originator="Herb"
<br>
    OccurrenceDate="0007-08-31T00:00:00.000-0600"&gt;
<br>
    &lt;Type&gt;OBSERVATION_ITEM_LITERAL&lt;/Type&am p;gt;
<br>
    &lt;Category&gt;BLANK_CATEGORY_LITERAL&lt;/Categ ory&gt;
<br>
 &lt;/itemList&gt;
<br>
<br>
 &lt;itemList
<br>
    xsi:type="kms_ns:Decision"
<br>
    URI=""
<br>
 /&gt;
<br>
<br>
&lt;/kms_ns:Item&gt;
<br>
<br>
<br>
=== Proposed New=======================
<br>
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
<br>
<br>
&lt;Item
<br>
 xmi:version="2.0"
<br>
 xmlns:xmi=<a class="moz-txt-link-rfc2396E" href="http://www.omg.org/XMI">"http://www.omg.org/XMI"</a>
<br>
 xmlns:xsi=<a class="moz-txt-link-rfc2396E" href="http://www.w3.org/2001/XMLSchema-instance">"http://www.w3.org/2001/XMLSchema-instance"</a>
<br>
 xmlns="com.cohesionforce.kms"
<br>
 URI="URI-000001"
<br>
 Description="Placeholder for head of list.  See: 
<a class="moz-txt-link-freetext" href=" http://www.eclipse.org/articles/Article-EMF-goes-RCP/rcp.htm l"> http://www.eclipse.org/articles/Article-EMF-goes-RCP/rcp.htm l</a>"
<br>
 Title="Root"
<br>
 DesignatedAuthority="" ResponsibleParty=""&gt;
<br>
<br>
 &lt;Type&gt;ITEM_ITEM_LITERAL&lt;/Type&gt;
<br>
 &lt;Category&gt;BLANK_CATEGORY_LITERAL&lt;/Cat egory&gt;
<br>
 &lt;itemList
<br>
    type="Observation"
<br>
    URI="URI-000002"
<br>
    Description="Could not add a sibling to root - duh!"
<br>
    Title="1st child"
<br>
    Originator="Herb"
<br>
    OccurrenceDate="0007-12-31T00:00:00.000-0600"&gt;
<br>
    &lt;Type&gt;OBSERVATION_ITEM_LITERAL&lt;/Type&am p;gt;
<br>
    &lt;Category&gt;BLANK_CATEGORY_LITERAL&lt;/Categ ory&gt;
<br>
    &lt;itemList
<br>
       type="Observation"
<br>
       URI="URI-000003"
<br>
       Description="Able to add child here"
<br>
       Title="Child for 2"
<br>
       DesignatedAuthority="anyone"
<br>
       ResponsibleParty=""
<br>
       Originator="Herb"
<br>
       OccurrenceDate="0007-10-01T00:00:00.000-0600"&gt;
<br>
       &lt;Type&gt;OBSERVATION_ITEM_LITERAL&lt;/Type&am p;gt;
<br>
       &lt;Category&gt;BLANK_CATEGORY_LITERAL&lt;/Categ ory&gt;
<br>
    &lt;/itemList&gt;
<br>
 &lt;/itemList&gt;
<br>
<br>
 &lt;itemList
<br>
    type="Observation"
<br>
    URI="URI-000004"
<br>
    Description="Able to add sibling"
<br>
    Title="Sibling for 2"
<br>
    Originator="Herb"
<br>
    OccurrenceDate="0007-08-31T00:00:00.000-0600"&gt;
<br>
    &lt;Type&gt;OBSERVATION_ITEM_LITERAL&lt;/Type&am p;gt;
<br>
    &lt;Category&gt;BLANK_CATEGORY_LITERAL&lt;/Categ ory&gt;
<br>
 &lt;/itemList&gt;
<br>
<br>
 &lt;itemList
<br>
    type="Decision"
<br>
    URI=""
<br>
 /&gt;
<br>
<br>
&lt;/Item&gt;
<br>
<br>
<br>
<br>
</blockquote>
</body>
</html>

--------------070004040702040401010907--


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: How do I override doSave and doLoad? [message #521209 is a reply to message #521188] Tue, 16 March 2010 18:11 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
It is my boss' idea. This is really an internal project (for now). If it ever gets delivered, we would not modify the data. He wants to be able to look in the model (xml) files and have the data look "cleaner".

I can only guess that this would be the case during development. Since the entire model is his idea, he knows what an "Observation" is instead of having to precede it with "kms_ns:", and the same for the "xsi:". These are qualifiers that would have to remain if this becomes a real product (which, I understand, it may).

I will read the links you suggested. The "substitution group" may be similar to the "alias" concept in a product called XStream. I was able to get the XStream jar file working in a pure java app, but I could not incorporate it into my EMF/EEF/RCP app.

I will post back on progress.

Thanks.



Re: How do I override doSave and doLoad? [message #521239 is a reply to message #521209] Tue, 16 March 2010 20:47 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Herb,

Comments below.

Herb Miller wrote:
> It is my boss' idea.
I thought so. Does he have pointy hair?
> This is really an internal project (for now). If it ever gets
> delivered, we would not modify the data. He wants to be able to look
> in the model (xml) files and have the data look "cleaner".
Oh dear. Carrying an identifying namespace on at least the root element
is kind of a fundamental aspect of modern XML formats. Consider XML
Schema itself...
>
> I can only guess that this would be the case during development.
> Since the entire model is his idea, he knows what an "Observation" is
> instead of having to precede it with "kms_ns:", and the same for the
> "xsi:".
I see the same element referring to two different types so the element
name does not fully determine the type. EMF wouldn't serialize an
xsi:type if it were redundant.
> These are qualifiers that would have to remain if this becomes a real
> product (which, I understand, it may).
>
> I will read the links you suggested. The "substitution group" may be
> similar to the "alias" concept in a product called XStream. I was
> able to get the XStream jar file working in a pure java app, but I
> could not incorporate it into my EMF/EEF/RCP app.
You'd definitely need to do something here, either an xsi:type or
different element names depending on the type.
>
> I will post back on progress.
>
> Thanks.
>
>
>
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: How do I override doSave and doLoad? [message #521518 is a reply to message #521239] Wed, 17 March 2010 21:12 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
I have a couple of questions. The 1st refers to this paragraph you wrote:

> I see the same element referring to two different types so the element
> name does not fully determine the type. EMF wouldn't serialize an xsi:type if it were redundant.

Question 1:
I am thinking there are 2 possibilities here, and I was wondering which one you meant.
1) Is this a problem with the model we have now even before I try to modify the "look" of the data in the files.
2) Is this a problem we will have with the files if I make the changes mentioned in "Merk's Meanderings".

One of the reasons I wanted to override doSave and doLoad was so the program would see and deal with the data in the appropriate format, but the data in the stored files would look "prettier" (like lipstick on a pig). I was going to translate the data on the way into and out of the program.

Question 2:
I am terrible at XSD. I am studying up on it right now, so I will catch up pretty soon. That is why we use UML drawings (picture worth 1,000 words). I am having a problem understanding the schema at the "Merk's Meanderings" article you pointed me to.

In this little snippet of the schema from the article (I think there are no typographical errors), does the complex type named "FileSystem" define the type in the element named "fileSystem"? What is confusing is the element's type is "resource:FileSystem", but the complex type's name is just "FileSystem".

<xsd:element
name="fileSystem"
type="resource:FileSystem"/>

<xsd:complexType
name="FileSystem">
<xsd:sequence>
<xsd:element
name="folder"
ecore:name="folders"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>

Thanks.





Re: How do I override doSave and doLoad? [message #521528 is a reply to message #521518] Wed, 17 March 2010 17:38 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Herb,

Comments below.


Herb Miller wrote:
> I have a couple of questions. The 1st refers to this paragraph you
> wrote:
>
>> I see the same element referring to two different types so the element
>> name does not fully determine the type. EMF wouldn't serialize an
>> xsi:type if it were redundant.
>
> Question 1:
> I am thinking there are 2 possibilities here, and I was wondering
> which one you meant.
> 1) Is this a problem with the model we have now even before I try to
> modify the "look" of the data in the files.
Yes. Right now the xsi:type is absolute necessary.
> 2) Is this a problem we will have with the files if I make the changes
> mentioned in "Merk's Meanderings".
That's the only way to avoid xsi:type. Something needs to be done.
>
> One of the reasons I wanted to override doSave and doLoad was so the
> program would see and deal with the data in the appropriate format,
> but the data in the stored files would look "prettier" (like lipstick
> on a pig). I was going to translate the data on the way into and out
> of the program.
Yes, but surely something finer grained is needed. There is no magic.
>
> Question 2:
> I am terrible at XSD.
But it's so wonderful! :-P
> I am studying up on it right now, so I will catch up pretty soon.
> That is why we use UML drawings (picture worth 1,000 words). I am
> having a problem understanding the schema at the "Merk's Meanderings"
> article you pointed me to.
Oh dear....
>
> In this little snippet of the schema from the article (I think there
> are no typographical errors), does the complex type named "FileSystem"
> define the type in the element named "fileSystem"? What is confusing
> is the element's type is "resource:FileSystem", but the complex type's
> name is just "FileSystem".
Oh dear, even element qualification is throwing you for a loop. What can
I do? I can't teach all the basic XML and XML Schema concepts in the
newsgroup...
>
> <xsd:element
> name="fileSystem"
> type="resource:FileSystem"/>
>
> <xsd:complexType
> name="FileSystem">
> <xsd:sequence>
> <xsd:element
> name="folder"
> ecore:name="folders"
> maxOccurs="unbounded"/>
> </xsd:sequence>
> </xsd:complexType>
>
> Thanks.
>
>
>
>
>
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: How do I override doSave and doLoad? [message #521777 is a reply to message #521528] Thu, 18 March 2010 17:35 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
Well, you don't have time to teach me XSD. I am trying to get smarter on XSD. I have been reading the tutorial at http://www.w3schools.com, and some articles from http://www.w3.org and http://www.devshed.com. I have never had to use XSD since we model with UML.

Using the small snippet from before (see below), I think I understand that the fileSystem element is defined as a resource:FileSystem type. Since the targetNamespace is the same as "resource", then we are in the resource namespace. So the complexType FileSystem is actually the same type as resource:FileSystem. If I am off on that much then I am really lost.

My next question is this:
What is the type of the element named "folder" in the complexType definition of FileSystem? Does ecore:name resolve the "type"? I have not been able to find anywhere that an element can be defined without a type.

<xsd:element
name="fileSystem"
type="resource:FileSystem"/>

<xsd:complexType
name="FileSystem">
<xsd:sequence>
<xsd:element
name="folder"
ecore:name="folders"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>

Are you sure it wouldn't be easier to override doSave and doLoad?

Thanks.

Re: How do I override doSave and doLoad? [message #521796 is a reply to message #521777] Thu, 18 March 2010 18:19 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Herb,

Comments below.

Herb Miller wrote:
> Well, you don't have time to teach me XSD. I am trying to get smarter
> on XSD. I have been reading the tutorial at http://www.w3schools.com,
> and some articles from http://www.w3.org and http://www.devshed.com
> I have never had to use XSD since we model with UML.
Lucky you hey? :-)
>
> Using the small snippet from before (see below), I think I understand
> that the fileSystem element is defined as a resource:FileSystem type.
> Since the targetNamespace is the same as "resource", then we are in
> the resource namespace. So the complexType FileSystem is actually the
> same type as resource:FileSystem. If I am off on that much then I am
> really lost.
Exactly.
>
> My next question is this:
> What is the type of the element named "folder" in the complexType
> definition of FileSystem? Does ecore:name resolve the "type"? I have
> not been able to find anywhere that an element can be defined without
> a type.
>
> <xsd:element
> name="fileSystem"
> type="resource:FileSystem"/>
>
> <xsd:complexType
> name="FileSystem">
> <xsd:sequence>
> <xsd:element
> name="folder"
> ecore:name="folders"
> maxOccurs="unbounded"/>
Sorry it left out the type="resource:Folder"
> </xsd:sequence>
> </xsd:complexType>
>
> Are you sure it wouldn't be easier to override doSave and doLoad?
What exactly would you do there, rewrite the entire XML serialization
framework?

You might mention to your boss that trying to make XML pretty is like
trying to make a silk purse out of a sows ear. :-P If you want
something that pretty and human readable, Xtext is the way to go.

All this just brings back bad memories of the days when there were those
in a position of authority who believed that being able to edit simple
XML with notepad was more important than having a clean model. :-(
>
> Thanks.
>
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: How do I override doSave and doLoad? [message #521805 is a reply to message #521796] Thu, 18 March 2010 18:44 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
Thanks, that cleared up a few things.

On the other hand, "Oh No - another buzz word".

I will quickly look at Xtext while I continue down the "substitution group" path.

I will post back on how its going.

Thanks again.

Re: How do I override doSave and doLoad? [message #522044 is a reply to message #521805] Fri, 19 March 2010 18:32 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
Speaking of buzz words, would "Ecore to XML Mapping" be a viable option to change the format of the stored files. I was reading something that said the following:
============================
Ecore2XMLExtendedMetaData
Can be used with the OPTION_EXTENDED_META_DATA save/load option defined on XMLResource to affect how date are serialized/deserialized.
Will consult registered Ecore2XML mappings to determine the XML representation of objects.

Resource Handlers
Interface XMLResource.ResourceHandler defines callbacks that can be implemented to do special processing before/after a resource is loaded/saved.

Used with OPTION_RESOURCE_HANDLER save/load option defined on XMLResource.
=============================

Wouldn't that allow me to customize the loading/saving of data from/to files?

Thanks.

Re: How do I override doSave and doLoad? [message #522051 is a reply to message #522044] Fri, 19 March 2010 18:45 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Herb,

Comments below.

Herb Miller wrote:
> Speaking of buzz words, would "Ecore to XML Mapping" be a viable
> option to change the format of the stored files.
Potentially yes, but it doesn't seem to me you need to map between two
different Ecore models.
> I was reading something that said the following:
> ============================
> Ecore2XMLExtendedMetaData
> Can be used with the OPTION_EXTENDED_META_DATA save/load option
> defined on XMLResource to affect how date are serialized/deserialized.
> Will consult registered Ecore2XML mappings to determine the XML
> representation of objects.
>
> Resource Handlers
> Interface XMLResource.ResourceHandler defines callbacks that can be
> implemented to do special processing before/after a resource is
> loaded/saved.
>
> Used with OPTION_RESOURCE_HANDLER save/load option defined on
> XMLResource.
> =============================
>
> Wouldn't that allow me to customize the loading/saving of data from/to
> files?
Yes, but it doesn't avoid the need to create an Ecore model that can
load the instances unassisted. I just helps map instances of that
Ecore model onto a instances of a second slightly different one.
>
> Thanks.
>
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: How do I override doSave and doLoad? [message #522074 is a reply to message #522051] Fri, 19 March 2010 20:03 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
Ok, I found an article here:
http://wiki.eclipse.org/EMF/Recipes#Recipe:_Exploiting_Subst itution_Groups_Without_Polluting_Your_Generated_API

which sounds a lot like what you are talking about. This article gives an example of the problem I am having in many instances. It seems like everything I want to override is being used inside of a delivered plug-in that is necessary for my project.

For instance, there is a line in the article that says:
Generate as normal and modify the generated resource factory to use the XMLResource.OPTION_ELEMENT_HANDLER option:

Followed by:
/**
* Creates an instance of the resource.
*
*
* @generated NOT
*/
@Override
public Resource createResource(URI uri)
{
//...

result.getDefaultSaveOptions().put(XMLResource.OPTION_ELEMEN T_HANDLER, new ElementHandlerImpl(false));

result.getDefaultLoadOptions().put(XMLResource.OPTION_SUPPRE SS_DOCUMENT_ROOT, Boolean.TRUE);

return result;
}
================================

The only problem is that I have no generated code that looks like this. The only use of createResource in the generated code is a call to createResource. But the actual createResource code is in EPAckageImpl.class in one of the plug-ins. So how do I add that line to a delivered plug-in?

Thanks.

Re: How do I override doSave and doLoad? [message #522092 is a reply to message #522074] Fri, 19 March 2010 17:10 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Herg,

Comments below.


Herb Miller wrote:
> Ok, I found an article here:
> http://wiki.eclipse.org/EMF/Recipes#Recipe:_Exploiting_Subst itution_Groups_Without_Polluting_Your_Generated_API
>
>
> which sounds a lot like what you are talking about. This article
> gives an example of the problem I am having in many instances. It
> seems like everything I want to override is being used inside of a
> delivered plug-in that is necessary for my project.
>
> For instance, there is a line in the article that says:
> Generate as normal and modify the generated resource factory to use
> the XMLResource.OPTION_ELEMENT_HANDLER option:
> Followed by:
> /**
> * Creates an instance of the resource.
> * * * @generated NOT
> */
> @Override
> public Resource createResource(URI uri)
> {
> //...
> result.getDefaultSaveOptions().put(XMLResource.OPTION_ELEMEN
> T_HANDLER, new ElementHandlerImpl(false));
> result.getDefaultLoadOptions().put(XMLResource.OPTION_SUPPRE
> SS_DOCUMENT_ROOT, Boolean.TRUE);
>
> return result;
> }
> ================================
>
> The only problem is that I have no generated code that looks like this.
The GenPackage has a Resource Type property that you could set that to
XMI. This should cause a plugin.xml registration for that generated
resource factory to be registered, but the plugin.xml will not be
updated once it exists, so you'll need to delete it so it will be
regenerated.
> The only use of createResource in the generated code is a call to
> createResource. But the actual createResource code is in
> EPAckageImpl.class in one of the plug-ins. So how do I add that line
> to a delivered plug-in?
Once you do the above, you'll see an XyzResourceFactoryImpl in which you
can apply your local changes. Be sure to use the debugger to verify
that this code path is being taken.
>
> Thanks.
>
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: How do I override doSave and doLoad? [message #622335 is a reply to message #521239] Wed, 17 March 2010 21:12 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
I have a couple of questions. The 1st refers to this paragraph you wrote:

> I see the same element referring to two different types so the element
> name does not fully determine the type. EMF wouldn't serialize an xsi:type if it were redundant.

Question 1:
I am thinking there are 2 possibilities here, and I was wondering which one you meant.
1) Is this a problem with the model we have now even before I try to modify the "look" of the data in the files.
2) Is this a problem we will have with the files if I make the changes mentioned in "Merk's Meanderings".

One of the reasons I wanted to override doSave and doLoad was so the program would see and deal with the data in the appropriate format, but the data in the stored files would look "prettier" (like lipstick on a pig). I was going to translate the data on the way into and out of the program.

Question 2:
I am terrible at XSD. I am studying up on it right now, so I will catch up pretty soon. That is why we use UML drawings (picture worth 1,000 words). I am having a problem understanding the schema at the "Merk's Meanderings" article you pointed me to.

In this little snippet of the schema from the article (I think there are no typographical errors), does the complex type named "FileSystem" define the type in the element named "fileSystem"? What is confusing is the element's type is "resource:FileSystem", but the complex type's name is just "FileSystem".

<xsd:element
name="fileSystem"
type="resource:FileSystem"/>

<xsd:complexType
name="FileSystem">
<xsd:sequence>
<xsd:element
name="folder"
ecore:name="folders"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>

Thanks.
Re: How do I override doSave and doLoad? [message #622336 is a reply to message #622335] Wed, 17 March 2010 21:52 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Herb,

Comments below.


Herb Miller wrote:
> I have a couple of questions. The 1st refers to this paragraph you
> wrote:
>
>> I see the same element referring to two different types so the element
>> name does not fully determine the type. EMF wouldn't serialize an
>> xsi:type if it were redundant.
>
> Question 1:
> I am thinking there are 2 possibilities here, and I was wondering
> which one you meant.
> 1) Is this a problem with the model we have now even before I try to
> modify the "look" of the data in the files.
Yes. Right now the xsi:type is absolute necessary.
> 2) Is this a problem we will have with the files if I make the changes
> mentioned in "Merk's Meanderings".
That's the only way to avoid xsi:type. Something needs to be done.
>
> One of the reasons I wanted to override doSave and doLoad was so the
> program would see and deal with the data in the appropriate format,
> but the data in the stored files would look "prettier" (like lipstick
> on a pig). I was going to translate the data on the way into and out
> of the program.
Yes, but surely something finer grained is needed. There is no magic.
>
> Question 2:
> I am terrible at XSD.
But it's so wonderful! :-P
> I am studying up on it right now, so I will catch up pretty soon.
> That is why we use UML drawings (picture worth 1,000 words). I am
> having a problem understanding the schema at the "Merk's Meanderings"
> article you pointed me to.
Oh dear....
>
> In this little snippet of the schema from the article (I think there
> are no typographical errors), does the complex type named "FileSystem"
> define the type in the element named "fileSystem"? What is confusing
> is the element's type is "resource:FileSystem", but the complex type's
> name is just "FileSystem".
Oh dear, even element qualification is throwing you for a loop. What can
I do? I can't teach all the basic XML and XML Schema concepts in the
newsgroup...
>
> <xsd:element
> name="fileSystem"
> type="resource:FileSystem"/>
>
> <xsd:complexType
> name="FileSystem">
> <xsd:sequence>
> <xsd:element
> name="folder"
> ecore:name="folders"
> maxOccurs="unbounded"/>
> </xsd:sequence>
> </xsd:complexType>
>
> Thanks.
>
>
>
>
>
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: How do I override doSave and doLoad? [message #622344 is a reply to message #622336] Thu, 18 March 2010 17:35 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
Well, you don't have time to teach me XSD. I am trying to get smarter on XSD. I have been reading the tutorial at http://www.w3schools.com, and some articles from http://www.w3.org and http://www.devshed.com I have never had to use XSD since we model with UML.

Using the small snippet from before (see below), I think I understand that the fileSystem element is defined as a resource:FileSystem type. Since the targetNamespace is the same as "resource", then we are in the resource namespace. So the complexType FileSystem is actually the same type as resource:FileSystem. If I am off on that much then I am really lost.

My next question is this:
What is the type of the element named "folder" in the complexType definition of FileSystem? Does ecore:name resolve the "type"? I have not been able to find anywhere that an element can be defined without a type.

<xsd:element
name="fileSystem"
type="resource:FileSystem"/>

<xsd:complexType
name="FileSystem">
<xsd:sequence>
<xsd:element
name="folder"
ecore:name="folders"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>

Are you sure it wouldn't be easier to override doSave and doLoad?

Thanks.
Re: How do I override doSave and doLoad? [message #622345 is a reply to message #622344] Thu, 18 March 2010 18:19 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Herb,

Comments below.

Herb Miller wrote:
> Well, you don't have time to teach me XSD. I am trying to get smarter
> on XSD. I have been reading the tutorial at http://www.w3schools.com,
> and some articles from http://www.w3.org and http://www.devshed.com
> I have never had to use XSD since we model with UML.
Lucky you hey? :-)
>
> Using the small snippet from before (see below), I think I understand
> that the fileSystem element is defined as a resource:FileSystem type.
> Since the targetNamespace is the same as "resource", then we are in
> the resource namespace. So the complexType FileSystem is actually the
> same type as resource:FileSystem. If I am off on that much then I am
> really lost.
Exactly.
>
> My next question is this:
> What is the type of the element named "folder" in the complexType
> definition of FileSystem? Does ecore:name resolve the "type"? I have
> not been able to find anywhere that an element can be defined without
> a type.
>
> <xsd:element
> name="fileSystem"
> type="resource:FileSystem"/>
>
> <xsd:complexType
> name="FileSystem">
> <xsd:sequence>
> <xsd:element
> name="folder"
> ecore:name="folders"
> maxOccurs="unbounded"/>
Sorry it left out the type="resource:Folder"
> </xsd:sequence>
> </xsd:complexType>
>
> Are you sure it wouldn't be easier to override doSave and doLoad?
What exactly would you do there, rewrite the entire XML serialization
framework?

You might mention to your boss that trying to make XML pretty is like
trying to make a silk purse out of a sows ear. :-P If you want
something that pretty and human readable, Xtext is the way to go.

All this just brings back bad memories of the days when there were those
in a position of authority who believed that being able to edit simple
XML with notepad was more important than having a clean model. :-(
>
> Thanks.
>
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: How do I override doSave and doLoad? [message #622346 is a reply to message #521796] Thu, 18 March 2010 18:44 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
Thanks, that cleared up a few things.

On the other hand, "Oh No - another buzz word".

I will quickly look at Xtext while I continue down the "substitution group" path.

I will post back on how its going.

Thanks again.
Re: How do I override doSave and doLoad? [message #622355 is a reply to message #622346] Fri, 19 March 2010 18:32 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
Speaking of buzz words, would "Ecore to XML Mapping" be a viable option to change the format of the stored files. I was reading something that said the following:
============================
Ecore2XMLExtendedMetaData
Can be used with the OPTION_EXTENDED_META_DATA save/load option defined on XMLResource to affect how date are serialized/deserialized.
Will consult registered Ecore2XML mappings to determine the XML representation of objects.

Resource Handlers
Interface XMLResource.ResourceHandler defines callbacks that can be implemented to do special processing before/after a resource is loaded/saved.

Used with OPTION_RESOURCE_HANDLER save/load option defined on XMLResource.
=============================

Wouldn't that allow me to customize the loading/saving of data from/to files?

Thanks.
Re: How do I override doSave and doLoad? [message #622356 is a reply to message #622355] Fri, 19 March 2010 18:45 Go to previous messageGo to next message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Herb,

Comments below.

Herb Miller wrote:
> Speaking of buzz words, would "Ecore to XML Mapping" be a viable
> option to change the format of the stored files.
Potentially yes, but it doesn't seem to me you need to map between two
different Ecore models.
> I was reading something that said the following:
> ============================
> Ecore2XMLExtendedMetaData
> Can be used with the OPTION_EXTENDED_META_DATA save/load option
> defined on XMLResource to affect how date are serialized/deserialized.
> Will consult registered Ecore2XML mappings to determine the XML
> representation of objects.
>
> Resource Handlers
> Interface XMLResource.ResourceHandler defines callbacks that can be
> implemented to do special processing before/after a resource is
> loaded/saved.
>
> Used with OPTION_RESOURCE_HANDLER save/load option defined on
> XMLResource.
> =============================
>
> Wouldn't that allow me to customize the loading/saving of data from/to
> files?
Yes, but it doesn't avoid the need to create an Ecore model that can
load the instances unassisted. I just helps map instances of that
Ecore model onto a instances of a second slightly different one.
>
> Thanks.
>
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Re: How do I override doSave and doLoad? [message #622357 is a reply to message #522051] Fri, 19 March 2010 20:03 Go to previous messageGo to next message
Herb Miller is currently offline Herb MillerFriend
Messages: 139
Registered: January 2010
Senior Member
Ok, I found an article here:
http://wiki.eclipse.org/EMF/Recipes#Recipe:_Exploiting_Subst itution_Groups_Without_Polluting_Your_Generated_API

which sounds a lot like what you are talking about. This article gives an example of the problem I am having in many instances. It seems like everything I want to override is being used inside of a delivered plug-in that is necessary for my project.

For instance, there is a line in the article that says:
Generate as normal and modify the generated resource factory to use the XMLResource.OPTION_ELEMENT_HANDLER option:

Followed by:
/**
* Creates an instance of the resource.
*
*
* @generated NOT
*/
@Override
public Resource createResource(URI uri)
{
//...

result.getDefaultSaveOptions().put(XMLResource.OPTION_ELEMEN T_HANDLER, new ElementHandlerImpl(false));

result.getDefaultLoadOptions().put(XMLResource.OPTION_SUPPRE SS_DOCUMENT_ROOT, Boolean.TRUE);

return result;
}
================================

The only problem is that I have no generated code that looks like this. The only use of createResource in the generated code is a call to createResource. But the actual createResource code is in EPAckageImpl.class in one of the plug-ins. So how do I add that line to a delivered plug-in?

Thanks.
Re: How do I override doSave and doLoad? [message #622358 is a reply to message #622357] Fri, 19 March 2010 21:54 Go to previous message
Ed Merks is currently offline Ed MerksFriend
Messages: 33140
Registered: July 2009
Senior Member
Herg,

Comments below.


Herb Miller wrote:
> Ok, I found an article here:
> http://wiki.eclipse.org/EMF/Recipes#Recipe:_Exploiting_Subst itution_Groups_Without_Polluting_Your_Generated_API
>
>
> which sounds a lot like what you are talking about. This article
> gives an example of the problem I am having in many instances. It
> seems like everything I want to override is being used inside of a
> delivered plug-in that is necessary for my project.
>
> For instance, there is a line in the article that says:
> Generate as normal and modify the generated resource factory to use
> the XMLResource.OPTION_ELEMENT_HANDLER option:
> Followed by:
> /**
> * Creates an instance of the resource.
> * * * @generated NOT
> */
> @Override
> public Resource createResource(URI uri)
> {
> //...
> result.getDefaultSaveOptions().put(XMLResource.OPTION_ELEMEN
> T_HANDLER, new ElementHandlerImpl(false));
> result.getDefaultLoadOptions().put(XMLResource.OPTION_SUPPRE
> SS_DOCUMENT_ROOT, Boolean.TRUE);
>
> return result;
> }
> ================================
>
> The only problem is that I have no generated code that looks like this.
The GenPackage has a Resource Type property that you could set that to
XMI. This should cause a plugin.xml registration for that generated
resource factory to be registered, but the plugin.xml will not be
updated once it exists, so you'll need to delete it so it will be
regenerated.
> The only use of createResource in the generated code is a call to
> createResource. But the actual createResource code is in
> EPAckageImpl.class in one of the plug-ins. So how do I add that line
> to a delivered plug-in?
Once you do the above, you'll see an XyzResourceFactoryImpl in which you
can apply your local changes. Be sure to use the debugger to verify
that this code path is being taken.
>
> Thanks.
>
>


Ed Merks
Professional Support: https://www.macromodeling.com/
Previous Topic:Ecore property definition list
Next Topic:Yet another model repository
Goto Forum:
  


Current Time: Wed Apr 24 20:12:10 GMT 2024

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

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

Back to the top