code: JPAPUnitInfo getPuInfo(String puName) {
          final boolean isTraceOn = TraceComponent.isAnyTracingEnabled();
          if (isTraceOn && tc.isEntryEnabled())
              Tr.entry(tc, "getPuInfo : " + puName);
  
          JPAPUnitInfo rtnVal = null;
  
          synchronized (pxmlsInfo) {
              // Check if puName uses the '#' syntax.
              int archiveEnd;
              if (scope == JPAPuScope.EAR_Scope && (archiveEnd = puName.indexOf('#')) != -1) {
                  String archiveName = puName.substring(0, archiveEnd);
                  puName = puName.substring(archiveEnd + 1);
                  JPAPxmlInfo pxmlInfo = pxmlsInfo.get(archiveName);
                  if (pxmlInfo != null) {
                      rtnVal = pxmlInfo.getPuInfo(puName);
                  }
              } else {
                  for (JPAPxmlInfo pxmlInfo : pxmlsInfo.values()) {
                      rtnVal = pxmlInfo.getPuInfo(puName);
                      if (rtnVal != null) {
                          break;
                      }
                  }
              }
          }
  
          if (isTraceOn && tc.isEntryEnabled())
              Tr.exit(tc, "getPuInfo : " + (rtnVal != null ? rtnVal.getPersistenceUnitName() : "PU not found."));
          return rtnVal;
      }
docs: Returns the PersistenceUnitInfo object represents the persistence unit (puName) or null
  if not found. This method also processes relative form of persistence unit definition.