Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Modeling » EMF » Xcore and FeatureMaps
Xcore and FeatureMaps [message #1011295] Tue, 19 February 2013 09:01 Go to next message
Jan Rosczak is currently offline Jan Rosczak
Messages: 35
Registered: July 2009
Location: Hamburg, Germany
Member
Hi,

I am trying to get FeatureMaps to work with Xcore. Is this possible and if yes, how can this be done?

Thanks
Jan
Re: Xcore and FeatureMaps [message #1011311 is a reply to message #1011295] Tue, 19 February 2013 09:35 Go to previous messageGo to next message
Ed Merks is currently offline Ed Merks
Messages: 26047
Registered: July 2009
Senior Member
Jan,

I've not tried that. You might try exporting a *.genmodel for a *.ecore
model with feature maps to *.xcore and seeing how that looks. A feature
map is just a multi-valued EAttribute with FeatureMap.Entry data type so
it should just work if you use an attribute with type EFeatureMapEntry...


On 19/02/2013 10:01 AM, Jan Rosczak wrote:
> Hi,
>
> I am trying to get FeatureMaps to work with Xcore. Is this possible
> and if yes, how can this be done?
>
> Thanks
> Jan
Re: Xcore and FeatureMaps [message #1011375 is a reply to message #1011311] Tue, 19 February 2013 12:46 Go to previous messageGo to next message
Jan Rosczak is currently offline Jan Rosczak
Messages: 35
Registered: July 2009
Location: Hamburg, Germany
Member
Hi Ed,

I (hopefully) did, as you suggested. But when I select my genmodel and click "Export model..." I get a NullPointerException. I am using the last EMF Milestone, Xcore version 1.1.0.

Thanks
Jan

java.lang.NullPointerException
	at org.eclipse.emf.ecore.xcore.resource.XcoreResource$FragmentCache.<init>(XcoreResource.java:66)
	at org.eclipse.emf.ecore.xcore.resource.XcoreResource.getEObject(XcoreResource.java:157)
	at org.eclipse.emf.ecore.xcore.scoping.XcoreImportedNamespaceAwareScopeProvider$EClassifierScope$EcoreDataTypeAliasEObjectDescription.getElement(XcoreImportedNamespaceAwareScopeProvider.java:535)
	at org.eclipse.emf.ecore.xcore.scoping.XcoreImportedNamespaceAwareScopeProvider$EClassifierScope$EcoreDataTypeAliasEObjectDescription.getEObjectOrProxy(XcoreImportedNamespaceAwareScopeProvider.java:463)
	at org.eclipse.xtext.scoping.impl.AbstractScope$5.apply(AbstractScope.java:186)
	at org.eclipse.xtext.scoping.impl.AbstractScope$5.apply(AbstractScope.java:1)
	at com.google.common.collect.Iterators$7.computeNext(Iterators.java:645)
	at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
	at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
	at com.google.common.collect.Iterators$5.hasNext(Iterators.java:539)
	at org.eclipse.xtext.scoping.impl.ImportScope.getAliasedElements(ImportScope.java:117)
	at org.eclipse.xtext.scoping.impl.ImportScope.getLocalElementsByEObject(ImportScope.java:97)
	at org.eclipse.xtext.scoping.impl.AbstractScope.getElements(AbstractScope.java:154)
	at org.eclipse.xtext.scoping.impl.FilteringScope.getElements(FilteringScope.java:41)
	at org.eclipse.xtext.scoping.impl.ScopeBasedSelectable.getExportedObjectsByObject(ScopeBasedSelectable.java:45)
	at org.eclipse.xtext.scoping.impl.ImportScope.getLocalElementsByEObject(ImportScope.java:96)
	at org.eclipse.xtext.scoping.impl.AbstractScope.getElements(AbstractScope.java:154)
	at org.eclipse.xtext.scoping.impl.AbstractScope$3.get(AbstractScope.java:157)
	at org.eclipse.xtext.scoping.impl.AbstractScope$3.get(AbstractScope.java:1)
	at org.eclipse.xtext.scoping.impl.AbstractScope$ParentIterable.iterator(AbstractScope.java:59)
	at com.google.common.collect.Iterables$3.next(Iterables.java:505)
	at com.google.common.collect.Iterables$3.next(Iterables.java:498)
	at com.google.common.collect.Iterators$5.hasNext(Iterators.java:540)
	at com.google.common.collect.Iterators$7.computeNext(Iterators.java:643)
	at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
	at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
	at com.google.common.collect.Iterators$5.hasNext(Iterators.java:539)
	at com.google.common.collect.Iterators$7.computeNext(Iterators.java:643)
	at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
	at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
	at com.google.common.collect.Iterators$5.hasNext(Iterators.java:539)
	at com.google.common.collect.Iterators$7.computeNext(Iterators.java:643)
	at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
	at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
	at com.google.common.collect.Iterators$5.hasNext(Iterators.java:539)
	at org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer.getCrossReferenceNameFromScope(CrossReferenceSerializer.java:128)
	at org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer.serializeCrossRef(CrossReferenceSerializer.java:120)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.getToken(SequenceFeeder.java:453)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:220)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:401)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:222)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:401)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:239)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:394)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:239)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:394)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
	at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:85)
	at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:108)
	at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:130)
	at org.eclipse.xtext.resource.XtextResource.doSave(XtextResource.java:316)
	at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1441)
	at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1010)
	at org.eclipse.emf.ecore.xcore.exporter.XcoreExporter$3.run(XcoreExporter.java:394)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
  • Attachment: model.ecore
    (Size: 1.47KB, Downloaded 41 times)
