Author: ppoddar
Date: Tue Jun 10 13:34:52 2008
New Revision: 666314

URL: http://svn.apache.org/viewvc?rev=666314&view=rev
Log:
OPENJPA-602: Avoid NPE when table-per-class inheritance staregy with an 
abstract root. See test cases for further details.

Added:
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/BaseEntity.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/EnglishParagraph.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/FrenchParagraph.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/GermanParagraph.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/TestTablePerClassInheritanceWithAbstractRoot.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/Translatable.java
    
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/Translation.java
Modified:
    
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java

Modified: 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java?rev=666314&r1=666313&r2=666314&view=diff
==============================================================================
--- 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
 (original)
+++ 
openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/RelationToManyInverseKeyFieldStrategy.java
 Tue Jun 10 13:34:52 2008
@@ -133,9 +133,16 @@
             elem.setJoinDirection(ValueMapping.JOIN_EXPECTED_INVERSE);
             elem.setUseClassCriteria(criteria);
 
-            field.setOrderColumn(finfo.getOrderColumn(field,
-                mapped.getForeignKey().getTable(), adapt));
-            field.setOrderColumnIO(finfo.getColumnIO());
+            ForeignKey fk = mapped.getForeignKey();
+            /** Foreign key may be null if declared type of the mapped field 
is 
+             * abstract and under table-per-class inheritance strategy will 
have
+             * no mapped table.  
+             */
+            if (fk != null) {
+               field.setOrderColumn(finfo.getOrderColumn(field,
+                               fk.getTable(), adapt));
+               field.setOrderColumnIO(finfo.getColumnIO());
+            }
             return;
         }
 

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/BaseEntity.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/BaseEntity.java?rev=666314&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/BaseEntity.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/BaseEntity.java
 Tue Jun 10 13:34:52 2008
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.inheritance.polymorphic;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Version;
+
+/**
+ * An abstract base entity class with auto-generated identty and version field.
+ * Used for testing special case of table-per-class inheritance strategy when 
+ * the root of persistent inheritance hierarchy is abstract and itself 
+ * derives from an abstract MappedSuperClass (i.e. this class).
+ * 
+ * For a more detailed description of the domain model to which this receiver
+ * belongs
+ * @see TestTablePerClassInheritanceWithAbstractRoot
+ * 
+ * @author Pinaki Poddar
+ * 
+ */
[EMAIL PROTECTED]
+public abstract class BaseEntity {
+       @Id
+       @GeneratedValue
+       private long id;
+       
+       @Version
+       private long version;
+
+       public long getId() {
+               return id;
+       }
+
+       public long getVersion() {
+               return version;
+       }
+}

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/EnglishParagraph.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/EnglishParagraph.java?rev=666314&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/EnglishParagraph.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/EnglishParagraph.java
 Tue Jun 10 13:34:52 2008
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.inheritance.polymorphic;
+
+import javax.persistence.Entity;
+
+/**
+ * A persistent class derived from an abstract persistent class and 
+ * using table-per-concrete-class inheritance strategy.
+ * 
+ * For a more detailed description of the domain model to which this receiver
+ * belongs
+ * @see TestTablePerClassInheritanceWithAbstractRoot
+ * 
+ * @author Pinaki Poddar
+ *
+ */
[EMAIL PROTECTED]
+public class EnglishParagraph extends Translatable {
+       private String content;
+
+       public String getContent() {
+               return content;
+       }
+
+       public void setContent(String content) {
+               this.content = content;
+       }
+}

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/FrenchParagraph.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/FrenchParagraph.java?rev=666314&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/FrenchParagraph.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/FrenchParagraph.java
 Tue Jun 10 13:34:52 2008
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.inheritance.polymorphic;
+
+import javax.persistence.Entity;
+
+/**
+ * A persistent class derived from an abstract persistent class and 
+ * using table-per-concrete-class inheritance strategy.
+ * 
+ * For a more detailed description of the domain model to which this receiver
+ * belongs
+ * @see TestTablePerClassInheritanceWithAbstractRoot
+ * 
+ * @author Pinaki Poddar
+ *
+ */
[EMAIL PROTECTED]
+public class FrenchParagraph extends Translatable {
+       private String content;
+
+       public String getContent() {
+               return content;
+       }
+
+       public void setContent(String content) {
+               this.content = content;
+       }
+}

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/GermanParagraph.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/GermanParagraph.java?rev=666314&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/GermanParagraph.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/GermanParagraph.java
 Tue Jun 10 13:34:52 2008
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.inheritance.polymorphic;
+
+import javax.persistence.Entity;
+
+/**
+ * A persistent class derived from an abstract persistent class and 
+ * using table-per-concrete-class inheritance strategy.
+ * 
+ * For a more detailed description of the domain model to which this receiver
+ * belongs
+ * @see TestTablePerClassInheritanceWithAbstractRoot
+ * 
+ * @author Pinaki Poddar
+ *
+ */
[EMAIL PROTECTED]
+public class GermanParagraph extends Translatable {
+       private String content;
+
+       public String getContent() {
+               return content;
+       }
+
+       public void setContent(String content) {
+               this.content = content;
+       }
+}

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/TestTablePerClassInheritanceWithAbstractRoot.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/TestTablePerClassInheritanceWithAbstractRoot.java?rev=666314&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/TestTablePerClassInheritanceWithAbstractRoot.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/TestTablePerClassInheritanceWithAbstractRoot.java
 Tue Jun 10 13:34:52 2008
