Geert,
Thanks for the explanation. As for some of your suggestions about
the app, while I did learn a lot from them, I did just create this
application purely to demonstrate the problem so there were some
corners that were cut. ;)
Take care,
Jeremy
On 8/18/07, Geert Bevin <[EMAIL PROTECTED]> wrote:
>
> Hi Jeremy,
>
> I tried out your code, I found this:
> addConstraint(new ConstrainedProperty("containerId")
> .notEmpty(true)
> .notNull(true)
> .manyToOne(RepositoryContainer.class, "id")
>
> There's a problem with your notEmpty constraint. Since containerId is
> an integer, 'empty' means zero. So any time you set it to 0 it is
> validated as being MANDATORY. I couldn't find an INVALID validation
> error though. If I remove this constraint, everything works fine.
>
> There's also another issue, you explicitly set the repository ID to
> 0. Is that intended? By using the 'identifier' constraint without
> declaring the 'sparse' constraint will let RIFE use the native
> database method to generate IDs. Also, you might wanna remove the
> 'unique' constraint on the id property if you're having them
> generated by the database, it is not necessary.
>
> Some other minor remarks:
>
> * in Home.java:
>
> DbQueryManager dbqm = new DbQueryManager(datasource);
> Select select = new Select(datasource);
> select
> .from(RepositoryContainer.class.getSimpleName())
> .where("id", "=", r.getContainerId());
>
> Can be more easily written as:
>
> manager.getRestoreQuery(r.getContainerId());
>
> Where manager is a GQM for the RepositoryContainer class.
>
> Also, if you combine that with the next statement:
>
> RepositoryContainer rc2 = dbqm.executeFetchFirstBean(select,
> RepositoryContainer.class);
>
> You can simply replace that by:
>
> RepositoryContainer rc2 = manager.getRestoreQuery(r.getContainerId
> ());
>
> This will generate exactly the same SQL statements, RIFE doesn't have
> a container that by itself manages entities.
>
> * in SiteTest.java:
>
> new SiteBuilder("sites" + File.separator + "main.xml").getSite();
>
> Can be written as:
>
> new SiteBuilder("sites/main.xml").getSite();
>
> This looks up a resource and not a file. Resources always use regular
> slashes as path separators, disregarding the platform you're using.
>
> * in ApplicationInitializer.java:
>
> You're swallowing the DatabaseException and not checking your return
> state. So if there's an error during installation, you never get
> notified about it. You will only not see a message being printed out
> that confirms the table creation. You'll still miss the details about
> what happened though.
>
>
> Hope this helps,
>
> Geert
>
>
> On 17 Aug 2007, at 05:23, Jeremy Whitlock wrote:
>
> > Geert,
> > I have attached a sample application that proves the problem I am
> > having. Included with this tar.gz is a README file that should tell
> > you how to get Maven configured with the RIFE 1.6.1 jar and how to run
> > it. The source is so simple that viewing it should make a lot of
> > sense. Visiting the RIFE site as explained in the README should also
> > give you some output to explain why I'm having this problem. If you
> > need anything else, please let me know. Also, I hope I've just done
> > something stupid.
> >
> > Take care,
> >
> > Jeremy
> >
> > On 8/15/07, Jeremy Whitlock <[EMAIL PROTECTED]> wrote:
> >> Hi All,
> >> To make this as easy to diagnose as possible, I have decided to
> >> post non-obfuscated code:
> >>
> >> SQL Trace Output
> >> -------------------------
> >> Aug 15, 2007 1:59:28 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 0ms : CREATE SEQUENCE SEQ_svnrepositorycontainer
> >> Aug 15, 2007 1:59:28 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 103ms : CREATE TABLE svnrepositorycontainer (active CHAR(1) NOT
> >> NULL, authzPath LONGVARCHAR NOT NULL, created TIMESTAMP NOT NULL,
> >> description VARCHAR(256) NOT NULL, displayName VARCHAR(64) NOT NULL,
> >> id INTEGER NOT NULL, path LONGVARCHAR NOT NULL, serverType VARCHAR(8)
> >> NOT NULL, PRIMARY KEY (id), UNIQUE (id), CHECK (active != ''), CHECK
> >> (authzPath != ''), CHECK (description != ''), CHECK (displayName !=
> >> ''), CHECK (path != ''), CHECK (serverType != ''), CHECK (serverType
> >> IN ('Apache','SvnServe')))
> >> Aug 15, 2007 1:59:28 PM
> >> org.thoughtspark.sac.elements.ApplicationInitializer$Deployer install
> >> INFO: Table created for SVNRepositoryContainer
> >> Aug 15, 2007 1:59:28 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 0ms : CREATE SEQUENCE SEQ_svnrepository
> >> Aug 15, 2007 1:59:28 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 18ms : CREATE TABLE svnrepository (active CHAR(1) NOT NULL,
> >> containerId INTEGER NOT NULL, created TIMESTAMP NOT NULL, dataStore
> >> VARCHAR(4) NOT NULL, description VARCHAR(256) NOT NULL, displayName
> >> VARCHAR(64) NOT NULL, id INTEGER NOT NULL, name VARCHAR(64) NOT NULL,
> >> PRIMARY KEY (id), FOREIGN KEY (containerId) REFERENCES
> >> svnrepositorycontainer (id), UNIQUE (id), CHECK (active != ''), CHECK
> >> (containerId != 0), CHECK (dataStore != ''), CHECK (dataStore IN
> >> ('BDB','FSFS')), CHECK (description != ''), CHECK (displayName !=
> >> ''),
> >> CHECK (name != ''))
> >> Aug 15, 2007 1:59:28 PM
> >> org.thoughtspark.sac.elements.ApplicationInitializer$Deployer install
> >> INFO: Table created for SVNRepository
> >> Aug 15, 2007 2:00:06 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 20ms : SELECT * FROM SVNRepositoryContainer WHERE active = 'Y'
> >> ORDER BY displayName ASC
> >> Aug 15, 2007 2:00:53 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 7ms : SELECT count(*) FROM svnrepositorycontainer WHERE id = -1
> >> Aug 15, 2007 2:00:53 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 0ms : SELECT count(*) FROM svnrepositorycontainer WHERE
> >> displayName = 'Some Container' AND active = 'Y'
> >> Aug 15, 2007 2:00:53 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 0ms : SELECT count(*) FROM svnrepositorycontainer WHERE path =
> >> '/Some/path' AND active = 'Y'
> >> Aug 15, 2007 2:00:53 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 1ms : CALL NEXT VALUE FOR SEQ_svnrepositorycontainer
> >> Aug 15, 2007 2:00:53 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 112ms : INSERT INTO svnrepositorycontainer (active, authzPath,
> >> created, description, displayName, id, path, serverType) VALUES
> >> (?, ?,
> >> ?, ?, ?, ?, ?, ?)
> >> Aug 15, 2007 2:00:54 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 1ms : SELECT * FROM SVNRepositoryContainer WHERE active = 'Y'
> >> ORDER BY displayName ASC
> >> Aug 15, 2007 2:01:00 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 0ms : SELECT * FROM SVNRepository WHERE active = 'Y' ORDER BY
> >> displayName ASC
> >> Aug 15, 2007 2:01:00 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 0ms : SELECT * FROM SVNRepositoryContainer WHERE active = 'Y'
> >> ORDER BY displayName ASC
> >> Container Id: 0
> >> Aug 15, 2007 2:01:20 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 0ms : SELECT count(*) FROM svnrepository WHERE id = -1
> >> Aug 15, 2007 2:01:20 PM com.uwyn.rife.database.DbStatement
> >> outputTrace
> >> INFO: 0ms : SELECT * FROM svnrepositorycontainer WHERE id = 0
> >>
> >> SVNRepository.java
> >> ----------------------------
> >> .....
> >> public class SVNRepository {
> >> private int id = -1;
> >> private int containerId;
> >> .....
> >> /**
> >> * @return Returns the id.
> >> */
> >> public int getId() {
> >> return id;
> >> }
> >> /**
> >> * @param id The id to set.
> >> */
> >> public void setId(int id) {
> >> this.id = id;
> >> }
> >> /**
> >> * Returns the id of the repository container this
> >> repository is
> >> * associated with.
> >> */
> >> public int getContainerId() {
> >> return containerId;
> >> }
> >>
> >> /**
> >> * Sets the repository container id.
> >> *
> >> * @param The repository container id.
> >> */
> >> public void setContainerId(int containerId) {
> >> this.containerId = containerId;
> >> }
> >> .....
> >>
> >> SVNRepositoryContainer.java
> >> -----------------------------------------
> >> .....
> >> public class SVNRepositoryContainer {
> >> private int id = -1;
> >> .....
> >> /**
> >> * @return Returns the id.
> >> */
> >> public int getId() {
> >> return id;
> >> }
> >> /**
> >> * @param id The id to set.
> >> */
> >> public void setId(int id) {
> >> this.id = id;
> >> }
> >> .....
> >>
> >> SVNRepositoryMetaData.java
> >> -----------------------------------------
> >> ....
> >> public SVNRepositoryMetaData extends MetaData {
> >> .....
> >> addConstraint(new ConstrainedProperty("containerId")
> >> .notEmpty(true)
> >> .notNull(true)
> >> .manyToOne(SVNRepositoryContainer.class,
> >> "id")
> >> );
> >> .....
> >>
> >> SVNRepositoriesAdd.java
> >> ------------------------------------
> >> .....
> >> public SVNRepositoriesAdd extends Element {
> >> .....
> >> public void processElement() throws EngineException {
> >> SVNRepository bean = getNamedInputBean("Repository");
> >>
> >> if (((Validated)repository).validate
> >> (SACUtils.getGenericQueryManager(SVNRepository.class)))
> >> {
> >> ....
> >> } else {
> >> ....
> >> .....
> >> .....
> >>
> >> The SQL trace above shows the following:
> >>
> >> Creation of the SVNREPOSITORYCONTAINER table
> >> Creation of the SVNREPOSITORY table
> >> Creation of necessary sequences
> >> Creation of a row in the SVNREPOSITORYCONTAINER table with an id of 0
> >> Attempt to create a row in the SVNREPOSITORY table with a
> >> CONTAINERID of 0
> >>
> >> The problem is that the validate() call is always returning INVALID.
> >> Unfortunately, it makes no sense because there is a row in the
> >> SVNREPOSITORYCONTAINER table with an id of 0. I have verified
> >> this in
> >> Java code and using a database browsing tool. Hopefully with exact
> >> code, this can be easier to diagnose.
> >>
> >> Take care,
> >>
> >> Jeremy
> >>
> >
> > >
> > <rife-many-to-one-example.tar.gz>
>
> --
> Geert Bevin
> Terracotta - http://www.terracotta.org
> Uwyn "Use what you need" - http://uwyn.com
> RIFE Java application framework - http://rifers.org
> Music and words - http://gbevin.com
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"rife-users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/rife-users?hl=en
-~----------~----~----~----~------~----~------~--~---