/*
* Copyright (c) 2015 Cisco Systems, Inc. and others. 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
*/
package org.opendaylight.yangtools.yang.data.impl.codec;
import com.google.common.base.Optional;
import com.google.common.io.BaseEncoding;
import java.util.Objects;
import org.opendaylight.yangtools.yang.data.api.codec.UnionCodec;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
final class UnionStringCodec extends TypeDefinitionAwareCodec<Object, UnionTypeDefinition> implements UnionCodec<String> {
private final static Logger LOG = LoggerFactory.getLogger(UnionStringCodec.class);
private UnionStringCodec(final Optional<UnionTypeDefinition> typeDef) {
super(typeDef, Object.class);
}
static TypeDefinitionAwareCodec<?, UnionTypeDefinition> from(final UnionTypeDefinition normalizedType) {
return new UnionStringCodec(Optional.fromNullable(normalizedType));
}
@Override
public String serialize(final Object data) {
if (data instanceof byte[]) {
return BaseEncoding.base64().encode((byte[]) data);
}
return Objects.toString(data, "");
}
@Override
public Object deserialize(final String stringRepresentation) {
if (!getTypeDefinition().isPresent()) {
return stringRepresentation;
}
for (final TypeDefinition<?> type : getTypeDefinition().get().getTypes()) {
final TypeDefinitionAwareCodec<Object, ? extends TypeDefinition<?>> typeAwareCodec = from(type);
if (typeAwareCodec == null) {
/*
* This is a type for which we have no codec (eg identity ref) so we'll say it's
* valid
*/
return stringRepresentation;
}
try {
return typeAwareCodec.deserialize(stringRepresentation);
} catch (final Exception e) {
LOG.debug("Value {} did not matched representation for {}",stringRepresentation,type,e);
// invalid - try the next union type.
}
}
throw new IllegalArgumentException("Invalid value \"" + stringRepresentation + "\" for union type.");
}
}