/*
 * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.sdo.helper.xsdhelper.define;


import java.net.URI;
import java.net.URL;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import org.eclipse.persistence.logging.AbstractSessionLog;
import org.eclipse.persistence.sdo.helper.DefaultSchemaResolver;

public class CyclicSchemaResolver extends DefaultSchemaResolver {
    @Override
    public Source resolveSchema(Source sourceXSD, String namespace, String schemaLocation) {
        if (schemaLocation != null && !schemaLocation.equals("")) {
            return super.resolveSchema(sourceXSD, namespace, schemaLocation);
        }
        schemaLocation = namespace.equals("uri") ? "Cyclic1.xsd" : "Cyclic2.xsd";
        URL schemaUrl = null;
        try {
            if (getBaseSchemaLocation() != null) {
                // Attempt to resolve the schema location against the base location
                URI baseUri = new URI(getBaseSchemaLocation());
                URI resolvedUri = baseUri.resolve(schemaLocation);
                schemaUrl = resolvedUri.toURL();
            } else {
                schemaUrl = new URL(schemaLocation);
            }
        } catch (Exception e) {
            AbstractSessionLog.getLog().log(AbstractSessionLog.WARNING, "sdo_error_processing_referenced_schema", new Object[] {e.getClass().getName(), namespace, schemaLocation });
            AbstractSessionLog.getLog().logThrowable(AbstractSessionLog.FINEST, e);
            return null;
        }
        return new StreamSource(schemaUrl.toExternalForm());
    }
}
