sorry, where says "bog" its "blog" :S 2012/8/30 Juan José Gil <[email protected]>
> 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 >> >>>>> >> >>>>> >> >>>> >> >>>> >> >> >> >> >> >> >
