/*
 * Copyright (c) 2013, 2020 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:
//     Denise Smith - 2.6 - initial implementation
package org.eclipse.persistence.oxm.json;

import jakarta.json.JsonStructure;

import org.eclipse.persistence.internal.oxm.Unmarshaller;
import org.eclipse.persistence.internal.oxm.record.ExtendedSource;
import org.eclipse.persistence.internal.oxm.record.XMLReader;
import org.eclipse.persistence.internal.oxm.record.json.JsonStructureReader;

/**
 *   Object to be used with Unmarshaller to unmarshal jakarta.json.JsonStructure objects
 *   (ie: jakarta.json.JsonObject or jakarta.json.JsonArray)
 *
 *   Usage:
 *      JsonStructureSource source = new JsonStructureSource(jsonObject);
 *      Object unmarshalled = jaxbUnmarshaller.unmarshal(source);
 *
 */
public class JsonStructureSource extends ExtendedSource {

    private JsonStructure jsonStructure;

    public JsonStructureSource(JsonStructure jsonStructure) {
        this.jsonStructure = jsonStructure;
    }

    public JsonStructure getJsonStructure() {
        return jsonStructure;
    }

    @Override
    public XMLReader createReader(Unmarshaller unmarshaller) {
        JsonStructureReader reader = new JsonStructureReader(unmarshaller);
        reader.setJsonStructure(getJsonStructure());
        return reader;
    }

    @Override
    public XMLReader createReader(Unmarshaller unmarshaller, Class unmarshalClass) {
        JsonStructureReader reader = new JsonStructureReader(unmarshaller, unmarshalClass);
        reader.setJsonStructure(getJsonStructure());
        return reader;
    }

}
