From commitsjohn93@example.net Sat Mar 01 08:04:28 2008 Return-Path: <commitsjohn93@example.net> Delivered-To: john93@example.net Received: (qmail 61108 invoked from network); 1 Mar 2008 08:04:28 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 1 Mar 2008 08:04:28 -0000 Received: (qmail 39622 invoked by uid 500); 1 Mar 2008 08:04:23 -0000 Delivered-To: john93@example.net Received: (qmail 39609 invoked by uid 500); 1 Mar 2008 08:04:23 -0000 Mailing-List: contact john93@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:john93@example.net> List-Unsubscribe: <mailto:john93@example.net> List-Post: <mailto:john93@example.net> List-Id: <commits.cayenne.apache.org> Reply-To: john93@example.net Delivered-To: mailing list john93@example.net Received: (qmail 39600 invoked by uid 500); 1 Mar 2008 08:04:23 -0000 Delivered-To: john93@example.net Received: (qmail 39597 invoked by uid 99); 1 Mar 2008 08:04:23 -0000 Received: from nike.apache.org (HELO nike.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 00:04:23 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO minotaur.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with SMTP; Sat, 01 Mar 2008 08:03:45 +0000 Received: (qmail 60929 invoked by uid 1723); 1 Mar 2008 08:04:04 -0000 Date: 1 Mar 2008 08:04:00 -0000 Message-ID: <john93@example.net> TO: john93@example.net FROM: john93@example.net SUBJECT: Open Issues by Votes: 2008-03-01 X-Virus-Checked: Checked by ClamAV on apache.org Cayenne - Saturday, March 1, 2008 59 issues 2 - http://issues.apache.org/cayenne/browse/CAY-895 2 - http://issues.apache.org/cayenne/browse/CAY-762 2 - http://issues.apache.org/cayenne/browse/CAY-892 2 - http://issues.apache.org/cayenne/browse/CAY-132 2 - http://issues.apache.org/cayenne/browse/CAY-154 2 - http://issues.apache.org/cayenne/browse/CAY-808 2 - http://issues.apache.org/cayenne/browse/CAY-905 2 - http://issues.apache.org/cayenne/browse/CAY-316 2 - http://issues.apache.org/cayenne/browse/CAY-578 2 - http://issues.apache.org/cayenne/browse/CAY-155 2 - http://issues.apache.org/cayenne/browse/CAY-889 2 - http://issues.apache.org/cayenne/browse/CAY-402 2 - http://issues.apache.org/cayenne/browse/CAY-894 2 - http://issues.apache.org/cayenne/browse/CAY-204 2 - http://issues.apache.org/cayenne/browse/CAY-400 2 - http://issues.apache.org/cayenne/browse/CAY-825 2 - http://issues.apache.org/cayenne/browse/CAY-217 2 - http://issues.apache.org/cayenne/browse/CAY-795 2 - http://issues.apache.org/cayenne/browse/CAY-886 2 - http://issues.apache.org/cayenne/browse/CAY-910 2 - http://issues.apache.org/cayenne/browse/CAY-481 2 - http://issues.apache.org/cayenne/browse/CAY-890 2 - http://issues.apache.org/cayenne/browse/CAY-906 2 - http://issues.apache.org/cayenne/browse/CAY-366 2 - http://issues.apache.org/cayenne/browse/CAY-431 2 - http://issues.apache.org/cayenne/browse/CAY-911 2 - http://issues.apache.org/cayenne/browse/CAY-880 2 - http://issues.apache.org/cayenne/browse/CAY-225 1 - http://issues.apache.org/cayenne/browse/CAY-760 1 - http://issues.apache.org/cayenne/browse/CAY-893 1 - http://issues.apache.org/cayenne/browse/CAY-210 1 - http://issues.apache.org/cayenne/browse/CAY-881 1 - http://issues.apache.org/cayenne/browse/CAY-552 1 - http://issues.apache.org/cayenne/browse/CAY-432 1 - http://issues.apache.org/cayenne/browse/CAY-314 1 - http://issues.apache.org/cayenne/browse/CAY-253 1 - http://issues.apache.org/cayenne/browse/CAY-534 1 - http://issues.apache.org/cayenne/browse/CAY-584 1 - http://issues.apache.org/cayenne/browse/CAY-811 1 - http://issues.apache.org/cayenne/browse/CAY-536 1 - http://issues.apache.org/cayenne/browse/CAY-527 1 - http://issues.apache.org/cayenne/browse/CAY-550 1 - http://issues.apache.org/cayenne/browse/CAY-554 1 - http://issues.apache.org/cayenne/browse/CAY-794 1 - http://issues.apache.org/cayenne/browse/CAY-523 1 - http://issues.apache.org/cayenne/browse/CAY-477 1 - http://issues.apache.org/cayenne/browse/CAY-943 1 - http://issues.apache.org/cayenne/browse/CAY-891 1 - http://issues.apache.org/cayenne/browse/CAY-419 1 - http://issues.apache.org/cayenne/browse/CAY-577 1 - http://issues.apache.org/cayenne/browse/CAY-888 1 - http://issues.apache.org/cayenne/browse/CAY-806 1 - http://issues.apache.org/cayenne/browse/CAY-483 1 - http://issues.apache.org/cayenne/browse/CAY-228 1 - http://issues.apache.org/cayenne/browse/CAY-282 1 - http://issues.apache.org/cayenne/browse/CAY-907 1 - http://issues.apache.org/cayenne/browse/CAY-457 1 - http://issues.apache.org/cayenne/browse/CAY-209 1 - http://issues.apache.org/cayenne/browse/CAY-850 From commitsjohn93@example.net Sat Mar 01 09:42:24 2008 Return-Path: <commitsjohn93@example.net> Delivered-To: john93@example.net Received: (qmail 80231 invoked from network); 1 Mar 2008 09:42:24 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 1 Mar 2008 09:42:24 -0000 Received: (qmail 76781 invoked by uid 500); 1 Mar 2008 09:42:19 -0000 Delivered-To: john93@example.net Received: (qmail 76768 invoked by uid 500); 1 Mar 2008 09:42:19 -0000 Mailing-List: contact john93@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:john93@example.net> List-Unsubscribe: <mailto:john93@example.net> List-Post: <mailto:john93@example.net> List-Id: <commits.cayenne.apache.org> Reply-To: john93@example.net Delivered-To: mailing list john93@example.net Received: (qmail 76759 invoked by uid 99); 1 Mar 2008 09:42:19 -0000 Received: from nike.apache.org (HELO nike.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 01:42:19 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 09:41:41 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 60ABF1A9832; Sat, 1 Mar 2008 01:42:01 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r632575 - /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java Date: Sat, 01 Mar 2008 09:42:01 -0000 To: john93@example.net From: john93@example.net X-Mailer: svnmailer-1.0.8 Message-Id: <john93@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: aadamchik Date: Sat Mar 1 01:42:00 2008 New Revision: 632575 URL: http://svn.apache.org/viewvc?rev=632575&view=rev Log: an explicit exception on attempt to use currently unsuported fetch joins Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java?rev=632575&r1=632574&r2=632575&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java Sat Mar 1 01:42:00 2008 @@ -68,7 +68,7 @@ @Override public boolean visitInnerFetchJoin(EJBQLJoin join) { // TODO: andrus, 4/9/2007 - support for prefetching - return visitInnerJoin(join); + throw new UnsupportedOperationException("Fetch joins are not yet supported"); } @Override @@ -83,7 +83,7 @@ @Override public boolean visitOuterFetchJoin(EJBQLJoin join) { // TODO: andrus, 4/9/2007 - support for prefetching - return visitOuterJoin(join); + throw new UnsupportedOperationException("Fetch joins are not yet supported"); } @Override From commitsjohn93@example.net Sat Mar 01 11:30:10 2008 Return-Path: <commitsjohn93@example.net> Delivered-To: john93@example.net Received: (qmail 953 invoked from network); 1 Mar 2008 11:30:10 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 1 Mar 2008 11:30:10 -0000 Received: (qmail 32572 invoked by uid 500); 1 Mar 2008 11:30:06 -0000 Delivered-To: john93@example.net Received: (qmail 32549 invoked by uid 500); 1 Mar 2008 11:30:05 -0000 Mailing-List: contact john93@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:john93@example.net> List-Unsubscribe: <mailto:john93@example.net> List-Post: <mailto:john93@example.net> List-Id: <commits.cayenne.apache.org> Reply-To: john93@example.net Delivered-To: mailing list john93@example.net Received: (qmail 32540 invoked by uid 99); 1 Mar 2008 11:30:05 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 03:30:05 -0800 X-ASF-Spam-Status: No, hits=-1996.3 required=10.0 tests=ALL_TRUSTED,HTML_MESSAGE,MIME_HTML_ONLY X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO brutus.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 11:29:31 +0000 Received: from brutus (localhost [83.161.120.155]) by brutus.apache.org (Postfix) with ESMTP id 0EE19234C05D for <john93@example.net>; Sat, 1 Mar 2008 03:29:00 -0800 (PST) Message-ID: <868471882.1204370940042.JavaMail.www-data@brutus> Date: Sat, 1 Mar 2008 03:29:00 -0800 (PST) From: john93@example.net To: john93@example.net Subject: [CONF] Apache Cayenne Documentation: ObjectIdQuery (page edited) MIME-Version: 1.0 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Virus-Checked: Checked by ClamAV on apache.org <html> <head> <base href="http://cwiki.apache.org/confluence" /> <style type="text/css"> <!-- body, p, td, table, tr, .bodytext, .stepfield { font-family: Verdana, arial, sans-serif; font-size: 11px; line-height: 16px; color: #000000; font-weight: normal; } #PageContent { text-align: left; background-color: #fff; padding: 0px; margin: 0px; padding-bottom:20px; } /* ** when this stylesheet is used for the Tiny MCE Wysiwyg editor's edit area, we can't ** use an id=PageContent or class=wiki-content, so we must ** set the body style to that used for PageContent, and p to that used for wiki-content. */ body { margin: 0px; padding: 0px; text-align: center; background-color: #f0f0f0; } @media print { body { background-color: #fff; } } .monospaceInput { font:12px monospace } .wiki-content p, .commentblock p { margin: 16px 0px 16px 0px; padding: 0px; } .wiki-content-preview { padding: 5px; border-left: 1px solid #3c78b5; border-right: 1px solid #3c78b5; } ul, ol { margin-top: 2px; margin-bottom: 2px; padding-top: 0px; padding-bottom: 0px; } pre { padding: 0px; margin-top: 5px; margin-left: 15px; margin-bottom: 5px; margin-right: 5px; text-align: left; } .helpheading { font-weight: bold; background-color: #D0D9BD; border-bottom: 1px solid #3c78b5; padding: 4px 4px 4px 4px; margin: 0px; margin-top: 10px; } .helpcontent { padding: 4px 4px 20px 4px; background-color: #f5f7f1; } .code { border: 1px dashed #3c78b5; font-size: 11px; font-family: Courier; margin: 10px; line-height: 13px; } .focusedComment { background: #ffffce; } .commentBox, .focusedComment { padding: 10px; margin: 5px 0 5px 0; border: 1px #bbb solid; } .codeHeader { background-color: #f0f0f0; border-bottom: 1px dashed #3c78b5; padding: 3px; text-align: center; } .codeContent { text-align: left; background-color: #f0f0f0; padding: 3px; } .preformatted { border: 1px dashed #3c78b5; font-size: 11px; font-family: Courier; margin: 10px; line-height: 13px; } .preformattedHeader { background-color: #f0f0f0; border-bottom: 1px dashed #3c78b5; padding: 3px; text-align: center; } .preformattedContent { background-color: #f0f0f0; padding: 3px; } .panel { border: 1px dashed #3c78b5; margin: 10px; margin-top: 0px; } .panelHeader { background-color: #f0f0f0; border-bottom: 1px dashed #3c78b5; padding: 3px; text-align: center; } .panelContent { background-color: #f0f0f0; padding: 5px; } .anonymousAlert { background-color: #f0f0f0; border: 1px dashed red; font-size: 11px; padding: 10px 5px 10px 5px; margin: 4px; line-height: 13px; } .lockAlert { background-color: #f0f0f0; width: 50%; border: 1px dashed red; font-size: 11px; padding: 10px 5px 10px 5px; margin: 4px; line-height: 13px; } .code-keyword { color: #000091; background-color: inherit; } .code-object { color: #910091; background-color: inherit; } .code-quote { color: #009100; background-color: inherit; } .code-comment { color: #808080; background-color: inherit; } .code-xml .code-keyword { color: inherit; font-weight: bold; } .code-tag { color: #000091; background-color: inherit; } .breadcrumbs { background-color: #f0f0f0; border-color: #3c78b5; border-width: 1px 0px 1px 0px; border-style: solid; font-size: 11px; padding: 3px 0px 3px 0px; } .navmenu { border: 1px solid #ccc; } .menuheading { font-weight: bold; background-color: #f0f0f0; border-bottom: 1px solid #3c78b5; padding: 4px 4px 2px 4px; } .menuitems { padding: 4px 4px 20px 4px; } .rightpanel { border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; } #helpheading { text-align: left; font-weight: bold; background-color: #D0D9BD; border-bottom: 1px solid #3c78b5; padding: 4px 4px 4px 4px; margin: 0px; } #helpcontent { padding: 4px 4px 4px 4px; background-color: #f5f7f1; } .helptab-unselected { font-weight: bold; padding: 5px; background-color: #f5f7f1; } .helptab-selected { font-weight: bold; background-color: #D0D9BD; padding: 5px; } .helptabs { margin: 0px; background-color: #f5f7f1; padding: 5px; } .infopanel-heading { font-weight: bold; padding: 4px 0px 2px 0px; } .pagebody { } .pageheader { padding: 5px 5px 5px 0px; border-bottom: 1px solid #3c78b5; } .pagetitle { font-size: 22px; font-weight: bold; font-family: Arial, sans-serif; color: #003366; } .newpagetitle { color: #ccc !important; } .steptitle { font-size: 18px; font-weight: bold; font-family: Arial, sans-serif; color: #003366; margin-bottom: 7px; } .substeptitle { font-size: 12px; font-weight: bold; font-family: Arial, sans-serif; color: #003366; margin: 2px 4px 4px 4px; padding: 2px 4px 1px 4px; } .stepdesc { font-family: Verdana, arial, sans-serif; font-size: 11px; line-height: 16px; font-weight: normal; color: #666666; margin-top: 7px; margin-bottom: 7px; } .steplabel { font-weight: bold; margin-right: 4px; color: black; float: left; width: 15%; text-align: right; } .stepfield { background: #f0f0f0; padding: 5px; } .submitButtons{ margin-top:5px; text-align:right; } .formtitle { font-size: 12px; font-weight: bold; font-family: Arial, sans-serif; color: #003366; } .sectionbottom { border-bottom: 1px solid #3c78b5; } .topRow { border-top: 2px solid #3c78b5; } .tabletitle { font-size: 14px; font-weight: bold; font-family: Arial, sans-serif; padding: 3px 0px 2px 0px; margin: 8px 4px 2px 0px; color: #003366; border-bottom: 2px solid #3c78b5; } .pagesubheading { color: #666666; font-size: 10px; padding: 0px 0px 5px 0px; } HR { color: 3c78b5; height: 1; } A:link, A:visited, A:active, A:hover { color: #003366; } h1 A:link, h1 A:visited, h1 A:active { text-decoration: none; } h1 A:hover { border-bottom: 1px dotted #003366; } .wiki-content > :first-child, .commentblock > :first-child { margin-top: 3px; } .logocell { padding: 10px; } input { font-family: verdana, geneva, arial, sans-serif; font-size: 11px; color: #000000; } textarea, textarea.editor { font-family: verdana, geneva, arial, sans-serif; font-size: 11px; color: #333333; } /* use logoSpaceLink instead. .spacenametitle { font: 21px/31px Impact, Arial, Helvetica; font-weight: 100; color: #999999; margin: 0px; } .spacenametitle img { margin: 0 0 -4px 0; } .spacenametitle a { text-decoration: none; color: #999999; } .spacenametitle a:visited { text-decoration: none; color: #999999; }*/ .spacenametitle-printable { font: 20px/25px Impact, Arial, Helvetica; font-weight: 100; color: #999999; margin: 0px; } .spacenametitle-printable a { text-decoration: none; color: #999999; } .spacenametitle-printable a:visited { text-decoration: none; color: #999999; } .blogDate { font-weight: bold; text-decoration: none; color: black; } .blogSurtitle { background: #f0f0f0; border: 1px solid #ddd; padding: 3px; margin: 1px 1px 10px 1px; } .blogHeading { font-size: 20px; line-height: normal; font-weight: bold; padding: 0px; margin: 0px; } .blogHeading a { text-decoration: none; color: black; } .endsection { align: right; color: #666666; margin-top: 10px; } .endsectionleftnav { align: right; color: #666666; margin-top: 10px; } h1 { font-size: 24px; line-height: normal; font-weight: bold; background-color: #f0f0f0; color: #003366; border-bottom: 1px solid #3c78b5; padding: 2px; margin: 36px 0px 4px 0px; } h2 { font-size: 18px; line-height: normal; font-weight: bold; background-color: #f0f0f0; border-bottom: 1px solid #3c78b5; padding: 2px; margin: 27px 0px 4px 0px; } h3 { font-size: 14px; line-height: normal; font-weight: bold; background-color: #f0f0f0; padding: 2px; margin: 21px 0px 4px 0px; } h4 { font-size: 12px; line-height: normal; font-weight: bold; background-color: #f0f0f0; padding: 2px; margin: 18px 0px 4px 0px; } h4.search { font-size: 12px; line-height: normal; font-weight: normal; background-color: #f0f0f0; padding: 4px; margin: 18px 0px 4px 0px; } h5 { font-size: 10px; line-height: normal; font-weight: bold; background-color: #f0f0f0; padding: 2px; margin: 14px 0px 4px 0px; } h6 { font-size: 8px; line-height: normal; font-weight: bold; background-color: #f0f0f0; padding: 2px; margin: 14px 0px 4px 0px; } .smallfont { font-size: 10px; } .descfont { font-size: 10px; color: #666666; } .smallerfont { font-size: 9px; } .smalltext { color: #666666; font-size: 10px; } .smalltext a { color: #666666; } .smalltext-blue { color: #3c78b5; font-size: 10px; } .surtitle { margin-left: 1px; margin-bottom: 5px; font-size: 14px; color: #666666; } /* css hack found here: http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */ .navItemOver { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #003366; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;} .navItemOver a { color: #ffffff; background-color:#003366; text-decoration: none; } .navItemOver a:visited { color: #ffffff; background-color:#003366; text-decoration: none; } .navItemOver a:hover { color: #ffffff; background-color:#003366; text-decoration: none; } .navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; } .navItem a { color: #ffffff; text-decoration: none; } .navItem a:hover { color: #ffffff; text-decoration: none; } .navItem a:visited { color: #ffffff; text-decoration: none; } div.padded { padding: 4px; } div.thickPadded { padding: 10px; } h3.macrolibrariestitle { margin: 0px 0px 0px 0px; } div.centered { text-align: center; margin: 10px; } div.centered table {margin: 0px auto; text-align: left; } .tableview table { margin: 0; } .tableview th { text-align: left; color: #003366; font-size: 12px; padding: 5px 0px 0px 5px; border-bottom: 2px solid #3c78b5; } .tableview td { text-align: left; border-color: #ccc; border-width: 0px 0px 1px 0px; border-style: solid; margin: 0; padding: 4px 10px 4px 5px; } .grid { margin: 2px 0px 5px 0px; border-collapse: collapse; } .grid th { border: 1px solid #ccc; padding: 2px 4px 2px 4px; background: #f0f0f0; text-align: center; } .grid td { border: 1px solid #ccc; padding: 3px 4px 3px 4px; } .gridHover { background-color: #f9f9f9; } td.infocell { background-color: #f0f0f0; } .label { font-weight: bold; color: #003366; } label { font-weight: bold; color: #003366; } .error { background-color: #fcc; } .errorBox { background-color: #fcc; border: 1px solid #c00; padding: 5px; margin: 5px; } .errorMessage { color: #c00; } .success { background-color: #dfd; } .successBox { background-color: #dfd; border: 1px solid #090; padding: 5px; margin-top:5px; margin-bottom:5px; } blockquote { padding-left: 10px; padding-right: 10px; margin-left: 5px; margin-right: 0px; border-left: 1px solid #3c78b5; } table.confluenceTable { margin: 5px; border-collapse: collapse; } /* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */ table.confluenceTable td.confluenceTd { border-width: 1px; border-style: solid; border-color: #ccc; padding: 3px 4px 3px 4px; } /* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */ table.confluenceTable th.confluenceTh { border-width: 1px; border-style: solid; border-color: #ccc; padding: 3px 4px 3px 4px; background-color: #f0f0f0; text-align: center; } td.confluenceTd { border-width: 1px; border-style: solid; border-color: #ccc; padding: 3px 4px 3px 4px; } th.confluenceTh { border-width: 1px; border-style: solid; border-color: #ccc; padding: 3px 4px 3px 4px; background-color: #f0f0f0; text-align: center; } DIV.small { font-size: 9px; } H1.pagename { margin-top: 0px; } IMG.inline {} .loginform { margin: 5px; border: 1px solid #ccc; } /* The text how the "This is a preview" comment should be shown. */ .previewnote { text-align: center; font-size: 11px; color: red; } /* How the preview content should be shown */ .previewcontent { background: #E0E0E0; } /* How the system messages should be shown (DisplayMessage.jsp) */ .messagecontent { background: #E0E0E0; } /* How the "This page has been modified..." -comment should be shown. */ .conflictnote { } .createlink { color: maroon; } a.createlink { color: maroon; } .templateparameter { font-size: 9px; color: darkblue; } .diffadded { background: #ddffdd; padding: 1px 1px 1px 4px; border-left: 4px solid darkgreen; } .diffdeleted { color: #999; background: #ffdddd; padding: 1px 1px 1px 4px; border-left: 4px solid darkred; } .diffnochange { padding: 1px 1px 1px 4px; border-left: 4px solid lightgrey; } .differror { background: brown; } .diff { font-family: lucida console, courier new, fixed-width; font-size: 12px; line-height: 14px; } .diffaddedchars { background-color:#99ff99; font-weight:bolder; } .diffremovedchars { background-color:#ff9999; text-decoration: line-through; font-weight:bolder; } .greybackground { background: #f0f0f0 } .greybox { border: 1px solid #ddd; padding: 3px; margin: 1px 1px 10px 1px; } .borderedGreyBox { border: 1px solid #cccccc; background-color: #f0f0f0; padding: 10px; } .greyboxfilled { border: 1px solid #ddd; background: #f0f0f0; padding: 3px; margin: 1px 1px 10px 1px; } .navBackgroundBox { padding: 5px 5px 5px 5px; font-size: 22px; font-weight: bold; font-family: Arial, sans-serif; color: white; background: #3c78b5; text-decoration: none; } .previewBoxTop { background-color: #f0f0f0; border-width: 1px 1px 0px 1px; border-style: solid; border-color: #3c78b5; padding: 5px; margin: 5px 0px 0px 0px; text-align: center; } .previewContent { background-color: #fff; border-color: #3c78b5; border-width: 0px 1px 0px 1px; border-style: solid; padding: 10px; margin: 0px; } .previewBoxBottom { background-color: #f0f0f0; border-width: 0px 1px 1px 1px; border-style: solid; border-color: #3c78b5; padding: 5px; margin: 0px 0px 5px 0px; text-align: center; } .functionbox { background-color: #f0f0f0; border: 1px solid #3c78b5; padding: 3px; margin: 1px 1px 10px 1px; } .functionbox-greyborder { background-color: #f0f0f0; border: 1px solid #ddd; padding: 3px; margin: 1px 1px 10px 1px; } .search-highlight { background-color: #ffffcc; } /* normal (white) background */ .rowNormal { background-color: #ffffff; } /* alternate (pale yellow) background */ .rowAlternate { background-color: #f7f7f7; } /* used in the list attachments table */ .rowAlternateNoBottomColor { background-color: #f7f7f7; } .rowAlternateNoBottomNoColor { } .rowAlternateNoBottomColor td { border-bottom: 0px; } .rowAlternateNoBottomNoColor td { border-bottom: 0px; } /* row highlight (grey) background */ .rowHighlight { background-color: #f0f0f0; } TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; } TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; } TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; } TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; } TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; } .toolbar { margin: 0px; border-collapse: collapse; } .toolbar td { border: 1px solid #ccc; padding: 2px 2px 2px 2px; color: #ccc; } td.noformatting { border-width: 0px; border-style: none; text-align: center; padding: 0px; } .commentblock { margin: 12px 0 12px 0; } /* * Divs displaying the license information, if necessary. */ .license-eval, .license-none, .license-nonprofit { border-top: 1px solid #bbbbbb; text-align: center; font-size: 10px; font-family: Verdana, Arial, Helvetica, sans-serif; } .license-eval, .license-none { background-color: #ffcccc; } .license-eval b, .license-none b { color: #990000 } .license-nonprofit { background-color: #ffffff; } /* * The shadow at the bottom of the page between the main content and the * "powered by" section. */ .bottomshadow { height: 12px; background-image: url("$req.contextPath/images/border/border_bottom.gif"); background-repeat: repeat-x; } /* * Styling of the operations box */ .navmenu .operations li, .navmenu .operations ul { list-style: none; margin-left: 0; padding-left: 0; } .navmenu .operations ul { margin-bottom: 9px; } .navmenu .label { font-weight: inherit; } /* * Styling of ops as a toolbar */ .toolbar div { display: none; } .toolbar .label { display: none; } .toolbar .operations { display: block; } .toolbar .operations ul { display: inline; list-style: none; margin-left: 10px; padding-left: 0; } .toolbar .operations li { list-style: none; display: inline; } /* list page navigational tabs */ #foldertab { padding: 3px 0px 3px 8px; margin-left: 0; border-bottom: 1px solid #3c78b5; font: bold 11px Verdana, sans-serif; } #foldertab li { list-style: none; margin: 0; display: inline; } #foldertab li a { padding: 3px 0.5em; margin-left: 3px; border: 1px solid #3c78b5; border-bottom: none; background: #3c78b5; text-decoration: none; } #foldertab li a:link { color: #ffffff; } #foldertab li a:visited { color: #ffffff; } #foldertab li a:hover { color: #ffffff; background: #003366; border-color: #003366; } #foldertab li a.current { background: white; border-bottom: 1px solid white; color: black; } #foldertab li a.current:link { color: black; } #foldertab li a.current:visited { color: black; } #foldertab li a.current:hover { background: white; border-bottom: 1px solid white; color: black; } /* alphabet list */ ul#squaretab { margin-left: 0; padding-left: 0; white-space: nowrap; font: bold 8px Verdana, sans-serif; } #squaretab li { display: inline; list-style-type: none; } #squaretab a { padding: 2px 6px; border: 1px solid #3c78b5; } #squaretab a:link, #squaretab a:visited { color: #fff; background-color: #3c78b5; text-decoration: none; } #squaretab a:hover { color: #ffffff; background-color: #003366; border-color: #003366; text-decoration: none; } #squaretab li a#current { background: white; color: black; } .blogcalendar * { font-family:verdana, arial, sans-serif; font-size:x-small; font-weight:normal; line-height:140%; padding:2px; } table.blogcalendar { border: 1px solid #3c78b5; } .blogcalendar th.calendarhead, a.calendarhead { font-size:x-small; font-weight:bold; padding:2px; text-transform:uppercase; background-color: #3c78b5; color: #ffffff; letter-spacing: .3em; text-transform: uppercase; } .calendarhead:visited {color: white;} .calendarhead:active {color: white;} .calendarhead:hover {color: white;} .blogcalendar th { font-size:x-small; font-weight:bold; padding:2px; background-color:#f0f0f0; } .blogcalendar td { font-size:x-small; font-weight:normal; } .searchGroup { padding: 0 0 10px 0; background: #f0f0f0; } .searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; padding: 2px 4px 1px 4px; } .searchItem { padding: 1px 4px 1px 4px; } .searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; } /* permissions page styles */ .permissionHeading { border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left; } .permissionTab { border-width: 0 0 0 1px; border-style: solid; background: #3c78b5; color: #ffffff; font-size: 10px; } .permissionSuperTab { border-width: 0 0 0 1px; border-style: solid; background: #003366; color: #ffffff; } .permissionCell { border-left: #bbb; border-width: 0 0 0 1px; border-style: solid; } /* warning panel */ .warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; } /* alert panel */ .alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; } /* info panel */ .infoPanel { background: #D8E4F1; border:#3c78b5 1px solid; padding: 8px; margin: 10px; } /* side menu highlighting (e.g. space content screen) */ .optionPadded { padding: 2px; } .optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; } .optionSelected a { font-weight: bold; text-decoration: none; color: black; } /* information macros */ .noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px} .warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px} .infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px} .tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px} .informationMacroPadding { padding: 5px 0 0 5px; } table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td { border: none; } table.sectionMacroWithBorder td.columnMacro { border-style: dashed; border-width: 1px; border-color: #cccccc;} .pagecontent { padding: 10px; text-align: left; } /* styles for links in the top bar */ .topBarDiv a:link {color: #ffffff;} .topBarDiv a:visited {color: #ffffff;} .topBarDiv a:active {color: #ffffff;} .topBarDiv a:hover {color: #ffffff;} .topBarDiv {color: #ffffff;} .topBar { background-color: #003366; } /* styles for extended operations */ .greyLinks a:link {color: #666666; text-decoration:underline;} .greyLinks a:visited {color: #666666; text-decoration:underline;} .greyLinks a:active {color: #666666; text-decoration:underline;} .greyLinks a:hover {color: #666666; text-decoration:underline;} .greyLinks {color: #666666; display:block; padding: 10px} .logoSpaceLink {color: #999999; text-decoration: none} .logoSpaceLink a:link {color: #999999; text-decoration: none} .logoSpaceLink a:visited {color: #999999; text-decoration: none} .logoSpaceLink a:active {color: #999999; text-decoration: none} .logoSpaceLink a:hover {color: #003366; text-decoration: none} /* basic panel (basicpanel.vmd) style */ .basicPanelContainer {border: 1px solid #3c78b5; margin-top: 2px; margin-bottom: 8px; width: 100%} .basicPanelTitle {padding: 5px; margin: 0px; background-color: #f0f0f0; color: black; font-weight: bold;} .basicPanelBody {padding: 5px; margin: 0px} .separatorLinks a:link {color: white} .separatorLinks a:visited {color: white} .separatorLinks a:active {color: white} .greynavbar {background-color: #f0f0f0; border-top: 1px solid #3c78b5; margin-top: 2px} div.headerField { float: left; width: auto; height: 100%; } .headerFloat { margin-left: auto; width: 50%; } .headerFloatLeft { float: left; margin-right: 20px; margin-bottom: 10px; } #headerRow { padding: 10px; } div.license-personal { background-color: #003366; color: #ffffff; } div.license-personal a { color: #ffffff; } .greyFormBox { border: 1px solid #cccccc; padding: 5px; } /* IE automatically adds a margin before and after form tags. Use this style to remove that */ .marginlessForm { margin: 0px; } .openPageHighlight { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; } .editPageInsertLinks, .editPageInsertLinks a { color: #666666; font-weight: bold; font-size: 10px; } /* Style for label heatmap. */ .top10 a { font-weight: bold; font-size: 2em; color: #003366; } .top25 a { font-weight: bold; font-size: 1.6em; color: #003366; } .top50 a { font-size: 1.4em; color: #003366; } .top100 a { font-size: 1.2em; color: #003366; } .heatmap { list-style:none; width: 95%; margin: 0px auto; } .heatmap a { text-decoration:none; } .heatmap a:hover { text-decoration:underline; } .heatmap li { display: inline; } .minitab { padding: 3px 0px 3px 8px; margin-left: 0; margin-top: 1px; margin-bottom: 0px; border-bottom: 1px solid #3c78b5; font: bold 9px Verdana, sans-serif; text-decoration: none; float:none; } .selectedminitab { padding: 3px 0.5em; margin-left: 3px; margin-top: 1px; border: 1px solid #3c78b5; background: white; border-bottom: 1px solid white; color: #000000; text-decoration: none; } .unselectedminitab { padding: 3px 0.5em; margin-left: 3px; margin-top: 1px; border: 1px solid #3c78b5; border-bottom: none; background: #3c78b5; color: #ffffff; text-decoration: none; } a.unselectedminitab:hover { color: #ffffff; background: #003366; border-color: #003366; } a.unselectedminitab:link { color: white; } a.unselectedminitab:visited { color: white; } a.selectedminitab:link { color: black; } a.selectedminitab:visited { color: black; } .linkerror { background-color: #fcc;} a.labelOperationLink:link {text-decoration: underline} a.labelOperationLink:active {text-decoration: underline} a.labelOperationLink:visited {text-decoration: underline} a.labelOperationLink:hover {text-decoration: underline} a.newLabel:link {background-color: #ddffdd} a.newLabel:active {background-color: #ddffdd} a.newLabel:visited {background-color: #ddffdd} a.newLabel:hover {background-color: #ddffdd} ul.square {list-style-type: square} .inline-control-link { background: #ffc; font-size: 9px; color: #666; padding: 2px; text-transform: uppercase; text-decoration: none; } .inline-control-link a:link {text-decoration: none} .inline-control-link a:active {text-decoration: none} .inline-control-link a:visited {text-decoration: none} .inline-control-link a:hover {text-decoration: none} .inline-control-link { background: #ffc; font-size: 9px; color: #666; padding: 2px; text-transform: uppercase; text-decoration: none; cursor: pointer; } div.auto_complete { width: 350px; background: #fff; } div.auto_complete ul { border: 1px solid #888; margin: 0; padding: 0; width: 100%; list-style-type: none; } div.auto_complete ul li { margin: 0; padding: 3px; } div.auto_complete ul li.selected { background-color: #ffb; } div.auto_complete ul strong.highlight { color: #800; margin: 0; padding: 0; } /******* Edit Page Styles *******/ .toogleFormDiv{ border:1px solid #A7A6AA; background-color:white; padding:5px; margin-top: 5px; } .toogleInfoDiv{ border:1px solid #A7A6AA; background-color:white; display:none; padding:5px; margin-top: 10px; } .inputSection{ margin-bottom:20px; } #editBox{ border:1px solid lightgray; background-color:#F0F0F0; } /******* Left Navigation Theme Styles ********/ .leftnav li a { text-decoration:none; color:white; margin:0px; display:block; padding:2px; padding-left:5px; background-color: #3c78b5; border-top:1px solid #3c78b5; } .leftnav li a:active {color:white;} .leftnav li a:visited {color:white;} .leftnav li a:hover {background-color: #003366; color:white;} /* Added by Shaun during i18n */ .replaced { background-color: #33CC66; } .topPadding { margin-top: 20px; } /* new form style */ .form-block { padding: 6px; } .form-error-block { padding: 6px; background: #fcc; border-top: #f0f0f0 1px solid; border-bottom: #f0f0f0 1px solid; margin-bottom: 6px; padding: 0 12px 0 12px; } .form-element-large { font-size: 16px; font-weight: bold; font-family: Arial, sans-serif; color: #003366; } .form-element-small { font-size: 12px; font-weight: bold; font-family: Arial, sans-serif; color: #003366; } .form-header { background: lightyellow; border-top: #f0f0f0 1px solid; border-bottom: #f0f0f0 1px solid; margin-bottom: 6px; padding: 0 12px 0 12px; } .form-header p, .form-block p, .form-error-block p { line-height: normal; margin: 12px 0 12px 0; } .form-example { color: #888; font-size: 11px; } .form-divider { border-bottom: #ccc 1px solid; margin-bottom: 6px; } .form-buttons { margin-top: 6px; border-top: #ccc 1px solid; border-bottom: #ccc 1px solid; background: #f0f0f0; padding: 10px; text-align: center; } .form-buttons input { width: 100px; } .form-block .error { padding: 6px; margin-bottom: 6px; } --> </style> </head> <body> <div id="PageContent"> <table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%"><tr> <td valign="top" class="pagebody"> <div class="pageheader"> <span class="pagetitle"> Page Edited : <a href="http://cwiki.apache.org/confluence/display/CAYDOC">CAYDOC</a> : <a href="http://cwiki.apache.org/confluence/display/CAYDOC/ObjectIdQuery">ObjectIdQuery</a> </span> </div> <p> <a href="http://cwiki.apache.org/confluence/display/CAYDOC/ObjectIdQuery">ObjectIdQuery</a> has been edited by <a href="http://cwiki.apache.org/confluence/display/~andrus">Andrus Adamchik</a> <span class="smallfont">(Mar 01, 2008)</span>. </p> <p> <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=10661&originalVersion=4&revisedVersion=5">(View changes)</a> </p> <span class="label">Content:</span><br/> <div class="greybox wiki-content"><p><tt>ObjectIdQuery</tt> is a query that selects objects matching an ObjectId. Considering that ObjectId must be unique, the result of such query is a single object or no objects.</p> <p>Normally if you need to find an object that matches a certain primary key value, you would use <tt>DataObjectUtils.objectForPK(DataContext,String,int)</tt>. This method will look up an object in the cache, and only run a query if it is not yet cached. <tt>ObjectIdQuery</tt> gives the user more control of the object caching behavior. It supports three possible caching policies:</p> <table class='confluenceTable'><tbody> <tr> <th class='confluenceTh'>Policy</th> <th class='confluenceTh'>Cache Behavior</th> </tr> <tr> <td class='confluenceTd'><tt>ObjectIdQuery.CACHE</tt> </td> <td class='confluenceTd'>This policy is similar to DataObjectUtils behavior. If an object is already cached (either at the DataContext or DataDomain level), it is returned, otherwise the fetch is performed.</td> </tr> <tr> <td class='confluenceTd'><em>(default policy)</em> <tt>ObjectIdQuery.CACHE_REFRESH</tt> </td> <td class='confluenceTd'>This policy forces a database fetch. If an object is already cached (either at the DataContext or DataDomain level), cache is refreshed with a new version and a fresh object is included in the result.</td> </tr> <tr> <td class='confluenceTd'><tt>ObjectIdQuery.CACHE_NO_REFRESH</tt> </td> <td class='confluenceTd'>This policy suppresses database fetch. If an object is already cached (either at the DataContext or DataDomain level), query returns this object. Otherwise it returns an empty result.</td> </tr> </tbody></table> <p>An example of getting a guranteed fresh object:</p> <div class="code"><div class="codeContent"> <pre class="code-java">ObjectId id = <span class="code-keyword">new</span> ObjectId(<span class="code-quote">"Artist"</span>, Artist.ARTIST_ID_PK_COLUMN, 55); <span class="code-comment">// <span class="code-keyword">this</span> constructor implicitly uses <span class="code-quote">"CACHE_REFRESH"</span> policy, so a fresh object will be returned </span>ObjectIdQuery query = <span class="code-keyword">new</span> ObjectIdQuery(id); DataContext context = ... Artist object = (Artist) DataObjectUtils.objectForQuery(context, query);</pre> </div></div> <p>An example of checking whether an object is already cached:</p> <div class="code"><div class="codeContent"> <pre class="code-java">ObjectId id = <span class="code-keyword">new</span> ObjectId(<span class="code-quote">"Artist"</span>, Artist.ARTIST_ID_PK_COLUMN, 55); ObjectIdQuery query = <span class="code-keyword">new</span> ObjectIdQuery(id, <span class="code-keyword">false</span>, ObjectIdQuery.CACHE_NO_REFRESH); DataContext context = ... Artist object = (Artist) DataObjectUtils.objectForQuery(context, query); <span class="code-keyword">if</span>(object == <span class="code-keyword">null</span>) { <span class="code-comment">// not cached </span>} <span class="code-keyword">else</span> { <span class="code-comment">// cached </span>}</pre> </div></div></div> </td></tr></table></div> <p> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="http://cwiki.apache.org/confluence/images/border/spacer.gif" width="1" height="1" border="0"/></td> </tr> </table> <div class="smalltext"> Powered by <a href="http://www.atlassian.com/software/confluence/default.jsp?clicked=footer" class="smalltext">Atlassian Confluence</a> (Version: 2.2.9 Build:#527 Sep 07, 2006) - <a href="http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470" class="smalltext">Bug/feature request</a><br/> <br> <a href="http://cwiki.apache.org/confluence/users/viewnotifications.action">Unsubscribe or edit your notifications preferences</a> </div> </body> </html> From commitsjohn93@example.net Sat Mar 01 11:41:54 2008 Return-Path: <commitsjohn93@example.net> Delivered-To: john93@example.net Received: (qmail 2248 invoked from network); 1 Mar 2008 11:41:54 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 1 Mar 2008 11:41:54 -0000 Received: (qmail 38133 invoked by uid 500); 1 Mar 2008 11:41:49 -0000 Delivered-To: john93@example.net Received: (qmail 38116 invoked by uid 500); 1 Mar 2008 11:41:49 -0000 Mailing-List: contact john93@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:john93@example.net> List-Unsubscribe: <mailto:john93@example.net> List-Post: <mailto:john93@example.net> List-Id: <commits.cayenne.apache.org> Reply-To: john93@example.net Delivered-To: mailing list john93@example.net Received: (qmail 38107 invoked by uid 99); 1 Mar 2008 11:41:49 -0000 Received: from nike.apache.org (HELO nike.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 03:41:49 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 11:41:11 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 7C68F1A9832; Sat, 1 Mar 2008 03:41:31 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r632579 - /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java Date: Sat, 01 Mar 2008 11:41:30 -0000 To: john93@example.net From: john93@example.net X-Mailer: svnmailer-1.0.8 Message-Id: <john93@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: aadamchik Date: Sat Mar 1 03:41:24 2008 New Revision: 632579 URL: http://svn.apache.org/viewvc?rev=632579&view=rev Log: spelling Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java?rev=632579&r1=632578&r2=632579&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java Sat Mar 1 03:41:24 2008 @@ -83,7 +83,7 @@ /** * Changes object state to MODIFIED if needed, returning true if the change has - * occured, false if not. + * occurred, false if not. */ protected boolean markAsDirty(Persistent object) { if (object.getPersistenceState() == PersistenceState.COMMITTED) { From commitsjohn93@example.net Sat Mar 01 11:51:30 2008 Return-Path: <commitsjohn93@example.net> Delivered-To: john93@example.net Received: (qmail 3604 invoked from network); 1 Mar 2008 11:51:30 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 1 Mar 2008 11:51:30 -0000 Received: (qmail 43923 invoked by uid 500); 1 Mar 2008 11:51:26 -0000 Delivered-To: john93@example.net Received: (qmail 43907 invoked by uid 500); 1 Mar 2008 11:51:26 -0000 Mailing-List: contact john93@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:john93@example.net> List-Unsubscribe: <mailto:john93@example.net> List-Post: <mailto:john93@example.net> List-Id: <commits.cayenne.apache.org> Reply-To: john93@example.net Delivered-To: mailing list john93@example.net Received: (qmail 43898 invoked by uid 99); 1 Mar 2008 11:51:25 -0000 Received: from athena.apache.org (HELO athena.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 03:51:25 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 11:50:59 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 8F28A1A9832; Sat, 1 Mar 2008 03:51:09 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r632582 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne: CayenneContextGraphAction.java access/DataContextGraphAction.java util/ObjectContextGraphAction.java Date: Sat, 01 Mar 2008 11:51:08 -0000 To: john93@example.net From: john93@example.net X-Mailer: svnmailer-1.0.8 Message-Id: <john93@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: aadamchik Date: Sat Mar 1 03:51:07 2008 New Revision: 632582 URL: http://svn.apache.org/viewvc?rev=632582&view=rev Log: CAY-789 return object diff to client in ROP after commit (refactoring of property change handler for DataContext to match that of CayenneContext, and more importantly, pass all events to the GraphManager/ObjectStore) Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextGraphAction.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java?rev=632582&r1=632581&r2=632582&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/CayenneContextGraphAction.java Sat Mar 1 03:51:07 2008 @@ -36,6 +36,7 @@ class CayenneContextGraphAction extends ObjectContextGraphAction { static final ThreadLocal<Boolean> arcChangeInProcess = new ThreadLocal<Boolean>() { + @Override protected synchronized Boolean initialValue() { return Boolean.FALSE; @@ -84,20 +85,6 @@ finally { setArcChangeInProcess(false); } - } - - @Override - protected void handleSimplePropertyChange( - Persistent object, - String propertyName, - Object oldValue, - Object newValue) { - context.getGraphManager().nodePropertyChanged( - object.getObjectId(), - propertyName, - oldValue, - newValue); - markAsDirty(object); } /** Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextGraphAction.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextGraphAction.java?rev=632582&r1=632581&r2=632582&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextGraphAction.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContextGraphAction.java Sat Mar 1 03:51:07 2008 @@ -38,24 +38,6 @@ } @Override - protected void handleSimplePropertyChange( - Persistent object, - String propertyName, - Object oldValue, - Object newValue) { - - // for simple properties ObjectStore requires a callback only the first time the - // object changes - if (markAsDirty(object)) { - context.getGraphManager().nodePropertyChanged( - object.getObjectId(), - propertyName, - oldValue, - newValue); - } - } - - @Override protected void handleArcPropertyChange( Persistent object, ArcProperty property, Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java?rev=632582&r1=632581&r2=632582&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/util/ObjectContextGraphAction.java Sat Mar 1 03:51:07 2008 @@ -75,11 +75,19 @@ Object oldValue, Object newValue); - protected abstract void handleSimplePropertyChange( + protected void handleSimplePropertyChange( Persistent object, String propertyName, Object oldValue, - Object newValue); + Object newValue) { + + context.getGraphManager().nodePropertyChanged( + object.getObjectId(), + propertyName, + oldValue, + newValue); + markAsDirty(object); + } /** * Changes object state to MODIFIED if needed, returning true if the change has From commitsjohn93@example.net Sat Mar 01 12:29:54 2008 Return-Path: <commitsjohn93@example.net> Delivered-To: john93@example.net Received: (qmail 14747 invoked from network); 1 Mar 2008 12:29:54 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 1 Mar 2008 12:29:54 -0000 Received: (qmail 60929 invoked by uid 500); 1 Mar 2008 12:29:49 -0000 Delivered-To: john93@example.net Received: (qmail 60912 invoked by uid 500); 1 Mar 2008 12:29:49 -0000 Mailing-List: contact john93@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:john93@example.net> List-Unsubscribe: <mailto:john93@example.net> List-Post: <mailto:john93@example.net> List-Id: <commits.cayenne.apache.org> Reply-To: john93@example.net Delivered-To: mailing list john93@example.net Received: (qmail 60903 invoked by uid 99); 1 Mar 2008 12:29:49 -0000 Received: from nike.apache.org (HELO nike.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 04:29:49 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 12:29:10 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 9C5871A9832; Sat, 1 Mar 2008 04:29:30 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r632583 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/access/ main/java/org/apache/cayenne/graph/ test/java/org/apache/cayenne/graph/ Date: Sat, 01 Mar 2008 12:29:29 -0000 To: john93@example.net From: john93@example.net X-Mailer: svnmailer-1.0.8 Message-Id: <john93@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: aadamchik Date: Sat Mar 1 04:29:25 2008 New Revision: 632583 URL: http://svn.apache.org/viewvc?rev=632583&view=rev Log: generics Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphManager.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphMap.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/graph/MockGraphManager.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java?rev=632583&r1=632582&r2=632583&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java Sat Mar 1 04:29:25 2008 @@ -962,8 +962,8 @@ * * @since 1.2 */ - public synchronized Collection registeredNodes() { - return new ArrayList<Persistent>(objectMap.values()); + public synchronized Collection<Object> registeredNodes() { + return new ArrayList<Object>(objectMap.values()); } /** Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphManager.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphManager.java?rev=632583&r1=632582&r2=632583&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphManager.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphManager.java Sat Mar 1 04:29:25 2008 @@ -50,5 +50,5 @@ /** * Returns all graph nodes registered with GraphManager. */ - Collection registeredNodes(); + Collection<Object> registeredNodes(); } Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphMap.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphMap.java?rev=632583&r1=632582&r2=632583&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphMap.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/graph/GraphMap.java Sat Mar 1 04:29:25 2008 @@ -52,7 +52,7 @@ /** * Returns an immutable collection of registered nodes. */ - public Collection registeredNodes() { + public Collection<Object> registeredNodes() { return Collections.unmodifiableCollection(nodes.values()); } Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/graph/MockGraphManager.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/graph/MockGraphManager.java?rev=632583&r1=632582&r2=632583&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/graph/MockGraphManager.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/graph/MockGraphManager.java Sat Mar 1 04:29:25 2008 @@ -25,13 +25,13 @@ public class MockGraphManager implements GraphManager { - protected Map map; + protected Map<Object, Object> map; public MockGraphManager() { - this.map = new HashMap(); + this.map = new HashMap<Object, Object>(); } - public Collection registeredNodes() { + public Collection<Object> registeredNodes() { return map.values(); } From commitsjohn93@example.net Sat Mar 01 15:22:01 2008 Return-Path: <commitsjohn93@example.net> Delivered-To: john93@example.net Received: (qmail 13620 invoked from network); 1 Mar 2008 15:22:00 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 1 Mar 2008 15:22:00 -0000 Received: (qmail 27454 invoked by uid 500); 1 Mar 2008 15:21:56 -0000 Delivered-To: john93@example.net Received: (qmail 27434 invoked by uid 500); 1 Mar 2008 15:21:56 -0000 Mailing-List: contact john93@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:john93@example.net> List-Unsubscribe: <mailto:john93@example.net> List-Post: <mailto:john93@example.net> List-Id: <commits.cayenne.apache.org> Reply-To: john93@example.net Delivered-To: mailing list john93@example.net Received: (qmail 27425 invoked by uid 99); 1 Mar 2008 15:21:56 -0000 Received: from nike.apache.org (HELO nike.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 07:21:56 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [83.161.120.155] (HELO eris.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Mar 2008 15:21:16 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E5DF81A9832; Sat, 1 Mar 2008 07:21:34 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r632599 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/access/ main/java/org/apache/cayenne/reflect/pojo/ main/java/org/apache/cayenne/reflect/valueholder/ test/java/org/apache/cayenne/remote/ Date: Sat, 01 Mar 2008 15:21:33 -0000 To: john93@example.net From: john93@example.net X-Mailer: svnmailer-1.0.8 Message-Id: <john93@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: aadamchik Date: Sat Mar 1 07:21:32 2008 New Revision: 632599 URL: http://svn.apache.org/viewvc?rev=632599&view=rev Log: CAY-789 return object diff to client in ROP after commit (first working implementation. more testing is needed; need to filter out server entities) Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ChildDiffLoader.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/pojo/EnhancedPojoMapProperty.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/valueholder/ValueHolderMapProperty.java cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/remote/ClientChannelServerDiffsTest.java Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ChildDiffLoader.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ChildDiffLoader.java?rev=632599&r1=632598&r2=632599&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ChildDiffLoader.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ChildDiffLoader.java Sat Mar 1 07:21:32 2008 @@ -50,7 +50,33 @@ */ class ChildDiffLoader implements GraphChangeHandler { - ObjectContext context; + static final ThreadLocal<Boolean> childDiffProcessing = new ThreadLocal<Boolean>() { + + @Override + protected synchronized Boolean initialValue() { + return Boolean.FALSE; + } + }; + + private ObjectContext context; + + /** + * Returns whether child diff processing is in progress. + * + * @since 3.0 + */ + static boolean isProcessingChildDiff() { + return childDiffProcessing.get(); + } + + /** + * Sets whether child diff processing is in progress. + * + * @since 3.0 + */ + static void setExternalChange(Boolean flag) { + childDiffProcessing.set(flag); + } ChildDiffLoader(ObjectContext context) { this.context = context; @@ -61,30 +87,47 @@ } public void nodeCreated(Object nodeId) { - ObjectId id = (ObjectId) nodeId; - if (id.getEntityName() == null) { - throw new NullPointerException("Null entity name in id " + id); - } - ObjEntity entity = context.getEntityResolver().getObjEntity(id.getEntityName()); - if (entity == null) { - throw new IllegalArgumentException("Entity not mapped with Cayenne: " + id); - } + setExternalChange(Boolean.TRUE); - Persistent dataObject = null; try { - dataObject = (Persistent) entity.getJavaClass().newInstance(); + ObjectId id = (ObjectId) nodeId; + if (id.getEntityName() == null) { + throw new NullPointerException("Null entity name in id " + id); + } + + ObjEntity entity = context.getEntityResolver().getObjEntity( + id.getEntityName()); + if (entity == null) { + throw new IllegalArgumentException("Entity not mapped with Cayenne: " + + id); + } + + Persistent dataObject = null; + try { + dataObject = (Persistent) entity.getJavaClass().newInstance(); + } + catch (Exception ex) { + throw new CayenneRuntimeException("Error instantiating object.", ex); + } + + dataObject.setObjectId(id); + context.registerNewObject(dataObject); } - catch (Exception ex) { - throw new CayenneRuntimeException("Error instantiating object.", ex); + finally { + setExternalChange(Boolean.FALSE); } - - dataObject.setObjectId(id); - context.registerNewObject(dataObject); } public void nodeRemoved(Object nodeId) { - context.deleteObject(findObject(nodeId)); + setExternalChange(Boolean.TRUE); + + try { + context.deleteObject(findObject(nodeId)); + } + finally { + setExternalChange(Boolean.FALSE); + } } public void nodePropertyChanged( @@ -99,12 +142,16 @@ ClassDescriptor descriptor = context.getEntityResolver().getClassDescriptor( ((ObjectId) nodeId).getEntityName()); + setExternalChange(Boolean.TRUE); try { descriptor.getProperty(property).writeProperty(object, null, newValue); } catch (Exception e) { throw new CayenneRuntimeException("Error setting property: " + property, e); } + finally { + setExternalChange(Boolean.FALSE); + } } public void arcCreated(Object nodeId, Object targetNodeId, Object arcId) { @@ -116,27 +163,33 @@ ((ObjectId) nodeId).getEntityName()); ArcProperty property = (ArcProperty) descriptor.getProperty(arcId.toString()); - property.visit(new PropertyVisitor() { + setExternalChange(Boolean.TRUE); + try { + property.visit(new PropertyVisitor() { - public boolean visitAttribute(AttributeProperty property) { - return false; - } + public boolean visitAttribute(AttributeProperty property) { + return false; + } - public boolean visitToMany(ToManyProperty property) { - // connect reverse arc if the relationship is marked as "runtime" - ArcProperty reverseArc = property.getComplimentaryReverseArc(); - boolean autoConnectReverse = reverseArc != null - && reverseArc.getRelationship().isRuntime(); + public boolean visitToMany(ToManyProperty property) { + // connect reverse arc if the relationship is marked as "runtime" + ArcProperty reverseArc = property.getComplimentaryReverseArc(); + boolean autoConnectReverse = reverseArc != null + && reverseArc.getRelationship().isRuntime(); - property.addTarget(source, target, autoConnectReverse); - return false; - } + property.addTarget(source, target, autoConnectReverse); + return false; + } - public boolean visitToOne(ToOneProperty property) { - property.setTarget(source, target, false); - return false; - } - }); + public boolean visitToOne(ToOneProperty property) { + property.setTarget(source, target, false); + return false; + } + }); + } + finally { + setExternalChange(Boolean.FALSE); + } } public void arcDeleted(Object nodeId, final Object targetNodeId, Object arcId) { @@ -151,45 +204,54 @@ ClassDescriptor descriptor = context.getEntityResolver().getClassDescriptor( ((ObjectId) nodeId).getEntityName()); Property property = descriptor.getProperty(arcId.toString()); - property.visit(new PropertyVisitor() { - public boolean visitAttribute(AttributeProperty property) { - return false; - } - - public boolean visitToMany(ToManyProperty property) { - // connect reverse arc if the relationship is marked as "runtime" - ArcProperty reverseArc = property.getComplimentaryReverseArc(); - boolean autoConnectReverse = reverseArc != null - && reverseArc.getRelationship().isRuntime(); + setExternalChange(Boolean.TRUE); + try { + property.visit(new PropertyVisitor() { - Persistent target = findObject(targetNodeId); + public boolean visitAttribute(AttributeProperty property) { + return false; + } - if (target == null) { + public boolean visitToMany(ToManyProperty property) { + // connect reverse arc if the relationship is marked as "runtime" + ArcProperty reverseArc = property.getComplimentaryReverseArc(); + boolean autoConnectReverse = reverseArc != null + && reverseArc.getRelationship().isRuntime(); + + Persistent target = findObject(targetNodeId); + + if (target == null) { + + // this is usually the case when a NEW object was deleted and then + // its + // relationships were manipulated; so try to locate the object in + // the + // collection ... + // the performance of this is rather dubious of course... + target = findObjectInCollection(targetNodeId, property + .readProperty(source)); + } + + if (target == null) { + // ignore? + } + else { + property.removeTarget(source, target, autoConnectReverse); + } - // this is usually the case when a NEW object was deleted and then its - // relationships were manipulated; so try to locate the object in the - // collection ... - // the performance of this is rather dubious of course... - target = findObjectInCollection(targetNodeId, property - .readProperty(source)); + return false; } - if (target == null) { - // ignore? - } - else { - property.removeTarget(source, target, autoConnectReverse); + public boolean visitToOne(ToOneProperty property) { + property.setTarget(source, null, false); + return false; } - - return false; - } - - public boolean visitToOne(ToOneProperty property) { - property.setTarget(source, null, false); - return false; - } - }); + }); + } + finally { + setExternalChange(Boolean.FALSE); + } } Persistent findObject(Object nodeId) { @@ -200,9 +262,9 @@ if (object != null) { return object; } - + ObjectId id = (ObjectId) nodeId; - + // this can happen if a NEW object is deleted and after that its relationships are // modified if (id.isTemporary()) { @@ -225,18 +287,19 @@ return (Persistent) objects.get(0); } - + Persistent findObjectInCollection(Object nodeId, Object toManyHolder) { - Collection c = (toManyHolder instanceof Map) ? ((Map) toManyHolder) - .values() : (Collection) toManyHolder; + Collection c = (toManyHolder instanceof Map) + ? ((Map) toManyHolder).values() + : (Collection) toManyHolder; Iterator it = c.iterator(); while (it.hasNext()) { Persistent o = (Persistent) it.next(); - if(nodeId.equals(o.getObjectId())) { + if (nodeId.equals(o.getObjectId())) { return o; } } - + return null; } } Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java?rev=632599&r1=632598&r2=632599&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataContext.java Sat Mar 1 07:21:32 2008 @@ -1116,12 +1116,22 @@ GraphDiff changes, boolean cascade) { - if (this != originatingContext && changes != null) { - changes.apply(new ChildDiffLoader(this)); - fireDataChannelChanged(originatingContext, changes); - } + boolean childContext = this != originatingContext && changes != null; + + try { + if (childContext) { + getObjectStore().childContextSyncStarted(); + changes.apply(new ChildDiffLoader(this)); + fireDataChannelChanged(originatingContext, changes); + } - return (cascade) ? flushToParent(true) : new CompoundDiff(); + return (cascade) ? flushToParent(true) : new CompoundDiff(); + } + finally { + if (childContext) { + getObjectStore().childContextSyncStopped(); + } + } } /** @@ -1141,6 +1151,7 @@ : DataChannel.FLUSH_NOCASCADE_SYNC; ObjectStore objectStore = getObjectStore(); + GraphDiff parentChanges = null; // prevent multiple commits occuring simulteneously synchronized (objectStore) { @@ -1153,46 +1164,62 @@ if (noop) { // need to clear phantom changes objectStore.postprocessAfterPhantomCommit(); - return new CompoundDiff(); } + else { - try { - GraphDiff returnChanges = getChannel().onSync(this, changes, syncType); + try { + parentChanges = getChannel().onSync(this, changes, syncType); - // note that this is a hack resulting from a fix to CAY-766... To support - // valid object state in PostPersist callback, 'postprocessAfterCommit' is - // invoked by DataDomain.onSync(..). Unless the parent is DataContext, and - // this method is not invoked!! As a result, PostPersist will contain temp - // ObjectIds in nested contexts and perm ones in flat contexts. - // Pending better callback design ..... - if (objectStore.hasChanges()) { - objectStore.postprocessAfterCommit(returnChanges); + // note that this is a hack resulting from a fix to CAY-766... To + // support + // valid object state in PostPersist callback, + // 'postprocessAfterCommit' is + // invoked by DataDomain.onSync(..). Unless the parent is DataContext, + // and + // this method is not invoked!! As a result, PostPersist will contain + // temp + // ObjectIds in nested contexts and perm ones in flat contexts. + // Pending better callback design ..... + if (objectStore.hasChanges()) { + objectStore.postprocessAfterCommit(parentChanges); + } + + // this event is caught by peer nested DataContexts to synchronize the + // state + fireDataChannelCommitted(this, changes); } - - // this event is caught by peer nested DataContexts to synchronize the - // state - fireDataChannelCommitted(this, changes); - - // this event is caught by child DataContexts to update temporary - // ObjectIds with permanent - if (!returnChanges.isNoop()) { - fireDataChannelCommitted(getChannel(), returnChanges); + // "catch" is needed to unwrap OptimisticLockExceptions + catch (CayenneRuntimeException ex) { + Throwable unwound = Util.unwindException(ex); + + if (unwound instanceof CayenneRuntimeException) { + throw (CayenneRuntimeException) unwound; + } + else { + throw new CayenneRuntimeException("Commit Exception", unwound); + } } + } + + // merge changes from parent as well as changes caused by lifecycle event + // callbacks/listeners... - return returnChanges; + CompoundDiff diff = new CompoundDiff(); + + diff.addAll(objectStore.getLifecycleEventInducedChanges()); + if (parentChanges != null) { + diff.add(parentChanges); } - // "catch" is needed to unwrap OptimisticLockExceptions - catch (CayenneRuntimeException ex) { - Throwable unwound = Util.unwindException(ex); - if (unwound instanceof CayenneRuntimeException) { - throw (CayenneRuntimeException) unwound; - } - else { - throw new CayenneRuntimeException("Commit Exception", unwound); - } + // this event is caught by child DataContexts to update temporary + // ObjectIds with permanent + if (!diff.isNoop()) { + fireDataChannelCommitted(getChannel(), diff); } + + return diff; } + } /** Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java?rev=632599&r1=632598&r2=632599&view=diff ============================================================================== --- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java (original) +++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/ObjectStore.java Sat Mar 1 07:21:32 2008 @@ -43,6 +43,7 @@ import org.apache.cayenne.graph.NodeCreateOperation; import org.apache.cayenne.graph.NodeDeleteOperation; import org.apache.cayenne.graph.NodeDiff; +import org.apache.cayenne.graph.NodePropertyChangeOperation; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.ObjEntity; @@ -105,6 +106,8 @@ // used to avoid incorrect on-demand DataRowStore initialization after deserialization private boolean dataRowCacheSet; + private Collection<GraphDiff> lifecycleEventInducedChanges; + /** * The DataContext that owns this ObjectStore. */ @@ -132,6 +135,39 @@ } /** + * @since 3.0 + */ + void childContextSyncStarted() { + lifecycleEventInducedChanges = new ArrayList<GraphDiff>(); + } + + /** + * @since 3.0 + */ + void childContextSyncStopped() { + lifecycleEventInducedChanges = null; + } + + /** + * @since 3.0 + */ + Collection<GraphDiff> getLifecycleEventInducedChanges() { + return lifecycleEventInducedChanges != null + ? lifecycleEventInducedChanges + : Collections.EMPTY_LIST; + } + + void registerLifecycleEventInducedChange(GraphDiff diff) { + if (ChildDiffLoader.isProcessingChildDiff()) { + // reset so that subsequent event-induced changes could get registered... + ChildDiffLoader.setExternalChange(Boolean.FALSE); + } + else { + lifecycleEventInducedChanges.add(diff); + } + } + + /** * Registers object change. * * @since 1.2 @@ -570,7 +606,7 @@ if (context != null && context.getChannel() != null) { ObjectIdQuery query = new ObjectIdQuery(oid, true, ObjectIdQuery.CACHE); - List results = context.getChannel().onQuery(context, query).firstList(); + List<?> results = context.getChannel().onQuery(context, query).firstList(); return results.isEmpty() ? null : (DataRow) results.get(0); } else { @@ -998,14 +1034,27 @@ * @since 1.2 */ public void nodeCreated(Object nodeId) { - registerDiff(nodeId, new NodeCreateOperation(nodeId)); + NodeDiff diff = new NodeCreateOperation(nodeId); + + if (lifecycleEventInducedChanges != null) { + registerLifecycleEventInducedChange(diff); + } + + registerDiff(nodeId, diff); } /** * @since 1.2 */ public void nodeRemoved(Object nodeId) { - registerDiff(nodeId, new NodeDeleteOperation(nodeId)); + + NodeDiff diff = new NodeDeleteOperation(nodeId); + + if (lifecycleEventInducedChanges != null) { + registerLifecycleEventInducedChange(diff); + } + + registerDiff(nodeId, diff); } /** @@ -1019,6 +1068,14 @@ Object oldValue, Object newValue) { + if (lifecycleEventInducedChanges != null) { + registerLifecycleEventInducedChange(new NodePropertyChangeOperation( + nodeId, + property, + oldValue, + newValue)); + } + registerDiff(nodeId, null); } @@ -1026,22 +1083,26 @@ * @since 1.2 */ public void arcCreated(Object nodeId, Object targetNodeId, Object arcId) { - registerDiff(nodeId, new ArcOperation( - nodeId, - targetNodeId, - arcId.toString(), - false)); + NodeDiff diff = new ArcOperation(nodeId, targetNodeId, arcId.toString(), false); + + if (lifecycleEventInducedChanges != null) { + registerLifecycleEventInducedChange(diff); + } + + registerDiff(nodeId, diff); } /** * @since 1.2 */ public void arcDeleted(Object nodeId, Object targetNodeId, Object arcId) { - registerDiff(nodeId, new ArcOperation( - nodeId, - targetNodeId, - arcId.toString(), - true)); + NodeDiff diff = new ArcOperation(nodeId, targetNodeId, arcId.toString(), true); + + if (lifecycleEventInducedChanges != null) { + registerLifecycleEventInducedChange(diff); + } + + registerDiff(nodeId, diff); } // an ObjectIdQuery optimized for retrieval of multiple snapshots - it can be reset Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/pojo/EnhancedPojoMapProperty.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/reflect/pojo/EnhancedPojoMapProperty.java?rev=632599&r1=632598&r2=632599&view=diff ============================================================================== ---
{'source': 'Apache Software Foundation Public Mail Archives'}