You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by cu...@apache.org on 2014/02/05 22:18:32 UTC

svn commit: r1564931 - in /openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/enhance/ openjpa-kernel/src/main/java/org/apache/openjpa/meta/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/ openjpa-persistence/s...

Author: curtisr7
Date: Wed Feb  5 21:18:31 2014
New Revision: 1564931

URL: http://svn.apache.org/r1564931
Log:
OPENJPA-2467: Fix detection of property access method names. Patch contributed by Dalia Abo Sheasha.

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalization.java   (with props)
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalizationOldBehavior.java   (with props)
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/TestPropertyAccessCapitalization.java   (with props)
Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/CodeGenerator.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/Reflection.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/CodeGenerator.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/CodeGenerator.java?rev=1564931&r1=1564930&r2=1564931&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/CodeGenerator.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/CodeGenerator.java Wed Feb  5 21:18:31 2014
@@ -398,14 +398,24 @@ public class CodeGenerator {
                 code.append("is");
             else
                 code.append("get");
-            code.append(capFieldName).parens();
+            if (fieldName.length() > 1 && Character.isLowerCase(fieldName.charAt(0))
+                && Character.isUpperCase(fieldName.charAt(1))) {
+                code.append(fieldName).parens();
+            } else {
+                code.append(capFieldName).parens();
+            }
             code.openBrace(2).endl();
             code.tab(2).append("return ").append(fieldName).
                 append(";").endl();
             code.closeBrace(2).afterSection();
 
             // setter
-            code.tab().append("public void set").append(capFieldName);
+            if (fieldName.length() > 1 && Character.isLowerCase(fieldName.charAt(0))
+                && Character.isUpperCase(fieldName.charAt(1))) {
+                code.tab().append("public void set").append(fieldName);
+            } else {
+                code.tab().append("public void set").append(capFieldName);
+            }
             code.openParen(true).append(fieldType).append(paramType).
                 append(" ").append(propertyName).closeParen();
             code.openBrace(2).endl();

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java?rev=1564931&r1=1564930&r2=1564931&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/PCEnhancer.java Wed Feb  5 21:18:31 2014
@@ -806,7 +806,7 @@ public class PCEnhancer { 
      * Return the name of the setter method for the given field.
      */
     private static String getSetterName(FieldMetaData fmd) {
-        return "set" + StringUtils.capitalize(fmd.getName());
+        return fmd.getSetterName();
     }
 
     /**

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/Reflection.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/Reflection.java?rev=1564931&r1=1564930&r2=1564931&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/Reflection.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/enhance/Reflection.java Wed Feb  5 21:18:31 2014
@@ -123,6 +123,19 @@ public class Reflection {
                         || m.getReturnType() == Boolean.class)) {
                         setGetterMethod(cls, prop, m);
                         return m;
+                    } else {
+                        m = getDeclaredMethod(c, "get" + prop, null);
+                        if (m != null) {
+                            setGetterMethod(cls, prop, m);
+                            return m;
+                        } else {
+                            m = getDeclaredMethod(c, "is" + prop, null);
+                            if (m != null 
+                                    && (m.getReturnType() == boolean.class || m.getReturnType() == Boolean.class)) {
+                                setGetterMethod(cls, prop, m);
+                                return m;
+                            }
+                        }
                     }
                 }
             }

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java?rev=1564931&r1=1564930&r2=1564931&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/meta/FieldMetaData.java Wed Feb  5 21:18:31 2014
@@ -2446,4 +2446,26 @@ public class FieldMetaData
     public void setUseSchemaElement(boolean _useSchemaElement) {
         this._useSchemaElement = _useSchemaElement;
     }
+
+    public String getSetterName() {
+        String setterName = "set" + StringUtils.capitalize(_name);
+        if (_name.length() > 1 && Character.isLowerCase(_name.charAt(0)) && Character.isUpperCase(_name.charAt(1))) {
+            // We have the special case where the first char is lower, and the
+            // following char is capital. We need to support using the
+            // setaStart() (correct) and setAStart() (incorrect -- old way)
+            Class<?> type = getDeclaringMetaData().getDescribedType();
+            setterName = "set" + _name;
+            try {
+                type.getDeclaredMethod(setterName, getType());
+                return setterName;
+            } catch (Exception e) {
+            }
+            setterName = "set" + StringUtils.capitalize(_name);
+            try {
+                type.getDeclaredMethod(setterName, getType());
+            } catch (Exception e) {
+            }
+        }
+        return setterName;
+    }
 }

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalization.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalization.java?rev=1564931&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalization.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalization.java Wed Feb  5 21:18:31 2014
@@ -0,0 +1,217 @@
+/*
+ * 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.access;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "CAPITALIZATION_TABLE")
+public class PropertyAccessCapitalization {
+    private long id;
+    private int word;
+    private int aWord;
+    private int aaWord;
+    private int aaaWord;
+    private int CAPITAL;
+    private int aCAPITAL;
+    private int Another;
+    private int a1;
+    private int B1;
+    private int a;
+    private int B;
+    private boolean aBoolean;
+    private boolean BBoolean;
+    private boolean BOOLEAN;
+    private boolean Bool;
+
+    public int getaCAPITAL() {
+        return aCAPITAL;
+    }
+
+    public void setaCAPITAL(int aCAPITAL) {
+        this.aCAPITAL = aCAPITAL;
+    }
+
+    public int getA1() {
+        return a1;
+    }
+
+    public void setA1(int a1) {
+        this.a1 = a1;
+    }
+
+    public int getA() {
+        return a;
+    }
+
+    public void setA(int a) {
+        this.a = a;
+    }
+
+    @Id
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public int getWord() {
+        return word;
+    }
+
+    public void setWord(int word) {
+        this.word = word;
+    }
+
+    public int getaWord() {
+        return aWord;
+    }
+
+    public void setaWord(int aWord) {
+        this.aWord = aWord;
+    }
+
+    public int getAaWord() {
+        return aaWord;
+    }
+
+    public void setAaWord(int aaWord) {
+        this.aaWord = aaWord;
+    }
+
+    public int getAaaWord() {
+        return aaaWord;
+    }
+
+    public void setAaaWord(int aaaWord) {
+        this.aaaWord = aaaWord;
+    }
+
+    public int getCAPITAL() {
+        return CAPITAL;
+    }
+
+    public void setCAPITAL(int cAPITAL) {
+        CAPITAL = cAPITAL;
+    }
+
+    public int getB1() {
+        return B1;
+    }
+
+    public void setB1(int b1) {
+        B1 = b1;
+    }
+
+    public int getB() {
+        return B;
+    }
+
+    public void setB(int b) {
+        B = b;
+    }
+
+    public int getAnother() {
+        return Another;
+    }
+
+    public void setAnother(int another) {
+        Another = another;
+    }
+
+    public boolean isaBoolean() {
+        return aBoolean;
+    }
+
+    public void setaBoolean(boolean aBoolean) {
+        this.aBoolean = aBoolean;
+    }
+
+    public boolean isBBoolean() {
+        return BBoolean;
+    }
+
+    public void setBBoolean(boolean bBoolean) {
+        BBoolean = bBoolean;
+    }
+
+    public boolean isBOOLEAN() {
+        return BOOLEAN;
+    }
+
+    public void setBOOLEAN(boolean bOOLEAN) {
+        BOOLEAN = bOOLEAN;
+    }
+
+    public boolean isBool() {
+        return Bool;
+    }
+
+    public void setBool(boolean bool) {
+        Bool = bool;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        PropertyAccessCapitalization other = (PropertyAccessCapitalization) obj;
+        if (getAnother() != other.getAnother())
+            return false;
+        if (getB() != other.getB())
+            return false;
+        if (getB1() != other.getB1())
+            return false;
+        if (isBBoolean() != other.isBBoolean())
+            return false;
+        if (isBOOLEAN() != other.isBOOLEAN())
+            return false;
+        if (isBool() != other.isBool())
+            return false;
+        if (getCAPITAL() != other.getCAPITAL())
+            return false;
+        if (getA() != other.getA())
+            return false;
+        if (getA1() != other.getA1())
+            return false;
+        if (isaBoolean() != other.isaBoolean())
+            return false;
+        if (getaCAPITAL() != other.getaCAPITAL())
+            return false;
+        if (getaWord() != other.getaWord())
+            return false;
+        if (getAaWord() != other.getAaWord())
+            return false;
+        if (getAaaWord() != other.getAaaWord())
+            return false;
+        if (getId() != other.getId())
+            return false;
+        if (getWord() != other.getWord())
+            return false;
+        return true;
+    }
+}

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalization.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalizationOldBehavior.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalizationOldBehavior.java?rev=1564931&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalizationOldBehavior.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalizationOldBehavior.java Wed Feb  5 21:18:31 2014
@@ -0,0 +1,220 @@
+/*
+ * 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.access;
+
+import javax.persistence.Access;
+import javax.persistence.AccessType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "CAPITALIZATION_OLD_BEHAVIOR_TABLE")
+@Access(AccessType.PROPERTY)
+public class PropertyAccessCapitalizationOldBehavior {
+    private long id;
+    private int word;
+    private int aWord;
+    private int aaWord;
+    private int aaaWord;
+    private int CAPITAL;
+    private int aCAPITAL;
+    private int Another;
+    private int a1;
+    private int B1;
+    private int a;
+    private int B;
+    private boolean aBoolean;
+    private boolean BBoolean;
+    private boolean BOOLEAN;
+    private boolean Bool;
+
+    public int getAWord() {
+        return aWord;
+    }
+
+    public void setAWord(int aWord) {
+        this.aWord = aWord;
+    }
+
+    @Id
+    public long getId() {
+        return id;
+    }
+
+    public void setId(long id) {
+        this.id = id;
+    }
+
+    public int getWord() {
+        return word;
+    }
+
+    public void setWord(int word) {
+        this.word = word;
+    }
+
+    public int getAaWord() {
+        return aaWord;
+    }
+
+    public void setAaWord(int aaWord) {
+        this.aaWord = aaWord;
+    }
+
+    public int getAaaWord() {
+        return aaaWord;
+    }
+
+    public void setAaaWord(int aaaWord) {
+        this.aaaWord = aaaWord;
+    }
+
+    public int getCAPITAL() {
+        return CAPITAL;
+    }
+
+    public void setCAPITAL(int cAPITAL) {
+        CAPITAL = cAPITAL;
+    }
+
+    public int getACAPITAL() {
+        return aCAPITAL;
+    }
+
+    public void setACAPITAL(int aCAPITAL) {
+        this.aCAPITAL = aCAPITAL;
+    }
+
+    public int getA1() {
+        return a1;
+    }
+
+    public void setA1(int a1) {
+        this.a1 = a1;
+    }
+
+    public int getA() {
+        return a;
+    }
+
+    public void setA(int a) {
+        this.a = a;
+    }
+
+    public int getB1() {
+        return B1;
+    }
+
+    public void setB1(int b1) {
+        B1 = b1;
+    }
+
+    public int getB() {
+        return B;
+    }
+
+    public void setB(int b) {
+        B = b;
+    }
+
+    public int getAnother() {
+        return Another;
+    }
+
+    public void setAnother(int another) {
+        Another = another;
+    }
+
+    public boolean isABoolean() {
+        return aBoolean;
+    }
+
+    public void setABoolean(boolean aBoolean) {
+        this.aBoolean = aBoolean;
+    }
+
+    public boolean isBBoolean() {
+        return BBoolean;
+    }
+
+    public void setBBoolean(boolean bBoolean) {
+        BBoolean = bBoolean;
+    }
+
+    public boolean isBOOLEAN() {
+        return BOOLEAN;
+    }
+
+    public void setBOOLEAN(boolean bOOLEAN) {
+        BOOLEAN = bOOLEAN;
+    }
+
+    public boolean isBool() {
+        return Bool;
+    }
+
+    public void setBool(boolean bool) {
+        Bool = bool;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null)
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        PropertyAccessCapitalizationOldBehavior other = (PropertyAccessCapitalizationOldBehavior) obj;
+        if (getAnother() != other.getAnother())
+            return false;
+        if (getB() != other.getB())
+            return false;
+        if (getB1() != other.getB1())
+            return false;
+        if (isBBoolean() != other.isBBoolean())
+            return false;
+        if (isBOOLEAN() != other.isBOOLEAN())
+            return false;
+        if (isBool() != other.isBool())
+            return false;
+        if (getCAPITAL() != other.getCAPITAL())
+            return false;
+        if (getA() != other.getA())
+            return false;
+        if (getA1() != other.getA1())
+            return false;
+        if (isABoolean() != other.isABoolean())
+            return false;
+        if (getACAPITAL() != other.getACAPITAL())
+            return false;
+        if (getAWord() != other.getAWord())
+            return false;
+        if (getAaWord() != other.getAaWord())
+            return false;
+        if (getAaaWord() != other.getAaaWord())
+            return false;
+        if (getId() != other.getId())
+            return false;
+        if (getWord() != other.getWord())
+            return false;
+        return true;
+    }
+}

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/PropertyAccessCapitalizationOldBehavior.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/TestPropertyAccessCapitalization.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/TestPropertyAccessCapitalization.java?rev=1564931&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/TestPropertyAccessCapitalization.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/TestPropertyAccessCapitalization.java Wed Feb  5 21:18:31 2014
@@ -0,0 +1,94 @@
+/*
+ * 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.access;
+
+import java.util.Random;
+
+import javax.persistence.EntityManager;
+
+import org.apache.openjpa.persistence.test.SingleEMFTestCase;
+
+public class TestPropertyAccessCapitalization extends SingleEMFTestCase {
+    public void setUp() {
+        setUp(DROP_TABLES, PropertyAccessCapitalization.class, PropertyAccessCapitalizationOldBehavior.class);
+    }
+
+    public void testCorrectCapitalization() {
+        EntityManager em = emf.createEntityManager();
+
+        PropertyAccessCapitalization entity = new PropertyAccessCapitalization();
+        Random r = new Random();
+        entity.setId(r.nextInt());
+        entity.setWord(r.nextInt());
+        entity.setaWord(r.nextInt());
+        entity.setAaWord(r.nextInt());
+        entity.setAaaWord(r.nextInt());
+        entity.setCAPITAL(r.nextInt());
+        entity.setaCAPITAL(r.nextInt());
+        entity.setAnother(r.nextInt());
+        entity.setA1(r.nextInt());
+        entity.setB1(r.nextInt());
+        entity.setA(r.nextInt());
+        entity.setB(r.nextInt());
+        entity.setaBoolean(true);
+        entity.setBBoolean(true);
+        entity.setBOOLEAN(true);
+        entity.setBool(true);
+
+        em.getTransaction().begin();
+        em.persist(entity);
+        em.getTransaction().commit();
+
+        em.clear();
+        PropertyAccessCapitalization persistentEntity = em.find(PropertyAccessCapitalization.class, entity.getId());
+        assertEquals(entity, persistentEntity);
+    }
+
+    public void testOldCapitalization() {
+        EntityManager em = emf.createEntityManager();
+
+        PropertyAccessCapitalizationOldBehavior entity = new PropertyAccessCapitalizationOldBehavior();
+        Random r = new Random();
+        entity.setId(r.nextInt());
+        entity.setWord(r.nextInt());
+        entity.setAWord(r.nextInt());
+        entity.setAaWord(r.nextInt());
+        entity.setAaaWord(r.nextInt());
+        entity.setCAPITAL(r.nextInt());
+        entity.setACAPITAL(r.nextInt());
+        entity.setAnother(r.nextInt());
+        entity.setA1(r.nextInt());
+        entity.setB1(r.nextInt());
+        entity.setA(r.nextInt());
+        entity.setB(r.nextInt());
+        entity.setABoolean(true);
+        entity.setBBoolean(true);
+        entity.setBOOLEAN(true);
+        entity.setBool(true);
+
+        em.getTransaction().begin();
+        em.persist(entity);
+        em.getTransaction().commit();
+
+        em.clear();
+        PropertyAccessCapitalizationOldBehavior persistentEntity =
+            em.find(PropertyAccessCapitalizationOldBehavior.class, entity.getId());
+        assertEquals(entity, persistentEntity);
+    }
+}

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/access/TestPropertyAccessCapitalization.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java?rev=1564931&r1=1564930&r2=1564931&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceMetaDataDefaults.java Wed Feb  5 21:18:31 2014
@@ -609,12 +609,16 @@ public class PersistenceMetaDataDefaults
                     return false;
             }            
             try {
+                String setterName; 
+                if (member.getName().startsWith("is")) {
+                    setterName = "set" + member.getName().substring(2);
+                } else {
+                    setterName = "set" + member.getName().substring(3);
+                }
                 // check for setters for methods
-                Method setter = (Method) AccessController.doPrivileged(
-                    J2DoPrivHelper.getDeclaredMethodAction(
-                        meta.getDescribedType(), "set" +
-                        StringUtils.capitalize(name), new Class[] { 
-                            ((Method) member).getReturnType() }));
+                Method setter =
+                    (Method) AccessController.doPrivileged(J2DoPrivHelper.getDeclaredMethodAction(
+                        meta.getDescribedType(), setterName, new Class[] { ((Method) member).getReturnType() }));
                 if (setter == null && !isAnnotatedTransient(member)) {
                     logNoSetter(meta, name, null);
                     return false;