/*
 * 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.jcr.resource.internal.helper.jcr;

import java.io.IOException;
import java.io.InputStream;

import javax.jcr.NamespaceRegistry;
import javax.jcr.Node;

import org.apache.sling.api.SlingConstants;
import org.apache.sling.jcr.resource.api.JcrResourceConstants;
import org.junit.Ignore;

@Ignore
public class JcrItemResourceTestBase extends SlingRepositoryTestBase {

    protected static final long TEST_MODIFIED = System.currentTimeMillis();

    protected static final String TEST_TYPE = "text/gurk";

    protected static final String TEST_ENCODING = "ISO-8859-1";

    protected static final byte[] TEST_DATA = { 'S', 'o', 'm', 'e', ' ', 'T',
        'e', 's', 't' };

    protected String rootPath;

    protected Node rootNode;

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        // create the session
        getSession();

        try {
            NamespaceRegistry nsr = session.getWorkspace().getNamespaceRegistry();
            nsr.registerNamespace(SlingConstants.NAMESPACE_PREFIX,
                JcrResourceConstants.SLING_NAMESPACE_URI);
        } catch (Exception e) {
            // don't care for now
        }

        rootPath = "/test" + System.currentTimeMillis();
        rootNode = getSession().getRootNode().addNode(rootPath.substring(1),
            "nt:unstructured");
        getSession().save();
    }

    @Override
    protected void tearDown() throws Exception {
        if (rootNode != null) {
            rootNode.remove();
            getSession().save();
        }

        super.tearDown();
    }

    protected void assertEquals(byte[] expected, InputStream actual)
            throws IOException {
        if (actual == null) {
            fail("Resource stream is null");
        } else {
            try {
                for (byte b : expected) {
                    assertEquals(b, (byte)actual.read());
                }
            } finally {
                try {
                    actual.close();
                } catch (IOException grok) {
                }
            }
        }
    }
}
