X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Forg%2Fonap%2Fschema%2FOxmModelLoader.java;h=fb41fc9a5e7774eda68988fe5c088fbe62239b42;hb=f6a319cdda918e33c1bf5cffbb356dd0b9feb069;hp=8f5560261c9027c37ce67ddd9537784085ef8a24;hpb=00832f054dd0c21492af531548e321ea25cdb8b4;p=aai%2Fgizmo.git diff --git a/src/main/java/org/onap/schema/OxmModelLoader.java b/src/main/java/org/onap/schema/OxmModelLoader.java index 8f55602..fb41fc9 100644 --- a/src/main/java/org/onap/schema/OxmModelLoader.java +++ b/src/main/java/org/onap/schema/OxmModelLoader.java @@ -20,36 +20,54 @@ */ package org.onap.schema; +import com.google.common.base.CaseFormat; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.annotation.PostConstruct; import javax.ws.rs.core.Response.Status; +import org.eclipse.persistence.dynamic.DynamicType; +import org.eclipse.persistence.internal.oxm.mappings.Descriptor; import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext; import org.onap.aai.cl.eelf.LoggerFactory; import org.onap.aai.nodes.NodeIngestor; -import org.onap.aai.setup.ConfigTranslator; -import org.onap.aai.setup.SchemaLocationsBean; -import org.onap.aai.setup.Version; +import org.onap.aai.setup.SchemaVersion; +import org.onap.aai.setup.Translator; import org.onap.crud.exception.CrudException; import org.onap.crud.logging.CrudServiceMsgs; -import org.onap.schema.util.SchemaIngestPropertyReader; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +@Component public class OxmModelLoader { - private static Map versionContextMap = - new ConcurrentHashMap<>(); + private static Translator translator; + private static NodeIngestor nodeIngestor; - static final Pattern p = Pattern.compile("aai_oxm_(.*).xml"); - static final Pattern versionPattern = Pattern.compile("V(\\d*)"); + private static Map versionContextMap = new ConcurrentHashMap<>(); + private static Map> xmlElementLookup = new ConcurrentHashMap<>(); + + final static Pattern versionPattern = Pattern.compile("(?i)v(\\d*)"); private static org.onap.aai.cl.api.Logger logger = LoggerFactory.getInstance().getLogger(OxmModelLoader.class.getName()); - private OxmModelLoader() { + private OxmModelLoader() { } + + @Autowired + public OxmModelLoader(Translator translator, NodeIngestor nodeIngestor) { + OxmModelLoader.translator = translator; + OxmModelLoader.nodeIngestor = nodeIngestor; + } + + @PostConstruct + public void init() throws CrudException { + OxmModelLoader.loadModels(); } /** @@ -59,29 +77,24 @@ public class OxmModelLoader { * @throws IOException * */ - public static synchronized void loadModels() throws CrudException { - SchemaIngestPropertyReader schemaIngestPropertyReader = new SchemaIngestPropertyReader(); - - SchemaLocationsBean schemaLocationsBean = new SchemaLocationsBean(); - schemaLocationsBean.setNodeDirectory(schemaIngestPropertyReader.getNodeDir()); - ConfigTranslator configTranslator = new OxmModelConfigTranslator(schemaLocationsBean); - NodeIngestor nodeIngestor = new NodeIngestor(configTranslator); + public synchronized static void loadModels() throws CrudException { if (logger.isDebugEnabled()) { logger.debug("Loading OXM Models"); } - for (Version oxmVersion : Version.values()) { + for (SchemaVersion oxmVersion : translator.getSchemaVersions().getVersions()) { DynamicJAXBContext jaxbContext = nodeIngestor.getContextForVersion(oxmVersion); if (jaxbContext != null) { - loadModel(oxmVersion.toString().toLowerCase(), jaxbContext); + loadModel(oxmVersion.toString(), jaxbContext); } } } - private static synchronized void loadModel(String oxmVersion, DynamicJAXBContext jaxbContext) { + private synchronized static void loadModel(String oxmVersion, DynamicJAXBContext jaxbContext) { versionContextMap.put(oxmVersion, jaxbContext); + loadXmlLookupMap(oxmVersion, jaxbContext); logger.info(CrudServiceMsgs.LOADED_OXM_FILE, oxmVersion); } @@ -100,7 +113,7 @@ public class OxmModelLoader { if (versionContextMap == null || versionContextMap.isEmpty()) { loadModels(); } else if (!versionContextMap.containsKey(version)) { - logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "Error loading oxm model: " + version); + logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "Error loading oxm model: " + version); throw new CrudException("Error loading oxm model: " + version, Status.INTERNAL_SERVER_ERROR); } @@ -117,8 +130,7 @@ public class OxmModelLoader { // If there are still no models available, then there's not much we can do... if (versionContextMap.isEmpty()) { logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "No available OXM schemas to get latest version for."); - throw new CrudException("No available OXM schemas to get latest version for.", - Status.INTERNAL_SERVER_ERROR); + throw new CrudException("No available OXM schemas to get latest version for.", Status.INTERNAL_SERVER_ERROR); } // Iterate over the available model versions to determine which is the most @@ -127,10 +139,10 @@ public class OxmModelLoader { String latestVersionStr = null; for (String versionKey : versionContextMap.keySet()) { - Matcher matcher = versionPattern.matcher(versionKey.toUpperCase()); + Matcher matcher = versionPattern.matcher(versionKey); if (matcher.find()) { - int currentVersion = Integer.parseInt(matcher.group(1)); + int currentVersion = Integer.valueOf(matcher.group(1)); if ((latestVersion == null) || (currentVersion > latestVersion)) { latestVersion = currentVersion; @@ -142,38 +154,6 @@ public class OxmModelLoader { return latestVersionStr; } - /** - * Retrieves the list of all Loaded OXM versions. - * - * @return - A List of Strings of all loaded OXM versions. - * - * @throws CrudException - */ - public static List getLoadedOXMVersions() throws CrudException { - - // If we haven't already loaded in the available OXM models, then do so now. - if (versionContextMap == null || versionContextMap.isEmpty()) { - loadModels(); - } - - // If there are still no models available, then there's not much we can do... - if (versionContextMap.isEmpty()) { - logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "No available OXM schemas to get versions for."); - throw new CrudException("No available OXM schemas to get versions for.", - Status.INTERNAL_SERVER_ERROR); - } - - List versions = new ArrayList (); - for (String versionKey : versionContextMap.keySet()) { - - Matcher matcher = versionPattern.matcher(versionKey.toUpperCase()); - if (matcher.find()) { - versions.add ( "V" + matcher.group ( 1 ) ); - } - } - return versions; - } - /** * Retrieves the map of all JAXB context objects that have been created by importing the * available OXM model schemas. @@ -192,4 +172,89 @@ public class OxmModelLoader { public static void setVersionContextMap(Map versionContextMap) { OxmModelLoader.versionContextMap = versionContextMap; } + + + public static void loadXmlLookupMap(String version, DynamicJAXBContext jaxbContext ) { + + @SuppressWarnings("rawtypes") + List descriptorsList = jaxbContext.getXMLContext().getDescriptors(); + HashMap types = new HashMap(); + + for (@SuppressWarnings("rawtypes") + Descriptor desc : descriptorsList) { + + DynamicType entity = jaxbContext.getDynamicType(desc.getAlias()); + String entityName = desc.getDefaultRootElement(); + types.put(entityName, entity); + } + xmlElementLookup.put(version, types); + } + + + public static DynamicType getDynamicTypeForVersion(String version, String type) throws CrudException { + + DynamicType dynamicType; + // If we haven't already loaded in the available OXM models, then do so now. + if (versionContextMap == null || versionContextMap.isEmpty()) { + loadModels(); + } else if (!versionContextMap.containsKey(version)) { + logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "Error loading oxm model: " + version); + throw new CrudException("Error loading oxm model: " + version, Status.INTERNAL_SERVER_ERROR); + } + + // First try to match the Java-type based on hyphen to camel case + // translation + String javaTypeName = CaseFormat.LOWER_HYPHEN.to(CaseFormat.UPPER_CAMEL, type); + dynamicType = versionContextMap.get(version).getDynamicType(javaTypeName); + + if (xmlElementLookup.containsKey(version)) { + if (dynamicType == null) { + // Try to lookup by xml root element by exact match + dynamicType = xmlElementLookup.get(version).get(type); + } + + if (dynamicType == null) { + // Try to lookup by xml root element by lowercase + dynamicType = xmlElementLookup.get(version).get(type.toLowerCase()); + } + + if (dynamicType == null) { + // Direct lookup as java-type name + dynamicType = versionContextMap.get(version).getDynamicType(type); + } + } + + return dynamicType; + } + + /** + * Retrieves the list of all Loaded OXM versions. + * + * @return - A List of Strings of all loaded OXM versions. + * + * @throws CrudException + */ + public static List getLoadedOXMVersions() throws CrudException { + + // If we haven't already loaded in the available OXM models, then do so now. + if (versionContextMap == null || versionContextMap.isEmpty()) { + loadModels(); + } + + // If there are still no models available, then there's not much we can do... + if (versionContextMap.isEmpty()) { + logger.error(CrudServiceMsgs.OXM_LOAD_ERROR, "No available OXM schemas to get versions for."); + throw new CrudException("No available OXM schemas to get versions for.", Status.INTERNAL_SERVER_ERROR); + } + + List versions = new ArrayList(); + for (String versionKey : versionContextMap.keySet()) { + + Matcher matcher = versionPattern.matcher(versionKey); + if (matcher.find()) { + versions.add ("V"+ matcher.group(1)); + } + } + return versions; + } }