From 6438c65381e7b9729fa19656a4750acee09ac58e Mon Sep 17 00:00:00 2001
From: lotte <lotte_hofstede@hotmail.com>
Date: Thu, 25 Apr 2019 17:13:58 +0200
Subject: [PATCH] continued refactoring resource type factories

---
 .../metadata-registry.actions.ts              |  4 +-
 .../metadata-registry.component.ts            |  2 +-
 .../metadata-registry.reducers.ts             |  4 +-
 .../metadata-schema-form.component.ts         |  2 +-
 .../metadata-field-form.component.ts          |  4 +-
 .../metadata-schema.component.ts              |  4 +-
 .../edit-in-place-field.component.ts          |  2 +-
 src/app/core/auth/auth-object-factory.ts      | 29 -------
 .../auth/auth-response-parsing.service.ts     |  6 +-
 .../cache/models/normalized-object-factory.ts | 85 -------------------
 src/app/core/cache/response.models.ts         |  5 +-
 .../config/models/config-object-factory.ts    | 36 --------
 ...zed-config-submission-definitions.model.ts |  2 +-
 ...ormalized-config-submission-forms.model.ts |  5 ++
 ...malized-config-submission-section.model.ts |  5 ++
 .../data/base-response-parsing.service.ts     | 18 ++--
 .../data/metadatafield-parsing.service.ts     |  4 +-
 .../normalized-authority-value.model.ts       |  3 +
 ...registry-metadataschemas-response.model.ts |  2 +-
 .../core/shared/resource-type.decorator.ts    |  8 +-
 src/app/core/shared/resource-type.ts          |  3 +-
 21 files changed, 47 insertions(+), 186 deletions(-)
 delete mode 100644 src/app/core/auth/auth-object-factory.ts
 delete mode 100644 src/app/core/cache/models/normalized-object-factory.ts
 delete mode 100644 src/app/core/config/models/config-object-factory.ts

diff --git a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.actions.ts b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.actions.ts
index 7358123462..96f9d345f5 100644
--- a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.actions.ts
+++ b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.actions.ts
@@ -1,7 +1,7 @@
 import { Action } from '@ngrx/store';
 import { type } from '../../../shared/ngrx/type';
