incubator-sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Sling Website: Manipulating Content - The SlingPostServlet (page edited)
Date Wed, 21 May 2008 09:39:00 GMT
<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/SLINGxSITE">SLINGxSITE</a> :
            <a href="http://cwiki.apache.org/confluence/display/SLINGxSITE/Manipulating+Content+-+The+SlingPostServlet">Manipulating Content - The SlingPostServlet</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/SLINGxSITE/Manipulating+Content+-+The+SlingPostServlet">Manipulating Content - The SlingPostServlet</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~fmeschbe">Felix Meschberger</a>
            <span class="smallfont">(May 21, 2008)</span>.
     </p>
    <p>
      Change summary:
      <div class="greybox wiki-content"><p>Starte expanding on content creation/update</p></div>
    </p>
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=85794&originalVersion=12&revisedVersion=13">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><h1><a name="ManipulatingContent-TheSlingPostServlet-ManipulatingContent%3ATheSlingPostServlet"></a>Manipulating Content: The SlingPostServlet</h1>

<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Work In Progress</b><br />
<p>This page is work in progress to explain how the SlingPostServlet works after the refactoring as per <span class="nobr"><a href="https://issues.apache.org/jira/browse/SLING-422" title="Visit page outside Confluence" rel="nofollow">SLING-422<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>.</p></td></tr></table>


<div>
<ul>
  <li><a href='#ManipulatingContent-TheSlingPostServlet-MultipleWaystoModifyContent'>Multiple Ways to Modify Content</a></li>
  <li><a href='#ManipulatingContent-TheSlingPostServlet-Quickstart%3ACreatingContent'>Quickstart: Creating Content</a></li>
  <li><a href='#ManipulatingContent-TheSlingPostServlet-SlingPostServletOperations'>SlingPostServlet Operations</a></li>
  <li><a href='#ManipulatingContent-TheSlingPostServlet-SpecialParameters'>Special Parameters</a></li>
</ul></div>



<h2><a name="ManipulatingContent-TheSlingPostServlet-MultipleWaystoModifyContent"></a>Multiple Ways to Modify Content</h2>

<p>As always in life there is more than one way to do it. So to modify content in a JCR repository underlying Sling, you have multiple options, two of which are WebDAV and the Sling default POST Servlet also called the <em>SlingPostServlet</em>. This page is about how you can modify - create, modify, copy, move, delete - content through the <em>SlingPostServlet</em>. In addition it also explains how to extend the SlingPostServlet with new operations.</p>


<p>What is Content anyway ? In the following discussion, I use the terms <em>Content</em> and <em>Item</em> interchangeably. With <em>Content</em> I just mean some data to be stored in the JCR repository to be later used as the basis for some presentation. In this sense <em>Content</em> is a rather conceptual term. <em>Item</em> is the name of the parent interface of the JCR <em>Node</em> and <em>Property</em> interfaces. When speaking of <em>Items</em> we mean some actual data stored in the repository ignoring whether the data is actually stored as a <em>Node</em> with child nodes and properties or just a single <em>Property</em>.</p>


<h2><a name="ManipulatingContent-TheSlingPostServlet-Quickstart%3ACreatingContent"></a>Quickstart: Creating Content</h2>

<p>To create content you simply send an HTTP request using the path of the node to store the content in and include the actual content as request parameters. So one possibility to do just that is by having an HTML Form like the following:</p>


<div class="code"><div class="codeContent">
<pre class="code-java">&lt;form method=<span class="code-quote">"POST"</span> action=<span class="code-quote">"http:<span class="code-comment">//host/some/<span class="code-keyword">new</span>/content"</span> &gt;
</span>   &lt;input type=<span class="code-quote">"text"</span> name=<span class="code-quote">"title"</span> value="" /&gt;
   &lt;input type=<span class="code-quote">"text"</span> name=<span class="code-quote">"text"</span> value="" /&gt;
&lt;/form&gt;</pre>
</div></div>


<p>This simple form will set the <tt>title</tt> and <tt>text</tt> properties on a node at <tt>/some/new/content</tt>. If this node does not exist it is just created otherwise the existing content would be modified.</p>

<p>Similarly you can do this using the <tt>curl</tt> command line tool:</p>

