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 <[email protected]> > 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 <[email protected]> > > > >> 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 > >>>>> > >>>>> > >>>> > >>>> > >> > >> > >
