/*
 * 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.felix.serializer.impl.json;

import java.lang.reflect.Type;

import org.apache.felix.serializer.Deserializing;
import org.apache.felix.serializer.Parser;
import org.apache.felix.serializer.Serializer;
import org.apache.felix.serializer.Serializing;
import org.apache.felix.serializer.Writer;
import org.osgi.util.converter.Converter;
import org.osgi.util.converter.Converters;
import org.osgi.util.converter.TypeReference;

public class JsonSerializerImpl implements Serializer, Serializer.JsonSerializer {
    private final Converter converter = Converters.standardConverter();
    private final Parser parser = new DefaultJsonParser();
    private final Writer writer = new DefaultJsonWriter(converter);

    @Override
    public <T> Deserializing<T> deserialize(Class<T> cls) {
        return new JsonDeserializingImpl<T>(converter, parser, cls);
    }

    @Override
    public Serializing serialize(Object obj) {
        return new JsonSerializingImpl(converter, writer, obj);
    }

    @Override
    public <T> Deserializing<T> deserialize(TypeReference<T> ref) {
        return new JsonDeserializingImpl<T>(converter, parser, ref.getType());
    }

    @Override @SuppressWarnings("rawtypes")
    public Deserializing<?> deserialize(Type type) {
        return new JsonDeserializingImpl(converter, parser, type);
    }
}
