cayenne-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Juan José Gil <mat...@gmail.com>
Subject Re: Vaadin Integration and MetaData of mappings
Date Thu, 30 Aug 2012 15:49:52 GMT
sorry, where says "bog" its "blog" :S

2012/8/30 Juan José Gil <matero@gmail.com>

> Understood :)
>
> Thanks for such great guidelines!
>
> I'll see if it is possible to bog about vaadin & cayenne integration :)
>
> Regards
> Juanjo
>
> 2012/8/30 Andrus Adamchik <andrus@objectstyle.org>
>
>> In your app please keep using Guice.
>>
>> Cayenne DI (which is strongly inspired by Guice, but has much smaller
>> footprint) is intended for configuring stuff inside Cayenne. The container
>> itself is hidden inside CayenneRuntime and we are not promoting it for
>> general app-level use, even though in theory it should be possible.
>>
>> Andrus
>>
>> On Aug 30, 2012, at 4:13 PM, Juan José Gil wrote:
>>
>> > thanks Andrus!
>> >
>> > I'll give it a try :)
>> >
>> > which are the pros of using cayenne di instead of guice? (I've already
>> > worked on integrating guice + vaadin + shiro and I don't want to loose
>> all
>> > that effort :S)
>> >
>> > Regards
>> > Juanjo
>> >
>> >
>> > 2012/8/30 Andrus Adamchik <andrus@objectstyle.org>
>> >
>> >> 1. Serialization. There's not much to it really. Just make sure the
>> >> context you are using is session-scoped. See for instance this class
>> that
>> >> provides a session-bound context (used by CayenneFilter) :
>> >>
>> >>
>> >>
>> http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-3.1/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/web/SessionContextRequestHandler.java?view=markup
>> >>
>> >> 2. Multi-tenancy... So if you go with DB-schema per tenant, it might
>> look
>> >> like this:
>> >>
>> >> // do it once per tenant, and cache the returned runtime in the app
>> scope
>> >> ServerRuntime createServerRuntime(final String tenantSchema) {
>> >>
>> >>   // "cayenne-xyz.xml" is a mapping common to all tenants, that will be
>> >> further customized here
>> >>   ServerRuntime runtime = new ServerRuntime("cayenne-xyz.xml", new
>> >> Module() {
>> >>
>> >>        // in a custom module override the schema of all loaded DataMaps
>> >>        public void configure(Binder binder) {
>> >>             binder.bind(DataMapLoader.class).toInstance(new
>> >> TenantMapLoader(tenantSchema));
>> >>        }
>> >>   });
>> >>
>> >>
>> >>   return runtime;
>> >> }
>> >>
>> >> class TenantMapLoader extends XMLDataMapLoader {
>> >>
>> >>    private String tenantSchema;
>> >>
>> >>    TenantMapLoader(String tenantSchema) {
>> >>        this.tenantSchema = tenantSchema;
>> >>    }
>> >>
>> >>
>> >>    public DataMap load(Resource configurationResource) {
>> >>         DataMap map = super.load(configurationResource);
>> >>         map.setDefaultSchema(tenantSchema);
>> >>
>> >>         for(DbEntity e : map.getDbEntities()) {
>> >>             e.setSchema(tenantSchema);
>> >>         }
>> >>
>> >>         return map;
>> >>    }
>> >> }
>> >>
>> >> Andrus
>> >>
>> >>
>> >> On Aug 29, 2012, at 4:15 PM, Juan José Gil wrote:
>> >>
>> >>> Thanks for the reply Andrus!
>> >>>
>> >>> Could you point me to docs/samples about ObjectContext Serialization
&
>> >>> multi-tenant approaches you describe?
>> >>>
>> >>> About the"adding-metadata" part, I was thinking in adding constraints
>> in
>> >> a
>> >>> similar way to active-record in RoR or GORM in grails, but using code
>> >>> generation phases of cayenne.
>> >>>
>> >>> By now i'll use some kind of "typed" KVC delegating to cayenne the
>> >>> properties access and then providing some kind a "class metadata"
>> which
>> >> can
>> >>> be extended by subclasses... but i'll prefer the "code generation"
>> form,
>> >> so
>> >>> I can use IDEs capabilities.
>> >>>
>> >>> maybe I'll generate some "java code configuration" which then will be
>> >> used
>> >>> to generate final classes... it sounds as a mess but it could give
>> really
>> >>> nice possibilities! don't you think?
>> >>>
>> >>> if i get to somewhere with this approach I'll tell you :)
>> >>>
>> >>>>
>> >>>>
>> >>>>> the data objects will reside at the http session, and will be
used
>> >>>> directly by the vaadin widgets, does this kind of cayenne data
>> objects
>> >>>> "use" could arrive with attaching/detaching problems?
>> >>>>
>> >>>> Shouldn't be a problem. You can store Cayenne objects in a session.
>> The
>> >>>> simplest way to avoid attach/detach issues is to have a
>> session-scoped
>> >>>> ObjectContext. Then it is serialized/deserialized together with
the
>> >> objects
>> >>>> in case the session is saved to disk, or replicated across the
>> cluster.
>> >>>>
>> >>>>> Also, is there a way to add metadata info in cayenne metamodel?
I
>> would
>> >>>> like to add constraints / validations to generated classes, so they
>> can
>> >> be
>> >>>> used to define searching criterias on indexed attributes (something
>> like
>> >>>> active-records class filters, but only on indexed properties) and
>> >> generate
>> >>>> model validations on properties so they can be used at UI fields
>> >> directly,
>> >>>> facilitating the app development.
>> >>>>
>> >>>> You can add extra info using callbacks or lifecycle listeners. Any
>> extra
>> >>>> properties can be defined either manually in generated subclasses,
or
>> >> even
>> >>>> stored in the base CayenneDataObject (with 'readProperty' /
>> >> 'writeProperty'
>> >>>> methods, and custom property names).
>> >>>>
>> >>>>> Finally, I'm looking for a multitenant implementation to use,
and I
>> >>>> believe that the solution pointed at
>> >>>>
>> >>
>> http://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/couldbealso
used with cayenne; is there any constraint I should look for?
>> >>>>
>> >>>> Cayenne is certainly friendly to various multi-tenancy approaches.
In
>> >> 3.1
>> >>>> API terms, you might assign a separate instance of ServerRuntime
to
>> each
>> >>>> tenant, and use that to create ObjectContexts for its users. You
may
>> >> start
>> >>>> all runtimes from the same basic configuration, and "namespace"
them
>> >> using
>> >>>> tenant-unique DB URL. Or you may use a single DataSource, and after
a
>> >>>> runtime is loaded, scan through all its DbEntities and assign a
>> tenant
>> >>>> "schema" to them. Feel free to ask about further details.
>> >>>>
>> >>>> Andrus
>> >>>>
>> >>>>
>> >>>> On Aug 26, 2012, at 5:15 PM, Juan J. Gil wrote:
>> >>>>> Hello, I'm thinking to use cayenne in conjunction with vaadin
(
>> >>>> http://vaadin.com).
>> >>>>>
>> >>>>> I'm trying to use some kind of tight integration between both
>> >> frameworks
>> >>>> (defining cayenne generated classes which are vaadin data models
>> >>>> implementations).
>> >>>>> That way I could define forms directly on data objects, querying
&
>> >>>> mutating its state directly from vaadin widgets.
>> >>>>> As vaadin is an stateful web framework, should I have to expect
for
>> >> some
>> >>>> kind of problem with data objects between requests? I mean, the
data
>> >>>> objects will reside at the http session, and will be used directly
by
>> >> the
>> >>>> vaadin widgets, does this kind of cayenne data objects "use" could
>> >> arrive
>> >>>> with attaching/detaching problems?
>> >>>>>
>> >>>>> Also, is there a way to add metadata info in cayenne metamodel?
I
>> would
>> >>>> like to add constraints / validations to generated classes, so they
>> can
>> >> be
>> >>>> used to define searching criterias on indexed attributes (something
>> like
>> >>>> active-records class filters, but only on indexed properties) and
>> >> generate
>> >>>> model validations on properties so they can be used at UI fields
>> >> directly,
>> >>>> facilitating the app development.
>> >>>>>
>> >>>>> Finally, I'm looking for a multitenant implementation to use,
and I
>> >>>> believe that the solution pointed at
>> >>>>
>> >>
>> http://blog.jerodsanto.net/2011/07/building-multi-tenant-rails-apps-with-postgresql-schemas/couldbealso
used with cayenne; is there any constraint I should look for?
>> >>>>>
>> >>>>> Best regards
>> >>>>> Juanjo
>> >>>>>
>> >>>>> ps: pardon my really poor English! :P
>> >>>>>
>> >>>>>
>> >>>>
>> >>>>
>> >>
>> >>
>>
>>
>

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