@@ -0,0 +1,155 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.inheritance.polymorphic;
+
+import java.util.List;
+
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+/**
+ * Tests a domain model with following characteristics:
+ * a) A typical bidirectional ManyToOne/OneToMany relation 
+ *    EntityA references a single instance of EntityB
+ *    EntityB references a collection of EntityA
+ * b) EntityB itself is abstract 
+ * c) Many concrete subclasses of EntityB exist
+ * d) EntityB uses TABLE_PER_CLASS inheritance strategy, hence no mapping 
table 
+ *    exists for EntityB itself.
+ * e) Relation field in EntityA is declared as abstract type EntityB (for which
+ * f) all the domain classes i.e. EntityA, EntityB and all its subclasses is
+ *    derived from an abstract MappedSuperClass which holds primary key and
+ *    version fields.
+ *    
+ *  The test addresses a reported error [1] in mapping the above domain model.
+ *  The test verifies basic persist, query and delete operations on the domain
+ *  model.
+ *  
+ *  [1] <A HREF="https://issues.apache.org/jira/browse/OPENJPA-602";> 
OPENJPA-602</A>}
+ *        
+ * @author Pinaki Poddar
+ *
+ */
+public class TestTablePerClassInheritanceWithAbstractRoot extends
+               SingleEMFTestCase {
+       Class[] UNJOINED_SUBCLASSES = {
+                       EnglishParagraph.class, 
+                       FrenchParagraph.class, 
+                       GermanParagraph.class};
+       
+    public void setUp() {
+        setUp(CLEAR_TABLES, 
+                       "openjpa.Log", "SQL=TRACE", 
+                       Translation.class, BaseEntity.class,
+                       EnglishParagraph.class, FrenchParagraph.class, 
+                       GermanParagraph.class, Translatable.class);
+    }
+    
+       public void testConsistency() {
+               OpenJPAEntityManager em = emf.createEntityManager();
+               em.getTransaction().begin();
+               /**
+                * Aggregate query operations can not be performed on unjoined 
+                * subclasses. Hence all concrete subclasses of abstract base
+                * class is counted separately to count all Translatable 
instances.
+                */
+               int nTranslatableBefore = count(UNJOINED_SUBCLASSES);
+               int nTranslationBefore = count(Translation.class);
+               
+               EnglishParagraph english = new EnglishParagraph();
+               FrenchParagraph french   = new FrenchParagraph();
+               GermanParagraph german   = new GermanParagraph();
+               
+               Translation translation1 = new Translation(); 
+               Translation translation2 = new Translation(); 
+               Translation translation3 = new Translation(); 
+               Translation translation4 = new Translation(); 
+               
+               english.setContent("Hello");
+               french.setContent("Bon jour");
+               german.setContent("Guten Tag");
+
+               
+               translation1.setTranslatable(english);
+               translation2.setTranslatable(english);
+               translation3.setTranslatable(french);
+               translation4.setTranslatable(german);
+               
+               english.addTranslation(translation1);
+               english.addTranslation(translation2);
+               french.addTranslation(translation3);
+               german.addTranslation(translation4);
+               
+               em.persist(translation1);
+               em.persist(translation2);
+               em.persist(translation3);
+               em.persist(translation4);
+               em.getTransaction().commit();
+               
+               em.clear();
+
+               int nTranslatableAfter = count(UNJOINED_SUBCLASSES);
+               int nTranslationAfter  = count(Translation.class);
+               
+               assertEquals(nTranslatableBefore+3, nTranslatableAfter);
+               assertEquals(nTranslationBefore+4, nTranslationAfter);
+               
+               /**
+                * Verify that if A refers to B then A must be a member of the 
set 
+                * referred by B
+                */
+               em.getTransaction().begin();
+               List<Translation> result = em.createQuery("SELECT p FROM 
Translation p")
+                       .getResultList();
+               assertTrue(!result.isEmpty());
+               for (Translation translation : result) {
+                       assertTrue(translation.getTranslatable()
+                                       
.getTranslations().contains(translation));
+               }
+               em.getTransaction().rollback();
+       }
+       
+       
+       void linkConsistently(Translation translation, Translatable 
translatable) {
+               translatable.addTranslation(translation);
+               translation.setTranslatable(translatable);
+       }
+       
+       /**
+        * Count the number of instances in the given class by aggregate JPQL 
query.
+        */
+       public int count(Class c) {
+               OpenJPAEntityManager em = emf.createEntityManager();
+               return ((Number) em.createQuery("SELECT COUNT(p) FROM " + 
+                               c.getSimpleName() + " 
p").getSingleResult()).intValue();
+       }
+       
+       /**
+        * Count total number of instances of all the given classes by separate 
JPQL
+        * aggregate query. Useful when a base class has unjoined subclasses.
+        */
+       public int count(Class... classes) {
+               int total = 0;
+               for (Class c:classes) {
+                       total += count(c);
+               }
+               return total;
+       }
+       
+}

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/Translatable.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/Translatable.java?rev=666314&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/Translatable.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/Translatable.java
 Tue Jun 10 13:34:52 2008
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.inheritance.polymorphic;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.OneToMany;
+
+/**
+ * An abstract persistent class used as root of inheritance hierarchy and 
+ * using table-per-concrete-class inheritance strategy.
+ * 
+ * For a more detailed description of the domain model to which this receiver
+ * belongs
+ * @see TestTablePerClassInheritanceWithAbstractRoot
+ * 
+ * @author Pinaki Poddar
+ *
+ */
[EMAIL PROTECTED]
[EMAIL PROTECTED](strategy=InheritanceType.TABLE_PER_CLASS)
+public abstract class Translatable extends BaseEntity {
+       @OneToMany(mappedBy="translatable", cascade=CascadeType.PERSIST)
+       private Set<Translation> translations;
+       
+       public void addTranslation(Translation t) {
+               if (translations == null)
+                       translations = new HashSet<Translation>();
+               translations.add(t);
+       }
+       
+       public Set<Translation> getTranslations() {
+               return Collections.unmodifiableSet(translations);
+       }
+}

Added: 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/Translation.java
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/Translation.java?rev=666314&view=auto
==============================================================================
--- 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/Translation.java
 (added)
+++ 
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/inheritance/polymorphic/Translation.java
 Tue Jun 10 13:34:52 2008
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.inheritance.polymorphic;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
[EMAIL PROTECTED]
[EMAIL PROTECTED](name="TRANSLATIONS")
+/**
+ * An persistent class that refers to a polymorphic uni-cardinality relation. 
+ * The polymorphic relation itself derives from an abstract class that uses
+ * table-per-class inheritance strategy.
+ *   
+ * For a more detailed description of the domain model to which this receiver
+ * belongs
+ * @see TestTablePerClassInheritanceWithAbstractRoot
+ * 
+ * @author Pinaki Poddar
+ *
+ */
+public class Translation extends BaseEntity {
+       @ManyToOne(cascade=CascadeType.PERSIST)
+       private Translatable translatable;
+
+       public Translatable getTranslatable() {
+               return translatable;
+       }
+
+       public void setTranslatable(Translatable translatable) {
+               this.translatable = translatable;
+       }
+}


Reply via email to