-import { MetadataSchema } from '../../../core/metadata/metadataschema.model';
-import { MetadataField } from '../../../core/metadata/metadatafield.model';
+import { MetadataSchema } from '../../../core/metadata/metadata-schema.model';
+import { MetadataField } from '../../../core/metadata/metadata-field.model';
 
 /**
  * For each action type in an action group, make a simple
diff --git a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.ts b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.ts
index 88c807e3bc..302974b5c2 100644
--- a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.ts
+++ b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.component.ts
@@ -3,7 +3,6 @@ import { RegistryService } from '../../../core/registry/registry.service';
 import { Observable, combineLatest as observableCombineLatest } from 'rxjs';
 import { RemoteData } from '../../../core/data/remote-data';
 import { PaginatedList } from '../../../core/data/paginated-list';
-import { MetadataSchema } from '../../../core/metadata/metadataschema.model';
 import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
 import { map, take } from 'rxjs/operators';
 import { hasValue } from '../../../shared/empty.util';
@@ -12,6 +11,7 @@ import { zip } from 'rxjs/internal/observable/zip';
 import { NotificationsService } from '../../../shared/notifications/notifications.service';
 import { Route, Router } from '@angular/router';
 import { TranslateService } from '@ngx-translate/core';
+import { MetadataSchema } from '../../../core/metadata/metadata-schema.model';
 
 @Component({
   selector: 'ds-metadata-registry',
diff --git a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.reducers.ts b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.reducers.ts
index d20e3d5bcc..e805c8b8fc 100644
--- a/src/app/+admin/admin-registries/metadata-registry/metadata-registry.reducers.ts
+++ b/src/app/+admin/admin-registries/metadata-registry/metadata-registry.reducers.ts
@@ -1,4 +1,3 @@
-import { MetadataSchema } from '../../../core/metadata/metadataschema.model';
 import {
   MetadataRegistryAction,
   MetadataRegistryActionTypes,
@@ -9,7 +8,8 @@ import {
   MetadataRegistrySelectFieldAction,
   MetadataRegistrySelectSchemaAction
 } from './metadata-registry.actions';
-import { MetadataField } from '../../../core/metadata/metadatafield.model';
+import { MetadataField } from '../../../core/metadata/metadata-field.model';
+import { MetadataSchema } from '../../../core/metadata/metadata-schema.model';
 
 /**
  * The metadata registry state.
diff --git a/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts b/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts
index 23a5765058..23e7309a00 100644
--- a/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts
+++ b/src/app/+admin/admin-registries/metadata-registry/metadata-schema-form/metadata-schema-form.component.ts
@@ -9,9 +9,9 @@ import { FormGroup } from '@angular/forms';
 import { RegistryService } from '../../../../core/registry/registry.service';
 import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service';
 import { take } from 'rxjs/operators';
-import { MetadataSchema } from '../../../../core/metadata/metadataschema.model';
 import { TranslateService } from '@ngx-translate/core';
 import { combineLatest } from 'rxjs/internal/observable/combineLatest';
+import { MetadataSchema } from '../../../../core/metadata/metadata-schema.model';
 
 @Component({
   selector: 'ds-metadata-schema-form',
diff --git a/src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts b/src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts
index 2da2b45021..0811530343 100644
--- a/src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts
+++ b/src/app/+admin/admin-registries/metadata-schema/metadata-field-form/metadata-field-form.component.ts
@@ -1,5 +1,4 @@
 import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';
-import { MetadataSchema } from '../../../../core/metadata/metadataschema.model';
 import {
   DynamicFormControlModel,
   DynamicFormLayout,
@@ -8,10 +7,11 @@ import {
 import { FormGroup } from '@angular/forms';
 import { RegistryService } from '../../../../core/registry/registry.service';
 import { FormBuilderService } from '../../../../shared/form/builder/form-builder.service';
-import { MetadataField } from '../../../../core/metadata/metadatafield.model';
 import { take } from 'rxjs/operators';
 import { TranslateService } from '@ngx-translate/core';
 import { combineLatest } from 'rxjs/internal/observable/combineLatest';
+import { MetadataSchema } from '../../../../core/metadata/metadata-schema.model';
+import { MetadataField } from '../../../../core/metadata/metadata-field.model';
 
 @Component({
   selector: 'ds-metadata-field-form',
diff --git a/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.ts b/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.ts
index bdc7d5ed27..2974c1c087 100644
--- a/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.ts
+++ b/src/app/+admin/admin-registries/metadata-schema/metadata-schema.component.ts
@@ -4,8 +4,6 @@ import { ActivatedRoute, Router } from '@angular/router';
 import { Observable, combineLatest as observableCombineLatest } from 'rxjs';
 import { RemoteData } from '../../../core/data/remote-data';
 import { PaginatedList } from '../../../core/data/paginated-list';
-import { MetadataField } from '../../../core/metadata/metadatafield.model';
-import { MetadataSchema } from '../../../core/metadata/metadataschema.model';
 import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
 import { map, take } from 'rxjs/operators';
 import { hasValue } from '../../../shared/empty.util';
@@ -13,6 +11,8 @@ import { RestResponse } from '../../../core/cache/response.models';
 import { zip } from 'rxjs/internal/observable/zip';
 import { NotificationsService } from '../../../shared/notifications/notifications.service';
 import { TranslateService } from '@ngx-translate/core';
+import { MetadataField } from '../../../core/metadata/metadata-field.model';
+import { MetadataSchema } from '../../../core/metadata/metadata-schema.model';
 
 @Component({
   selector: 'ds-metadata-schema',
diff --git a/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts b/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts
index 0b9bc62c55..1722cde8bc 100644
--- a/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts
+++ b/src/app/+item-page/edit-item-page/item-metadata/edit-in-place-field/edit-in-place-field.component.ts
@@ -4,13 +4,13 @@ import { RegistryService } from '../../../../core/registry/registry.service';
 import { cloneDeep } from 'lodash';
 import { BehaviorSubject, Observable, of as observableOf } from 'rxjs';
 import { map, take } from 'rxjs/operators';
-import { MetadataField } from '../../../../core/metadata/metadatafield.model';
 import { InputSuggestion } from '../../../../shared/input-suggestions/input-suggestions.model';
 import { FieldChangeType } from '../../../../core/data/object-updates/object-updates.actions';
 import { FieldUpdate } from '../../../../core/data/object-updates/object-updates.reducer';
 import { ObjectUpdatesService } from '../../../../core/data/object-updates/object-updates.service';
 import { NgModel } from '@angular/forms';
 import { MetadatumViewModel } from '../../../../core/shared/metadata.models';
+import { MetadataField } from '../../../../core/metadata/metadata-field.model';
 
 @Component({
   // tslint:disable-next-line:component-selector
diff --git a/src/app/core/auth/auth-object-factory.ts b/src/app/core/auth/auth-object-factory.ts
deleted file mode 100644
index 02458f4e3e..0000000000
--- a/src/app/core/auth/auth-object-factory.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { AuthType } from './auth-type';
-import { GenericConstructor } from '../shared/generic-constructor';
-import { NormalizedAuthStatus } from './models/normalized-auth-status.model';
-import { NormalizedEPerson } from '../eperson/models/normalized-eperson.model';
-import { NormalizedObject } from '../cache/models/normalized-object.model';
-import { CacheableObject } from '../cache/object-cache.reducer';
-import { NormalizedGroup } from '../eperson/models/normalized-group.model';
-
-export class AuthObjectFactory {
-  public static getConstructor(type): GenericConstructor<NormalizedObject<CacheableObject>> {
-    switch (type) {
-      case AuthType.EPerson: {
-        return NormalizedEPerson
-      }
-
-      case AuthType.Group: {
-        return NormalizedGroup
-      }
-
-      case AuthType.Status: {
-        return NormalizedAuthStatus
-      }
-
-      default: {
-        return undefined;
-      }
-    }
-  }
-}
diff --git a/src/app/core/auth/auth-response-parsing.service.ts b/src/app/core/auth/auth-response-parsing.service.ts
index 1993f6d162..a5a160531c 100644
--- a/src/app/core/auth/auth-response-parsing.service.ts
+++ b/src/app/core/auth/auth-response-parsing.service.ts
@@ -1,6 +1,5 @@
 import { Inject, Injectable } from '@angular/core';
 
-import { AuthObjectFactory } from './auth-object-factory';
 import { BaseResponseParsingService } from '../data/base-response-parsing.service';
 import { AuthStatusResponse, RestResponse } from '../cache/response.models';
 import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model';
@@ -10,16 +9,13 @@ import { isNotEmpty } from '../../shared/empty.util';
 import { ObjectCacheService } from '../cache/object-cache.service';
 import { ResponseParsingService } from '../data/parsing.service';
 import { RestRequest } from '../data/request.models';
-import { AuthType } from './auth-type';
 import { AuthStatus } from './models/auth-status.model';
 import { NormalizedAuthStatus } from './models/normalized-auth-status.model';
 import { NormalizedObject } from '../cache/models/normalized-object.model';
-import { DSpaceObject } from '../shared/dspace-object.model';
 
 @Injectable()
 export class AuthResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
 
-  protected objectFactory = AuthObjectFactory;
   protected toCache = true;
 
   constructor(@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
@@ -29,7 +25,7 @@ export class AuthResponseParsingService extends BaseResponseParsingService imple
 
   parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
     if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links) && (data.statusCode === 200)) {
-      const response = this.process<NormalizedObject<AuthStatus>, AuthType>(data.payload, request.uuid);
+      const response = this.process<NormalizedObject<AuthStatus>>(data.payload, request.uuid);
       return new AuthStatusResponse(response, data.statusCode, data.statusText);
     } else {
       return new AuthStatusResponse(data.payload as NormalizedAuthStatus, data.statusCode, data.statusText);
diff --git a/src/app/core/cache/models/normalized-object-factory.ts b/src/app/core/cache/models/normalized-object-factory.ts
deleted file mode 100644
index b83b39e437..0000000000
--- a/src/app/core/cache/models/normalized-object-factory.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { NormalizedBitstream } from './normalized-bitstream.model';
-import { NormalizedBundle } from './normalized-bundle.model';
-import { NormalizedItem } from './normalized-item.model';
-import { NormalizedCollection } from './normalized-collection.model';
-import { GenericConstructor } from '../../shared/generic-constructor';
-import { NormalizedCommunity } from './normalized-community.model';
-import { ResourceType } from '../../shared/resource-type';
-import { NormalizedObject } from './normalized-object.model';
-import { NormalizedLicense } from './normalized-license.model';
-import { NormalizedResourcePolicy } from './normalized-resource-policy.model';
-import { NormalizedWorkspaceItem } from '../../submission/models/normalized-workspaceitem.model';
-import { NormalizedEPerson } from '../../eperson/models/normalized-eperson.model';
-import { NormalizedGroup } from '../../eperson/models/normalized-group.model';
-import { NormalizedWorkflowItem } from '../../submission/models/normalized-workflowitem.model';
-import { NormalizedBitstreamFormat } from './normalized-bitstream-format.model';
-import { NormalizedMetadataSchema } from '../../metadata/normalized-metadata-schema.model';
-import { CacheableObject } from '../object-cache.reducer';
-import { NormalizedSubmissionDefinitionsModel } from '../../config/models/normalized-config-submission-definitions.model';
-import { NormalizedSubmissionFormsModel } from '../../config/models/normalized-config-submission-forms.model';
-import { NormalizedSubmissionSectionModel } from '../../config/models/normalized-config-submission-section.model';
-import { NormalizedAuthStatus } from '../../auth/models/normalized-auth-status.model';
-
-export class NormalizedObjectFactory {
-  public static getConstructor(type: ResourceType): GenericConstructor<NormalizedObject<CacheableObject>> {
-    switch (type) {
-      case ResourceType.Bitstream: {
-        return NormalizedBitstream
-      }
-      case ResourceType.Bundle: {
-        return NormalizedBundle
-      }
-      case ResourceType.Item: {
-        return NormalizedItem
-      }
-      case ResourceType.Collection: {
-        return NormalizedCollection
-      }
-      case ResourceType.Community: {
-        return NormalizedCommunity
-      }
-      case ResourceType.BitstreamFormat: {
-        return NormalizedBitstreamFormat
-      }
-      case ResourceType.License: {
-        return NormalizedLicense
-      }
-      case ResourceType.ResourcePolicy: {
-        return NormalizedResourcePolicy
-      }
-      case ResourceType.EPerson: {
-        return NormalizedEPerson
-      }
-      case ResourceType.Group: {
-        return NormalizedGroup
-      }
-      case ResourceType.MetadataSchema: {
-        return NormalizedMetadataSchema
-      }
-      case ResourceType.MetadataField: {
-        return NormalizedGroup
-      }
-      case ResourceType.WorkspaceItem: {
-        return NormalizedWorkspaceItem
-      }
-      case ResourceType.WorkflowItem: {
-        return NormalizedWorkflowItem
-      }
-      case ResourceType.SubmissionDefinition:
-      case ResourceType.SubmissionDefinitions: {
-        return NormalizedSubmissionDefinitionsModel
-      }
-      case ResourceType.SubmissionForm:
-      case ResourceType.SubmissionForms: {
-        return NormalizedSubmissionFormsModel
-      }
-      case ResourceType.SubmissionSection:
-      case ResourceType.SubmissionSections: {
-        return NormalizedSubmissionSectionModel
-      }
-      default: {
-        return undefined;
-      }
-    }
-  }
-}
diff --git a/src/app/core/cache/response.models.ts b/src/app/core/cache/response.models.ts
index 810dcf1799..753f9dab1e 100644
--- a/src/app/core/cache/response.models.ts
+++ b/src/app/core/cache/response.models.ts
@@ -8,13 +8,12 @@ import { IntegrationModel } from '../integration/models/integration.model';
 import { RegistryMetadataschemasResponse } from '../registry/registry-metadataschemas-response.model';
 import { RegistryMetadatafieldsResponse } from '../registry/registry-metadatafields-response.model';
 import { RegistryBitstreamformatsResponse } from '../registry/registry-bitstreamformats-response.model';
-import { AuthStatus } from '../auth/models/auth-status.model';
-import { MetadataSchema } from '../metadata/metadataschema.model';
-import { MetadataField } from '../metadata/metadatafield.model';
 import { PaginatedList } from '../data/paginated-list';
 import { SubmissionObject } from '../submission/models/submission-object.model';
 import { DSpaceObject } from '../shared/dspace-object.model';
 import { NormalizedAuthStatus } from '../auth/models/normalized-auth-status.model';
+import { MetadataField } from '../metadata/metadata-field.model';
+import { MetadataSchema } from '../metadata/metadata-schema.model';
 
 /* tslint:disable:max-classes-per-file */
 export class RestResponse {
diff --git a/src/app/core/config/models/config-object-factory.ts b/src/app/core/config/models/config-object-factory.ts
deleted file mode 100644
index 44b2e377c4..0000000000
--- a/src/app/core/config/models/config-object-factory.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import { GenericConstructor } from '../../shared/generic-constructor';
-import { ConfigType } from './config-type';
-import { ConfigObject } from './config.model';
-import { NormalizedSubmissionDefinitionsModel } from './normalized-config-submission-definitions.model';
-import { NormalizedSubmissionFormsModel } from './normalized-config-submission-forms.model';
-import { NormalizedSubmissionSectionModel } from './normalized-config-submission-section.model';
-import { NormalizedSubmissionUploadsModel } from './normalized-config-submission-uploads.model';
-
-/**
- * Class to return normalized models for config objects
- */
-export class ConfigObjectFactory {
-  public static getConstructor(type): GenericConstructor<ConfigObject> {
-    switch (type) {
-      case ConfigType.SubmissionDefinition:
-      case ConfigType.SubmissionDefinitions: {
-        return NormalizedSubmissionDefinitionsModel
-      }
-      case ConfigType.SubmissionForm:
-      case ConfigType.SubmissionForms: {
-        return NormalizedSubmissionFormsModel
-      }
-      case ConfigType.SubmissionSection:
-      case ConfigType.SubmissionSections: {
-        return NormalizedSubmissionSectionModel
-      }
-      case ConfigType.SubmissionUpload:
-      case ConfigType.SubmissionUploads: {
-        return NormalizedSubmissionUploadsModel
-      }
-      default: {
-        return undefined;
-      }
-    }
-  }
-}
diff --git a/src/app/core/config/models/normalized-config-submission-definitions.model.ts b/src/app/core/config/models/normalized-config-submission-definitions.model.ts
index 0d98132c0f..87df838378 100644
--- a/src/app/core/config/models/normalized-config-submission-definitions.model.ts
+++ b/src/app/core/config/models/normalized-config-submission-definitions.model.ts
@@ -12,7 +12,7 @@ import { mapsTo } from '../../cache/builders/build-decorators';
  */
 @mapsTo(SubmissionDefinitionsModel)
 @inheritSerialization(NormalizedConfigObject)
-@resourceType(ResourceType.SubmissionDefinitions)
+@resourceType(ResourceType.SubmissionDefinitions, ResourceType.SubmissionDefinition)
 export class NormalizedSubmissionDefinitionsModel extends NormalizedConfigObject<SubmissionDefinitionsModel> {
 
   /**
diff --git a/src/app/core/config/models/normalized-config-submission-forms.model.ts b/src/app/core/config/models/normalized-config-submission-forms.model.ts
index a957e8c7fa..2856fe46fc 100644
--- a/src/app/core/config/models/normalized-config-submission-forms.model.ts
+++ b/src/app/core/config/models/normalized-config-submission-forms.model.ts
@@ -1,11 +1,16 @@
 import { autoserialize, inheritSerialization } from 'cerialize';
 import { NormalizedConfigObject } from './normalized-config.model';
 import { FormRowModel, SubmissionFormsModel } from './config-submission-forms.model';
+import { resourceType } from '../../shared/resource-type.decorator';
+import { ResourceType } from '../../shared/resource-type';
+import { mapsTo } from '../../cache/builders/build-decorators';
 
 /**
  * Normalized class for the configuration describing the submission form
  */
+@mapsTo(SubmissionFormsModel)
 @inheritSerialization(NormalizedConfigObject)
+@resourceType(ResourceType.SubmissionForm, ResourceType.SubmissionForms)
 export class NormalizedSubmissionFormsModel extends NormalizedConfigObject<SubmissionFormsModel> {
 
   /**
diff --git a/src/app/core/config/models/normalized-config-submission-section.model.ts b/src/app/core/config/models/normalized-config-submission-section.model.ts
index c876acf607..174cd5a10a 100644
--- a/src/app/core/config/models/normalized-config-submission-section.model.ts
+++ b/src/app/core/config/models/normalized-config-submission-section.model.ts
@@ -3,11 +3,16 @@ import { SectionsType } from '../../../submission/sections/sections-type';
 import { NormalizedConfigObject } from './normalized-config.model';
 import { SubmissionFormsModel } from './config-submission-forms.model';
 import { SubmissionSectionVisibility } from './config-submission-section.model';
+import { mapsTo } from '../../cache/builders/build-decorators';
+import { resourceType } from '../../shared/resource-type.decorator';
+import { ResourceType } from '../../shared/resource-type';
 
 /**
  * Normalized class for the configuration describing the submission section
  */
+@mapsTo(SubmissionFormsModel)
 @inheritSerialization(NormalizedConfigObject)
+@resourceType(ResourceType.SubmissionForm, ResourceType.SubmissionForms)
 export class NormalizedSubmissionSectionModel extends NormalizedConfigObject<SubmissionFormsModel> {
 
   /**
diff --git a/src/app/core/data/base-response-parsing.service.ts b/src/app/core/data/base-response-parsing.service.ts
index 334aadd379..15f52e0939 100644
--- a/src/app/core/data/base-response-parsing.service.ts
+++ b/src/app/core/data/base-response-parsing.service.ts
@@ -9,15 +9,15 @@ import { PaginatedList } from './paginated-list';
 import { ResourceType } from '../shared/resource-type';
 import { RESTURLCombiner } from '../url-combiner/rest-url-combiner';
 import { isRestDataObject, isRestPaginatedList } from '../cache/builders/normalized-object-build.service';
+import { getNormalizedConstructorByType } from '../shared/resource-type.decorator';
 /* tslint:disable:max-classes-per-file */
 
 export abstract class BaseResponseParsingService {
   protected abstract EnvConfig: GlobalConfig;
   protected abstract objectCache: ObjectCacheService;
-  protected abstract objectFactory: any;
   protected abstract toCache: boolean;
 
-  protected process<ObjectDomain, ObjectType>(data: any, requestUUID: string): any {
+  protected process<ObjectDomain>(data: any, requestUUID: string): any {
     if (isNotEmpty(data)) {
       if (hasNoValue(data) || (typeof data !== 'object')) {
         return data;
@@ -32,7 +32,7 @@ export abstract class BaseResponseParsingService {
             .keys(data._embedded)
             .filter((property) => data._embedded.hasOwnProperty(property))
             .forEach((property) => {
-              const parsedObj = this.process<ObjectDomain, ObjectType>(data._embedded[property], requestUUID);
+              const parsedObj = this.process<ObjectDomain>(data._embedded[property], requestUUID);
               if (isNotEmpty(parsedObj)) {
                 if (isRestPaginatedList(data._embedded[property])) {
                   object[property] = parsedObj;
@@ -61,7 +61,7 @@ export abstract class BaseResponseParsingService {
     }
   }
 
-  protected processPaginatedList<ObjectDomain, ObjectType>(data: any, requestUUID: string): PaginatedList<ObjectDomain> {
+  protected processPaginatedList<ObjectDomain>(data: any, requestUUID: string): PaginatedList<ObjectDomain> {
     const pageInfo: PageInfo = this.processPageInfo(data);
     let list = data._embedded;
 
@@ -73,7 +73,7 @@ export abstract class BaseResponseParsingService {
     return new PaginatedList<ObjectDomain>(pageInfo, page, );
   }
 
-  protected processArray<ObjectDomain, ObjectType>(data: any, requestUUID: string): ObjectDomain[] {
+  protected processArray<ObjectDomain>(data: any, requestUUID: string): ObjectDomain[] {
     let array: ObjectDomain[] = [];
     data.forEach((datum) => {
         array = [...array, this.process(datum, requestUUID)];
@@ -82,10 +82,10 @@ export abstract class BaseResponseParsingService {
     return array;
   }
 
-  protected deserialize<ObjectDomain, ObjectType>(obj): any {
-    const type: ObjectType = obj.type;
+  protected deserialize<ObjectDomain>(obj): any {
+    const type: ResourceType = obj.type;
     if (hasValue(type)) {
-      const normObjConstructor = this.objectFactory.getConstructor(type) as GenericConstructor<ObjectDomain>;
+      const normObjConstructor = getNormalizedConstructorByType(type) as GenericConstructor<ObjectDomain>;
 
       if (hasValue(normObjConstructor)) {
         const serializer = new DSpaceRESTv2Serializer(normObjConstructor);
@@ -103,7 +103,7 @@ export abstract class BaseResponseParsingService {
     }
   }
 
-  protected cache<ObjectDomain, ObjectType>(obj, requestUUID) {
+  protected cache<ObjectDomain>(obj, requestUUID) {
     if (this.toCache) {
       this.addToObjectCache(obj, requestUUID);
     }
diff --git a/src/app/core/data/metadatafield-parsing.service.ts b/src/app/core/data/metadatafield-parsing.service.ts
index f9582c394d..092285e9c5 100644
--- a/src/app/core/data/metadatafield-parsing.service.ts
+++ b/src/app/core/data/metadatafield-parsing.service.ts
@@ -3,8 +3,8 @@ import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.
 import { RestRequest } from './request.models';
 import { ResponseParsingService } from './parsing.service';
 import { Injectable } from '@angular/core';
-import { MetadatafieldSuccessResponse, MetadataschemaSuccessResponse, RestResponse } from '../cache/response.models';
-import { MetadataField } from '../metadata/metadatafield.model';
+import { MetadatafieldSuccessResponse, RestResponse } from '../cache/response.models';
+import { MetadataField } from '../metadata/metadata-field.model';
 
 /**
  * A service responsible for parsing DSpaceRESTV2Response data related to a single MetadataField to a valid RestResponse
diff --git a/src/app/core/integration/models/normalized-authority-value.model.ts b/src/app/core/integration/models/normalized-authority-value.model.ts
index 5ebb61281d..6e6c7ee798 100644
--- a/src/app/core/integration/models/normalized-authority-value.model.ts
+++ b/src/app/core/integration/models/normalized-authority-value.model.ts
@@ -2,12 +2,15 @@ import { autoserialize, inheritSerialization } from 'cerialize';
 import { IntegrationModel } from './integration.model';
 import { mapsTo } from '../../cache/builders/build-decorators';
 import { AuthorityValue } from './authority.value';
+import { resourceType } from '../../shared/resource-type.decorator';
+import { ResourceType } from '../../shared/resource-type';
 
 /**
  * Normalized model class for an Authority Value
  */
 @mapsTo(AuthorityValue)
 @inheritSerialization(IntegrationModel)
+@resourceType(ResourceType.Authority)
 export class NormalizedAuthorityValue extends IntegrationModel {
 
   @autoserialize
diff --git a/src/app/core/registry/registry-metadataschemas-response.model.ts b/src/app/core/registry/registry-metadataschemas-response.model.ts
index 5f4799abd7..f27550bbe0 100644
--- a/src/app/core/registry/registry-metadataschemas-response.model.ts
+++ b/src/app/core/registry/registry-metadataschemas-response.model.ts
@@ -1,6 +1,6 @@
-import { MetadataSchema } from '../metadata/metadataschema.model';
 import { PageInfo } from '../shared/page-info.model';
 import { autoserialize, autoserializeAs } from 'cerialize';
+import { MetadataSchema } from '../metadata/metadata-schema.model';
 
 export class RegistryMetadataschemasResponse {
   @autoserializeAs(MetadataSchema)
diff --git a/src/app/core/shared/resource-type.decorator.ts b/src/app/core/shared/resource-type.decorator.ts
index da5259b968..a063eb8310 100644
--- a/src/app/core/shared/resource-type.decorator.ts
+++ b/src/app/core/shared/resource-type.decorator.ts
@@ -2,15 +2,17 @@ import { CacheableObject } from '../cache/object-cache.reducer';
 import { GenericConstructor } from './generic-constructor';
 
 const resourceTypeForObjectMap = new Map();
-export function resourceType(resourceType: string) {
+
+export function resourceType(...resourceType: string[]) {
   return function decorator(objectConstructor: GenericConstructor<CacheableObject>) {
     if (!objectConstructor) {
       return;
     }
-    resourceTypeForObjectMap.set(resourceType, objectConstructor);
+    resourceType.forEach((rt: string) => resourceTypeForObjectMap.set(rt, objectConstructor)
+    )
   };
 }
 
-export function rendersSectionType(resourceType: string) {
+export function getNormalizedConstructorByType(resourceType: string) {
   return resourceTypeForObjectMap.get(resourceType);
 }
diff --git a/src/app/core/shared/resource-type.ts b/src/app/core/shared/resource-type.ts
index 02283a5dde..c4eeb7a27d 100644
--- a/src/app/core/shared/resource-type.ts
+++ b/src/app/core/shared/resource-type.ts
@@ -20,5 +20,6 @@ export enum ResourceType {
   SubmissionForms = 'submissionforms',
   SubmissionSections = 'submissionsections',
   SubmissionSection = 'submissionsection',
-  AuthStatus = 'status'
+  AuthStatus = 'status',
+  Authority = 'authority'
 }
-- 
GitLab