/*
 * 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.contentloader;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

import javax.jcr.RepositoryException;

import org.osgi.annotation.versioning.ConsumerType;

/**
 * The <code>ContentReader</code>
 */
@ConsumerType
public interface ContentReader {

    static final String PROPERTY_EXTENSIONS = "extensions";

    static final String PROPERTY_TYPES = "contentTypes";

    /**
     * Read the content from the URL and create the
     * content using the provided content creator.
     * @param url The input stream.
     * @throws IOException If anything goes wrong.
     */
    void parse(URL url, ContentCreator creator) throws IOException, RepositoryException;

    /**
     * Read the content from the input stream and create the
     * content using the provided content creator.
     * @param ins the input stream.
     * @throws IOException If anything goes wrong.
     */
    void parse(InputStream ins, ContentCreator contentCreator) throws IOException, RepositoryException;

}
