From 52bb9087c39a6a86833684b0cac6b8f9c6043716 Mon Sep 17 00:00:00 2001 From: Sheshi Chinthakayala Date: Wed, 18 Oct 2017 16:56:52 -0500 Subject: [PATCH] removed the printYangToProp binaries and the file was removed as binaries are not allowed in ONAP git repos. The PrintYangToProp.java file was moved to ccsdk/sli/core repo Change-Id: I09d78f78cfe68fe7708d0b5278be52716011d467 Issue-ID: SDNC-81 Signed-off-by: Sheshi Chinthakayala --- dgbuilder/build_pom_for_yang_compile | 10 +- dgbuilder/pom.xml | 2 +- dgbuilder/tools/PrintYangToProp.java | 1424 ------------------------------- dgbuilder/tools/getRpcsClassFromYang.sh | 10 +- dgbuilder/tools/pom.xml_base | 10 +- dgbuilder/tools/printYangProps.sh | 2 +- dgbuilder/tools/printYangToProp.jar | Bin 9010 -> 0 bytes 7 files changed, 17 insertions(+), 1441 deletions(-) delete mode 100644 dgbuilder/tools/PrintYangToProp.java delete mode 100644 dgbuilder/tools/printYangToProp.jar diff --git a/dgbuilder/build_pom_for_yang_compile b/dgbuilder/build_pom_for_yang_compile index c9aa38ac..80d4ede7 100755 --- a/dgbuilder/build_pom_for_yang_compile +++ b/dgbuilder/build_pom_for_yang_compile @@ -6,13 +6,13 @@ model_pom_content=$(cat < 4.0.0 - org.onap.ccsdk.distribution - distribution-root - ${1} + org.onap.ccsdk.sli.core + ccsdk-sli-core + LATEST yangApp-model bundle - 1.0.0-SNAPSHOT + 1.0.0-SNAPSHOT @@ -47,7 +47,7 @@ model_pom_content=$(cat <\${yang.file.directory} - org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl + org.opendaylight.mdsal.binding.maven.api.gen.plugin.CodeGeneratorImpl \${salGeneratorPath} diff --git a/dgbuilder/pom.xml b/dgbuilder/pom.xml index e1cde5a0..a1961d12 100644 --- a/dgbuilder/pom.xml +++ b/dgbuilder/pom.xml @@ -120,7 +120,7 @@ - + diff --git a/dgbuilder/tools/PrintYangToProp.java b/dgbuilder/tools/PrintYangToProp.java deleted file mode 100644 index 93aaac79..00000000 --- a/dgbuilder/tools/PrintYangToProp.java +++ /dev/null @@ -1,1424 +0,0 @@ - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintStream; -import java.io.FileDescriptor; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.util.LinkedList; -import java.util.List; -import java.util.Properties; -import java.util.Arrays; -import java.util.ArrayList; -import java.io.*; -import javax.json.*; -import org.opendaylight.yangtools.yang.binding.Identifier; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddressBuilder; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.CaseFormat; - -public class PrintYangToProp { - - private static final Logger LOG = LoggerFactory.getLogger(PrintYangToProp.class); - public static final String PROPERTIES_FILE="/opt/bvc/controller/configuration/flowred.properties"; - private static Properties properties; - - static { - - // Trick class loader into loading builders. Some of - // these will be needed later by Reflection classes, but need - // to explicitly "new" them here to get class loader to load them. -/* - ServiceInformationBuilder b2 = new ServiceInformationBuilder(); - ServiceDataBuilder b3 = new ServiceDataBuilder(); - SdncRequestHeaderBuilder b4 = new SdncRequestHeaderBuilder(); - RequestInformationBuilder b6 = new RequestInformationBuilder(); - - FlowredGroupInformationDataBuilder b29 = new FlowredGroupInformationDataBuilder(); - FlowredInformationDataBuilder b48 = new FlowredInformationDataBuilder(); - - OperStatusBuilder b41 = new OperStatusBuilder(); -*/ - - - } - - public static void loadProperties() { - /* - - File file = new File(PROPERTIES_FILE); - properties = new Properties(); - InputStream input = null; - if (file.isFile() && file.canRead()) { - try { - input = new FileInputStream(file); - properties.load(input); - LOG.info("Loaded properties from " + PROPERTIES_FILE ); - } catch (Exception e) { - LOG.error("Failed to load properties " + PROPERTIES_FILE +"\n",e); - } finally { - if (input != null) { - try { - input.close(); - } catch (IOException e) { - LOG.error("Failed to close properties file " + PROPERTIES_FILE +"\n",e); - } - } - } - } - */ - } - - public static Properties toProperties(Properties props, Object fromObj) { - Class fromClass = null; - - if (fromObj != null) - { - fromClass = fromObj.getClass(); - } - return (toProperties(props, "", fromObj, fromClass)); - } - - public static Properties toProperties(Properties props, String pfx, Object fromObj) - { - Class fromClass = null; - - if (fromObj != null) - { - fromClass = fromObj.getClass(); - } - - return(toProperties(props, pfx, fromObj, fromClass)); - } - - public static Properties toProperties(Properties props, String pfx, - Object fromObj, Class fromClass) { - - if (fromObj == null) { - return (props); - } - - - String simpleName = fromClass.getSimpleName(); - - //LOG.debug("Extracting properties from " + fromClass.getName() - // + " class"); - if (fromObj instanceof List) { - - // Class is a List. List should contain yang-generated classes. - //LOG.debug(fromClass.getName() + " is a List"); - - List fromList = (List) fromObj; - - for (int i = 0; i < fromList.size(); i++) { - toProperties(props, pfx + "[" + i + "]", fromList.get(i), fromClass); - } - props.setProperty(pfx + "_length", "" + fromList.size()); - - } else if (isYangGenerated(fromClass)) { - // Class is yang generated. - //LOG.debug(fromClass.getName() + " is a Yang-generated class"); - - String propNamePfx = null; - - // If called from a list (so prefix ends in ']'), don't - // add class name again - if (pfx.endsWith("]")) { - propNamePfx = pfx; - } else { - if ((pfx != null) && (pfx.length() > 0)) { - propNamePfx = pfx ; - } else { - propNamePfx = toLowerHyphen(fromClass.getSimpleName()); - } - - if (propNamePfx.endsWith("-builder")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - - "-builder".length()); - } - - if (propNamePfx.endsWith("-impl")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - - "-impl".length()); - } - } - - // Iterate through getter methods to figure out values we need to - // save from - - for (Method m : fromClass.getMethods()) { - // LOG.debug("Checking " + m.getName() + " method"); - if (isGetter(m)) { - // LOG.debug(m.getName() + " is a getter"); - Class returnType = m.getReturnType(); - String fieldName = toLowerHyphen(m.getName().substring(3)); - if(m != null && m.getName().matches("^is[A-Z].*")){ - fieldName = toLowerHyphen(m.getName().substring(2)); - } - - fieldName = fieldName.substring(0, 1).toLowerCase() - + fieldName.substring(1); - - // Is the return type a yang generated class? - if (isYangGenerated(returnType)) { - // Is it an enum? - if (returnType.isEnum()) { - // Return type is a typedef. Save its value. - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - - Object retValue = m.invoke(fromObj); - - if (!isAccessible) { - m.setAccessible(isAccessible); - } - if (retValue != null) { - String propName = propNamePfx + "." - + fieldName; - String propVal = retValue.toString(); - String yangProp = "yang." + fieldName + "." + propVal; - if ( properties.containsKey(yangProp)) { - propVal = properties.getProperty(yangProp); - //LOG.debug("Adjusting property " + yangProp + " " + propVal); - } - //LOG.debug("Setting property " + propName - // + " to " + propVal); - props.setProperty(propName, propVal); - } - } catch (Exception e) { - LOG.error( - "Caught exception trying to convert Yang-generated enum returned by " - + fromClass.getName() + "." - + m.getName() - + "() to Properties entry", e); - } - } else if (isIpv4Address(returnType)) { - // Save its value - try { - String propName = propNamePfx + "." + fieldName; - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - Ipv4Address retValue = (Ipv4Address) m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - - if (retValue != null) { - String propVal = retValue.getValue().toString(); - //LOG.debug("Setting property " + propName - // + " to " + propVal); - props.setProperty(propName, propVal); - - } - } catch (Exception e) { - LOG.error( - "Caught exception trying to convert value returned by " - + fromClass.getName() + "." - + m.getName() - + "() to Properties entry", e); - } - } else if (isIpv6Address(returnType)) { - // Save its value - try { - String propName = propNamePfx + "." + fieldName; - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - Ipv6Address retValue = (Ipv6Address) m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - - if (retValue != null) { - String propVal = retValue.getValue().toString(); - //LOG.debug("Setting property " + propName - // + " to " + propVal); - props.setProperty(propName, propVal); - - } - } catch (Exception e) { - LOG.error( - "Caught exception trying to convert value returned by " - + fromClass.getName() + "." - + m.getName() - + "() to Properties entry", e); - } - } else { - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - Object retValue = m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - if (retValue != null) { - toProperties(props, propNamePfx + "." + fieldName, retValue, returnType); - } - } catch (Exception e) { - LOG.error( - "Caught exception trying to convert Yang-generated class returned by" - + fromClass.getName() + "." - + m.getName() - + "() to Properties entry", e); - } - } - } else if (returnType.equals(Class.class)) { - - //LOG.debug(m.getName() - // + " returns a Class object - not interested"); - - } else if (List.class.isAssignableFrom(returnType)) { - - // This getter method returns a list. - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - Object retList = m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - // Figure out what type of elements are stored in this array. - Type paramType = m.getGenericReturnType(); - Type elementType = ((ParameterizedType) paramType) - .getActualTypeArguments()[0]; - toProperties(props, propNamePfx + "." + fieldName, - retList, (Class)elementType); - } catch (Exception e) { - LOG.error( - "Caught exception trying to convert List returned by " - + fromClass.getName() + "." - + m.getName() - + "() to Properties entry", e); - } - - } else { - - // Method returns something that is not a List and not - // yang-generated. - // Save its value - try { - String propName = propNamePfx + "." + fieldName; - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - Object propValObj = m.invoke(fromObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - - if (propValObj != null) { - String propVal = propValObj.toString(); - //LOG.debug("Setting property " + propName - // + " to " + propVal); - props.setProperty(propName, propVal); - - } - } catch (Exception e) { - LOG.error( - "Caught exception trying to convert value returned by " - + fromClass.getName() + "." - + m.getName() - + "() to Properties entry", e); - } - } - - } - } - - } else { - // Class is not yang generated and not a list - // Do nothing. - - } - - return (props); - } - - public static Object toBuilder(Properties props, Object toObj) { - - return (toBuilder(props, "", toObj)); - } - - public static List toList(Properties props, String pfx, List toObj, - Class elemType) { - - int maxIdx = -1; - boolean foundValue = false; - - //LOG.debug("Saving properties to List<" + elemType.getName() - // + "> from " + pfx); - - // Figure out array size - for (Object pNameObj : props.keySet()) { - String key = (String) pNameObj; - - if (key.startsWith(pfx + "[")) { - String idxStr = key.substring(pfx.length() + 1); - int endloc = idxStr.indexOf("]"); - if (endloc != -1) { - idxStr = idxStr.substring(0, endloc); - } - - try { - int curIdx = Integer.parseInt(idxStr); - if (curIdx > maxIdx) { - maxIdx = curIdx; - } - } catch (Exception e) { - LOG.error("Illegal subscript in property " + key); - } - - } - } - - //LOG.debug(pfx + " has max index of " + maxIdx); - for (int i = 0; i <= maxIdx; i++) { - - String curBase = pfx + "[" + i + "]"; - - if (isYangGenerated(elemType)) { - String builderName = elemType.getName() + "Builder"; - try { - Class builderClass = Class.forName(builderName); - Object builderObj = builderClass.newInstance(); - Method buildMethod = builderClass.getMethod("build"); - builderObj = toBuilder(props, curBase, builderObj, true); - if (builderObj != null) { - //LOG.debug("Calling " + builderObj.getClass().getName() - // + "." + buildMethod.getName() + "()"); - Object builtObj = buildMethod.invoke(builderObj); - toObj.add(builtObj); - foundValue = true; - } - - } catch (ClassNotFoundException e) { - LOG.warn("Could not find builder class " + builderName, e); - } catch (Exception e) { - LOG.error("Caught exception trying to populate list from " - + pfx); - } - } - - } - - if (foundValue) { - return (toObj); - } else { - return (null); - } - - } - - public static Object toBuilder(Properties props, String pfx, Object toObj) { - return(toBuilder(props, pfx, toObj, false)); - } - - public static Object toBuilder(Properties props, String pfx, Object toObj, boolean preservePfx) { - Class toClass = toObj.getClass(); - boolean foundValue = false; - - //LOG.debug("Saving properties to " + toClass.getName() + " class from " - // + pfx); - - Ipv4Address addr; - - if (isYangGenerated(toClass)) { - // Class is yang generated. - //LOG.debug(toClass.getName() + " is a Yang-generated class"); - - String propNamePfx = null; - if (preservePfx) { - propNamePfx = pfx; - } else { - - if ((pfx != null) && (pfx.length() > 0)) { - propNamePfx = pfx + "." - + toLowerHyphen(toClass.getSimpleName()); - } else { - propNamePfx = toLowerHyphen(toClass.getSimpleName()); - } - - if (propNamePfx.endsWith("-builder")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - - "-builder".length()); - } - - if (propNamePfx.endsWith("-impl")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - - "-impl".length()); - } - } - - if (toObj instanceof Identifier) { - //LOG.debug(toClass.getName() + " is a Key - skipping"); - return (toObj); - } - - // Iterate through getter methods to figure out values we need to - // set - - for (Method m : toClass.getMethods()) { - // LOG.debug("Is " + m.getName() + " method a setter?"); - if (isSetter(m)) { - // LOG.debug(m.getName() + " is a setter"); - Class paramTypes[] = m.getParameterTypes(); - Class paramClass = paramTypes[0]; - - String fieldName = toLowerHyphen(m.getName().substring(3)); - fieldName = fieldName.substring(0, 1).toLowerCase() - + fieldName.substring(1); - - String propName = propNamePfx + "." + fieldName; - - String paramValue = props.getProperty(propName); - if (paramValue == null) { - //LOG.debug(propName + " is unset"); - } else { - //LOG.debug(propName + " = " + paramValue); - } - - // Is the return type a yang generated class? - if (isYangGenerated(paramClass)) { - // Is it an enum? - if (paramClass.isEnum()) { - - //LOG.debug(m.getName() + " expects an Enum"); - // Param type is a typedef. - if (paramValue != null) { - Object paramObj = null; - - try { - paramObj = Enum.valueOf(paramClass, - toUpperCamelCase(paramValue)); - } catch (Exception e) { - LOG.error( - "Caught exception trying to convert field " - + propName + " to enum " - + paramClass.getName(), e); - } - - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - - //LOG.debug("Calling " - // + toObj.getClass().getName() + "." - // + m.getName() + "(" + paramValue - // + ")"); - m.invoke(toObj, paramObj); - - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error( - "Caught exception trying to create Yang-generated enum expected by" - + toClass.getName() - + "." - + m.getName() - + "() from Properties entry", - e); - } - } - } else { - - String simpleName = paramClass.getSimpleName(); - - if ("Ipv4Address".equals(simpleName) - || "Ipv6Address".equals(simpleName)) { - - if (paramValue != null) { - try { - IpAddress ipAddr = IpAddressBuilder - .getDefaultInstance(paramValue); - - - if ("Ipv4Address".equals(simpleName)) - { - m.invoke(toObj, ipAddr.getIpv4Address()); - } - else - { - m.invoke(toObj, ipAddr.getIpv6Address()); - - } - foundValue = true; - } catch (Exception e) { - LOG.error( - "Caught exception calling " - + toClass.getName() + "." - + m.getName() + "(" - + paramValue + ")", e); - - } - } - - } else { - // setter expects a yang-generated class. Need - // to - // create a builder to set it. - - String builderName = paramClass.getName() - + "Builder"; - Class builderClass = null; - Object builderObj = null; - Object paramObj = null; - - //LOG.debug(m.getName() - // + " expects a yang-generated class - looking for builder " - // + builderName); - try { - builderClass = Class.forName(builderName); - builderObj = builderClass.newInstance(); - paramObj = toBuilder(props, propNamePfx, - builderObj); - } catch (ClassNotFoundException e) { - Object constObj = null; - try { - // See if I can find a constructor I can - // use - Constructor[] constructors = paramClass - .getConstructors(); - // Is there a String constructor? - for (Constructor c : constructors) { - Class[] cParms = c - .getParameterTypes(); - if ((cParms != null) - && (cParms.length == 1)) { - if (String.class - .isAssignableFrom(cParms[0])) { - constObj = c - .newInstance(paramValue); - } - } - } - - if (constObj == null) { - // Is there a Long constructor? - for (Constructor c : constructors) { - Class[] cParms = c - .getParameterTypes(); - if ((cParms != null) - && (cParms.length == 1)) { - if (Long.class - .isAssignableFrom(cParms[0])) { - constObj = c - .newInstance(Long - .parseLong(paramValue)); - } - } - } - - } - - if (constObj != null) { - try { - m.invoke(toObj, constObj); - foundValue = true; - } catch (Exception e2) { - LOG.error( - "Caught exception trying to call " - + m.getName(), - e2); - } - } - } catch (Exception e1) { - LOG.warn( - "Could not find a suitable constructor for " - + paramClass.getName(), - e1); - } - - if (paramObj == null) { - LOG.warn("Could not find builder class " - + builderName - + " and could not find a String or Long constructor - trying just to set passing paramValue"); - - } - - } catch (Exception e) { - LOG.error( - "Caught exception trying to create builder " - + builderName, e); - } - - if (paramObj != null) { - - try { - - Method buildMethod = builderClass - .getMethod("build"); - //LOG.debug("Calling " - // + paramObj.getClass().getName() - // + "." + buildMethod.getName() - // + "()"); - Object builtObj = buildMethod - .invoke(paramObj); - - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - - //LOG.debug("Calling " - // + toObj.getClass().getName() - // + "." + m.getName() + "()"); - m.invoke(toObj, builtObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error( - "Caught exception trying to set Yang-generated class expected by" - + toClass.getName() - + "." - + m.getName() - + "() from Properties entry", - e); - } - } else { - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - //LOG.debug("Calling " - // + toObj.getClass().getName() - // + "." + m.getName() + "(" - // + paramValue + ")"); - m.invoke(toObj, paramValue); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error( - "Caught exception trying to convert value returned by" - + toClass.getName() - + "." - + m.getName() - + "() to Properties entry", - e); - } - } - } - } - } else { - - // Setter's argument is not a yang-generated class. See - // if it is a List. - - if (List.class.isAssignableFrom(paramClass)) { - - //LOG.debug("Parameter class " + paramClass.getName() - // + " is a List"); - - // Figure out what type of args are in List and pass - // that to toList(). - - Type paramType = m.getGenericParameterTypes()[0]; - Type elementType = ((ParameterizedType) paramType) - .getActualTypeArguments()[0]; - Object paramObj = new LinkedList(); - try { - paramObj = toList(props, propName, - (List) paramObj, (Class) elementType); - } catch (Exception e) { - LOG.error("Caught exception trying to create list expected as argument to " - + toClass.getName() + "." + m.getName()); - } - - if (paramObj != null) { - try { - boolean isAccessible = m.isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - //LOG.debug("Calling " - // + toObj.getClass().getName() + "." - // + m.getName() + "(" + paramValue - // + ")"); - m.invoke(toObj, paramObj); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error( - "Caught exception trying to convert List returned by" - + toClass.getName() + "." - + m.getName() - + "() to Properties entry", - e); - } - } - } else { - - // Setter expects something that is not a List and - // not yang-generated. Just pass the parameter value - - //LOG.debug("Parameter class " - // + paramClass.getName() - // + " is not a yang-generated class or a List"); - - if (paramValue != null) { - - Object constObj = null; - - try { - // See if I can find a constructor I can use - Constructor[] constructors = paramClass - .getConstructors(); - // Is there a String constructor? - for (Constructor c : constructors) { - Class[] cParms = c.getParameterTypes(); - if ((cParms != null) - && (cParms.length == 1)) { - if (String.class - .isAssignableFrom(cParms[0])) { - constObj = c - .newInstance(paramValue); - } - } - } - - if (constObj == null) { - // Is there a Long constructor? - for (Constructor c : constructors) { - Class[] cParms = c - .getParameterTypes(); - if ((cParms != null) - && (cParms.length == 1)) { - if (Long.class - .isAssignableFrom(cParms[0])) { - constObj = c - .newInstance(Long - .parseLong(paramValue)); - } - } - } - - } - - if (constObj != null) { - try { - //LOG.debug("Calling " - // + toObj.getClass() - // .getName() + "." - // + m.getName() + "(" - // + constObj + ")"); - m.invoke(toObj, constObj); - foundValue = true; - } catch (Exception e2) { - LOG.error( - "Caught exception trying to call " - + m.getName(), e2); - } - } else { - try { - boolean isAccessible = m - .isAccessible(); - if (!isAccessible) { - m.setAccessible(true); - } - //LOG.debug("Calling " - // + toObj.getClass() - // .getName() + "." - // + m.getName() + "(" - // + paramValue + ")"); - m.invoke(toObj, paramValue); - if (!isAccessible) { - m.setAccessible(isAccessible); - } - foundValue = true; - - } catch (Exception e) { - LOG.error( - "Caught exception trying to convert value returned by" - + toClass.getName() - + "." - + m.getName() - + "() to Properties entry", - e); - } - } - } catch (Exception e1) { - LOG.warn( - "Could not find a suitable constructor for " - + paramClass.getName(), e1); - } - - /* - * try { boolean isAccessible = - * m.isAccessible(); if (!isAccessible) { - * m.setAccessible(true); } LOG.debug("Calling " - * + toObj.getClass().getName() + "." + - * m.getName() + "(" + paramValue + ")"); - * m.invoke(toObj, paramValue); if - * (!isAccessible) { - * m.setAccessible(isAccessible); } foundValue = - * true; - * - * } catch (Exception e) { LOG.error( - * "Caught exception trying to convert value returned by" - * + toClass.getName() + "." + m.getName() + - * "() to Properties entry", e); } - */ - } - } - } - } // End of section handling "setter" method - } // End of loop through Methods - } // End of section handling yang-generated class - - if (foundValue) { - return (toObj); - } else { - return (null); - } - } - -/* - public static void printPropertyList(PrintStream pstr, String pfx, - Class toClass) { - boolean foundValue = false; - - //LOG.debug("Analyzing " + toClass.getName() + " class : pfx " + pfx); - - if (isYangGenerated(toClass) - && (!Identifier.class.isAssignableFrom(toClass))) { - // Class is yang generated. - //LOG.debug(toClass.getName() + " is a Yang-generated class"); - - if (toClass.getName().endsWith("Key")) { - if (Identifier.class.isAssignableFrom(toClass)) { - //LOG.debug(Identifier.class.getName() - // + " is assignable from " + toClass.getName()); - } else { - - //LOG.debug(Identifier.class.getName() - // + " is NOT assignable from " + toClass.getName()); - } - } - - String propNamePfx = null; - if (pfx.endsWith("]")) { - propNamePfx = pfx; - } else { - - if ((pfx != null) && (pfx.length() > 0)) { - propNamePfx = pfx + "." - + toLowerHyphen(toClass.getSimpleName()); - } else { - propNamePfx = toLowerHyphen(toClass.getSimpleName()); - } - - if (propNamePfx.endsWith("-builder")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - - "-builder".length()); - } - - if (propNamePfx.endsWith("-impl")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - - "-impl".length()); - } - } - - // Iterate through getter methods to figure out values we need to - // set - - for (Method m : toClass.getMethods()) { - //LOG.debug("Is " + m.getName() + " method a getter?"); - if (isGetter(m)) { - //LOG.debug(m.getName() + " is a getter"); - Class returnClass = m.getReturnType(); - - String fieldName = toLowerHyphen(m.getName().substring(3)); - fieldName = fieldName.substring(0, 1).toLowerCase() - + fieldName.substring(1); - - String propName = propNamePfx + "." + fieldName; - - // Is the return type a yang generated class? - if (isYangGenerated(returnClass)) { - // Is it an enum? - if (returnClass.isEnum()) { - //System.out.println(returnClass.getSimpleName()); - //System.out.println(Arrays.asList(returnClass.getEnumConstants())); - - //LOG.debug(m.getName() + " is an Enum"); - pstr.print("\n" + propName + ":Enum:" + Arrays.asList(returnClass.getEnumConstants()) + "\n"); - - } else { - - String simpleName = returnClass.getSimpleName(); - - if ("Ipv4Address".equals(simpleName) || "Ipv6Address".equals(simpleName)) { - //LOG.debug(m.getName()+" is an "+simpleName); - pstr.print("\n" + propName + ":" + simpleName + "\n"); - } else { - printPropertyList(pstr, propNamePfx, returnClass); - } - - } - } else { - - // Setter's argument is not a yang-generated class. See - // if it is a List. - - if (List.class.isAssignableFrom(returnClass)) { - - //LOG.debug("Parameter class " - //+ returnClass.getName() + " is a List"); - - // Figure out what type of args are in List and pass - // that to toList(). - - Type returnType = m.getGenericReturnType(); - Type elementType = ((ParameterizedType) returnType) - .getActualTypeArguments()[0]; - Class elementClass = (Class) elementType; - //LOG.debug("Calling printPropertyList on list type (" - //+ elementClass.getName() - //+ "), pfx is (" - // + pfx - // + "), toClass is (" - // + toClass.getName() + ")"); - printPropertyList( - pstr, - propNamePfx - + "." - + toLowerHyphen(elementClass - .getSimpleName()) + "[]", - elementClass); - - } else if (!returnClass.equals(Class.class)) { - - // Setter expects something that is not a List and - // not yang-generated. Just pass the parameter value - - //LOG.debug("Parameter class " - // + returnClass.getName() - // + " is not a yang-generated class or a List"); - String className=returnClass.getName(); - - //"org.opendaylight.yangtools.yang.binding.Identifier" - int nClassNameIndex = className.lastIndexOf('.'); - String nClassName = className; - if(nClassNameIndex != -1){ - nClassName=className.substring(nClassNameIndex+1); - } - pstr.print("\n" + propName +":" + nClassName +"\n"); - - } - } - } // End of section handling "setter" method - } // End of loop through Methods - } // End of section handling yang-generated class - - } -*/ - - public static Properties prop = new Properties(); - public static ArrayList propList = new ArrayList(); - public static Properties getProperties(PrintStream pstr, String pfx, - Class toClass) { - boolean foundValue = false; - - //LOG.debug("Analyzing " + toClass.getName() + " class : pfx " + pfx); - - if (isYangGenerated(toClass) - && (!Identifier.class.isAssignableFrom(toClass))) { - // Class is yang generated. - //LOG.debug(toClass.getName() + " is a Yang-generated class"); - - if (toClass.getName().endsWith("Key")) { - if (Identifier.class.isAssignableFrom(toClass)) { - //LOG.debug(Identifier.class.getName() - // + " is assignable from " + toClass.getName()); - } else { - - //LOG.debug(Identifier.class.getName() - // + " is NOT assignable from " + toClass.getName()); - } - } - - String propNamePfx = null; - if (pfx.endsWith("]")) { - propNamePfx = pfx; - }else if(pfx.indexOf(".CLASS_FOUND") != -1){ - pfx = pfx.replace(".CLASS_FOUND",""); - propNamePfx = pfx + "." - + toLowerHyphen(toClass.getSimpleName()); - } else { - - if ((pfx != null) && (pfx.length() > 0)) { - propNamePfx = pfx + "." - + toLowerHyphen(toClass.getSimpleName()); - } else { - propNamePfx = toLowerHyphen(toClass.getSimpleName()); - } - - if (propNamePfx.endsWith("-builder")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - - "-builder".length()); - } - - if (propNamePfx.endsWith("-impl")) { - propNamePfx = propNamePfx.substring(0, propNamePfx.length() - - "-impl".length()); - } - } - - // Iterate through getter methods to figure out values we need to - // set - - for (Method m : toClass.getMethods()) { - //LOG.debug("Is " + m.getName() + " method a getter?"); - if (isGetter(m)) { - // LOG.debug(m.getName() + " is a getter"); - Class returnClass = m.getReturnType(); - - String fieldName = toLowerHyphen(m.getName().substring(3)); - if(m != null && m.getName().matches("^is[A-Z].*")){ - fieldName = toLowerHyphen(m.getName().substring(2)); - } - fieldName = fieldName.substring(0, 1).toLowerCase() - + fieldName.substring(1); - - String propName = propNamePfx + "." + fieldName; - //System.out.println("****" + propName); - - // Is the return type a yang generated class? - if (isYangGenerated(returnClass)) { - // Is it an enum? - if (returnClass.isEnum()) { - - //LOG.debug(m.getName() + " is an Enum"); - //pstr.print("\n" + propName); - //pstr.print("\n" + propName + ":Enum:" + Arrays.asList(returnClass.getEnumConstants()) + "\n"); - pstr.print("\"" + propName + ":Enum:" + Arrays.asList(returnClass.getEnumConstants()) + "\","); - prop.setProperty(propName,""); - propList.add(propName); - - } else { - - String simpleName = returnClass.getSimpleName(); - //System.out.println("simpleName:" + simpleName); - - if ("Ipv4Address".equals(simpleName) || "Ipv6Address".equals(simpleName) || "IpAddress".equals(simpleName)) { - //LOG.debug(m.getName()+" is an "+simpleName); - //pstr.print("\n" + propName); - //pstr.print("\n" + propName + ":" + simpleName + "\n"); - pstr.print("\"" + propName + ":" + simpleName + "\","); - prop.setProperty(propName,""); - propList.add(propName); - } else { - boolean isString = false; - boolean isNumber = false; - boolean isBoolean = false; - boolean isIdentifier = false; - //System.out.println("simpleName:" + simpleName); - //System.out.println("propName:" + propName); - for(Method mthd : returnClass.getMethods()){ - String methodName = mthd.getName(); - //System.out.println("methodName:" + methodName); - if(methodName.equals("getValue")){ - Class retType = mthd.getReturnType(); - //System.out.println("retType:" + retType); - isString = String.class.isAssignableFrom(retType); - isNumber = Number.class.isAssignableFrom(retType); - isBoolean = Boolean.class.isAssignableFrom(retType); - isIdentifier = Identifier.class.isAssignableFrom(retType); - //System.out.println("isString:" + isString); - //System.out.println("isNumber:" + isNumber); - //System.out.println("isNumber:" + isNumber); - break; - } - } - - if(isString){ - pstr.print("\"" + propName + ":String\","); - prop.setProperty(propName,""); - propList.add(propName); - }else if(isNumber){ - pstr.print("\"" + propName + ":Number\","); - prop.setProperty(propName,""); - propList.add(propName); - }else if(isBoolean){ - pstr.print("\"" + propName + ":Boolean\","); - prop.setProperty(propName,""); - propList.add(propName); - }else if(isIdentifier){ - //System.out.println("isIdentifier"); - //isIdentifer so skipping - continue; - }else{ - /* - System.out.println("fieldName:" + fieldName); - System.out.println("simpleName:" + simpleName); - System.out.println("returnClass:" + returnClass); - System.out.println("pstr:" + pstr); - System.out.println("propNamePfx:" + propNamePfx); - */ - getProperties(pstr, propNamePfx + ".CLASS_FOUND", returnClass); - } - } - - } - } else { - - // Setter's argument is not a yang-generated class. See - // if it is a List. - - if (List.class.isAssignableFrom(returnClass)) { - - //LOG.debug("Parameter class " - // + returnClass.getName() + " is a List"); - - // Figure out what type of args are in List and pass - // that to toList(). - - Type returnType = m.getGenericReturnType(); - Type elementType = ((ParameterizedType) returnType) - .getActualTypeArguments()[0]; - Class elementClass = (Class) elementType; - //LOG.debug("Calling printPropertyList on list type (" - //+ elementClass.getName() - // + "), pfx is (" - // + pfx - // + "), toClass is (" - // + toClass.getName() + ")"); - //System.out.println("List propNamePfx:" + propNamePfx+ "." + toLowerHyphen(elementClass.getSimpleName()) + "[]"); - if(String.class.isAssignableFrom(elementClass)){ - pstr.print("\"" + propName + ":[String,String,...]\","); - prop.setProperty(propName,""); - propList.add(propName); - }else if(Number.class.isAssignableFrom(elementClass)){ - pstr.print("\"" + propName + ":[Number,Number,...]\","); - prop.setProperty(propName,""); - propList.add(propName); - }else if(Boolean.class.isAssignableFrom(elementClass)){ - pstr.print("\"" + propName + ":[Boolean,Boolean,...]\","); - prop.setProperty(propName,""); - propList.add(propName); - }else if(Identifier.class.isAssignableFrom(elementClass)){ - continue; - }else{ - getProperties( - pstr, - propNamePfx - + "." - + toLowerHyphen(elementClass - .getSimpleName()) + "[]", - elementClass); - } - - } else if (!returnClass.equals(Class.class)) { - - // Setter expects something that is not a List and - // not yang-generated. Just pass the parameter value - - //LOG.debug("Parameter class " - // + returnClass.getName() - // + " is not a yang-generated class or a List"); - - //pstr.print("\n" + propName); - String className=returnClass.getName(); - int nClassNameIndex = className.lastIndexOf('.'); - String nClassName = className; - if(nClassNameIndex != -1){ - nClassName=className.substring(nClassNameIndex+1); - } - boolean isString = String.class.isAssignableFrom(returnClass); - boolean isNumber = Number.class.isAssignableFrom(returnClass); - boolean isBoolean = Boolean.class.isAssignableFrom(returnClass); - //pstr.print("\n" + propName +":" + nClassName +"\n"); - boolean isIdentifier = Identifier.class.isAssignableFrom(returnClass); - if(!isIdentifier && !nClassName.equals("[C")){ - if(isNumber){ - pstr.print("\"" + propName +":Number\","); - }else if(isBoolean){ - pstr.print("\"" + propName +":Boolean\","); - }else{ - if(nClassName.equals("[B")){ - pstr.print("\"" + propName +":Binary\","); - }else{ - pstr.print("\"" + propName +":" + nClassName +"\","); - } - } - prop.setProperty(propName,""); - propList.add(propName); - } - - } - } - } // End of section handling "setter" method - } // End of loop through Methods - } // End of section handling yang-generated class - - return prop; - } - - public static boolean isYangGenerated(Class c) { - if (c == null) { - return (false); - } else { - //System.out.println(c.getName()); - return (c.getName().startsWith("org.opendaylight.yang.gen.")); - } - } - - public static boolean isIpv4Address(Class c) { - - if (c == null ) { - return (false); - } - String simpleName = c.getSimpleName(); - return ("Ipv4Address".equals(simpleName)) ; - } - - public static boolean isIpv6Address(Class c) { - - if (c == null ) { - return (false); - } - String simpleName = c.getSimpleName(); - return ("Ipv6Address".equals(simpleName)) ; - } - - public static String toLowerHyphen(String inStr) { - if (inStr == null) { - return (null); - } - - String str = inStr.substring(0, 1).toLowerCase(); - if (inStr.length() > 1) { - str = str + inStr.substring(1); - } - - String regex = "(([a-z0-9])([A-Z]))"; - String replacement = "$2-$3"; - - String retval = str.replaceAll(regex, replacement).toLowerCase(); - - //LOG.debug("Converting " + inStr + " => " + str + " => " + retval); - return (retval); - } - - public static String toUpperCamelCase(String inStr) { - if (inStr == null) { - return (null); - } - - String[] terms = inStr.split("-"); - StringBuffer sbuff = new StringBuffer(); - // Check if string begins with a digit - if (Character.isDigit(inStr.charAt(0))) { - sbuff.append('_'); - } - for (String term : terms) { - sbuff.append(term.substring(0, 1).toUpperCase()); - if (term.length() > 1) { - sbuff.append(term.substring(1)); - } - } - return (sbuff.toString()); - - } - - public static boolean isGetter(Method m) { - //System.out.println(m); - if (m == null) { - return (false); - } - - if (Modifier.isPublic(m.getModifiers()) - && (m.getParameterTypes().length == 0)) { - if ((m.getName().matches("^is[A-Z].*") || m.getName().matches("^get[A-Z].*")) - && m.getReturnType().equals(Boolean.class)) { - return (true); - } - if (m.getName().matches("^get[A-Z].*") - && !m.getReturnType().equals(void.class)) { - return (true); - } - - } - - return (false); - } - - public static boolean isSetter(Method m) { - if (m == null) { - return (false); - } - - if (Modifier.isPublic(m.getModifiers()) - && (m.getParameterTypes().length == 1)) { - if (m.getName().matches("^set[A-Z].*")) { - Class[] paramTypes = m.getParameterTypes(); - if (paramTypes[0].isAssignableFrom(Identifier.class) - || Identifier.class.isAssignableFrom(paramTypes[0])) { - return (false); - } else { - return (true); - } - } - - } - - return (false); - } - - public static void main(String[] args){ - try{ - PrintStream ps = new PrintStream(new FileOutputStream(FileDescriptor.out)); - PrintYangToProp printYangToProp = new PrintYangToProp(); - String className = args[0]; - //ClassLoader classLoader = PrintYangToProp.class.getClassLoader(); - //Class aClass = classLoader.loadClass(className); - Class cl = Class.forName(className); - //printPropertyList(ps,"",cl); - //JsonObject jsonObj = Json.createObjectBuilder().build(); - Properties p = getProperties(ps,"",cl); - //System.out.println(p); - - }catch(Exception e){ - e.printStackTrace(); - } - } - - -} diff --git a/dgbuilder/tools/getRpcsClassFromYang.sh b/dgbuilder/tools/getRpcsClassFromYang.sh index b0703152..15b74dfa 100755 --- a/dgbuilder/tools/getRpcsClassFromYang.sh +++ b/dgbuilder/tools/getRpcsClassFromYang.sh @@ -17,7 +17,7 @@ do #echo $i export CLASSPATH=$CLASSPATH:$i done -export CLASSPATH=$CLASSPATH:${toolsDir}/printYangToProp.jar:. +export CLASSPATH=$CLASSPATH:. allProps="" for rpc in $rpcs do @@ -26,8 +26,8 @@ className=$(jar -tvf ${jarFile}|grep "org/opendaylight/yang/gen/"|grep -w "${rp inputProps="" if [ "$className" != "" ] then - #java -cp $CLASSPATH PrintYangToProp $className 2>/dev/null|grep '*' |cut -d'*' -f2|sed -e "s/^[ \t]*//g"|sed -e "s/^/\t\t\"/g"|sed -e "s/$/\",/g" - inputProps=$(java -cp $CLASSPATH PrintYangToProp $className 2>${toolsDir}/tmpws/logs/err.log) + #java -cp $CLASSPATH org.onap.ccsdk.sli.core.sli.PrintYangToProp $className 2>/dev/null|grep '*' |cut -d'*' -f2|sed -e "s/^[ \t]*//g"|sed -e "s/^/\t\t\"/g"|sed -e "s/$/\",/g" + inputProps=$(java -cp $CLASSPATH org.onap.ccsdk.sli.core.sli.PrintYangToProp $className 2>${toolsDir}/tmpws/logs/err.log) fi className=$(jar -tvf ${jarFile}|grep "org/opendaylight/yang/gen/"|grep -w "${rpcVal}Output"|grep -v grep|awk '{print $NF}'|sed -e 's/\//./g'|sed -e 's/.class$//g') #echo $inputProps @@ -35,8 +35,8 @@ className=$(jar -tvf ${jarFile}|grep "org/opendaylight/yang/gen/"|grep -w "${rpc outputProps="" if [ "$className" != "" ] then - #java -cp $CLASSPATH PrintYangToProp $className 2>/dev/null|grep '*' |cut -d'*' -f2|sed -e "s/^[ \t]*//g"|sed -e "s/^/\t\t\"/g"|sed -e "s/$/\",/g" - outputProps=$(java -cp $CLASSPATH PrintYangToProp $className 2>${toolsDir}/tmpws/logs/err.log) + #java -cp $CLASSPATH org.onap.ccsdk.sli.core.sli.PrintYangToProp $className 2>/dev/null|grep '*' |cut -d'*' -f2|sed -e "s/^[ \t]*//g"|sed -e "s/^/\t\t\"/g"|sed -e "s/$/\",/g" + outputProps=$(java -cp $CLASSPATH org.onap.ccsdk.sli.core.sli.PrintYangToProp $className 2>${toolsDir}/tmpws/logs/err.log) fi if [ -z "$allProps" ] then diff --git a/dgbuilder/tools/pom.xml_base b/dgbuilder/tools/pom.xml_base index b54c27f6..a0675f39 100644 --- a/dgbuilder/tools/pom.xml_base +++ b/dgbuilder/tools/pom.xml_base @@ -2,13 +2,13 @@ 4.0.0 - org.onap.ccsdk.distribution - distribution-root - 0.1.0-SNAPSHOT + org.onap.ccsdk.sli.core + ccsdk-sli-core + LATEST yangApp-model bundle - 1.0.0-SNAPSHOT + 1.0.0-SNAPSHOT @@ -43,7 +43,7 @@ ${yang.file.directory} - org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl + org.opendaylight.mdsal.binding.maven.api.gen.plugin.CodeGeneratorImpl ${salGeneratorPath} diff --git a/dgbuilder/tools/printYangProps.sh b/dgbuilder/tools/printYangProps.sh index 7d1d0faf..e34d84cf 100755 --- a/dgbuilder/tools/printYangProps.sh +++ b/dgbuilder/tools/printYangProps.sh @@ -5,4 +5,4 @@ then echo "Usage $0 className_without_the_dot_class_ext" exit fi - java PrintYangToProp $1 + java org.onap.ccsdk.sli.core.sli.PrintYangToProp $1 diff --git a/dgbuilder/tools/printYangToProp.jar b/dgbuilder/tools/printYangToProp.jar deleted file mode 100644 index 01b7310775b67d9ba012ba64e477af5a3d88d23a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9010 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 -- 2.16.6