// @TypeHint example
// <input type="text" name="./age" />
// <input type="hidden" name="./age@TypeHint" value="long" />
// causes the setProperty using the 'long' property type
if (propPath.endsWith(SlingPostConstants.TYPE_HINT_SUFFIX)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.TYPE_HINT_SUFFIX);
final RequestParameter[] rp = e.getValue();
if (rp.length > 0) {
prop.setTypeHintValue(rp[0].getString());
}
continue;
}
// @DefaultValue
if (propPath.endsWith(SlingPostConstants.DEFAULT_VALUE_SUFFIX)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.DEFAULT_VALUE_SUFFIX);
prop.setDefaultValues(e.getValue());
continue;
}
// SLING-130: VALUE_FROM_SUFFIX means take the value of this
// property from a different field
// @ValueFrom example:
// <input name="./Text@ValueFrom" type="hidden" value="fulltext" />
// causes the JCR Text property to be set to the value of the
// fulltext form field.
if (propPath.endsWith(SlingPostConstants.VALUE_FROM_SUFFIX)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.VALUE_FROM_SUFFIX);
// @ValueFrom params must have exactly one value, else ignored
if (e.getValue().length == 1) {
final String refName = e.getValue()[0].getString();
final RequestParameter[] refValues = request.getRequestParameters(refName);
if (refValues != null) {
prop.setValues(refValues);
}
}
continue;
}
// SLING-458: Allow Removal of properties prior to update
// @Delete example:
// <input name="./Text@Delete" type="hidden" />
// causes the JCR Text property to be deleted before update
if (propPath.endsWith(SlingPostConstants.SUFFIX_DELETE)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath, SlingPostConstants.SUFFIX_DELETE);
prop.setDelete(true);
continue;
}
// SLING-455: @MoveFrom means moving content to another location
// @MoveFrom example:
// <input name="./Text@MoveFrom" type="hidden" value="/tmp/path" />
// causes the JCR Text property to be set by moving the /tmp/path
// property to Text.
if (propPath.endsWith(SlingPostConstants.SUFFIX_MOVE_FROM)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.SUFFIX_MOVE_FROM);
// @MoveFrom params must have exactly one value, else ignored
if (e.getValue().length == 1) {
final String sourcePath = e.getValue()[0].getString();
prop.setRepositorySource(sourcePath, true);
}
continue;
}
// SLING-455: @CopyFrom means moving content to another location
// @CopyFrom example:
// <input name="./Text@CopyFrom" type="hidden" value="/tmp/path" />
// causes the JCR Text property to be set by copying the /tmp/path
// property to Text.
if (propPath.endsWith(SlingPostConstants.SUFFIX_COPY_FROM)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.SUFFIX_COPY_FROM);
// @MoveFrom params must have exactly one value, else ignored
if (e.getValue().length == 1) {
final String sourcePath = e.getValue()[0].getString();
prop.setRepositorySource(sourcePath, false);
}
continue;
}
// SLING-1412: @IgnoreBlanks
// @Ignore example:
// <input name="./Text" type="hidden" value="test" />
// <input name="./Text" type="hidden" value="" />
// <input name="./Text@String[]" type="hidden" value="true" />
// <input name="./Text@IgnoreBlanks" type="hidden" value="true" />
// causes the JCR Text property to be set by copying the /tmp/path
// property to Text.
if (propPath.endsWith(SlingPostConstants.SUFFIX_IGNORE_BLANKS)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.SUFFIX_IGNORE_BLANKS);
if (e.getValue().length == 1) {
prop.setIgnoreBlanks(true);
}
continue;
}
if (propPath.endsWith(SlingPostConstants.SUFFIX_USE_DEFAULT_WHEN_MISSING)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.SUFFIX_USE_DEFAULT_WHEN_MISSING);
if (e.getValue().length == 1) {
prop.setUseDefaultWhenMissing(true);
}
continue;
}
// @Patch
// Example:
// <input name="tags@TypeHint" value="String[]" type="hidden" />
// <input name="tags@Patch" value="true" type="hidden" />
// <input name="tags" value="+apple" type="hidden" />
// <input name="tags" value="-orange" type="hidden" />
if (propPath.endsWith(SlingPostConstants.SUFFIX_PATCH)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.SUFFIX_PATCH);
prop.setPatch(true);
continue;
}
if (propPath.endsWith(SlingPostConstants.SUFFIX_OFFSET)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.SUFFIX_OFFSET);
if (e.getValue().length == 1) {
Chunk chunk = prop.getChunk();
if(chunk == null){
chunk = new Chunk();
}
chunk.setOffsetValue(Long.parseLong(e.getValue()[0].toString()));
prop.setChunk(chunk);
}
continue;
}
if (propPath.endsWith(SlingPostConstants.SUFFIX_COMPLETED)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.SUFFIX_COMPLETED);
if (e.getValue().length == 1) {
Chunk chunk = prop.getChunk();
if(chunk == null){
chunk = new Chunk();
}
chunk.setCompleted(Boolean.parseBoolean((e.getValue()[0].toString())));
prop.setChunk(chunk);
}
continue;
}
if (propPath.endsWith(SlingPostConstants.SUFFIX_LENGTH)) {
final RequestProperty prop = getOrCreateRequestProperty(
reqProperties, propPath,
SlingPostConstants.SUFFIX_LENGTH);
if (e.getValue().length == 1) {
Chunk chunk = prop.getChunk();
if(chunk == null){
chunk = new Chunk();
}
chunk.setLength(Long.parseLong(e.getValue()[0].toString()));
prop.setChunk(chunk);
}
continue;
}
// plain property, create from values
final RequestProperty prop = getOrCreateRequestProperty(reqProperties,
propPath, null);
prop.setValues(e.getValue());
}
return reqProperties;
}