<div class="code"><div class="codeContent">
<pre class="code-java">$ curl -Ftitle=<span class="code-quote">"some title text"</span> -Ftext=<span class="code-quote">"some body text content"</span> http:<span class="code-comment">//host/some/<span class="code-keyword">new</span>/content</span></pre>
</div></div>


<p>You might want to use a specific JCR node type for a newly created node. This is possibly by simply setting a <tt>jcr:primaryType</tt> property on the request, e.g.</p>

<div class="code"><div class="codeContent">
<pre class="code-java">$ curl -F<span class="code-quote">"jcr:primaryType=nt:unstructured"</span> -Ftitle=<span class="code-quote">"some title text"</span> -Ftext=<span class="code-quote">"some body text content"</span> http:<span class="code-comment">//host/some/<span class="code-keyword">new</span>/content</span></pre>
</div></div>

<p>Similary you may assing JCR mixin node types using the <tt>jcr:mixinTypes</tt> property and a Sling resource type using the <tt>sling:resourceType</tt> property. For example:</p>

<div class="code"><div class="codeContent">
<pre class="code-java">$ curl -F<span class="code-quote">"sling:resourceType=sling:sample"</span> -Ftitle=<span class="code-quote">"some title text"</span> -Ftext=<span class="code-quote">"some body text content"</span> http:<span class="code-comment">//host/some/<span class="code-keyword">new</span>/content</span></pre>
</div></div>




<h2><a name="ManipulatingContent-TheSlingPostServlet-SlingPostServletOperations"></a>SlingPostServlet Operations</h2>


<p>The SlingPostServlet is actually just a frontend to the actual operations. To select the actual operation to execute, the <tt>:operation</tt> request parameter is used. Out of the box, the SlingPostServlet supports the following operations:</p>

<ul>
	<li>property not set or empty &#8211; Create new content or modify existing content</li>
	<li><tt>delete</tt> &#8211; Remove existing content</li>
	<li><tt>move</tt> &#8211; Move existing content to a new location</li>
	<li><tt>copy</tt> &#8211; Copy existing content to a new location</li>
</ul>


<p>All these operations always operate on the resource of the request as returned by <tt>SlingHttpServletRequest.getResource()</tt>. Some operations require additional parameters to be set to operate completely.</p>


<h3><a name="ManipulatingContent-TheSlingPostServlet-ContentCreationorModification"></a>Content Creation or Modification</h3>


<p>The simplest and most common use case, probably, is content creation and modification. We already saw an example above in the quickstart section. In this section we elaborate more on the concrete stuff.</p>

<p>First, the request URL indicates the actual repository node to be handled. If the URL addresses an existing node, the request parameters just provide values for the properties to be set on the existing node.</p>

<p>If the resource of the request is a synthetic resource, e.g. <tt>NonExistingResource</tt> or <tt>StarResource</tt>, a new item is created. The path (including name) of the item to be created is derived from the resource path:</p>

