/**
* <copyright>
*
* Copyright (c) 2011 Christian Kerl
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Christian Kerl - Initial API and implementation
*
* </copyright>
*/
package org.eclipselab.emf.ecore.protobuf.conversion;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EObject;
import org.eclipselab.emf.ecore.protobuf.internal.conversion.DefaultScalarConverter;
import org.eclipselab.emf.ecore.protobuf.internal.conversion.EcoreScalarConverter;
import org.eclipselab.emf.ecore.protobuf.internal.conversion.EnumConverter;
import com.google.protobuf.Descriptors;
import com.google.protobuf.Message;
public class ConverterRegistry
{
private List<ToProtoBufScalarConverter> toProtoBufScalarConverters = Arrays.asList(
new EnumConverter.ToProtoBuf(),
new EcoreScalarConverter.ToProtoBuf(),
new DefaultScalarConverter.ToProtoBuf());
private List<FromProtoBufScalarConverter> fromProtoBufScalarConverters = Arrays.asList(
new EnumConverter.FromProtoBuf(),
new EcoreScalarConverter.FromProtoBuf(),
new DefaultScalarConverter.FromProtoBuf());
private List<ToProtoBufMessageConverter< ? extends EObject, ? extends Message>> toProtobufMessageConverters = new ArrayList<ToProtoBufMessageConverter< ? extends EObject, ? extends Message>>();
private List<FromProtoBufMessageConverter<? extends Message, ? extends EObject>> fromProtobufMessageConverters = new ArrayList<FromProtoBufMessageConverter<? extends Message, ? extends EObject>>();
public void register(FromProtoBufMessageConverter<? extends Message, ? extends EObject> fromProtobufMessageConverter)
{
fromProtobufMessageConverters.add(0, fromProtobufMessageConverter);
if(fromProtobufMessageConverter instanceof Converter.WithRegistry)
{
((Converter.WithRegistry) fromProtobufMessageConverter).setRegistry(this);
}
}
public void register(FromProtoBufMessageConverter<? extends Message, ? extends EObject>... newFromProtobufMessageConverters)
{
registerFromProtobufConverters(Arrays.asList(newFromProtobufMessageConverters));
}
public void registerFromProtobufConverters(List<FromProtoBufMessageConverter<? extends Message, ? extends EObject>> newFromProtobufMessageConverters)
{
fromProtobufMessageConverters.addAll(0, newFromProtobufMessageConverters);
for(FromProtoBufMessageConverter<? extends Message, ? extends EObject> converter : newFromProtobufMessageConverters)
{
if(converter instanceof Converter.WithRegistry)
{
((Converter.WithRegistry) converter).setRegistry(this);
}
}
}
public void register(ToProtoBufMessageConverter<? extends EObject, ? extends Message> toProtobufMessageConverter)
{
toProtobufMessageConverters.add(0, toProtobufMessageConverter);
if(toProtobufMessageConverter instanceof Converter.WithRegistry)
{
((Converter.WithRegistry) toProtobufMessageConverter).setRegistry(this);
}
}
public void register(ToProtoBufMessageConverter<? extends EObject, ? extends Message>... newToProtobufMessageConverter)
{
registerToProtobufConverters(Arrays.asList(newToProtobufMessageConverter));
}
public void registerToProtobufConverters(List<ToProtoBufMessageConverter<? extends EObject, ? extends Message>> newToProtobufMessageConverter)
{
toProtobufMessageConverters.addAll(0, newToProtobufMessageConverter);
for(ToProtoBufMessageConverter<? extends EObject, ? extends Message> converter : newToProtobufMessageConverter)
{
if(converter instanceof Converter.WithRegistry)
{
((Converter.WithRegistry) converter).setRegistry(this);
}
}
}
public ToProtoBufScalarConverter find(EDataType sourceType, Descriptors.FieldDescriptor targetType)
{
for (ToProtoBufScalarConverter converter : toProtoBufScalarConverters)
{
if (converter.supports(sourceType, targetType))
{
return converter;
}
}
throw ConversionException.causeMissingConverter(sourceType, targetType);
}
public FromProtoBufScalarConverter find(Descriptors.FieldDescriptor sourceType, EDataType targetType)
{
for (FromProtoBufScalarConverter converter : fromProtoBufScalarConverters)
{
if (converter.supports(sourceType, targetType))
{
return converter;
}
}
throw ConversionException.causeMissingConverter(sourceType, targetType);
}
public FromProtoBufMessageConverter<? extends Message, ? extends EObject> find(Descriptors.Descriptor sourceType)
{
for(FromProtoBufMessageConverter<? extends Message, ? extends EObject> converter : fromProtobufMessageConverters)
{
if(converter.supports(sourceType))
{
return converter;
}
}
throw ConversionException.causeMissingConverter(sourceType);
}
public FromProtoBufMessageConverter<? extends Message, ? extends EObject> find(Descriptors.Descriptor sourceType, EClass targetType)
{
for(FromProtoBufMessageConverter<? extends Message, ? extends EObject> converter : fromProtobufMessageConverters)
{
if(converter.supports(sourceType, targetType))
{
return converter;
}
}
throw ConversionException.causeMissingConverter(sourceType, targetType);
}
public ToProtoBufMessageConverter<? extends EObject, ? extends Message> find(EClass sourceType)
{
for(ToProtoBufMessageConverter<? extends EObject, ? extends Message> converter : toProtobufMessageConverters)
{
if(converter.supports(sourceType))
{
return converter;
}
}
throw ConversionException.causeMissingConverter(sourceType);
}
}