blob: 2fcd926342c5655330eca972e5565e6d98cebabf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sling.servlets.post.impl.helper;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.request.RequestParameter;
import org.apache.sling.api.request.RequestParameterMap;
import org.apache.sling.servlets.post.NodeNameGenerator;
import org.apache.sling.servlets.post.SlingPostConstants;
/**
* Generates a node name based on a set of well-known request parameters
* like title, description, etc.
* See SLING-128.
*/
public class DefaultNodeNameGenerator implements NodeNameGenerator {
private final String[] parameterNames;
private final NodeNameFilter filter = new NodeNameFilter();
public static final int DEFAULT_MAX_NAME_LENGTH = 20;
private int maxLength = DEFAULT_MAX_NAME_LENGTH;
private int counter;
public DefaultNodeNameGenerator() {
this(null, -1);
}
public DefaultNodeNameGenerator(String[] parameterNames, int maxNameLength) {
if (parameterNames == null) {
this.parameterNames = new String[0];
} else {
this.parameterNames = parameterNames;
}
this.maxLength = (maxNameLength > 0)
? maxNameLength
: DEFAULT_MAX_NAME_LENGTH;
}
/**
* Get a "nice" node name, if possible, based on given request
*
* @param request the request
* @param basePath the base path
* @param requirePrefix <code>true</code> if the parameter names for
* properties requires a prefix
* @param defaultNodeNameGenerator a default generator
* @return a nice node name
*/
public String getNodeName(SlingHttpServletRequest request, String basePath,
boolean requirePrefix, NodeNameGenerator defaultNodeNameGenerator) {
RequestParameterMap parameters = request.getRequestParameterMap();
String valueToUse = null;
boolean doFilter = true;
// find the first request parameter that matches one of
// our parameterNames, in order, and has a value
if (parameters!=null) {
// we first check for the special sling parameters
RequestParameter specialParam = parameters.getValue(SlingPostConstants.RP_NODE_NAME);
if ( specialParam != null ) {
if ( specialParam.getString() != null && specialParam.getString().length() > 0 ) {
valueToUse = specialParam.getString();
doFilter = false;
}
}
if ( valueToUse == null ) {
specialParam = parameters.getValue(SlingPostConstants.RP_NODE_NAME_HINT);
if ( specialParam != null ) {
if ( specialParam.getString() != null && specialParam.getString().length() > 0 ) {
valueToUse = specialParam.getString();
}
}
}
if (valueToUse == null) {
for (String param : parameterNames) {
if (valueToUse != null) {
break;
}
if (requirePrefix) {
param = SlingPostConstants.ITEM_PREFIX_RELATIVE_CURRENT.concat(param);
}
final RequestParameter[] pp = parameters.get(param);
if (pp != null) {
for (RequestParameter p : pp) {
valueToUse = p.getString();
if (valueToUse != null && valueToUse.length() > 0) {
break;
}
valueToUse = null;
}
}
}
}
}
String result;
// should we filter?
if (valueToUse != null) {
if ( doFilter ) {
// filter value so that it works as a node name
result = filter.filter(valueToUse);
} else {
result = valueToUse;
}
} else {
// default value if none provided
result = nextCounter() + "_" + System.currentTimeMillis();
}
if ( doFilter ) {
// max length
if (result.length() > maxLength) {
result = result.substring(0,maxLength);
}
}
return result;
}
public synchronized int nextCounter() {
return ++counter;
}
}