Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * 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.jackrabbit.usermanager.impl.post;
 
 import java.util.List;
 import java.util.Map;
 
 
 import  org.osgi.service.component.ComponentContext;

Base class for all the POST servlets for the UserManager operations
 
 public abstract class AbstractAuthorizablePostServlet extends
         AbstractPostServlet {
     private static final long serialVersionUID = -5918670409789895333L;
 
     public static final String PROP_DATE_FORMAT = "servlet.post.dateFormats";
 
     private DateParser dateParser;
 
     // ---------- SCR Integration ----------------------------------------------
 
     protected void activate(ComponentContext context) {
         Dictionary<?, ?> props = context.getProperties();
 
          = new DateParser();
         String[] dateFormats = OsgiUtil.toStringArray(props.get());
         for (String dateFormat : dateFormats) {
             .register(dateFormat);
         }
     }
 
     protected void deactivate(ComponentContext context) {
          = null;
     }
 
     // ------ The methods below are based on the private methods from the
     // ModifyOperation class -----
 
    
Collects the properties that form the content to be written back to the repository. NOTE: In the returned map, the key is the property name not a path.

Throws:
RepositoryException if a repository error occurs
ServletException if an internal error occurs
 
     protected Map<StringRequestPropertycollectContent(
             Map<String, ?> properties,
             String authorizablePath) {
 
         boolean requireItemPrefix = requireItemPathPrefix(properties);
 
         // walk the request parameters and collect the properties
         Map<StringRequestPropertyreqProperties = new HashMap<StringRequestProperty>();
         for (Map.Entry<String, ?> e : properties.entrySet()) {
             final String paramName = e.getKey();
 
             // do not store parameters with names starting with sling:post
             if (paramName.startsWith(.)) {
                 continue;
             }
            // SLING-298: skip form encoding parameter
            if (paramName.equals("_charset_")) {
                continue;
            }
            // skip parameters that do not start with the save prefix
            if (requireItemPrefix && !hasItemPathPrefix(paramName)) {
                continue;
            }
            // ensure the paramName is an absolute property name
            String propPath;
            if (paramName.startsWith("./")) {
                propPath = paramName.substring(2);
            } else {
                propPath = paramName;
            }
            if (propPath.indexOf('/') != -1) {
                // only one path segment is valid here, so this paramter can't
                // be used.
                continue// skip it.
            }
            propPath = authorizablePath + "/" + propPath;
            // @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(.)) {
                RequestProperty prop = getOrCreateRequestProperty(
                    reqPropertiespropPath,
                    .);
                String typeHintValue = convertToString(e.getValue());
                if (typeHintValue != null) {
                    prop.setTypeHintValue(typeHintValue);
                }
                continue;
            }
            // @DefaultValue
            if (propPath.endsWith(.)) {
                RequestProperty prop = getOrCreateRequestProperty(
                    reqPropertiespropPath,
                    .);
                prop.setDefaultValues(convertToRequestParameterArray(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(.)) {
                RequestProperty prop = getOrCreateRequestProperty(
                    reqPropertiespropPath,
                    .);
                // @ValueFrom params must have exactly one value, else ignored
                String [] valueFrom = convertToStringArray(e.getValue());
                if (valueFrom.length == 1) {
                    String refName = valueFrom[0];
                    RequestParameter[] refValues = convertToRequestParameterArray(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(.)) {
                RequestProperty prop = getOrCreateRequestProperty(
                    reqPropertiespropPath.);
                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(.)) {
                // don't support @MoveFrom here
                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(.)) {
                // don't support @CopyFrom here
                continue;
            }
            // plain property, create from values
            RequestProperty prop = getOrCreateRequestProperty(reqProperties,
                propPathnull);
            prop.setValues(convertToRequestParameterArray(e.getValue()));
        }
        return reqProperties;
    }

    
Returns the request property for the given property path. If such a request property does not exist yet it is created and stored in the props.

Parameters:
props The map of already seen request properties.
paramPath The absolute path of the property including the suffix to be looked up.
suffix The (optional) suffix to remove from the paramName before looking it up.
Returns:
The RequestProperty for the paramName.
            Map<StringRequestPropertypropsString paramPathString suffix) {
        if (suffix != null && paramPath.endsWith(suffix)) {
            paramPath = paramPath.substring(0, paramPath.length()
                - suffix.length());
        }
        RequestProperty prop = props.get(paramPath);
        if (prop == null) {
            prop = new RequestProperty(paramPath);
            props.put(paramPathprop);
        }
        return prop;
    }

    
Removes all properties listed as RequestProperty.isDelete() from the authorizable.

Parameters:
authorizable The org.apache.jackrabbit.api.security.user.Authorizable that should have properties deleted.
reqProperties The map of request properties to check for properties to be removed.
changes The List to be updated with information on deleted properties.
Throws:
RepositoryException Is thrown if an error occurrs checking or removing properties.
    protected void processDeletes(Authorizable authorizable,
            Map<StringRequestPropertyreqProperties,
            List<Modificationchangesthrows RepositoryException {
        for (RequestProperty property : reqProperties.values()) {
            if (property.isDelete()) {
                if (authorizable.hasProperty(property.getName())) {
                    authorizable.removeProperty(property.getName());
                    changes.add(Modification.onDeleted(property.getPath()));
                }
            }
        }
    }

    
Writes back the content

Throws:
RepositoryException if a repository error occurs
ServletException if an internal error occurs
    protected void writeContent(Session sessionAuthorizable authorizable,
            Map<StringRequestPropertyreqProperties,
            List<Modificationchangesthrows RepositoryException {
        for (RequestProperty prop : reqProperties.values()) {
            if (prop.hasValues()) {
                // skip jcr special properties
                if (prop.getName().equals("jcr:primaryType")
                    || prop.getName().equals("jcr:mixinTypes")) {
                    continue;
                }
                if (authorizable.isGroup()) {
                    if (prop.getName().equals("groupId")) {
                        // skip these
                        continue;
                    }
                } else {
                    if (prop.getName().equals("userId")
                        || prop.getName().equals("pwd")
                        || prop.getName().equals("pwdConfirm")) {
                        // skip these
                        continue;
                    }
                }
                if (prop.isFileUpload()) {
                    // don't handle files for user properties for now.
                    continue;
                    // uploadHandler.setFile(parent, prop, changes);
                } else {
                    setPropertyAsIs(sessionauthorizablepropchanges);
                }
            }
        }
    }

    
set property without processing, except for type hints

Parameters:
parent the parent node
prop the request property
Throws:
RepositoryException if a repository error occurs.
    private void setPropertyAsIs(Session sessionAuthorizable parent,
            RequestProperty propList<Modificationchanges)
            throws RepositoryException {
        String parentPath;
        if (parent.isGroup()) {
                + parent.getID();
        } else {
                + parent.getID();
        }
        // no explicit typehint
        int type = .;
        if (prop.getTypeHint() != null) {
            try {
                type = PropertyType.valueFromName(prop.getTypeHint());
            } catch (Exception e) {
                // ignore
            }
        }
        String[] values = prop.getStringValues();
        if (values == null) {
            // remove property
            boolean removedProp = removePropertyIfExists(parentprop.getName());
            if (removedProp) {
                changes.add(Modification.onDeleted(parentPath + "/"
                    + prop.getName()));
            }
        } else if (values.length == 0) {
            // do not create new prop here, but clear existing
            if (parent.hasProperty(prop.getName())) {
                Value val = session.getValueFactory().createValue("");
                parent.setProperty(prop.getName(), val);
                changes.add(Modification.onModified(parentPath + "/"
                    + prop.getName()));
            }
        } else if (values.length == 1) {
            boolean removedProp = removePropertyIfExists(parentprop.getName());
            // if the provided value is the empty string, we don't have to do
            // anything.
            if (values[0].length() == 0) {
                if (removedProp) {
                    changes.add(Modification.onDeleted(parentPath + "/"
                        + prop.getName()));
                }
            } else {
                // modify property
                if (type == .) {
                    // try conversion
                    Calendar c = .parse(values[0]);
                    if (c != null) {
                        if (prop.hasMultiValueTypeHint()) {
                            final Value[] array = new Value[1];
                            array[0] = session.getValueFactory().createValue(c);
                            parent.setProperty(prop.getName(), array);
                            changes.add(Modification.onModified(parentPath
                                + "/" + prop.getName()));
                        } else {
                            Value cVal = session.getValueFactory().createValue(
                                c);
                            parent.setProperty(prop.getName(), cVal);
                            changes.add(Modification.onModified(parentPath
                                + "/" + prop.getName()));
                        }
                        return;
                    }
                    // fall back to default behaviour
                }
                if (type == .) {
                    Value val = session.getValueFactory().createValue(
                        values[0], .);
                    parent.setProperty(prop.getName(), val);
                } else {
                    if (prop.hasMultiValueTypeHint()) {
                        final Value[] array = new Value[1];
                        array[0] = session.getValueFactory().createValue(
                            values[0], type);
                        parent.setProperty(prop.getName(), array);
                    } else {
                        Value val = session.getValueFactory().createValue(
                            values[0], type);
                        parent.setProperty(prop.getName(), val);
                    }
                }
                changes.add(Modification.onModified(parentPath + "/"
                    + prop.getName()));
            }
        } else {
            removePropertyIfExists(parentprop.getName());
            if (type == .) {
                // try conversion
                ValueFactory valFac = session.getValueFactory();
                Value[] c = .parse(valuesvalFac);
                if (c != null) {
                    parent.setProperty(prop.getName(), c);
                    changes.add(Modification.onModified(parentPath + "/"
                        + prop.getName()));
                    return;
                }
                // fall back to default behaviour
            }
            Value[] vals = new Value[values.length];
            if (type == .) {
                for (int i = 0; i < values.lengthi++) {
                    vals[i] = session.getValueFactory().createValue(values[i]);
                }
            } else {
                for (int i = 0; i < values.lengthi++) {
                    vals[i] = session.getValueFactory().createValue(values[i],
                        type);
                }
            }
            parent.setProperty(prop.getName(), vals);
            changes.add(Modification.onModified(parentPath + "/"
                + prop.getName()));
        }
    }

    
Removes the property with the given name from the authorizable if it exists.

Parameters:
authorizable the org.apache.jackrabbit.api.security.user.Authorizable that should have properties deleted.
name the name of the property to remove
Returns:
path of the property that was removed or null if it was not removed
Throws:
RepositoryException if a repository error occurs.
    private boolean removePropertyIfExists(Authorizable authorizableString name)
            throws RepositoryException {
        if (authorizable.getProperty(name) != null) {
            authorizable.removeProperty(name);
            return true;
        }
        return false;
    }
    // ------ These methods were copied from AbstractSlingPostOperation ------

    
Returns true if the name starts with either of the prefixes ./, ../ and /.
    protected boolean hasItemPathPrefix(String name) {
    }

    
Returns true if any of the request parameters starts with ./. In this case only parameters starting with either of the prefixes ./, ../ and / are considered as providing content to be stored. Otherwise all parameters not starting with the command prefix : are considered as parameters to be stored.
    protected final boolean requireItemPathPrefix(
            Map<String, ?> properties) {
        boolean requirePrefix = false;
        Iterator<Stringiterator = properties.keySet().iterator();
        while (iterator.hasNext() && !requirePrefix) {
            String name = iterator.next();
            requirePrefix = name.startsWith(.);
        }
        return requirePrefix;
    }
    protected String convertToString(Object obj) {
        if (obj == null) {
            return null;
        }
        if (obj instanceof String) {
            return (String)obj;
        } else if (obj instanceof String[]) {
            String [] values = (String[])obj;
            if (values.length > 0) {
                return values[0];
            }
            return null;
        } else if (obj instanceof RequestParameter) {
            ((RequestParameter)obj).getString();
        } else if (obj instanceof RequestParameter[]) {
            RequestParameter[] values = (RequestParameter[])obj;
            if (values.length > 0) {
                return values[0].getString();
            }
            return null;
        }
        return null;
    }
    protected String[] convertToStringArray(Object obj) {
        if (obj == null) {
            return null;
        }
        if (obj instanceof String) {
            return new String[] {(String)obj};
        } else if (obj instanceof String[]) {
            return (String[])obj;
        } else if (obj instanceof RequestParameter) {
            return new String[] {((RequestParameter)obj).getString()};
        } else if (obj instanceof RequestParameter[]) {
            RequestParameter[] values = (RequestParameter[])obj;
            String [] strValues = new String[values.length];
            for (int i=0; i < values.lengthi++) {
                strValues[i] = values[i].getString();
            }
            return strValues;
        }
        return null;
    }
        if (obj == null) {
            return null;
        }
        if (obj instanceof String) {
            return new RequestParameter[] {
                new RequestParameterImpl((String)objnull)
            };
        } else if (obj instanceof String[]) {
            String [] strValues = (String[])obj;
            RequestParameter [] values = new RequestParameter[strValues.length];
            for (int i=0; i < strValues.lengthi++) {
                values[i] = new RequestParameterImpl(strValues[i], null);
            }
            return values;
        } else if (obj instanceof RequestParameter) {
            return new RequestParameter[] {(RequestParameter)obj};
        } else if (obj instanceof RequestParameter[]) {
            return (RequestParameter[])obj;
        }
        return null;
    }
    static class RequestParameterImpl implements RequestParameter {
        private String value;
        private String encoding;
        private byte[] content;
        RequestParameterImpl(String valueString encoding) {
            this. = encoding;
            this. = value;
            this. = null;
        }
        String getEncoding() {
            return this.;
        }
        void setEncoding(String encoding) {
            // recode this parameter by encoding the string with the current
            // encoding and decode the bytes with the encoding
            try {
                this. = getString(encoding);
            } catch (UnsupportedEncodingException uee) {
                throw new SlingUnsupportedEncodingException(uee);
            }
            this. = encoding;
        }

        

See also:
org.apache.sling.api.request.RequestParameter.get()
        public byte[] get() {
            if ( == null) {
                try {
                     = getString().getBytes(getEncoding());
                } catch (Exception e) {
                    // UnsupportedEncodingException, IllegalArgumentException
                     = getString().getBytes();
                }
            }
            return ;
        }

        

See also:
org.apache.sling.api.request.RequestParameter.getContentType()
        public String getContentType() {
            // none known for www-form-encoded parameters
            return null;
        }

        

See also:
org.apache.sling.api.request.RequestParameter.getInputStream()
        public InputStream getInputStream() {
            return new ByteArrayInputStream(this.get());
        }

        

See also:
org.apache.sling.api.request.RequestParameter.getFileName()
        public String getFileName() {
            // no original file name
            return null;
        }

        

See also:
org.apache.sling.api.request.RequestParameter.getSize()
        public long getSize() {
            return this.get().length;
        }

        

See also:
org.apache.sling.api.request.RequestParameter.getString()
        public String getString() {
            return ;
        }

        

See also:
org.apache.sling.api.request.RequestParameter.getString(java.lang.String)
        public String getString(String encoding)
                throws UnsupportedEncodingException {
            return new String(this.get(), encoding);
        }

        

See also:
org.apache.sling.api.request.RequestParameter.isFormField()
        public boolean isFormField() {
            // www-form-encoded are always form fields
            return true;
        }
        @Override
        public String toString() {
            return this.getString();
        }
    }
    static class SlingUnsupportedEncodingException extends SlingIOException {
        private static final long serialVersionUID = -4482276105859280247L;
            super(uee);
        }
    }
New to GrepCode? Check out our FAQ X