cayenne-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrey Razumovsky <razumovsky.and...@gmail.com>
Subject Re: CAY-1345) enum construction requires string name of enum
Date Wed, 23 Dec 2009 07:50:23 GMT
Since CAY-1261 we started to inject qualifier values automatically at
creation of the object. So, we need to do operation reverse to
getDatabaseValue() to have newly created object's ProductType=qualifier
value. Particularly, this line caused te error:
[java]    at
org.apache.cayenne.BaseContext.injectInitialValue(BaseContext.java:407)

2009/12/23 Aristedes Maniatis <ari@maniatis.org>

> OK, great. But I'm confused how CAY-1261 caused the problem. I can't see
> any code anywhere that would ever have made this work.
>
> Ari
>
>
>
> On 23/12/09 5:59 PM, Andrey Razumovsky wrote:
>
>> Looks fine. It's a regression in B1 (caused by CAY-1261), and it'll be
>> great
>> if you committed the fix. setProperty() should work correct for
>> ExtendedEnums as well
>>
>> 2009/12/23 Aristedes Maniatis<ari@maniatis.org>
>>
>>  What do people think of this as a solution? And what about getting that
>>> into 3.0? This really is a bug in 3.0 I think, since the whole concept of
>>> the interface ExtendedEnumeration is flawed at the moment.
>>>
>>> I haven't done any testing of this yet, but Marcin was going to see if he
>>> could write a few unit tests and also test it inside our own application.
>>>
>>> Ari Maniatis
>>>
>>>
>>> On 22/12/09 4:22 PM, Ari Maniatis (JIRA) wrote:
>>>
>>>
>>>>     [
>>>>
>>>> https://issues.apache.org/jira/browse/CAY-1345?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12793501#action_12793501
>>>> ]
>>>>
>>>> Ari Maniatis commented on CAY-1345:
>>>> -----------------------------------
>>>>
>>>> I believe the problem here is summarised as:
>>>>
>>>> * Our enum converter is able to convert an enum to any database value
>>>> with
>>>> "Object getDatabaseValue()" in the ExtendedEnumeration class. But it can
>>>> only convert back again to an object if the database value is the *name*
>>>> of
>>>> the enum.
>>>>
>>>> Here is a potential fix:
>>>>
>>>>
>>>>
>>>> class EnumConverter extends Converter {
>>>>
>>>>     @Override
>>>>     @SuppressWarnings("unchecked")
>>>>     Object convert(Object object, Class type) {
>>>>
>>>>         if (object == null) {
>>>>             return null;
>>>>         }
>>>>
>>>>         try {
>>>>             if (type.isAssignableFrom(ExtendedEnumeration.class)) {
>>>>                 for (ExtendedEnumeration en : (ExtendedEnumeration[])
>>>> type.getMethod(
>>>>                         "values").invoke(null)) {
>>>>                     if (en.getDatabaseValue().equals(object))
>>>>                         return en;
>>>>                 }
>>>>                 return null;
>>>>             }
>>>>         }
>>>>         catch (Exception e1) {
>>>>             return null;
>>>>         }
>>>>
>>>>         return Enum.valueOf(type, object.toString());
>>>>     }
>>>> }
>>>>
>>>>  enum as a class designator column (inheritance)
>>>>
>>>>> -----------------------------------------------
>>>>>
>>>>>                 Key: CAY-1345
>>>>>                 URL: https://issues.apache.org/jira/browse/CAY-1345
>>>>>             Project: Cayenne
>>>>>          Issue Type: Bug
>>>>>          Components: Cayenne Core Library
>>>>>    Affects Versions: 3.0M6
>>>>>            Reporter: Marcin Skladaniec
>>>>>             Fix For: 3.0 beta 2
>>>>>
>>>>>
>>>>> In our setup we are using an int column as a column designator (called
>>>>> 'type').
>>>>> this column is then mapped into an enum (called ProductType).
>>>>> when creating new objects following stacktrace is created:
>>>>>      [java] org.apache.cayenne.CayenneRuntimeException: [v.3.0B1 Nov
03
>>>>> 2009 19:16:06] Error setting property segment 'type' in path 'type'
>>>>>      [java]    at
>>>>>
>>>>> org.apache.cayenne.reflect.PropertyUtils.setProperty(PropertyUtils.java:169)
>>>>>      [java]    at
>>>>>
>>>>> org.apache.cayenne.exp.parser.ASTObjPath.injectValue(ASTObjPath.java:97)
>>>>>      [java]    at
>>>>> org.apache.cayenne.exp.parser.ASTEqual.injectValue(ASTEqual.java:162)
>>>>>      [java]    at
>>>>> org.apache.cayenne.BaseContext.injectInitialValue(BaseContext.java:407)
>>>>>      [java]    at
>>>>>
>>>>> org.apache.cayenne.CayenneContext.registerNewObject(CayenneContext.java:540)
>>>>>      [java]    at
>>>>> org.apache.cayenne.CayenneContext.newObject(CayenneContext.java:349)
>>>>>      [java]    at
>>>>> ish.oncourse.cayenne.CayenneContext.newObject(CayenneContext.java:279)
>>>>>      [java]    at
>>>>> ish.oncourse.cayenne.CayenneContext.newObject(CayenneContext.java:32)
>>>>>      [java]    at
>>>>>
>>>>> ish.oncourse.controller.ControllerFactory.createEditController(ControllerFactory.java:112)
>>>>>      [java]    at
>>>>>
>>>>> ish.oncourse.controller.ControllerFactory.createEditController(ControllerFactory.java:93)
>>>>>      [java]    at
>>>>>
>>>>> ish.oncourse.controller.ControllerFactory.createEditController(ControllerFactory.java:134)
>>>>>      [java]    at
>>>>>
>>>>> ish.oncourse.controller.entity.ProductListController.newRecord(ProductListController.java:76)
>>>>>      [java]    at
>>>>>
>>>>> ish.oncourse.controller.ListController$3.execute(ListController.java:1312)
>>>>>      [java]    at
>>>>>
>>>>> ish.oncourse.actions.PermissibleAction.actionPerformed(PermissibleAction.java:101)
>>>>>      [java]    at
>>>>> ish.view.components.Button.fireActionPerformed(Button.java:189)
>>>>>      [java]    at
>>>>> ish.view.components.Button.actionPerformed(Button.java:166)
>>>>>      [java]    at
>>>>>
>>>>> javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2028)
>>>>>      [java]    at
>>>>>
>>>>> javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2351)
>>>>>      [java]    at
>>>>>
>>>>> javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
>>>>>      [java]    at
>>>>> javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
>>>>>      [java]    at
>>>>>
>>>>> javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
>>>>>      [java]    at
>>>>>
>>>>> java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272)
>>>>>      [java]    at
>>>>> java.awt.Component.processMouseEvent(Component.java:6348)
>>>>>      [java]    at
>>>>> javax.swing.JComponent.processMouseEvent(JComponent.java:3255)
>>>>>      [java]    at java.awt.Component.processEvent(Component.java:6113)
>>>>>      [java]    at java.awt.Container.processEvent(Container.java:2085)
>>>>>      [java]    at
>>>>> java.awt.Component.dispatchEventImpl(Component.java:4714)
>>>>>      [java]    at
>>>>> java.awt.Container.dispatchEventImpl(Container.java:2143)
>>>>>      [java]    at java.awt.Component.dispatchEvent(Component.java:4544)
>>>>>      [java]    at
>>>>> java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4618)
>>>>>      [java]    at
>>>>> java.awt.LightweightDispatcher.processMouseEvent(Container.java:4282)
>>>>>      [java]    at
>>>>> java.awt.LightweightDispatcher.dispatchEvent(Container.java:4212)
>>>>>      [java]    at
>>>>> java.awt.Container.dispatchEventImpl(Container.java:2129)
>>>>>      [java]    at java.awt.Window.dispatchEventImpl(Window.java:2475)
>>>>>      [java]    at java.awt.Component.dispatchEvent(Component.java:4544)
>>>>>      [java]    at
>>>>> java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
>>>>>      [java]    at
>>>>>
>>>>> java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
>>>>>      [java]    at
>>>>>
>>>>> java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
>>>>>      [java]    at
>>>>>
>>>>> java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
>>>>>      [java]    at
>>>>> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
>>>>>      [java]    at
>>>>> java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
>>>>>      [java]    at
>>>>> java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
>>>>>      [java] Caused by: java.lang.IllegalArgumentException: No enum
>>>>> const
>>>>> class ish.oncourse.cayenne.ProductType.2
>>>>>      [java]    at java.lang.Enum.valueOf(Enum.java:196)
>>>>>      [java]    at
>>>>> org.apache.cayenne.reflect.EnumConverter.convert(EnumConverter.java:35)
>>>>>      [java]    at
>>>>>
>>>>> org.apache.cayenne.reflect.PropertyUtils.setSimpleProperty(PropertyUtils.java:229)
>>>>>      [java]    at
>>>>>
>>>>> org.apache.cayenne.reflect.PropertyUtils.setProperty(PropertyUtils.java:166)
>>>>>      [java]    ... 41 more
>>>>> there is a simple workaround, invoking setType(ProductType.MEMBERSHIP)
>>>>> on
>>>>> the new object fixes the problem. Yet it will be nice if the underlying
>>>>> cayenne mechanism worked with enums/int columns.
>>>>>
>>>>>
>>>>
>>>>  --
>>>
>>> -------------------------->
>>> Aristedes Maniatis
>>> GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A
>>>
>>>
>>
>>
>>
> --
>
> -------------------------->
> Aristedes Maniatis
> GPG fingerprint CBFB 84B4 738D 4E87 5E5C  5EFA EF6A 7D2E 3E49 102A
>



-- 
Andrey

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message