blob: c17d3fa5107ce7ff337424de14b1610dfd00eab3 [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Foundation
*
* Licensed 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.onosproject.yms.app.ych.defaultcodecs;
import org.onosproject.yms.app.ych.YchException;
import org.onosproject.yms.app.ych.defaultcodecs.xml.XmlCodecHandler;
import org.onosproject.yms.app.ych.defaultcodecs.xml.XmlCodecMultiInstanceHandler;
import org.onosproject.yms.app.ych.defaultcodecs.xml.XmlCodecMultiInstanceLeafHandler;
import org.onosproject.yms.app.ych.defaultcodecs.xml.XmlCodecSingleInstanceHandler;
import org.onosproject.yms.app.ych.defaultcodecs.xml.XmlCodecSingleInstanceLeafHandler;
import org.onosproject.yms.ych.YangProtocolEncodingFormat;
import org.onosproject.yms.ydt.YdtContext;
import org.onosproject.yms.ydt.YdtType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
import static org.onosproject.yms.ych.YangProtocolEncodingFormat.XML;
import static org.onosproject.yms.ydt.YdtType.MULTI_INSTANCE_LEAF_VALUE_NODE;
import static org.onosproject.yms.ydt.YdtType.MULTI_INSTANCE_NODE;
import static org.onosproject.yms.ydt.YdtType.SINGLE_INSTANCE_LEAF_VALUE_NODE;
import static org.onosproject.yms.ydt.YdtType.SINGLE_INSTANCE_NODE;
/**
* Represents an YCH handle factory to create different types of YANG data tree
* node.
*/
public final class CodecHandlerFactory {
private static final Logger log =
LoggerFactory.getLogger(CodecHandlerFactory.class);
private static final String YDT_TYPE_ERROR = "YDT type is not supported.";
/**
* Map of xml codec handler.
*/
private final Map<YdtType, XmlCodecHandler> handlerMap;
/**
* Creates a new codec handler factory.
*/
private CodecHandlerFactory() {
handlerMap = new HashMap<>();
handlerMap.put(SINGLE_INSTANCE_NODE,
new XmlCodecSingleInstanceHandler());
handlerMap.put(MULTI_INSTANCE_NODE,
new XmlCodecMultiInstanceHandler());
handlerMap.put(SINGLE_INSTANCE_LEAF_VALUE_NODE,
new XmlCodecSingleInstanceLeafHandler());
handlerMap.put(MULTI_INSTANCE_LEAF_VALUE_NODE,
new XmlCodecMultiInstanceLeafHandler());
}
/**
* Returns YCH instance handler node instance.
*
* @param node YDT context node
* @param format data format type expected from driver
* @return returns YCH handler node instance
*/
public XmlCodecHandler getCodecHandlerForContext(
YdtContext node,
YangProtocolEncodingFormat format) {
if (format == XML) {
XmlCodecHandler handler = handlerMap.get(node.getYdtType());
if (handler == null) {
throw new YchException(YDT_TYPE_ERROR + node.getYdtType());
}
return handler;
}
log.error("{} data format is not supported.", format);
return null;
}
/*
* Bill Pugh Singleton pattern. INSTANCE won't be instantiated until the
* LazyHolder class is loaded via a call to the instance() method below.
*/
private static class LazyHolder {
private static final CodecHandlerFactory INSTANCE =
new CodecHandlerFactory();
}
/**
* Returns a reference to the Singleton Codec Handler factory.
*
* @return the singleton codec handler factory
*/
public static CodecHandlerFactory instance() {
return LazyHolder.INSTANCE;
}
}