public static ResourceSchema getResourceSchema(
     PrismObject<ResourceType> resource, PrismContext prismContext) throws SchemaException {
   Element resourceXsdSchema = ResourceTypeUtil.getResourceXsdSchema(resource);
   if (resourceXsdSchema == null) {
     return null;
   }
   Object userDataEntry = resource.getUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA);
   if (userDataEntry != null) {
     if (userDataEntry instanceof ResourceSchema) {
       return (ResourceSchema) userDataEntry;
     } else {
       throw new IllegalStateException(
           "Expected ResourceSchema under user data key "
               + USER_DATA_KEY_PARSED_RESOURCE_SCHEMA
               + "in "
               + resource
               + ", but got "
               + userDataEntry.getClass());
     }
   } else {
     InternalMonitor.recordResourceSchemaParse();
     ResourceSchemaImpl parsedSchema =
         ResourceSchemaImpl.parse(
             resourceXsdSchema, "resource schema of " + resource, prismContext);
     if (parsedSchema == null) {
       throw new IllegalStateException("Parsed schema is null: most likely an internall error");
     }
     resource.setUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA, parsedSchema);
     parsedSchema.setNamespace(ResourceTypeUtil.getResourceNamespace(resource));
     return parsedSchema;
   }
 }
  public static RefinedResourceSchema getRefinedSchema(
      PrismObject<ResourceType> resource, PrismContext prismContext) throws SchemaException {
    if (resource == null) {
      throw new SchemaException("Could not get refined schema, resource does not exist.");
    }

    Object userDataEntry = resource.getUserData(USER_DATA_KEY_REFINED_SCHEMA);
    if (userDataEntry != null) {
      if (userDataEntry instanceof RefinedResourceSchema) {
        return (RefinedResourceSchema) userDataEntry;
      } else {
        throw new IllegalStateException(
            "Expected RefinedResourceSchema under user data key "
                + USER_DATA_KEY_REFINED_SCHEMA
                + "in "
                + resource
                + ", but got "
                + userDataEntry.getClass());
      }
    } else {
      RefinedResourceSchema refinedSchema = parse(resource, prismContext);
      resource.setUserData(USER_DATA_KEY_REFINED_SCHEMA, refinedSchema);
      return refinedSchema;
    }
  }
 public static void setParsedResourceSchemaConditional(
     ResourceType resourceType, ResourceSchema parsedSchema) {
   if (hasParsedSchema(resourceType)) {
     return;
   }
   PrismObject<ResourceType> resource = resourceType.asPrismObject();
   resource.setUserData(USER_DATA_KEY_PARSED_RESOURCE_SCHEMA, parsedSchema);
 }