public String[] getMetaAttributeNames(final String domainName) {
    if (PmdDataFactoryModule.META_DOMAIN.equals(domainName)) {
      return properties.keySet().toArray(new String[properties.size()]);
    }

    return backend.getMetaAttributeNames(domainName);
  }
  public Object getMetaAttribute(
      final String domain,
      final String name,
      final Class type,
      final DataAttributeContext context,
      final Object defaultValue) {
    if (domain == null) {
      throw new NullPointerException();
    }
    if (name == null) {
      throw new NullPointerException();
    }
    if (context == null) {
      throw new NullPointerException();
    }

    if (PmdDataFactoryModule.META_DOMAIN.equals(domain)) {
      final Object value = concept.getProperty(name);
      if (value == null) {
        return defaultValue;
      }

      // this metadata layer is not cloneable, so malicious client code may
      // modify metadata objects.
      // We cant solve the problem here, so all we can do is hope and pray.
      return convertFromPmd(value, type, defaultValue, context);
    }

    return backend.getMetaAttribute(domain, name, type, context, defaultValue);
  }
  public ConceptQueryMapper getMetaAttributeMapper(final String domain, final String name) {

    if (PmdDataFactoryModule.META_DOMAIN.equals(domain)) {
      final Object value = properties.get(name);
      if (value == null) {
        return DefaultConceptQueryMapper.INSTANCE;
      }

      // this metadata layer is not cloneable, so malicious client code may
      // modify metadata objects.
      // We cant solve the problem here, so all we can do is hope and pray.

      final DataAttributeContext context = new DefaultDataAttributeContext();
      for (int i = 0; i < conceptMappers.size(); i++) {
        final ConceptQueryMapper conceptMapper = conceptMappers.get(i);
        final Object ivalue = conceptMapper.getValue(value, null, context);
        if (ivalue != null) {
          return conceptMapper;
        }
      }
    }

    return DefaultConceptQueryMapper.INSTANCE;
  }