From open-jpa-commits-return-761nrice@example.net Tue Jan 02 00:23:52 2007 Return-Path: <open-jpa-commits-return-761nrice@example.net> Delivered-To: nrice@example.net Received: (qmail 56625 invoked from network); 2 Jan 2007 00:23:51 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 2 Jan 2007 00:23:51 -0000 Received: (qmail 6121 invoked by uid 500); 2 Jan 2007 00:23:58 -0000 Delivered-To: nrice@example.net Received: (qmail 6102 invoked by uid 500); 2 Jan 2007 00:23:58 -0000 Mailing-List: contact nrice@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:nrice@example.net> List-Unsubscribe: <mailto:nrice@example.net> List-Post: <mailto:nrice@example.net> List-Id: <open-jpa-commits.incubator.apache.org> Reply-To: nrice@example.net Delivered-To: mailing list nrice@example.net Received: (qmail 6093 invoked by uid 99); 2 Jan 2007 00:23:57 -0000 X-ASF-Spam-Status: No, hits=2.6 required=10.0 tests=HTML_MESSAGE,MIME_HTML_ONLY,NO_REAL_NAME 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; Mon, 01 Jan 2007 16:23:57 -0800 Received: from brutus (localhost [83.161.120.155]) by brutus.apache.org (Postfix) with ESMTP id 1231E7142D2 for <nrice@example.net>; Mon, 1 Jan 2007 16:23:00 -0800 (PST) Message-ID: <5386089.1167697380023.JavaMail.www-data@brutus> Date: Mon, 1 Jan 2007 16:23:00 -0800 (PST) From: nrice@example.net To: nrice@example.net Subject: [CONF] OpenJPA: Integration (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/openjpa">openjpa</a> : <a href="http://cwiki.apache.org/confluence/display/openjpa/Integration">Integration</a> </span> </div> <p> <a href="http://cwiki.apache.org/confluence/display/openjpa/Integration">Integration</a> has been edited by <a href="http://cwiki.apache.org/confluence/display/~mprudhom">Marc Prud&#39;hommeaux</a> <span class="smallfont">(Jan 01, 2007)</span>. </p> <p> Change summary: <div class="greybox wiki-content"><p>Added link to WSAD integration instructions</p></div> </p> <p> <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=23562&originalVersion=1&revisedVersion=2">(View changes)</a> </p> <span class="label">Content:</span><br/> <div class="greybox wiki-content"><h2><a name="Integration-IntegratingwithGlassfish%3A"></a>Integrating with Glassfish:</h2> <p>Since Glassfish (<span class="nobr"><a href="http://glassfish.dev.java.net" title="Visit page outside Confluence" rel="nofollow">http://glassfish.dev.java.net<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>) implements the Java Persistence API 1.0 SPI, it is very easy to use OpenJPA in Glassfish. See <span class="nobr"><a href="http://weblogs.java.net/blog/ss141213/archive/2006/07/using_openjpa_a.html" title="Visit page outside Confluence" rel="nofollow">http://weblogs.java.net/blog/ss141213/archive/2006/07/using_openjpa_a.html<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> for further details.</p> <h2><a name="Integration-IntegratingwithSunJavaSystemApplicationServer9.x%3A"></a>Integrating with Sun Java System Application Server 9.x:</h2> <p>Since Sun Java System Application Server is based on code from Glassfish project (<span class="nobr"><a href="http://glassfish.dev.java.net" title="Visit page outside Confluence" rel="nofollow">http://glassfish.dev.java.net<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>), the instructions to use OpenJPA in Glassfish and Sun Java System Application Server remain same. </p> <h3><a name="Integration-IntegratingwithWebSphereApplicationServerV6.1"></a>Integrating with WebSphere Application Server V6.1</h3> <p>See <span class="nobr"><a href="http://www-128.ibm.com/developerworks/websphere/techjournal/0612_barcia/0612_barcia.html" title="Visit page outside Confluence" rel="nofollow">IBM WebSphere Developer Technical Journal: Leveraging OpenJPA with WebSphere Application Server V6.1<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>.</p></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 open-jpa-commits-return-762nrice@example.net Wed Jan 03 00:50:00 2007 Return-Path: <open-jpa-commits-return-762nrice@example.net> Delivered-To: nrice@example.net Received: (qmail 36317 invoked from network); 3 Jan 2007 00:49:59 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 3 Jan 2007 00:49:59 -0000 Received: (qmail 29233 invoked by uid 500); 3 Jan 2007 00:50:05 -0000 Delivered-To: nrice@example.net Received: (qmail 29209 invoked by uid 500); 3 Jan 2007 00:50:05 -0000 Mailing-List: contact nrice@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:nrice@example.net> List-Unsubscribe: <mailto:nrice@example.net> List-Post: <mailto:nrice@example.net> List-Id: <open-jpa-commits.incubator.apache.org> Reply-To: nrice@example.net Delivered-To: mailing list nrice@example.net Received: (qmail 29200 invoked by uid 99); 3 Jan 2007 00:50:05 -0000 Received: from herse.apache.org (HELO herse.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 02 Jan 2007 16:50:05 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME 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; Tue, 02 Jan 2007 16:49:57 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id 8894A1A981D; Tue, 2 Jan 2007 16:49:00 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r491994 - in /incubator/openjpa/trunk: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java Date: Wed, 03 Jan 2007 00:49:00 -0000 To: nrice@example.net From: nrice@example.net X-Mailer: svnmailer-1.1.0 Message-Id: <nrice@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: awhite Date: Tue Jan 2 16:48:59 2007 New Revision: 491994 URL: http://svn.apache.org/viewvc?view=rev&rev=491994 Log: Exception translation when a managed transaction completion even causes an error. Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java?view=diff&rev=491994&r1=491993&r2=491994 ============================================================================== --- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java (original) +++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/BrokerImpl.java Tue Jan 2 16:48:59 2007 @@ -1757,11 +1757,11 @@ } catch (OpenJPAException ke) { if (_log.isTraceEnabled()) _log.trace(_loc.get("end-trans-error"), ke); - throw ke; + throw translateManagedCompletionException(ke); } catch (RuntimeException re) { if (_log.isTraceEnabled()) _log.trace(_loc.get("end-trans-error"), re); - throw new StoreException(re); + throw translateManagedCompletionException(new StoreException(re)); } finally { endOperation(); } @@ -1789,11 +1789,11 @@ } catch (OpenJPAException ke) { if (_log.isTraceEnabled()) _log.trace(_loc.get("end-trans-error"), ke); - throw ke; + throw translateManagedCompletionException(ke); } catch (RuntimeException re) { if (_log.isTraceEnabled()) _log.trace(_loc.get("end-trans-error"), re); - throw new StoreException(re); + throw translateManagedCompletionException(new StoreException(re)); } finally { _flags &= ~FLAG_ACTIVE; _flags &= ~FLAG_FLUSHED; @@ -1811,6 +1811,15 @@ endOperation(); } + } + + /** + * If we're in a managed transaction, use our implicit behavior exception + * translator to translate before/afterCompletion callback errors. + */ + private RuntimeException translateManagedCompletionException + (RuntimeException re) { + return (!_managed || _extrans == null) ? re : _extrans.translate(re); } /** Modified: incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java?view=diff&rev=491994&r1=491993&r2=491994 ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java (original) +++ incubator/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/PersistenceExceptions.java Tue Jan 2 16:48:59 2007 @@ -48,7 +48,7 @@ * and {@link NonUniqueResultException} in accordance with * section 3.7 of the EJB 3.0 specification. */ - static RuntimeExceptionTranslator getRollbackTranslator + public static RuntimeExceptionTranslator getRollbackTranslator (final OpenJPAEntityManager em) { return new RuntimeExceptionTranslator() { private boolean throwing = false; From open-jpa-commits-return-763nrice@example.net Wed Jan 03 02:52:58 2007 Return-Path: <open-jpa-commits-return-763nrice@example.net> Delivered-To: nrice@example.net Received: (qmail 72427 invoked from network); 3 Jan 2007 02:52:57 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 3 Jan 2007 02:52:57 -0000 Received: (qmail 43264 invoked by uid 500); 3 Jan 2007 02:52:37 -0000 Delivered-To: nrice@example.net Received: (qmail 43181 invoked by uid 500); 3 Jan 2007 02:52:32 -0000 Mailing-List: contact nrice@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:nrice@example.net> List-Unsubscribe: <mailto:nrice@example.net> List-Post: <mailto:nrice@example.net> List-Id: <open-jpa-commits.incubator.apache.org> Reply-To: nrice@example.net Delivered-To: mailing list nrice@example.net Received: (qmail 43126 invoked by uid 99); 3 Jan 2007 02:52:31 -0000 Received: from herse.apache.org (HELO herse.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 02 Jan 2007 18:52:30 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME 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; Tue, 02 Jan 2007 18:51:48 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id 706F61A9822; Tue, 2 Jan 2007 18:50:45 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r492027 - in /incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc: ./ meta/ meta/TestMappingToolAutoDelete.java Date: Wed, 03 Jan 2007 02:50:45 -0000 To: nrice@example.net From: nrice@example.net X-Mailer: svnmailer-1.1.0 Message-Id: <nrice@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: pcl Date: Tue Jan 2 18:50:44 2007 New Revision: 492027 URL: http://svn.apache.org/viewvc?view=rev&rev=492027 Log: adding forgotten new file for previous commit Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/TestMappingToolAutoDelete.java Added: incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/TestMappingToolAutoDelete.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/TestMappingToolAutoDelete.java?view=auto&rev=492027 ============================================================================== --- incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/TestMappingToolAutoDelete.java (added) +++ incubator/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jdbc/meta/TestMappingToolAutoDelete.java Tue Jan 2 18:50:44 2007 @@ -0,0 +1,61 @@ +package org.apache.openjpa.jdbc.meta; + +import java.io.IOException; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import javax.persistence.EntityManager; +import javax.persistence.Persistence; + +import org.apache.openjpa.jdbc.conf.JDBCConfiguration; +import org.apache.openjpa.jdbc.schema.SchemaTool; +import org.apache.openjpa.persistence.OpenJPAEntityManagerFactory; +import org.apache.openjpa.persistence.OpenJPAPersistence; +import org.apache.openjpa.persistence.simple.AllFieldTypes; + +import junit.framework.TestCase; + + +public class TestMappingToolAutoDelete + extends TestCase { + + private JDBCConfiguration _conf; + private OpenJPAEntityManagerFactory emf; + + public void setUp() { + Map props = new HashMap(); + props.put("openjpa.MetaDataFactory", + "jpa(Types=" + AllFieldTypes.class.getName() + ")"); + emf = OpenJPAPersistence.cast( + Persistence.createEntityManagerFactory("test", props)); + _conf = (JDBCConfiguration) emf.getConfiguration(); + + EntityManager em = emf.createEntityManager(); + em.getTransaction().begin(); + em.persist(new AllFieldTypes()); + em.getTransaction().commit(); + em.close(); + } + + public void tearDown() { + emf.close(); + } + + public void testMappingToolAutoDelete() + throws IOException, SQLException { + MappingTool.Flags flags = new MappingTool.Flags(); + + // indirect validation that comma-separated schema actions work + flags.schemaAction = SchemaTool.ACTION_ADD + "," + + SchemaTool.ACTION_DELETE_TABLE_CONTENTS; + + MappingTool.run(_conf, new String[0], flags, null); + + EntityManager em = emf.createEntityManager(); + assertEquals(Long.valueOf(0), + em.createQuery("select count(o) from AllFieldTypes o") + .getSingleResult()); + em.close(); + } +} From open-jpa-commits-return-764nrice@example.net Wed Jan 03 03:05:04 2007 Return-Path: <open-jpa-commits-return-764nrice@example.net> Delivered-To: nrice@example.net Received: (qmail 75457 invoked from network); 3 Jan 2007 03:05:04 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 3 Jan 2007 03:05:04 -0000 Received: (qmail 59009 invoked by uid 500); 3 Jan 2007 03:05:10 -0000 Delivered-To: nrice@example.net Received: (qmail 58992 invoked by uid 500); 3 Jan 2007 03:05:10 -0000 Mailing-List: contact nrice@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:nrice@example.net> List-Unsubscribe: <mailto:nrice@example.net> List-Post: <mailto:nrice@example.net> List-Id: <open-jpa-commits.incubator.apache.org> Reply-To: nrice@example.net Delivered-To: mailing list nrice@example.net Received: (qmail 58983 invoked by uid 99); 3 Jan 2007 03:05:09 -0000 Received: from herse.apache.org (HELO herse.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 02 Jan 2007 19:05:09 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME 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; Tue, 02 Jan 2007 19:04:13 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id DD0231A981A; Tue, 2 Jan 2007 18:44:58 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r492024 - in /incubator/openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ openjpa-jdbc/src/main/java... Date: Wed, 03 Jan 2007 02:44:58 -0000 To: nrice@example.net From: nrice@example.net X-Mailer: svnmailer-1.1.0 Message-Id: <nrice@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: pcl Date: Tue Jan 2 18:44:57 2007 New Revision: 492024 URL: http://svn.apache.org/viewvc?view=rev&rev=492024 Log: Added new SchemaTool action: deleteTableContents, and added support for comma-separated lists of schema actions, both via the MappingTool -schemaAction option and via direct SchemaTool usage. This implementation always processes all of the known types in the system; I have not tested running MappingTool against just one or two classes to see what 'all of the known types in the system' really means. Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingTool.java incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java incubator/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/schema/localizer.properties incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_mapping.xml Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java?view=diff&rev=492024&r1=492023&r2=492024 ============================================================================== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/JDBCStoreQuery.java Tue Jan 2 18:44:57 2007 @@ -468,7 +468,7 @@ // this case, we need to perform the query in-memory and // manually delete the instances if (updates == null) - sql[i] = dict.toDelete(mappings[i], sel, _store, params); + sql[i] = dict.toDelete(mappings[i], sel, params); else sql[i] = dict.toUpdate(mappings[i], sel, _store, params, updates); Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingTool.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingTool.java?view=diff&rev=492024&r1=492023&r2=492024 ============================================================================== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingTool.java (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/MappingTool.java Tue Jan 2 18:44:57 2007 @@ -102,7 +102,7 @@ private MappingRepository _repos = null; private SchemaGroup _schema = null; private SchemaTool _schemaTool = null; - private String _schemaAction = SchemaTool.ACTION_ADD; + private String _schemaActions = SchemaTool.ACTION_ADD; private boolean _readSchema = false; private boolean _pks = false; private boolean _fks = false; @@ -159,20 +159,20 @@ /** * The schema modification policy, or <code>none</code>. See the - * ACTION constants in {@link SchemaTool}. Defaults to - * {@link SchemaTool#ACTION_ADD}. + * ACTION constants in {@link SchemaTool}. May be a comma-separated + * list of values. Defaults to {@link SchemaTool#ACTION_ADD}. */ public String getSchemaAction() { - return _schemaAction; + return _schemaActions; } /** * The schema modification policy, or <code>none</code>. See the - * ACTION constants in {@link SchemaTool}. Defaults to - * {@link SchemaTool#ACTION_ADD}. + * ACTION constants in {@link SchemaTool}. May be a comma-separated + * list of values. Defaults to {@link SchemaTool#ACTION_ADD}. */ public void setSchemaAction(String schemaAction) { - _schemaAction = schemaAction; + _schemaActions = schemaAction; } /** @@ -294,15 +294,6 @@ /** * Return the schema tool to use for schema modification. */ - public SchemaTool getSchemaTool() { - if (_schemaTool == null) - _schemaTool = newSchemaTool(_schemaAction); - return _schemaTool; - } - - /** - * Return the schema tool to use for schema modification. - */ private SchemaTool newSchemaTool(String action) { if (SCHEMA_ACTION_NONE.equals(action)) action = null; @@ -394,14 +385,14 @@ */ public SchemaGroup getSchemaGroup() { if (_schema == null) { - if (ACTION_BUILD_SCHEMA.equals(_action)) { + if (_action.contains(ACTION_BUILD_SCHEMA)) { DynamicSchemaFactory factory = new DynamicSchemaFactory(); factory.setConfiguration(_conf); _schema = factory; - } else if (_readSchema - || SchemaTool.ACTION_RETAIN.equals(_schemaAction) - || SchemaTool.ACTION_REFRESH.equals(_schemaAction)) { - _schema = (SchemaGroup) getSchemaTool().getDBSchemaGroup(). + } else if (_readSchema + || _schemaActions.contains(SchemaTool.ACTION_RETAIN) + || _schemaActions.contains(SchemaTool.ACTION_REFRESH)) { + _schema = (SchemaGroup) newSchemaTool(null).getDBSchemaGroup(). clone(); } else { // with this we'll just read tables as different mappings @@ -449,6 +440,10 @@ * involves clearing the internal mapping repository. */ public void record() { + record(null); + } + + private void record(MappingTool.Flags flags) { MappingRepository repos = getRepository(); MetaDataFactory io = repos.getMetaDataFactory(); ClassMapping[] mappings; @@ -477,13 +472,25 @@ // now run the schematool as long as we're doing some schema // action and the user doesn't just want an xml output - if (!SCHEMA_ACTION_NONE.equals(_schemaAction) - && (_schemaWriter == null || (_schemaTool != null - && _schemaTool.getWriter() != null))) { - SchemaTool tool = getSchemaTool(); - tool.setSchemaGroup(getSchemaGroup()); - tool.run(); - tool.record(); + String[] schemaActions = _schemaActions.split(","); + for (int i = 0; i < schemaActions.length; i++) { + if (!SCHEMA_ACTION_NONE.equals(schemaActions[i]) + && (_schemaWriter == null || (_schemaTool != null + && _schemaTool.getWriter() != null))) { + SchemaTool tool = newSchemaTool(schemaActions[i]); + + // configure the tool with additional settings + if (flags != null) { + tool.setDropTables(flags.dropTables); + tool.setDropSequences(flags.dropSequences); + tool.setWriter(flags.sqlWriter); + tool.setOpenJPATables(flags.openjpaTables); + } + + tool.setSchemaGroup(getSchemaGroup()); + tool.run(); + tool.record(); + } } // xml output of schema? @@ -716,8 +723,8 @@ MappingRepository repos = getRepository(); repos.setStrategyInstaller(new RuntimeStrategyInstaller(repos)); if (getMapping(repos, cls, true) != null) - _flushSchema = !SCHEMA_ACTION_NONE.equals(_schemaAction) - && !SchemaTool.ACTION_ADD.equals(_schemaAction); + _flushSchema = !_schemaActions.contains(SCHEMA_ACTION_NONE) + && !_schemaActions.contains(SchemaTool.ACTION_ADD); } /** @@ -761,7 +768,7 @@ if (_dropCls == null) _dropCls = new HashSet(); _dropCls.add(cls); - if (!SchemaTool.ACTION_DROP.equals(_schemaAction)) + if (!_schemaActions.contains(SchemaTool.ACTION_DROP)) return; MappingRepository repos = getRepository(); @@ -1044,13 +1051,6 @@ tool.setIndexes(flags.indexes); tool.setSequences(flags.sequences || flags.dropSequences); - // make sure to do this after other settings so that other settings - // are passed on to schema tool - tool.getSchemaTool().setDropTables(flags.dropTables); - tool.getSchemaTool().setDropSequences(flags.dropSequences); - tool.getSchemaTool().setWriter(flags.sqlWriter); - tool.getSchemaTool().setOpenJPATables(flags.openjpaTables); - // and run the action for (int i = 0; i < act.length; i++) { log.info(_loc.get("tool-running", act[i], flags.action)); @@ -1059,7 +1059,7 @@ tool.run(act[i]); } log.info(_loc.get("tool-record")); - tool.record(); + tool.record(flags); return true; } Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java?view=diff&rev=492024&r1=492023&r2=492024 ============================================================================== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java Tue Jan 2 18:44:57 2007 @@ -27,6 +27,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.Set; import javax.sql.DataSource; @@ -65,6 +66,8 @@ public static final String ACTION_DROPDB = "dropDB"; public static final String ACTION_IMPORT = "import"; public static final String ACTION_EXPORT = "export"; + public static final String ACTION_DELETE_TABLE_CONTENTS = + "deleteTableContents"; public static final String[] ACTIONS = new String[]{ ACTION_ADD, @@ -77,6 +80,7 @@ ACTION_DROPDB, ACTION_IMPORT, ACTION_EXPORT, + ACTION_DELETE_TABLE_CONTENTS, }; private static final Localizer _loc = Localizer.forPackage @@ -324,6 +328,8 @@ createDB(); else if (ACTION_DROPDB.equals(_action)) dropDB(); + else if (ACTION_DELETE_TABLE_CONTENTS.equals(_action)) + deleteTableContents(); } /** @@ -400,6 +406,26 @@ } /** + * Issue DELETE statement against all known tables. + */ + private void deleteTableContents() + throws SQLException { + SchemaGroup group = getSchemaGroup(); + Schema[] schemas = group.getSchemas(); + Collection tables = new LinkedHashSet(); + for (int i = 0; i < schemas.length; i++) { + Table[] ts = schemas[i].getTables(); + for (int j = 0; j < ts.length; j++) + tables.add(ts[j]); + } + Table[] tableArray = (Table[]) tables.toArray(new Table[tables.size()]); + String[] sql = _conf.getDBDictionaryInstance() + .getDeleteTableContentsSQL(tableArray); + if (!executeSQL(sql)) + _log.warn(_loc.get("delete-table-contents")); + } + + /** * Record the changes made to the DB in the current {@link SchemaFactory}. */ public void record() { @@ -1233,7 +1259,8 @@ * <code>false</code> to prevent writing the schema changes to the * current {@link SchemaFactory}.</li> * </ul> - * The various actions are as follows. + * Actions can be composed in a comma-separated list. The various actions + * are as follows. * <ul> * <li><i>add</i>: Bring the schema up-to-date with the latest * changes to the schema XML data by adding tables, columns, @@ -1255,6 +1282,8 @@ * <code>file</code> option, or to stdout if no file is given.</li> * <li><i>dropDB</i>: Execute SQL to drop the current database. This * action implies <code>dropTables</code>.</li> + * <li><i>deleteTableContents</i>: Execute SQL to delete all rows from + * all tables that OpenJPA knows about.</li> * <li><i>import</i>: Import the given XML schema definition into the * current {@link SchemaFactory}.</li> * <li><i>export</i>: Export the current {@link SchemaFactory}'s recorded @@ -1269,6 +1298,9 @@ * <li>Drop the current database schema:<br /> * <code>java org.apache.openjpa.jdbc.schema.SchemaTool * -a dropDB</code></li> + * <li>Refresh the schema and delete all records in all tables:<br /> + * <code>java org.apache.openjpa.jdbc.schema.SchemaTool + * -a refresh,deleteTableContents</code></li> * <li>Create a schema based on an XML schema definition file:<br /> * <code>java org.apache.openjpa.jdbc.schema.SchemaTool * myschema.xml</code></li> @@ -1316,12 +1348,14 @@ flags.sequences = opts.removeBooleanProperty ("sequences", "sq", flags.sequences); flags.record = opts.removeBooleanProperty("record", "r", flags.record); - flags.action = opts.removeProperty("action", "a", flags.action); String fileName = opts.removeProperty("file", "f", null); String schemas = opts.removeProperty("s"); if (schemas != null) opts.setProperty("schemas", schemas); + String[] actions = opts.removeProperty("action", "a", flags.action) + .split(","); + // setup a configuration instance with cmd-line info Configurations.populateConfiguration(conf, opts); @@ -1330,7 +1364,13 @@ getClassLoader(SchemaTool.class, null); flags.writer = Files.getWriter(fileName, loader); - return run(conf, args, flags, loader); + boolean returnValue = true; + for (int i = 0; i < actions.length; i++) { + flags.action = actions[i]; + returnValue &= run(conf, args, flags, loader); + } + + return returnValue; } /** @@ -1370,7 +1410,8 @@ if (args.length == 0 && !ACTION_CREATEDB.equals(flags.action) && !ACTION_DROPDB.equals(flags.action) - && !ACTION_EXPORT.equals(flags.action)) + && !ACTION_EXPORT.equals(flags.action) + && !ACTION_DELETE_TABLE_CONTENTS.equals(flags.action)) return false; // parse in the arguments Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java?view=diff&rev=492024&r1=492023&r2=492024 ============================================================================== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/DBDictionary.java Tue Jan 2 18:44:57 2007 @@ -50,6 +50,7 @@ import java.util.Date; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -1742,9 +1743,8 @@ * cases where a subselect is required and the database doesn't support * subselects), this method should return null. */ - public SQLBuffer toDelete(ClassMapping mapping, Select sel, - JDBCStore store, Object[] params) { - return toBulkOperation(mapping, sel, store, params, null); + public SQLBuffer toDelete(ClassMapping mapping, Select sel, Object[] params) { + return toBulkOperation(mapping, sel, null, params, null); } public SQLBuffer toUpdate(ClassMapping mapping, Select sel, @@ -1893,6 +1893,47 @@ if (i.hasNext()) sql.append(", "); } + } + + /** + * Create SQL to delete the contents of the specified tables. + * The default implementation drops all non-deferred RESTRICT foreign key + * constraints involving the specified tables, issues DELETE statements + * against the tables, and then adds the dropped constraints back in. + * Databases with more optimal ways of deleting the contents of several + * tables should override this method. + */ + public String[] getDeleteTableContentsSQL(Table[] tables) { + Collection sql = new ArrayList(); + + // collect and drop non-deferred physical restrict constraints, and + // collect the DELETE FROM statements + Collection deleteSQL = new ArrayList(tables.length); + Collection restrictConstraints = new LinkedHashSet(); + for (int i = 0; i < tables.length; i++) { + ForeignKey[] fks = tables[i].getForeignKeys(); + for (int j = 0; j < fks.length; j++) { + if (!fks[j].isLogical() && !fks[j].isDeferred() + && fks[j].getDeleteAction() == ForeignKey.ACTION_RESTRICT) + restrictConstraints.add(fks[j]); + String[] constraintSQL = getDropForeignKeySQL(fks[j]); + sql.addAll(Arrays.asList(constraintSQL)); + } + + deleteSQL.add("DELETE FROM " + tables[i].getFullName()); + } + + // add the delete statements after all the constraint mutations + sql.addAll(deleteSQL); + + // add the deleted constraints back to the schema + for (Iterator iter = restrictConstraints.iterator(); iter.hasNext(); ) { + String[] constraintSQL = + getAddForeignKeySQL((ForeignKey) iter.next()); + sql.addAll(Arrays.asList(constraintSQL)); + } + + return (String[]) sql.toArray(new String[sql.size()]); } /** Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/schema/localizer.properties URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/schema/localizer.properties?view=diff&rev=492024&r1=492023&r2=492024 ============================================================================== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/schema/localizer.properties (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/schema/localizer.properties Tue Jan 2 18:44:57 2007 @@ -76,7 +76,7 @@ \t[-indexes/-ix <true/t | false/f>]\n\ \t[-record/-r <true/t | false/f>]\n\ \t[-action/-a <add | retain | drop | refresh | build | reflect\n\ - \t\t| createDB | dropDB | import | export>]\n\ + \t\t| createDB | dropDB | import | export | deleteTableContents>]\n\ \t<.schema file or resource>* sch-reflect: Reflecting on schemas "{0}". This process may take some time. \ Enable the org.apache.openjpa.jdbc.Schema logging category to see messages about the \ @@ -142,3 +142,5 @@ generating-foreign: Reading foreign keys for table "{1}" generating-sequences: Reading sequences for schema "{0}" no-custom-ds: use a custom DataSource +delete-table-contents: An error occurred while attempting to delete all \ + records from all mapped tables. \ No newline at end of file Modified: incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml?view=diff&rev=492024&r1=492023&r2=492024 ============================================================================== --- incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml (original) +++ incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml Tue Jan 2 18:44:57 2007 @@ -3626,7 +3626,8 @@ </itemizedlist> <para> The schema tool also accepts an <literal>-action</literal> or <literal>-a -</literal> flag. The available actions are: +</literal> flag. Multiple actions can be composed in a comma-separated list. +The available actions are: </para> <itemizedlist> <listitem> @@ -3701,6 +3702,12 @@ record of the schema. </para> </listitem> + <listitem> + <para> +<literal>deleteTableContents</literal>: Execute SQL to delete all rows from +all tables that OpenJPA knows about. + </para> + </listitem> </itemizedlist> <note> <para> @@ -3749,6 +3756,34 @@ </para> <programlisting> java org.apache.openjpa.jdbc.schema.SchemaTool -a createDB -f script.sql +</programlisting> + </example> + <example id="ref_guide_schema_schematool_table_cleanup"> + <title> + Table Cleanup + </title> + <indexterm zone="ref_guide_schema_schematool_table_cleanup"> + <primary> + schema + </primary> + <secondary> + refresh schema and delete all contents of all tables + </secondary> + </indexterm> + <indexterm zone="ref_guide_schema_schematool_table_cleanup"> + <primary> + testing + </primary> + <secondary> + refresh schema and delete all contents of all tables + </secondary> + </indexterm> + <para> +Refresh the schema and delete all contents of all tables that OpenJPA +knows about: + </para> +<programlisting> +java org.apache.openjpa.jdbc.schema.SchemaTool -a refresh,deleteTableContents </programlisting> </example> <example id="ref_guide_schema_schematool_drop"> Modified: incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_mapping.xml URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_mapping.xml?view=diff&rev=492024&r1=492023&r2=492024 ============================================================================== --- incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_mapping.xml (original) +++ incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_mapping.xml Tue Jan 2 18:44:57 2007 @@ -88,15 +88,16 @@ <itemizedlist> <listitem> <para> -<literal>-schemaAction/-sa &lt;add | refresh | drop | build | retain | none&gt; +<literal>-schemaAction/-sa &lt;add | refresh | drop | build | retain | reflect | createDB | dropDB | import | export | none&gt; </literal>: The action to take on the schema. These options correspond to the same-named actions on the schema tool described in -<xref linkend="ref_guide_schema_schematool"/>. Unless you are running the -mapping tool on all of your persistent types at once or dropping a mapping, we -strongly recommend you use the default <literal>add</literal> action or the -<literal>build</literal> action. Otherwise you may end up inadvertently dropping -schema components that are used by classes you are not currently running the -tool over. +<xref linkend="ref_guide_schema_schematool"/>. Actions can be composed in a +comma-separated list. Unless you are running the mapping tool on all of +your persistent types at once or dropping a mapping, we strongly +recommend you use the default <literal>add</literal> action or the +<literal>build</literal> action. Otherwise you may end up inadvertently +dropping schema components that are used by classes you are not +currently running the tool over. </para> </listitem> <listitem> @@ -277,6 +278,22 @@ To drop the schema for a persistent class, set the mapping tool's <literal> schemaAction</literal> to <literal>drop</literal>. </para> + <example id="ref_guide_mapping_mappingtool_cleanup_tables"> + <title> + Refreshing entire schema and cleaning out tables + </title> + <indexterm zone="ref_guide_mapping_mappingtool_cleanup_tables"> + <primary> + testing + </primary> + <secondary> + Rebuild mappings and clean tables + </secondary> + </indexterm> +<programlisting> +java org.apache.openjpa.jdbc.meta.MappingTool -sa add,deleteTableContents +</programlisting> + </example> <example id="ref_guide_mapping_mappingtool_dropschema"> <title> Dropping Mappings and Association Schema From open-jpa-commits-return-765nrice@example.net Wed Jan 03 03:11:52 2007 Return-Path: <open-jpa-commits-return-765nrice@example.net> Delivered-To: nrice@example.net Received: (qmail 77219 invoked from network); 3 Jan 2007 03:11:52 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 3 Jan 2007 03:11:52 -0000 Received: (qmail 62911 invoked by uid 500); 3 Jan 2007 03:11:58 -0000 Delivered-To: nrice@example.net Received: (qmail 62885 invoked by uid 500); 3 Jan 2007 03:11:58 -0000 Mailing-List: contact nrice@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:nrice@example.net> List-Unsubscribe: <mailto:nrice@example.net> List-Post: <mailto:nrice@example.net> List-Id: <open-jpa-commits.incubator.apache.org> Reply-To: nrice@example.net Delivered-To: mailing list nrice@example.net Received: (qmail 62876 invoked by uid 99); 3 Jan 2007 03:11:58 -0000 Received: from herse.apache.org (HELO herse.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 02 Jan 2007 19:11:58 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME 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; Tue, 02 Jan 2007 19:11:14 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id A204A1A981F; Tue, 2 Jan 2007 19:09:53 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r492035 - /incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml Date: Wed, 03 Jan 2007 03:09:53 -0000 To: nrice@example.net From: nrice@example.net X-Mailer: svnmailer-1.1.0 Message-Id: <nrice@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: pcl Date: Tue Jan 2 19:09:52 2007 New Revision: 492035 URL: http://svn.apache.org/viewvc?view=rev&rev=492035 Log: some docs about MySQL optimization Modified: incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml Modified: incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml?view=diff&rev=492035&r1=492034&r2=492035 ============================================================================== --- incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml (original) +++ incubator/openjpa/trunk/openjpa-project/src/doc/manual/ref_guide_dbsetup.xml Tue Jan 2 19:09:52 2007 @@ -2447,6 +2447,27 @@ false</literal>. </para> </listitem> + <listitem id="MySQLDictionary.OptimizeMultiTableDeletes"> + <para> + <indexterm> + <primary> + MySQL + </primary> + <secondary> + OptimizeMultiTableDeletes + </secondary> + </indexterm> +<literal>OptimizeMultiTableDeletes</literal>: MySQL as of version 4.0.0 +supports multiple tables in <literal>DELETE</literal> statements. When +this option is set, OpenJPA will use that syntax when doing bulk deletes +from multiple tables. This can happen when the +<literal>deleteTableContents</literal> <literal>SchemaTool</literal> +action is used. (See <xref linkend="ref_guide_schema_schematool"/> for +more info about <literal>deleteTableContents</literal>.) Defaults to +<literal>false</literal>, since the statement may fail if using InnoDB +tables and delete constraints. + </para> + </listitem> </itemizedlist> </section> <section id="ref_guide_dbsetup_dbsupport_oracle"> From open-jpa-commits-return-766nrice@example.net Wed Jan 03 03:37:05 2007 Return-Path: <open-jpa-commits-return-766nrice@example.net> Delivered-To: nrice@example.net Received: (qmail 80725 invoked from network); 3 Jan 2007 03:37:04 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 3 Jan 2007 03:37:04 -0000 Received: (qmail 77232 invoked by uid 500); 3 Jan 2007 03:37:11 -0000 Delivered-To: nrice@example.net Received: (qmail 77212 invoked by uid 500); 3 Jan 2007 03:37:11 -0000 Mailing-List: contact nrice@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:nrice@example.net> List-Unsubscribe: <mailto:nrice@example.net> List-Post: <mailto:nrice@example.net> List-Id: <open-jpa-commits.incubator.apache.org> Reply-To: nrice@example.net Delivered-To: mailing list nrice@example.net Received: (qmail 77203 invoked by uid 99); 3 Jan 2007 03:37:11 -0000 Received: from herse.apache.org (HELO herse.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 02 Jan 2007 19:37:11 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME 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; Tue, 02 Jan 2007 19:37:04 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id 269DC1A981D; Tue, 2 Jan 2007 19:02:46 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r492032 - /incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java Date: Wed, 03 Jan 2007 03:02:46 -0000 To: nrice@example.net From: nrice@example.net X-Mailer: svnmailer-1.1.0 Message-Id: <nrice@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: pcl Date: Tue Jan 2 19:02:45 2007 New Revision: 492032 URL: http://svn.apache.org/viewvc?view=rev&rev=492032 Log: deleteTableContents optimization for MySQL. This is disabled by default, as MySQL may fail if using InnoDB + delete constraints. Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java?view=diff&rev=492032&r1=492031&r2=492032 ============================================================================== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/MySQLDictionary.java Tue Jan 2 19:02:45 2007 @@ -50,6 +50,15 @@ */ public boolean driverDeserializesBlobs = true; + /** + * Whether to inline multi-table bulk-delete operations into MySQL's + * combined <code>DELETE FROM foo, bar, baz</code> syntax. + * Defaults to false, since this may fail in the presence of InnoDB tables + * with foreign keys. + * @see http://dev.mysql.com/doc/refman/5.0/en/delete.html + */ + public boolean optimizeMultiTableDeletes = false; + public MySQLDictionary() { platform = "MySQL"; validationSQL = "SELECT NOW()"; @@ -129,6 +138,22 @@ if (fk.getColumns().length > 1) return null; return super.getForeignKeyConstraintSQL(fk); + } + + public String[] getDeleteTableContentsSQL(Table[] tables) { + // mysql >= 4 supports more-optimal delete syntax + if (!optimizeMultiTableDeletes) + return super.getDeleteTableContentsSQL(tables); + else { + StringBuffer buf = new StringBuffer(tables.length * 8); + buf.append("DELETE FROM "); + for (int i = 0; i < tables.length; i++) { + buf.append(tables[i].getFullName()); + if (i < tables.length - 1) + buf.append(", "); + } + return new String[] { buf.toString() }; + } } protected void appendSelectRange(SQLBuffer buf, long start, long end) { From open-jpa-commits-return-767nrice@example.net Wed Jan 03 17:18:39 2007 Return-Path: <open-jpa-commits-return-767nrice@example.net> Delivered-To: nrice@example.net Received: (qmail 79910 invoked from network); 3 Jan 2007 17:18:38 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (83.161.120.155) by minotaur.apache.org with SMTP; 3 Jan 2007 17:18:38 -0000 Received: (qmail 75372 invoked by uid 500); 3 Jan 2007 17:18:45 -0000 Delivered-To: nrice@example.net Received: (qmail 75358 invoked by uid 500); 3 Jan 2007 17:18:45 -0000 Mailing-List: contact nrice@example.net; run by ezmlm Precedence: bulk List-Help: <mailto:nrice@example.net> List-Unsubscribe: <mailto:nrice@example.net> List-Post: <mailto:nrice@example.net> List-Id: <open-jpa-commits.incubator.apache.org> Reply-To: nrice@example.net Delivered-To: mailing list nrice@example.net Received: (qmail 75349 invoked by uid 99); 3 Jan 2007 17:18:44 -0000 Received: from herse.apache.org (HELO herse.apache.org) (83.161.120.155) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 03 Jan 2007 09:18:44 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME 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; Wed, 03 Jan 2007 09:18:37 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id 25A6E1A981A; Wed, 3 Jan 2007 09:17:40 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r492225 - in /incubator/openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/ openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/meta/ openjpa-persistence-jdb... Date: Wed, 03 Jan 2007 17:17:39 -0000 To: nrice@example.net From: nrice@example.net X-Mailer: svnmailer-1.1.0 Message-Id: <nrice@example.net> X-Virus-Checked: Checked by ClamAV on apache.org Author: ppoddar Date: Wed Jan 3 09:17:38 2007 New Revision: 492225 URL: http://svn.apache.org/viewvc?view=rev&rev=492225 Log: Adding @UniqueConstraint annotation. Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMappingInfo.java incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/SchemaTool.java incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/XMLSchemaParser.java incubator/openjpa/trunk/openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/meta/localizer.properties incubator/openjpa/trunk/openjpa-persistence-jdbc/src/main/java/org/apache/openjpa/persistence/jdbc/AnnotationPersistenceMappingParser.java Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java?view=diff&rev=492225&r1=492224&r2=492225 ============================================================================== --- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java (original) +++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/ClassMapping.java Wed Jan 3 09:17:38 2007 @@ -36,6 +36,8 @@ import org.apache.openjpa.jdbc.schema.ForeignKey; import org.apache.openjpa.jdbc.schema.Schemas; import org.apache.openjpa.jdbc.schema.Table; +import org.apache.openjpa.jdbc.schema.Unique; +import org.apache.openjpa.jdbc.schema.XMLSchemaParser; import org.apache.openjpa.jdbc.sql.Joins; import org.apache.openjpa.jdbc.sql.Result; import org.apache.openjpa.jdbc.sql.RowManager; @@ -791,6 +793,44 @@ _cols[i].setFlag(Column.FLAG_DIRECT_INSERT, true); if (io.isUpdatable(i, false)) _cols[i].setFlag(Column.FLAG_DIRECT_UPDATE, true); + } + } + mapUniqueConstraints(); + } + + /** + * Adds
{'source': 'Apache Software Foundation Public Mail Archives'}