/*
 * 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.testing.mock.jcr;

import javax.jcr.Item;
import javax.jcr.ItemNotFoundException;
import javax.jcr.ItemVisitor;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;

import org.apache.commons.lang3.StringUtils;

/**
 * Mock {@link Item} implementation.
 */
abstract class AbstractItem implements Item {

    protected final ItemData itemData;
    private final Session session;

    public AbstractItem(final ItemData itemData, final Session session) {
        this.itemData = itemData;
        this.session = session;
    }

    @Override
    public String getName() throws RepositoryException {
        return this.itemData.getName();
    }

    @Override
    public String getPath() throws RepositoryException {
        return this.itemData.getPath();
    }

    @Override
    public Node getParent() throws RepositoryException {
        return (Node) getSession().getItem(ResourceUtil.getParent(getPath()));
    }

    @Override
    public Session getSession()throws RepositoryException {
        return this.session;
    }

    @Override
    public boolean isModified() {
        return itemData.isChanged();
    }

    @Override
    public boolean isNew() {
        return itemData.isNew();
    }

    @Override
    public Item getAncestor(final int depth) throws RepositoryException {
        if (depth < 0 || depth > getDepth()) {
            throw new ItemNotFoundException();
        }
        return this.session.getItem(ResourceUtil.getParent(getPath(), depth));
    }

    protected String makeAbsolutePath(final String relativePath) throws RepositoryException {
        String absolutePath = relativePath;
        // ensure the path is absolute and normalized
        if (!StringUtils.startsWith(absolutePath, "/")) {
            absolutePath = getPath() + "/" + absolutePath; // NOPMD
        }
        return ResourceUtil.normalize(absolutePath);
    }

    protected MockSession getMockedSession() {
        return (MockSession) this.session;
    }

    @Override
    public void remove() throws RepositoryException {
        getSession().removeItem(getPath());
    }

    @Override
    public int getDepth() throws RepositoryException {
        if (StringUtils.equals("/", getPath())) {
            return 0;
        } else {
            return StringUtils.countMatches(getPath(), "/");
        }
    }

    // --- unsupported operations ---
    @Override
    public void accept(final ItemVisitor visitor) throws RepositoryException {
        throw new UnsupportedOperationException();
    }

    @Override
    public boolean isSame(final Item otherItem) throws RepositoryException {
        throw new UnsupportedOperationException();
    }

    @Override
    public void refresh(final boolean keepChanges) throws RepositoryException {
        throw new UnsupportedOperationException();
    }

    @Override
    public void save() throws RepositoryException {
        throw new UnsupportedOperationException();
    }

}