<ul>
	<li>If the resource path ends with a <tt>/*</tt> or <tt>/</tt> the name of the item is automatically created using a name creation algorithm taking into account various request parameters.</li>
	<li>Otherwise the resource path is used as the path and name of the new item.</li>
</ul>


<p>In both cases the path may still include selectors and extensions, which are cut off the path before finding out, what to do.</p>

<p>To illustrate this algorithm, lets look at some examples:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Resource Path </th>
<th class='confluenceTh'> Item path </th>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/new</tt> </td>
<td class='confluenceTd'> <tt>/content/new</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/new.html</tt> </td>
<td class='confluenceTd'> <tt>/content/new</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/new.print.a4.html</tt> </td>
<td class='confluenceTd'> <tt>/content/new</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/</tt> </td>
<td class='confluenceTd'> <tt>/content/xxx</tt> where <tt>xxx</tt> is a generated name </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/*</tt></td>
<td class='confluenceTd'> <tt>/content/xxx</tt> where <tt>xxx</tt> is a generated name </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/*.html</tt></td>
<td class='confluenceTd'> <tt>/content/xxx</tt> where <tt>xxx</tt> is a generated name </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/*.print.a4.html</tt></td>
<td class='confluenceTd'> <tt>/content/xxx</tt> where <tt>xxx</tt> is a generated name </td>
</tr>
</tbody></table>



<p>TBD: How parameters are used to define content to be stored. Should explain:</p>

<ul>
	<li>Special parameter suffixes:
	<ul>
		<li><tt>@DefaultValue</tt> &#8211; default value for properties</li>
		<li><tt>@TypeHint</tt> &#8211; hint for property types</li>
		<li><tt>@ValueFrom</tt> &#8211; property values taken from another parameter</li>
		<li><tt>@Delete</tt> &#8211; delete property before furhter processing</li>
		<li><tt>@MoveFrom</tt> &#8211; move repository item to designated item</li>
		<li><tt>@CopyFrom</tt> &#8211; copy repository item to designated item</li>
	</ul>
	</li>
	<li>Auto-creation of the node name</li>
</ul>



<h5><a name="ManipulatingContent-TheSlingPostServlet-SettingPropertyValues"></a>Setting Property Values</h5>

<p>Setting property values is as simple as just adding a request parameter whose name is the name of the property to be set and whose value is the value to be assigned to the property. We already saw how to do this in the quick start examples above.</p>

<p>Here is another example show a simple HTML form to create a new node with an automatically created name:</p>

<div class="code"><div class="codeContent">
<pre class="code-html"><span class="code-tag">&lt;form method=<span class="code-quote">"POST"</span> action=<span class="code-quote">"/content/page/first"</span>&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"text"</span> name=<span class="code-quote">"title"</span> /&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"text"</span> name=<span class="code-quote">"text"</span> /&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"Submit"</span> /&gt;</span>
<span class="code-tag">&lt;/form&gt;</span></pre>
</div></div>

<p>If this form is submitted with <em>title</em> and <em>This is some Text</em> as values for the <tt>title</tt> and <tt>text</tt> fields, resp., a new node is created at the path <tt>/content/page/first</tt> and the <tt>title</tt> and <tt>text</tt> properties set to the respective field values. If a node at <tt>/content/page/first</tt> already existed before submitting the form, the <tt>title</tt> and <tt>text</tt> properties are just updated to the new values from the form fields.</p>

<p>If a parameter has multiple values, the respective property will be created as a multi-value property. So for example the command line:</p>

<div class="code"><div class="codeContent">
<pre class="code-java">$ curl -Fmulti=one -Fmulti=two http:<span class="code-comment">//host/content/page</span></pre>
</div></div>

<p>Would assign the <tt>/content/page/multi</tt> property the value <em>[ "one", "two" ]</em>.</p>

<p>This is pretty much all there is to know about creating and modifying content. The following sections will now introduce more functionality which help you with more fine-grained control in your content management application.</p>


<h5><a name="ManipulatingContent-TheSlingPostServlet-FileUploads"></a>File Uploads</h5>

<p>TBD</p>


<h5><a name="ManipulatingContent-TheSlingPostServlet-OmittingSomeParameters"></a>Omitting Some Parameters</h5>

<p>There may be times, that you have forms which contain a lot of fields, which you do not want to actually store in content. Such forms usually are created using some client-side GUI library which uses the fields for its own purposes. To be able to easily differentiate between real content to be actually stored and such control parameters, you may prefix the names of the fields destined for content with a dot-slash (<tt>./</tt>).</p>

<p>As soon as the SlingPostServlet encounters parameters prefixed with dot-slash, only those parameters are considered for content updates while all other parameters not prefixed are just ignored. In addition to dot-slash prefixed parameters, also parameters prefixed with dot-dot-slash (<tt>../</tt>) and slash (<tt>/</tt>) are considered in this situation.</p>

<p>For example, the following form only uses the first two fields for content update and ignores the rest:</p>

<div class="code"><div class="codeContent">
<pre class="code-html"><span class="code-tag">&lt;form method=<span class="code-quote">"POST"</span> action=<span class="code-quote">"/content/page/first"</span>&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"text"</span> name=<span class="code-quote">"./title"</span> /&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"text"</span> name=<span class="code-quote">"../first/text"</span> /&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"hidden"</span> name=<span class="code-quote">"control0"</span> /&gt;</span><span class="code-tag"><span class="code-comment">&lt;!-- ignored --&gt;</span></span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"hidden"</span> name=<span class="code-quote">"control1"</span> /&gt;</span><span class="code-tag"><span class="code-comment">&lt;!-- ignored --&gt;</span></span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"Submit"</span> /&gt;</span>
<span class="code-tag">&lt;/form&gt;</span></pre>
</div></div>

<p>Because the SlingPostServlet encounters the <tt>./title</tt> parameter, only parameters prefixed with dot-slash, dot-dot-slash and slash are considered for content update. In this case this would <tt>./title</tt> and <tt>../first/text</tt> while <tt>control0</tt> and <tt>control1</tt> are not prefixed and thus ignored.</p>

<p>Background: The name of the parameters used for content update are actually intended to be relative path names of the properties to modify. So in effect using the field name <tt>text</tt> is equivalent to <tt>./text</tt> &#8211; dot-slash meaning relative to the current node identified by the <tt>action</tt> attribute value for <tt>form</tt> tag &#8211; or <tt>../first/text</tt> if <tt>first</tt> is the name of the node to modify &#8211; dot-dot-slash meaning relative to the parent node of the node identified by the <tt>action</tt> attribute value of the <tt>form</tt> tag.</p>

<p>Parameters whose name start with a colon (<tt>:</tt>) are always ignored by the SlingPostServlet with respect to content update. The reason is that the prefixing colon is intended as a marker for SlingPostServlet control parameters.</p>


<h5><a name="ManipulatingContent-TheSlingPostServlet-ControllingContentUpdateswith%7B%7B@%7D%7DSuffixes"></a>Controlling Content Updates with <tt>@</tt> Suffixes</h5>

<p>Generally just creating forms with parameters and their values suffices it completely. Sometimes, though, you want to have more control on how the parameter values are actually stored in the properties. For example, you want to set a property to a default value if the user did provide an actual value. Or you might want to store a parameter explicitly with a given data type, such as numeric, boolean etc.</p>

<p>The SlingPostServlet provides such property control in the form of <tt>@</tt> suffixed parameters, which are now presented.</p>

<p>The <tt>@</tt> suffixed parameters are not used on their own but always in conjunction with a plain parameter. The part of the parameter name before the <tt>@</tt> suffix is used in this case for correlation and must match exactly the name of the parameter to which the <tt>@</tt> suffixed parameter belongs.</p>

<p>For example, the parameter <tt>width@TypeHint</tt> applies to the <tt>width</tt> parameter and the <tt>./height@TypeHint</tt> parameter applies to the <tt>./height</tt> parameter. As can be seen, the correlation between the parameters is a simple case-sensitive string comparison. That is the <tt>widht@TypeHint</tt> parameter would not apply to the <tt>./width</tt> even though both parameters address the same property but they do not have a string match.</p>


<h6><a name="ManipulatingContent-TheSlingPostServlet-%7B%7B@TypeHint%7D%7D"></a><tt>@TypeHint</tt></h6>

<p>Parameters with the <tt>@TypeHint</tt> suffix may be used to force storing the named parameter in a property with the given type. The value of the <tt>@TypeHint</tt> parameter if applied to a parameter for a property is the JCR property type name. If the <tt>@TypeHint</tt> parameter is applied to a field upload parameter, the value is used to indicate the JCR primary node type for the node into which the uploaded file is stored.</p>

<p>Example: The following form sets the numeric <tt>width</tt> and the boolean <tt>checked</tt> properties:</p>

<div class="code"><div class="codeContent">
<pre class="code-html"><span class="code-tag">&lt;form method=<span class="code-quote">"POST"</span> action=<span class="code-quote">"/content/page/first"</span>&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"text"</span> name=<span class="code-quote">"width"</span> /&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"text"</span> name=<span class="code-quote">"width@TypeHint"</span> value=<span class="code-quote">"Long"</span> /&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"checkbox"</span> name=<span class="code-quote">"checked"</span> /&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"hidden"</span> name=<span class="code-quote">"checked@TypeHint"</span> value=<span class="code-quote">"Boolean"</span> /&gt;</span>
    <span class="code-tag">&lt;input type=<span class="code-quote">"Submit"</span> /&gt;</span>
<span class="code-tag">&lt;/form&gt;</span></pre>
</div></div>


<h6><a name="ManipulatingContent-TheSlingPostServlet-%7B%7B@DefaultValue%7D%7Ddefaultvalueforproperties"></a><tt>@DefaultValue</tt> &#8211; default value for properties</h6>
<h6><a name="ManipulatingContent-TheSlingPostServlet-%7B%7B@ValueFrom%7D%7Dpropertyvaluestakenfromanotherparameter"></a><tt>@ValueFrom</tt> &#8211; property values taken from another parameter</h6>
<h6><a name="ManipulatingContent-TheSlingPostServlet-%7B%7B@Delete%7D%7Ddeletepropertybeforefurhterprocessing"></a><tt>@Delete</tt> &#8211; delete property before furhter processing</h6>
<h6><a name="ManipulatingContent-TheSlingPostServlet-%7B%7B@MoveFrom%7D%7Dmoverepositoryitemtodesignateditem"></a><tt>@MoveFrom</tt> &#8211; move repository item to designated item</h6>
<h6><a name="ManipulatingContent-TheSlingPostServlet-%7B%7B@CopyFrom%7D%7Dcopyrepositoryitemtodesignateditem"></a><tt>@CopyFrom</tt> &#8211; copy repository item to designated item</h6>


<h5><a name="ManipulatingContent-TheSlingPostServlet-ResponseStatus"></a>Response Status</h5>

<p>The modification operation has the following status responses:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Status </th>
<th class='confluenceTh'> Explanation </th>
</tr>
<tr>
<td class='confluenceTd'> 200/OK </td>
<td class='confluenceTd'> An existing node has been updated with content </td>
</tr>
<tr>
<td class='confluenceTd'> 201/CREATED </td>
<td class='confluenceTd'> A new node has been created and filled with content </td>
</tr>
<tr>
<td class='confluenceTd'> 500/INTERNAL SERVER ERROR </td>
<td class='confluenceTd'> Some exception, for example a <tt>RepositoryException</tt>, occurred while processing the request </td>
</tr>
</tbody></table>


<h3><a name="ManipulatingContent-TheSlingPostServlet-ContentRemoval"></a>Content Removal</h3>

<p>To remove existing content just address the item to be removed and set the <tt>:operation</tt> parameter to <tt>delete</tt>. For example the following command line removes the <tt>/content/sample</tt> page:</p>

<div class="code"><div class="codeContent">
<pre class="code-java">$ curl -F<span class="code-quote">":operation=delete"</span> http:<span class="code-comment">//host/content/sample</span></pre>
</div></div>


<h5><a name="ManipulatingContent-TheSlingPostServlet-ResponseStatus"></a>Response Status</h5>

<p>The delete operation has the following status responses:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Status </th>
<th class='confluenceTh'> Explanation </th>
</tr>
<tr>
<td class='confluenceTd'> 200/OK </td>
<td class='confluenceTd'> The resource (and all its descendents) has been removed </td>
</tr>
<tr>
<td class='confluenceTd'> 404/NOT FOUND </td>
<td class='confluenceTd'> The request URL does not address an existing repository item </td>
</tr>
<tr>
<td class='confluenceTd'> 500/INTERNAL SERVER ERROR </td>
<td class='confluenceTd'> Some exception, for example a <tt>RepositoryException</tt>, occurred while processing the request </td>
</tr>
</tbody></table>



<h5><a name="ManipulatingContent-TheSlingPostServlet-DeletingMultipleItems"></a>Deleting Multiple Items</h5>

<p>By using the <tt>:applyTo</tt> request parameter it is possible to remove multiple items in one single request. Deleting items in this way leaves you with less control, though. In addition, if a single item removal fails, no item at all is removed.</p>

<p>When specifying the item(s) to be removed with the <tt>:applyTo</tt> parameter, the request resource is left untouched (unless of course if listed in the <tt>:applyTo</tt> parameter) and only used to resolve any relative paths in the <tt>:applyTo</tt> parameter.</p>

<p>To for example remove the <tt>/content/page1</tt> and <tt>/content/page2</tt> nodes, you might use the following command line:</p>

<div class="code"><div class="codeContent">
<pre class="code-java">curl -F<span class="code-quote">":operation=delete"</span> -F<span class="code-quote">":applyTo=/content/page1"</span> -F<span class="code-quote">":applyTo=/content/page2"</span> http:<span class="code-comment">//host/content/sample</span></pre>
</div></div>

<p>If any resource listed in the <tt>:applyTo</tt> parameter does not exist, it is silently ignored.</p>

<h6><a name="ManipulatingContent-TheSlingPostServlet-ResponseStatus"></a>Response Status</h6>

<p>The delete operation applied to multiple resources has the following status responses:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Status </th>
<th class='confluenceTh'> Explanation </th>
</tr>
<tr>
<td class='confluenceTd'> 200/OK </td>
<td class='confluenceTd'> All requested and existing resources have been removed </td>
</tr>
<tr>
<td class='confluenceTd'> 500/INTERNAL SERVER ERROR </td>
<td class='confluenceTd'> Some exception, for example a <tt>RepositoryException</tt>, occurred while processing the request </td>
</tr>
</tbody></table>



<h3><a name="ManipulatingContent-TheSlingPostServlet-CopyingContent"></a>Copying Content</h3>


<p>To copy existing content to a new location, the <tt>copy</tt> operation is specified. This operation copies the item addressed by the request URL to a new location indicated by the <tt>:dest</tt> parameter. The <tt>:dest</tt> parameter is the absolute or relative path to which the resource is copied. If the path is relative it is assumed to be below the same parent as the request resource. If it is terminated with a <tt>/</tt> character the request resource is copied to an item of the same name under the destination path.</p>

<p>To illustrate the <tt>:dest</tt> parameter handling, lets look at a few examples. All examples are based on addressing the <tt>/content/sample</tt> item:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> <tt>:dest</tt> Parameter </th>
<th class='confluenceTh'> Destination Absolute Path </th>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/newSample</tt> </td>
<td class='confluenceTd'> <tt>/content/newSample</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>different/newSample</tt> </td>
<td class='confluenceTd'> <tt>/content/different/newSample</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/different/</tt> </td>
<td class='confluenceTd'> <tt>/content/different/sample</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>different/</tt> </td>
<td class='confluenceTd'> <tt>/content/different/sample</tt> </td>
</tr>
</tbody></table>


<p>If an item already exists at the location derived from the <tt>:dest</tt> parameter, the copy operation fails unless the <tt>:replace</tt> parameter is set to <tt>true</tt> (case is ignored when checking the parameter value).</p>



<h5><a name="ManipulatingContent-TheSlingPostServlet-ResponseStatus"></a>Response Status</h5>

<p>The copy operation has the following status responses:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Status </th>
<th class='confluenceTh'> Explanation </th>
</tr>
<tr>
<td class='confluenceTd'> 200/OK </td>
<td class='confluenceTd'> The node has been copied to the new location replacing an existing item at the destination </td>
</tr>
<tr>
<td class='confluenceTd'> 201/CREATED </td>
<td class='confluenceTd'> The node has been copied to the new location creating a new item at the destination </td>
</tr>
<tr>
<td class='confluenceTd'> 412/PRECONDITION FAILED </td>
<td class='confluenceTd'> An item already exists at the destination and the <tt>:replace</tt> parameter is not set to <tt>true</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> 500/INTERNAL SERVER ERROR </td>
<td class='confluenceTd'> Some exception, for example a <tt>RepositoryException</tt>, occurred while processing the request </td>
</tr>
</tbody></table>



<h5><a name="ManipulatingContent-TheSlingPostServlet-CopyingMultipleItems"></a>Copying Multiple Items</h5>

<p>By using the <tt>:applyTo</tt> request parameter it is possible to copy multiple items in one single request. Copying items in this way leaves you with less control, though. In addition, if a single item copy fails, no item at all is copied.</p>

<p>When specifying the item(s) to be copied with the <tt>:applyTo</tt> parameter, the request resource is left untouched (unless of course if listed in the <tt>:applyTo</tt> parameter) and only used to resolve any relative paths in the <tt>:applyTo</tt> parameter.</p>

<p>To for example copy the <tt>/content/page1</tt> and <tt>/content/page2</tt> nodes to <tt>/content/target</tt>, you might use the following command line:</p>

<div class="code"><div class="codeContent">
<pre class="code-java">curl -F<span class="code-quote">":operation=copy"</span> -F<span class="code-quote">":applyTo=/content/page1"</span> -F<span class="code-quote">":applyTo=/content/page2"</span> -F<span class="code-quote">":dest=/content/target/"</span> http:<span class="code-comment">//host/content/sample</span></pre>
</div></div>

<p>Please note the trailing slash character (<tt>/</tt>) in the value of the <tt>:dest</tt> parameter. This is required for mult-item copy operations using the <tt>:applyTo</tt> parameter. The copied items are created below the node indicated by the <tt>:dest</tt>.</p>

<p>If any resource listed in the <tt>:applyTo</tt> parameter does not exist, it is silently ignored. Any item already existing at the copy destination whose name is the same as the name of an item to be copied is silently overwritten with the source item.</p>

<h6><a name="ManipulatingContent-TheSlingPostServlet-ResponseStatus"></a>Response Status</h6>

<p>The copy operation applied to multiple resources has the following status responses:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Status </th>
<th class='confluenceTh'> Explanation </th>
</tr>
<tr>
<td class='confluenceTd'> 200/OK </td>
<td class='confluenceTd'> All requested and existing resources have been copied </td>
</tr>
<tr>
<td class='confluenceTd'> 412/PRECONDITION FAILED </td>
<td class='confluenceTd'> The node indicated by the <tt>:dest</tt> parameter does not exist </td>
</tr>
<tr>
<td class='confluenceTd'> 500/INTERNAL SERVER ERROR </td>
<td class='confluenceTd'> Some exception, for example a <tt>RepositoryException</tt>, occurred while processing the request. This status is also set if the <tt>:dest</tt> parameter value does not have a trailing slash character. </td>
</tr>
</tbody></table>




<h3><a name="ManipulatingContent-TheSlingPostServlet-MovingContent"></a>Moving Content</h3>


<p>To move existing content to a new location, the <tt>move</tt> operation is specified. This operation moves the item addressed by the request URL to a new location indicated by the <tt>:dest</tt> parameter. The <tt>:dest</tt> parameter is the absolute or relative path to which the resource is moved. If the path is relative it is assumed to be below the same parent as the request resource. If it is terminated with a <tt>/</tt> character the request resource is moved to an item of the same name under the destination path.</p>

<p>To illustrate the <tt>:dest</tt> parameter handling, lets look at a few examples. All examples are based on addressing the <tt>/content/sample</tt> item:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> <tt>:dest</tt> Parameter </th>
<th class='confluenceTh'> Destination Absolute Path </th>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/newSample</tt> </td>
<td class='confluenceTd'> <tt>/content/newSample</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>different/newSample</tt> </td>
<td class='confluenceTd'> <tt>/content/different/newSample</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>/content/different/</tt> </td>
<td class='confluenceTd'> <tt>/content/different/sample</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>different/</tt> </td>
<td class='confluenceTd'> <tt>/content/different/sample</tt> </td>
</tr>
</tbody></table>


<p>If an item already exists at the location derived from the <tt>:dest</tt> parameter, the move operation fails unless the <tt>:replace</tt> parameter is set to <tt>true</tt> (case is ignored when checking the parameter value).</p>



<h5><a name="ManipulatingContent-TheSlingPostServlet-ResponseStatus"></a>Response Status</h5>

<p>The move operation has the following status responses:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Status </th>
<th class='confluenceTh'> Explanation </th>
</tr>
<tr>
<td class='confluenceTd'> 200/OK </td>
<td class='confluenceTd'> The node has been moved to the new location replacing an existing item at the destination </td>
</tr>
<tr>
<td class='confluenceTd'> 201/CREATED </td>
<td class='confluenceTd'> The node has been moved to the new location creating a new item at the destination </td>
</tr>
<tr>
<td class='confluenceTd'> 412/PRECONDITION FAILED </td>
<td class='confluenceTd'> An item already exists at the destination and the <tt>:replace</tt> parameter is not set to <tt>true</tt> </td>
</tr>
<tr>
<td class='confluenceTd'> 500/INTERNAL SERVER ERROR </td>
<td class='confluenceTd'> Some exception, for example a <tt>RepositoryException</tt>, occurred while processing the request </td>
</tr>
</tbody></table>



<h5><a name="ManipulatingContent-TheSlingPostServlet-MovingMultipleItems"></a>Moving Multiple Items</h5>

<p>By using the <tt>:applyTo</tt> request parameter it is possible to move multiple items in one single request. Moving items in this way leaves you with less control, though. In addition, if a single item move fails, no item at all is moved.</p>

<p>When specifying the item(s) to be moved with the <tt>:applyTo</tt> parameter, the request resource is left untouched (unless of course if listed in the <tt>:applyTo</tt> parameter) and only used to resolve any relative paths in the <tt>:applyTo</tt> parameter.</p>

<p>To for example move the <tt>/content/page1</tt> and <tt>/content/page2</tt> nodes to <tt>/content/target</tt>, you might use the following command line:</p>

<div class="code"><div class="codeContent">
<pre class="code-java">curl -F<span class="code-quote">":operation=move"</span> -F<span class="code-quote">":applyTo=/content/page1"</span> -F<span class="code-quote">":applyTo=/content/page2"</span> -F<span class="code-quote">":dest=/content/target/"</span> http:<span class="code-comment">//host/content/sample</span></pre>
</div></div>

<p>Please note the trailing slash character (<tt>/</tt>) in the value of the <tt>:dest</tt> parameter. This is required for mult-item move operations using the <tt>:applyTo</tt> parameter. The moved items are created below the node indicated by the <tt>:dest</tt>.</p>

<p>If any resource listed in the <tt>:applyTo</tt> parameter does not exist, it is silently ignored. Any item already existing at the move destination whose name is the same as the name of an item to be moved is silently overwritten with the source item.</p>

<h6><a name="ManipulatingContent-TheSlingPostServlet-ResponseStatus"></a>Response Status</h6>

<p>The move operation applied to multiple resources has the following status responses:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Status </th>
<th class='confluenceTh'> Explanation </th>
</tr>
<tr>
<td class='confluenceTd'> 200/OK </td>
<td class='confluenceTd'> All requested and existing resources have been moved </td>
</tr>
<tr>
<td class='confluenceTd'> 412/PRECONDITION FAILED </td>
<td class='confluenceTd'> The node indicated by the <tt>:dest</tt> parameter does not exist </td>
</tr>
<tr>
<td class='confluenceTd'> 500/INTERNAL SERVER ERROR </td>
<td class='confluenceTd'> Some exception, for example a <tt>RepositoryException</tt>, occurred while processing the request. This status is also set if the <tt>:dest</tt> parameter value does not have a trailing slash character. </td>
</tr>
</tbody></table>



<h2><a name="ManipulatingContent-TheSlingPostServlet-SpecialParameters"></a>Special Parameters</h2>


<p>Some parameters have special significance for the complete processing of the SlingPostServlet or are used by multiple operations. This section summarizes these parameters:</p>


<h3><a name="ManipulatingContent-TheSlingPostServlet-%7B%7B%3Aorder%7D%7D"></a><tt>:order</tt></h3>

<p>Child nodes may be ordered if the primary node type of their common parent node is defined as having orderable child nodes. To employ such ordering, the content creation/modification, move and copy operations support the <tt>:order</tt> parameter which apply child node ordering amongst its sibblings of the target node.</p>

<p>The <tt>:order</tt> parameter may have the following values:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Value </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> <tt>first</tt> </td>
<td class='confluenceTd'> Place the target node as the first amongst its sibblings </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>last</tt> </td>
<td class='confluenceTd'> Place the target node as the last amongst its sibblings </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>before <em>xyz</em></tt> </td>
<td class='confluenceTd'> Place the target node immediately before the sibbling whose name is <em>xyz</em> </td>
</tr>
<tr>
<td class='confluenceTd'> <tt>after <em>xyz</em></tt> </td>
<td class='confluenceTd'> Place the target node immediately after the sibbling whose name is <em>xyz</em> </td>
</tr>
<tr>
<td class='confluenceTd'> numeric </td>
<td class='confluenceTd'> Place the target node at the indicated numeric place amongst its sibblings where <em>0</em> is equivalent to <tt>first</tt> and <em>1</em> means the second place </td>
</tr>
</tbody></table>


<h3><a name="ManipulatingContent-TheSlingPostServlet-%7B%7B%3Aredirect%7D%7D"></a><tt>:redirect</tt></h3>

<p>Instructs the SlingPostServlet to redirect the client to the indicated location if the operation succeeds. That is the reponse status is set to <em>302/FOUND</em> and the <tt>Location</tt> header is set to the value of the <tt>:redirect</tt> parameter.</p>


<h3><a name="ManipulatingContent-TheSlingPostServlet-%7B%7B%3Astatus%7D%7D"></a><tt>:status</tt></h3>

<p>By default the SlingPostServlet sets response status according to the status of the operation executed. In some cases, it may be desirable to not have the real status codes (e.g. 404 or 505) but a normal <em>200/OK</em> to trick the client browser into displaying the response content generated by the SlingPostServlet.</p>

<p>To not send the actual response status back to the client, the <tt>:status</tt> request parameter should be set to <tt>browser</tt>. If this parameter is not set, is empty, is set to <tt>standard</tt> or to any other value, the actual status code is sent back to the client.</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>


Mime
View raw message