/* * 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.model.export; import com.google.common.base.Preconditions; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import java.io.OutputStream; import java.net.URI; import java.util.Date; import java.util.Map; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.ModuleImport; import org.opendaylight.yangtools.yang.model.api.SchemaContext; public final class YinExportUtils { private YinExportUtils() { throw new UnsupportedOperationException("Utility class"); } /** * * Returns well-formed file name of YIN file as defined in RFC6020. * * @param name Module or submodule name * @param revision Revision of module or submodule * @return well-formed file name of YIN file as defined in RFC6020. */ public static String wellFormedYinName(final String name, final Date revision) { return wellFormedYinName(name, SimpleDateFormatUtil.getRevisionFormat().format(revision)); } /** * * Returns well-formed file name of YIN file as defined in RFC6020. * * @param name * name Module or submodule name * @param revision * Revision of module or submodule * @return well-formed file name of YIN file as defined in RFC6020. */ public static String wellFormedYinName(final String name, final String revision) { return String.format("%s@%s.yin", Preconditions.checkNotNull(name),Preconditions.checkNotNull(revision)); } /** * Writes YIN representation of supplied module to specified output stream. * * @param ctx * Schema Context which contains module and extension definitions * to be used during export of model. * @param module * Module to be exported. * @param str * Output stream to which YIN representation of model will be * written. * @throws XMLStreamException */ public static void writeModuleToOutputStream(final SchemaContext ctx, final Module module, final OutputStream str) throws XMLStreamException { final XMLOutputFactory factory = XMLOutputFactory.newFactory(); final XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(str); writeModuleToOutputStream(ctx,module, xmlStreamWriter); xmlStreamWriter.flush(); } private static void writeModuleToOutputStream(final SchemaContext ctx, final Module module, final XMLStreamWriter xmlStreamWriter) { final URI moduleNs = module.getNamespace(); final Map<String, URI> prefixToNs = prefixToNamespace(ctx,module); final StatementTextWriter yinWriter = SingleModuleYinStatementWriter.create(xmlStreamWriter, moduleNs, prefixToNs); SchemaContextEmitter.writeToStatementWriter(module, ctx,yinWriter); } private static Map<String, URI> prefixToNamespace(final SchemaContext ctx, final Module module) { final BiMap<String, URI> prefixMap = HashBiMap.create(module.getImports().size() + 1); prefixMap.put(module.getPrefix(), module.getNamespace()); for (final ModuleImport imp : module.getImports()) { final String prefix = imp.getPrefix(); final URI namespace = getModuleNamespace(ctx,imp.getModuleName()); prefixMap.put(prefix, namespace); } return prefixMap; } private static URI getModuleNamespace(final SchemaContext ctx, final String moduleName) { for (final Module module : ctx.getModules()) { if (moduleName.equals(module.getName())) { return module.getNamespace(); } } throw new IllegalArgumentException("Module " + moduleName + "does not exists in provided schema context"); } }