/*
 * 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.fsprovider.internal.parser;

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.apache.sling.jcr.contentparser.ContentHandler;

/**
 * {@link ContentHandler} implementation that produces a tree of {@link ContentElement} items.
 */
final class ContentElementHandler implements ContentHandler {
    
    private ContentElement root;
    private Pattern PATH_PATTERN = Pattern.compile("^((/[^/]+)*)(/([^/]+))$"); 

    @Override
    public void resource(String path, Map<String, Object> properties) {
        if (StringUtils.equals(path, "/")) {
            root = new ContentElementImpl(null, properties);
        }
        else {
            if (root == null) {
                throw new RuntimeException("Root resource not set.");
            }
            Matcher matcher = PATH_PATTERN.matcher(path);
            if (!matcher.matches()) {
                throw new RuntimeException("Unexpected path:" + path);
            }
            String relativeParentPath = StringUtils.stripStart(matcher.group(1), "/");
            String name = matcher.group(4);
            ContentElement parent;
            if (StringUtils.isEmpty(relativeParentPath)) {
                parent = root;
            }
            else {
                parent = root.getChild(relativeParentPath);
            }
            if (parent == null) {
                throw new RuntimeException("Parent '" + relativeParentPath + "' does not exist.");
            }
            parent.getChildren().put(name, new ContentElementImpl(name, properties));
        }
    }
    
    public ContentElement getRoot() {
        return root;
    }

}