Re: Xcore and FeatureMaps [message #1011378 is a reply to message #1011375] Tue, 19 February 2013 12:53 Go to previous messageGo to next message
Ed Merks is currently offline Ed Merks
Messages: 26047
Registered: July 2009
Senior Member
Jan,

I tried that locally with the latest Xtext and the latest fixes in Xcore
needed for the latest Xtext and it produced this:

@Ecore(nsPrefix="mp", nsURI="http://model")
@GenModel(modelDirectory="/abc/src",
importerID="org.eclipse.emf.importer.ecore", complianceLevel="5.0")
package model

import org.eclipse.emf.ecore.EFeatureMapEntry

class Supplier
{
@ExtendedMetaData(kind="group")
unique EFeatureMapEntry [] orders
@ExtendedMetaData(group="#orders")
contains resolving transient volatile PurchaseOrder [] preferredOrders
@ExtendedMetaData(group="#orders")
contains resolving transient volatile PurchaseOrder [] standardOrders

}

class PurchaseOrder
{
}


On 19/02/2013 1:46 PM, Jan Rosczak wrote:
> Hi Ed,
>
> I (hopefully) did, as you suggested. But when I select my genmodel and click "Export model..." I get a NullPointerException. I am using the last EMF Milestone, Xcore version 1.1.0.
>
> Thanks
> Jan
>
>
> java.lang.NullPointerException
> at org.eclipse.emf.ecore.xcore.resource.XcoreResource$FragmentCache.<init>(XcoreResource.java:66)
> at org.eclipse.emf.ecore.xcore.resource.XcoreResource.getEObject(XcoreResource.java:157)
> at org.eclipse.emf.ecore.xcore.scoping.XcoreImportedNamespaceAwareScopeProvider$EClassifierScope$EcoreDataTypeAliasEObjectDescription.getElement(XcoreImportedNamespaceAwareScopeProvider.java:535)
> at org.eclipse.emf.ecore.xcore.scoping.XcoreImportedNamespaceAwareScopeProvider$EClassifierScope$EcoreDataTypeAliasEObjectDescription.getEObjectOrProxy(XcoreImportedNamespaceAwareScopeProvider.java:463)
> at org.eclipse.xtext.scoping.impl.AbstractScope$5.apply(AbstractScope.java:186)
> at org.eclipse.xtext.scoping.impl.AbstractScope$5.apply(AbstractScope.java:1)
> at com.google.common.collect.Iterators$7.computeNext(Iterators.java:645)
> at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
> at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
> at com.google.common.collect.Iterators$5.hasNext(Iterators.java:539)
> at org.eclipse.xtext.scoping.impl.ImportScope.getAliasedElements(ImportScope.java:117)
> at org.eclipse.xtext.scoping.impl.ImportScope.getLocalElementsByEObject(ImportScope.java:97)
> at org.eclipse.xtext.scoping.impl.AbstractScope.getElements(AbstractScope.java:154)
> at org.eclipse.xtext.scoping.impl.FilteringScope.getElements(FilteringScope.java:41)
> at org.eclipse.xtext.scoping.impl.ScopeBasedSelectable.getExportedObjectsByObject(ScopeBasedSelectable.java:45)
> at org.eclipse.xtext.scoping.impl.ImportScope.getLocalElementsByEObject(ImportScope.java:96)
> at org.eclipse.xtext.scoping.impl.AbstractScope.getElements(AbstractScope.java:154)
> at org.eclipse.xtext.scoping.impl.AbstractScope$3.get(AbstractScope.java:157)
> at org.eclipse.xtext.scoping.impl.AbstractScope$3.get(AbstractScope.java:1)
> at org.eclipse.xtext.scoping.impl.AbstractScope$ParentIterable.iterator(AbstractScope.java:59)
> at com.google.common.collect.Iterables$3.next(Iterables.java:505)
> at com.google.common.collect.Iterables$3.next(Iterables.java:498)
> at com.google.common.collect.Iterators$5.hasNext(Iterators.java:540)
> at com.google.common.collect.Iterators$7.computeNext(Iterators.java:643)
> at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
> at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
> at com.google.common.collect.Iterators$5.hasNext(Iterators.java:539)
> at com.google.common.collect.Iterators$7.computeNext(Iterators.java:643)
> at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
> at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
> at com.google.common.collect.Iterators$5.hasNext(Iterators.java:539)
> at com.google.common.collect.Iterators$7.computeNext(Iterators.java:643)
> at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:141)
> at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:136)
> at com.google.common.collect.Iterators$5.hasNext(Iterators.java:539)
> at org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer.getCrossReferenceNameFromScope(CrossReferenceSerializer.java:128)
> at org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer.serializeCrossRef(CrossReferenceSerializer.java:120)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.getToken(SequenceFeeder.java:453)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:220)
> at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:401)
> at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:222)
> at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:401)
> at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:239)
> at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:394)
> at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:299)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:325)
> at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:239)
> at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:394)
> at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:439)
> at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:85)
> at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:108)
> at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:130)
> at org.eclipse.xtext.resource.XtextResource.doSave(XtextResource.java:316)
> at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1441)
> at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1010)
> at org.eclipse.emf.ecore.xcore.exporter.XcoreExporter$3.run(XcoreExporter.java:394)
> at org.eclipse.core.internal.jobs.Worker.run(Worker.java:54)
>
Re: Xcore and FeatureMaps [message #1011412 is a reply to message #1011378] Tue, 19 February 2013 14:33 Go to previous messageGo to next message
Jan Rosczak is currently offline Jan Rosczak
Messages: 35
Registered: July 2009
Location: Hamburg, Germany
Member
Hi Ed,

this does not work in milestone M5, as the type EFeatureMapEntry cannot be imported. But the following works:

@Ecore(nsPrefix="mp", nsURI="http://model")
package model

import org.eclipse.emf.ecore.util.FeatureMap$Entry

type EFeatureMapEntry wraps FeatureMap$Entry

class Supplier
{
	@ExtendedMetaData(kind="group")
	EFeatureMapEntry [] orders

	@ExtendedMetaData(group="#orders")
	contains transient volatile PurchaseOrder [] preferredOrders

	@ExtendedMetaData(group="#orders")
	contains transient volatile PurchaseOrder [] standardOrders
}

class PurchaseOrder
{
}


Alas, adding @GenModel(runtimePlatform="RCP", featureDelegation="Reflective") changes the generated code for "preferredOrders" and "standardOrders" to its reflective version. I would have expected these method bodies to not change at all.

Thanks
Jan
Re: Xcore and FeatureMaps [message #1011463 is a reply to message #1011412] Tue, 19 February 2013 15:37 Go to previous messageGo to next message
Ed Merks is currently offline Ed Merks
Messages: 26047
Registered: July 2009
Senior Member
Jan,

Comments below.

On 19/02/2013 3:33 PM, Jan Rosczak wrote:
> Hi Ed,
>
> this does not work in milestone M5,
There was quite a bit of disruption in Xbase and it was hard to
synchronize all that...
> as the type EFeatureMapEntry cannot be imported. But the following works:
>
>
> @Ecore(nsPrefix="mp", nsURI="http://model")
> package model
>
> import org.eclipse.emf.ecore.util.FeatureMap$Entry
>
> type EFeatureMapEntry wraps FeatureMap$Entry
>
> class Supplier
> {
> @ExtendedMetaData(kind="group")
> EFeatureMapEntry [] orders
>
> @ExtendedMetaData(group="#orders")
> contains transient volatile PurchaseOrder [] preferredOrders
>
> @ExtendedMetaData(group="#orders")
> contains transient volatile PurchaseOrder [] standardOrders
> }
>
> class PurchaseOrder
> {
> }
>
>
> Alas, adding @GenModel(runtimePlatform="RCP",
> featureDelegation="Reflective") changes the generated code for
> "preferredOrders" and "standardOrders" to its reflective version. I
> would have expected these method bodies to not change at all.
Does that break anything?
>
> Thanks
> Jan
Re: Xcore and FeatureMaps [message #1011757 is a reply to message #1011463] Wed, 20 February 2013 07:56 Go to previous messageGo to next message
Jan Rosczak is currently offline Jan Rosczak
Messages: 35
Registered: July 2009
Location: Hamburg, Germany
Member
Hi,

yes, the reflective feature delegation breaks feature maps.

Supplier supplier = ModelFactory.eINSTANCE.createSupplier();

PurchaseOrder preferredOrder = ModelFactory.eINSTANCE.createPurchaseOrder();
PurchaseOrder standardOrder = ModelFactory.eINSTANCE.createPurchaseOrder();

supplier.getOrders().add(ModelPackage.Literals.SUPPLIER__PREFERRED_ORDERS, preferredOrder);
supplier.getOrders().add(ModelPackage.Literals.SUPPLIER__STANDARD_ORDERS, standardOrder);

System.out.println(supplier.getOrders().size()); // prints 2
System.out.println(supplier.getPreferredOrders().size()); // prints 0
System.out.println(supplier.getStandardOrders().size()); // prints 0


If the feature map would still work, the last two lines should each print "1".

----

In the example you showed, the import of "org.eclipse.emf.ecore.EFeatureMapEntry" bothered me. In which plugin can this class be found (I looked in git repository with no result)? Thats why I changed it to:

type EFeatureMapEntry wraps FeatureMap$Entry

That works.
Re: Xcore and FeatureMaps [message #1011763 is a reply to message #1011757] Wed, 20 February 2013 08:02 Go to previous messageGo to next message
Ed Merks is currently offline Ed Merks
Messages: 26047
Registered: July 2009
Senior Member
Jan,

Please open a bugzilla with the details and the example. The import
"org.eclipse.emf.ecore.EFeatureMapEntry" refers to the EDataType in
Ecore.ecore; you won't find it in Java. In general Xcore's imports can
refer to EClassifiers or to Java types (or even to both, e.g., for
generated EClasses).


On 20/02/2013 8:56 AM, Jan Rosczak wrote:
> Hi,
>
> yes, the reflective feature delegation breaks feature maps.
>
>
> Supplier supplier = ModelFactory.eINSTANCE.createSupplier();
>
> PurchaseOrder preferredOrder =
> ModelFactory.eINSTANCE.createPurchaseOrder();
> PurchaseOrder standardOrder =
> ModelFactory.eINSTANCE.createPurchaseOrder();
>
> supplier.getOrders().add(ModelPackage.Literals.SUPPLIER__PREFERRED_ORDERS,
> preferredOrder);
> supplier.getOrders().add(ModelPackage.Literals.SUPPLIER__STANDARD_ORDERS,
> standardOrder);
>
> System.out.println(supplier.getOrders().size()); // prints 2
> System.out.println(supplier.getPreferredOrders().size()); // prints 0
> System.out.println(supplier.getStandardOrders().size()); // prints 0
>
>
> If the feature map would still work, the last two lines should each
> print "1".
> ----
>
> In the example you showed, the import of
> "org.eclipse.emf.ecore.EFeatureMapEntry" bothered me. In which plugin
> can this class be found (I looked in git repository with no result)?
> Thats why I changed it to:
> type EFeatureMapEntry wraps FeatureMap$Entry
>
> That works.
>
Re: Xcore and FeatureMaps [message #1390945 is a reply to message #1011763] Mon, 30 June 2014 08:00 Go to previous messageGo to next message
Marco Descher is currently offline Marco Descher
Messages: 84
Registered: October 2010
Location: Austria
Member
Was there a bug created on this? Currently trying to get FeatureMaps running with XCore ... any updates? Thank you!
Re: Xcore and FeatureMaps [message #1391047 is a reply to message #1390945] Mon, 30 June 2014 11:18 Go to previous message
Ed Merks is currently offline Ed Merks
Messages: 26047
Registered: July 2009
Senior Member
Marco,

I don't recall. If it's not working in the latest release (in the Luna
repo), please open a bugzilla.

On 30/06/2014 10:00 AM, Marco Descher wrote:
> Was there a bug created on this? Currently trying to get FeatureMaps
> running with XCore ... any updates? Thank you!
Previous Topic:[CDO] Issues with uploading CLobs in non 1-byte encoding
Next Topic:EMF seems unable to read back what it wrote
Goto Forum:
  


Current Time: Tue Sep 16 21:33:19 GMT 2014

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

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