From af291845ec1a4518963bb5643716b4641c0d38b7 Mon Sep 17 00:00:00 2001
From: lotte <lotte_hofstede@hotmail.com>
Date: Fri, 26 Apr 2019 16:40:49 +0200
Subject: [PATCH] continued refactoring

---
 .../item-metadata/item-metadata.component.ts    |  2 +-
 src/app/core/auth/models/auth-status.model.ts   |  8 ++++++--
 .../auth/models/normalized-auth-status.model.ts |  4 ++++
 .../builders/normalized-object-build.service.ts |  8 ++++----
 .../cache/builders/remote-data-build.service.ts |  8 ++++----
 .../models/normalized-dspace-object.model.ts    |  5 +++--
 .../cache/models/normalized-object.model.ts     |  4 ++--
 src/app/core/cache/object-cache.reducer.ts      |  6 +++++-
 .../config/config-response-parsing.service.ts   |  2 --
 src/app/core/config/models/config.model.ts      |  4 ++--
 ...ormalized-config-submission-section.model.ts | 11 +++++++----
 .../config/models/normalized-config.model.ts    |  4 ++--
 .../browse-entries-response-parsing.service.ts  |  3 ---
 .../browse-items-response-parsing-service.ts    |  4 ----
 .../core/data/dso-response-parsing.service.ts   |  6 +-----
 .../facet-config-response-parsing.service.ts    |  1 -
 .../facet-value-map-response-parsing.service.ts |  1 -
 .../facet-value-response-parsing.service.ts     |  1 -
 .../eperson/eperson-response-parsing.service.ts |  5 +----
 .../integration/integration-object-factory.ts   | 17 -----------------
 .../integration-response-parsing.service.ts     |  8 +++-----
 src/app/core/integration/intergration-type.ts   |  4 ----
 src/app/core/shared/bitstream-format.model.ts   |  4 ++--
 src/app/core/shared/browse-definition.model.ts  |  6 ++++--
 src/app/core/shared/browse-entry.model.ts       |  8 ++++++--
 src/app/core/shared/dspace-object.model.ts      |  4 ++--
 src/app/core/shared/resource-policy.model.ts    |  4 ++--
 src/app/core/shared/resource-type.decorator.ts  |  9 +++++----
 src/app/core/shared/resource-type.ts            |  3 ++-
 .../submission-response-parsing.service.ts      |  8 +++-----
 30 files changed, 71 insertions(+), 91 deletions(-)
 delete mode 100644 src/app/core/integration/integration-object-factory.ts
 delete mode 100644 src/app/core/integration/intergration-type.ts

diff --git a/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.ts b/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.ts
index 6b3e05c818..8148b89bd4 100644
--- a/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.ts
+++ b/src/app/+item-page/edit-item-page/item-metadata/item-metadata.component.ts
@@ -17,9 +17,9 @@ import { NotificationsService } from '../../../shared/notifications/notification
 import { GLOBAL_CONFIG, GlobalConfig } from '../../../../config';
 import { TranslateService } from '@ngx-translate/core';
 import { RegistryService } from '../../../core/registry/registry.service';
-import { MetadataField } from '../../../core/metadata/metadatafield.model';
 import { MetadatumViewModel } from '../../../core/shared/metadata.models';
 import { Metadata } from '../../../core/shared/metadata.utils';
+import { MetadataField } from '../../../core/metadata/metadata-field.model';
 
 @Component({
   selector: 'ds-item-metadata',
diff --git a/src/app/core/auth/models/auth-status.model.ts b/src/app/core/auth/models/auth-status.model.ts
index 6e722a80c9..40ca71aa1b 100644
--- a/src/app/core/auth/models/auth-status.model.ts
+++ b/src/app/core/auth/models/auth-status.model.ts
@@ -3,9 +3,10 @@ import { AuthTokenInfo } from './auth-token-info.model';
 import { EPerson } from '../../eperson/models/eperson.model';
 import { RemoteData } from '../../data/remote-data';
 import { Observable } from 'rxjs';
-import { CacheableObject } from '../../cache/object-cache.reducer';
+import { CacheableObject, TypedObject } from '../../cache/object-cache.reducer';
+import { ResourceType } from '../../shared/resource-type';
 
-export class AuthStatus implements CacheableObject {
+export class AuthStatus implements CacheableObject, TypedObject {
 
   id: string;
 
@@ -20,4 +21,7 @@ export class AuthStatus implements CacheableObject {
   token?: AuthTokenInfo;
 
   self: string;
+
+  type: ResourceType;
+
 }
diff --git a/src/app/core/auth/models/normalized-auth-status.model.ts b/src/app/core/auth/models/normalized-auth-status.model.ts
index 46d0177fdc..50956935ef 100644
--- a/src/app/core/auth/models/normalized-auth-status.model.ts
+++ b/src/app/core/auth/models/normalized-auth-status.model.ts
@@ -31,4 +31,8 @@ export class NormalizedAuthStatus extends NormalizedObject<AuthStatus> {
   @relationship(ResourceType.EPerson, false)
   @autoserialize
   eperson: string;
+
+
+  @autoserialize
+  type: ResourceType;
 }
diff --git a/src/app/core/cache/builders/normalized-object-build.service.ts b/src/app/core/cache/builders/normalized-object-build.service.ts
index 79665fec3d..357ae71872 100644
--- a/src/app/core/cache/builders/normalized-object-build.service.ts
+++ b/src/app/core/cache/builders/normalized-object-build.service.ts
@@ -1,9 +1,9 @@
 import { Injectable } from '@angular/core';
 import { NormalizedObject } from '../models/normalized-object.model';
-import { CacheableObject } from '../object-cache.reducer';
 import { getRelationships } from './build-decorators';
-import { NormalizedObjectFactory } from '../models/normalized-object-factory';
 import { hasValue, isNotEmpty } from '../../../shared/empty.util';
+import { TypedObject } from '../object-cache.reducer';
+import { getNormalizedConstructorByType } from '../../shared/resource-type.decorator';
 
 /**
  * Return true if halObj has a value for `_links.self`
@@ -35,8 +35,8 @@ export class NormalizedObjectBuildService {
    *
    * @param {TDomain} domainModel a domain model
    */
-  normalize<T extends CacheableObject>(domainModel: T): NormalizedObject<T> {
-    const normalizedConstructor = NormalizedObjectFactory.getConstructor(domainModel.type);
+  normalize<T extends TypedObject>(domainModel: T): NormalizedObject<T> {
+    const normalizedConstructor = getNormalizedConstructorByType(domainModel.type);
     const relationships = getRelationships(normalizedConstructor) || [];
 
     const normalizedModel = Object.assign({}, domainModel) as any;
diff --git a/src/app/core/cache/builders/remote-data-build.service.ts b/src/app/core/cache/builders/remote-data-build.service.ts
index c0b359e7ea..18687e254d 100644
--- a/src/app/core/cache/builders/remote-data-build.service.ts
+++ b/src/app/core/cache/builders/remote-data-build.service.ts
@@ -21,7 +21,7 @@ import {
   getRequestFromRequestUUID,
   getResourceLinksFromResponse
 } from '../../shared/operators';
-import { CacheableObject } from '../object-cache.reducer';
+import { CacheableObject, TypedObject } from '../object-cache.reducer';
 
 @Injectable()
 export class RemoteDataBuildService {
@@ -29,7 +29,7 @@ export class RemoteDataBuildService {
               protected requestService: RequestService) {
   }
 
-  buildSingle<T extends CacheableObject>(href$: string | Observable<string>): Observable<RemoteData<T>> {
+  buildSingle<T extends TypedObject & CacheableObject>(href$: string | Observable<string>): Observable<RemoteData<T>> {
     if (typeof href$ === 'string') {
       href$ = observableOf(href$);
     }
@@ -107,7 +107,7 @@ export class RemoteDataBuildService {
     );
   }
 
-  buildList<T extends CacheableObject>(href$: string | Observable<string>): Observable<RemoteData<PaginatedList<T>>> {
+  buildList<T extends TypedObject & CacheableObject>(href$: string | Observable<string>): Observable<RemoteData<PaginatedList<T>>> {
     if (typeof href$ === 'string') {
       href$ = observableOf(href$);
     }
@@ -149,7 +149,7 @@ export class RemoteDataBuildService {
     return this.toRemoteDataObservable(requestEntry$, payload$);
   }
 
-  build<T extends CacheableObject>(normalized: NormalizedObject<T>): T {
+  build<T extends TypedObject & CacheableObject>(normalized: NormalizedObject<T>): T {
     const links: any = {};
     const relationships = getRelationships(normalized.constructor) || [];
 
diff --git a/src/app/core/cache/models/normalized-dspace-object.model.ts b/src/app/core/cache/models/normalized-dspace-object.model.ts
index 84e3f41f42..65da89a4eb 100644
--- a/src/app/core/cache/models/normalized-dspace-object.model.ts
+++ b/src/app/core/cache/models/normalized-dspace-object.model.ts
@@ -5,13 +5,14 @@ import { ResourceType } from '../../shared/resource-type';
 import { mapsTo } from '../builders/build-decorators';
 import { NormalizedObject } from './normalized-object.model';
 import { resourceType } from '../../shared/resource-type.decorator';
+import { TypedObject } from '../object-cache.reducer';
 
 /**
  * An model class for a DSpaceObject.
  */
 @mapsTo(DSpaceObject)
 @resourceType(ResourceType.DSpaceObject)
-export class NormalizedDSpaceObject<T extends DSpaceObject> extends NormalizedObject<T> {
+export class NormalizedDSpaceObject<T extends DSpaceObject> extends NormalizedObject<T> implements TypedObject {
 
   /**
    * The link to the rest endpoint where this object can be found
@@ -40,7 +41,7 @@ export class NormalizedDSpaceObject<T extends DSpaceObject> extends NormalizedOb
   /**
    * A string representing the kind of DSpaceObject, e.g. community, item, …
    */
-  @autoserializeAs(String)
+  @autoserializeAs(ResourceType)
   type: ResourceType;
 
   /**
diff --git a/src/app/core/cache/models/normalized-object.model.ts b/src/app/core/cache/models/normalized-object.model.ts
index 6ac8985d64..a80da98cca 100644
--- a/src/app/core/cache/models/normalized-object.model.ts
+++ b/src/app/core/cache/models/normalized-object.model.ts
@@ -1,10 +1,10 @@
-import { CacheableObject } from '../object-cache.reducer';
+import { CacheableObject, TypedObject } from '../object-cache.reducer';
 import { autoserialize } from 'cerialize';
 import { ResourceType } from '../../shared/resource-type';
 /**
  * An abstract model class for a NormalizedObject.
  */
-export abstract class NormalizedObject<T extends CacheableObject> implements CacheableObject {
+export abstract class NormalizedObject<T extends TypedObject> implements CacheableObject, TypedObject {
 
   /**
    * The link to the rest endpoint where this object can be found
diff --git a/src/app/core/cache/object-cache.reducer.ts b/src/app/core/cache/object-cache.reducer.ts
index 982c77341e..97a48af1c1 100644
--- a/src/app/core/cache/object-cache.reducer.ts
+++ b/src/app/core/cache/object-cache.reducer.ts
@@ -32,6 +32,9 @@ export interface Patch {
   operations: Operation[];
 }
 
+export interface TypedObject {
+  type: ResourceType;
+}
 /**
  * An interface to represent objects that can be cached
  *
@@ -40,7 +43,6 @@ export interface Patch {
 export interface CacheableObject {
   uuid?: string;
   self: string;
-  type?: ResourceType;
   // isNew: boolean;
   // dirtyType: DirtyType;
   // hasDirtyAttributes: boolean;
@@ -48,6 +50,8 @@ export interface CacheableObject {
   // save(): void;
 }
 
+// export type TypedCacheableObject = TypedObject & CacheableObject;
+
 /**
  * An entry in the ObjectCache
  */
diff --git a/src/app/core/config/config-response-parsing.service.ts b/src/app/core/config/config-response-parsing.service.ts
index b81dc07624..de85b911bd 100644
--- a/src/app/core/config/config-response-parsing.service.ts
+++ b/src/app/core/config/config-response-parsing.service.ts
@@ -16,8 +16,6 @@ import { ObjectCacheService } from '../cache/object-cache.service';
 
 @Injectable()
 export class ConfigResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
-
-  protected objectFactory = ConfigObjectFactory;
   protected toCache = false;
 
   constructor(
diff --git a/src/app/core/config/models/config.model.ts b/src/app/core/config/models/config.model.ts
index 81f20a0b3c..2a7c3da882 100644
--- a/src/app/core/config/models/config.model.ts
+++ b/src/app/core/config/models/config.model.ts
@@ -1,7 +1,7 @@
-import { CacheableObject } from '../../cache/object-cache.reducer';
+import { CacheableObject, TypedObject } from '../../cache/object-cache.reducer';
 import { ResourceType } from '../../shared/resource-type';
 
-export abstract class ConfigObject implements CacheableObject {
+export abstract class ConfigObject implements CacheableObject, TypedObject {
 
   /**
    * The name for this configuration
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 174cd5a10a..3f9bca8b7b 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
@@ -2,7 +2,10 @@ import { autoserialize, inheritSerialization } from 'cerialize';
 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 {
+  SubmissionSectionModel,
+  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';
@@ -10,10 +13,10 @@ import { ResourceType } from '../../shared/resource-type';
 /**
  * Normalized class for the configuration describing the submission section
  */
-@mapsTo(SubmissionFormsModel)
+@mapsTo(SubmissionSectionModel)
 @inheritSerialization(NormalizedConfigObject)
-@resourceType(ResourceType.SubmissionForm, ResourceType.SubmissionForms)
-export class NormalizedSubmissionSectionModel extends NormalizedConfigObject<SubmissionFormsModel> {
+@resourceType(ResourceType.SubmissionSection, ResourceType.SubmissionSections)
+export class NormalizedSubmissionSectionModel extends NormalizedConfigObject<SubmissionSectionModel> {
 
   /**
    * The header for this section
diff --git a/src/app/core/config/models/normalized-config.model.ts b/src/app/core/config/models/normalized-config.model.ts
index 0b75158588..c463cd8b08 100644
--- a/src/app/core/config/models/normalized-config.model.ts
+++ b/src/app/core/config/models/normalized-config.model.ts
@@ -1,13 +1,13 @@
 import { autoserialize, inheritSerialization } from 'cerialize';
 import { NormalizedObject } from '../../cache/models/normalized-object.model';
-import { CacheableObject } from '../../cache/object-cache.reducer';
+import { CacheableObject, TypedObject } from '../../cache/object-cache.reducer';
 import { ResourceType } from '../../shared/resource-type';
 
 /**
  * Normalized abstract class for a configuration object
  */
 @inheritSerialization(NormalizedObject)
-export abstract class NormalizedConfigObject<T extends CacheableObject> implements CacheableObject {
+export abstract class NormalizedConfigObject<T extends CacheableObject> implements CacheableObject, TypedObject {
 
   /**
    * The name for this configuration
diff --git a/src/app/core/data/browse-entries-response-parsing.service.ts b/src/app/core/data/browse-entries-response-parsing.service.ts
index 4690d738ed..5e6a9acaca 100644
--- a/src/app/core/data/browse-entries-response-parsing.service.ts
+++ b/src/app/core/data/browse-entries-response-parsing.service.ts
@@ -18,9 +18,6 @@ import { RestRequest } from './request.models';
 @Injectable()
 export class BrowseEntriesResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
 
-  protected objectFactory = {
-    getConstructor: () => BrowseEntry
-  };
   protected toCache = false;
 
   constructor(
diff --git a/src/app/core/data/browse-items-response-parsing-service.ts b/src/app/core/data/browse-items-response-parsing-service.ts
index fb950f6c68..324b36199a 100644
--- a/src/app/core/data/browse-items-response-parsing-service.ts
+++ b/src/app/core/data/browse-items-response-parsing-service.ts
@@ -18,10 +18,6 @@ import { NormalizedDSpaceObject } from '../cache/models/normalized-dspace-object
  */
 @Injectable()
 export class BrowseItemsResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
-
-  protected objectFactory = {
-    getConstructor: () => DSpaceObject
-  };
   protected toCache = false;
 
   constructor(
diff --git a/src/app/core/data/dso-response-parsing.service.ts b/src/app/core/data/dso-response-parsing.service.ts
index eb95cdae8a..d6c3b2caa6 100644
--- a/src/app/core/data/dso-response-parsing.service.ts
+++ b/src/app/core/data/dso-response-parsing.service.ts
@@ -4,8 +4,6 @@ import { ObjectCacheService } from '../cache/object-cache.service';
 import { GlobalConfig } from '../../../config/global-config.interface';
 import { GLOBAL_CONFIG } from '../../../config';
 import { NormalizedObject } from '../cache/models/normalized-object.model';
-import { ResourceType } from '../shared/resource-type';
-import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
 import { DSpaceRESTV2Response } from '../dspace-rest-v2/dspace-rest-v2-response.model';
 import { RestResponse, DSOSuccessResponse } from '../cache/response.models';
 import { RestRequest } from './request.models';
@@ -17,8 +15,6 @@ import { DSpaceObject } from '../shared/dspace-object.model';
 
 @Injectable()
 export class DSOResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
-
-  protected objectFactory = NormalizedObjectFactory;
   protected toCache = true;
 
   constructor(
@@ -34,7 +30,7 @@ export class DSOResponseParsingService extends BaseResponseParsingService implem
     if (hasValue(data.payload) && hasValue(data.payload.page) && data.payload.page.totalElements === 0) {
       processRequestDTO = { page: [] };
     } else {
-      processRequestDTO = this.process<NormalizedObject<DSpaceObject>, ResourceType>(data.payload, request.uuid);
+      processRequestDTO = this.process<NormalizedObject<DSpaceObject>>(data.payload, request.uuid);
     }
     let objectList = processRequestDTO;
 
diff --git a/src/app/core/data/facet-config-response-parsing.service.ts b/src/app/core/data/facet-config-response-parsing.service.ts
index e65e317642..15f520b249 100644
--- a/src/app/core/data/facet-config-response-parsing.service.ts
+++ b/src/app/core/data/facet-config-response-parsing.service.ts
@@ -15,7 +15,6 @@ import { GLOBAL_CONFIG } from '../../../config';
 
 @Injectable()
 export class FacetConfigResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
-  objectFactory = {};
   toCache = false;
   constructor(
     @Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
diff --git a/src/app/core/data/facet-value-map-response-parsing.service.ts b/src/app/core/data/facet-value-map-response-parsing.service.ts
index e03c1a78df..b67cef97c0 100644
--- a/src/app/core/data/facet-value-map-response-parsing.service.ts
+++ b/src/app/core/data/facet-value-map-response-parsing.service.ts
@@ -17,7 +17,6 @@ import { GLOBAL_CONFIG } from '../../../config';
 
 @Injectable()
 export class FacetValueMapResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
-  objectFactory = {};
   toCache = false;
 
   constructor(
diff --git a/src/app/core/data/facet-value-response-parsing.service.ts b/src/app/core/data/facet-value-response-parsing.service.ts
index e7665ebed2..49d72e0a01 100644
--- a/src/app/core/data/facet-value-response-parsing.service.ts
+++ b/src/app/core/data/facet-value-response-parsing.service.ts
@@ -12,7 +12,6 @@ import { GlobalConfig } from '../../../config/global-config.interface';
 
 @Injectable()
 export class FacetValueResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
-  objectFactory = {};
   toCache = false;
   constructor(
     @Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
diff --git a/src/app/core/eperson/eperson-response-parsing.service.ts b/src/app/core/eperson/eperson-response-parsing.service.ts
index 6c591b0b99..481f37d1fa 100644
--- a/src/app/core/eperson/eperson-response-parsing.service.ts
+++ b/src/app/core/eperson/eperson-response-parsing.service.ts
@@ -9,8 +9,6 @@ import { BaseResponseParsingService } from '../data/base-response-parsing.servic
 import { GLOBAL_CONFIG } from '../../../config';
 import { GlobalConfig } from '../../../config/global-config.interface';
 import { ObjectCacheService } from '../cache/object-cache.service';
-import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
-import { ResourceType } from '../shared/resource-type';
 import { DSpaceObject } from '../shared/dspace-object.model';
 
 /**
@@ -19,7 +17,6 @@ import { DSpaceObject } from '../shared/dspace-object.model';
 @Injectable()
 export class EpersonResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
 
-  protected objectFactory = NormalizedObjectFactory;
   protected toCache = false;
 
   constructor(
@@ -31,7 +28,7 @@ export class EpersonResponseParsingService extends BaseResponseParsingService im
 
   parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
     if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) {
-      const epersonDefinition = this.process<DSpaceObject,ResourceType>(data.payload, request.href);
+      const epersonDefinition = this.process<DSpaceObject>(data.payload, request.href);
       return new EpersonSuccessResponse(epersonDefinition[Object.keys(epersonDefinition)[0]], data.statusCode, data.statusText, this.processPageInfo(data.payload));
     } else {
       return new ErrorResponse(
diff --git a/src/app/core/integration/integration-object-factory.ts b/src/app/core/integration/integration-object-factory.ts
deleted file mode 100644
index f66a070fdf..0000000000
--- a/src/app/core/integration/integration-object-factory.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { GenericConstructor } from '../shared/generic-constructor';
-import { IntegrationType } from './intergration-type';
-import { IntegrationModel } from './models/integration.model';
-import { NormalizedAuthorityValue } from './models/normalized-authority-value.model';
-
-export class IntegrationObjectFactory {
-  public static getConstructor(type): GenericConstructor<IntegrationModel> {
-    switch (type) {
-      case IntegrationType.Authority: {
-        return NormalizedAuthorityValue;
-      }
-      default: {
-        return undefined;
-      }
-    }
-  }
-}
diff --git a/src/app/core/integration/integration-response-parsing.service.ts b/src/app/core/integration/integration-response-parsing.service.ts
index 2d3693cf3d..9793a69218 100644
--- a/src/app/core/integration/integration-response-parsing.service.ts
+++ b/src/app/core/integration/integration-response-parsing.service.ts
@@ -8,21 +8,19 @@ import {
   RestResponse
 } from '../cache/response.models';
 import { isNotEmpty } from '../../shared/empty.util';
-import { IntegrationObjectFactory } from './integration-object-factory';
 
 import { BaseResponseParsingService } from '../data/base-response-parsing.service';
 import { GLOBAL_CONFIG } from '../../../config';
 import { GlobalConfig } from '../../../config/global-config.interface';
 import { ObjectCacheService } from '../cache/object-cache.service';
 import { IntegrationModel } from './models/integration.model';
-import { IntegrationType } from './intergration-type';
 import { AuthorityValue } from './models/authority.value';
 import { PaginatedList } from '../data/paginated-list';
+import { ResourceType } from '../shared/resource-type';
 
 @Injectable()
 export class IntegrationResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
 
-  protected objectFactory = IntegrationObjectFactory;
   protected toCache = true;
 
   constructor(
@@ -34,7 +32,7 @@ export class IntegrationResponseParsingService extends BaseResponseParsingServic
 
   parse(request: RestRequest, data: DSpaceRESTV2Response): RestResponse {
     if (isNotEmpty(data.payload) && isNotEmpty(data.payload._links)) {
-      const dataDefinition = this.process<IntegrationModel,IntegrationType>(data.payload, request.uuid);
+      const dataDefinition = this.process<IntegrationModel>(data.payload, request.uuid);
       return new IntegrationSuccessResponse(this.processResponse(dataDefinition), data.statusCode, data.statusText, this.processPageInfo(data.payload));
     } else {
       return new ErrorResponse(
@@ -49,7 +47,7 @@ export class IntegrationResponseParsingService extends BaseResponseParsingServic
   protected processResponse(data: PaginatedList<IntegrationModel>): any {
     const returnList = Array.of();
     data.page.forEach((item, index) => {
-      if (item.type === IntegrationType.Authority) {
+      if (item.type === ResourceType.Authority) {
         data.page[index] = Object.assign(new AuthorityValue(), item);
       }
     });
diff --git a/src/app/core/integration/intergration-type.ts b/src/app/core/integration/intergration-type.ts
deleted file mode 100644
index 882dc6d8ce..0000000000
--- a/src/app/core/integration/intergration-type.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-
-export enum IntegrationType {
-  Authority = 'authority'
-}
diff --git a/src/app/core/shared/bitstream-format.model.ts b/src/app/core/shared/bitstream-format.model.ts
index 9af345e607..c46df1724d 100644
--- a/src/app/core/shared/bitstream-format.model.ts
+++ b/src/app/core/shared/bitstream-format.model.ts
@@ -1,11 +1,11 @@
 
-import { CacheableObject } from '../cache/object-cache.reducer';
+import { CacheableObject, TypedObject } from '../cache/object-cache.reducer';
 import { ResourceType } from './resource-type';
 
 /**
  * Model class for a Bitstream Format
  */
-export class BitstreamFormat implements CacheableObject {
+export class BitstreamFormat implements CacheableObject, TypedObject {
 
   /**
    * Short description of this Bitstream Format
diff --git a/src/app/core/shared/browse-definition.model.ts b/src/app/core/shared/browse-definition.model.ts
index 05263858c6..fe5fdd439b 100644
--- a/src/app/core/shared/browse-definition.model.ts
+++ b/src/app/core/shared/browse-definition.model.ts
@@ -1,7 +1,9 @@
 import { autoserialize, autoserializeAs } from 'cerialize';
 import { SortOption } from './sort-option.model';
+import { ResourceType } from './resource-type';
+import { TypedObject } from '../cache/object-cache.reducer';
 
-export class BrowseDefinition {
+export class BrowseDefinition implements TypedObject {
   @autoserialize
   id: string;
 
@@ -15,7 +17,7 @@ export class BrowseDefinition {
   defaultSortOrder: string;
 
   @autoserialize
-  type: string;
+  type: ResourceType;
 
   @autoserializeAs('metadata')
   metadataKeys: string[];
diff --git a/src/app/core/shared/browse-entry.model.ts b/src/app/core/shared/browse-entry.model.ts
index 932c6946d1..6f018cedde 100644
--- a/src/app/core/shared/browse-entry.model.ts
+++ b/src/app/core/shared/browse-entry.model.ts
@@ -1,10 +1,14 @@
 import { autoserialize, autoserializeAs } from 'cerialize';
 import { ListableObject } from '../../shared/object-collection/shared/listable-object.model';
+import { ResourceType } from './resource-type';
+import { resourceType } from './resource-type.decorator';
+import { CacheableObject, TypedObject } from '../cache/object-cache.reducer';
 
-export class BrowseEntry implements ListableObject {
+@resourceType(ResourceType.BrowseEntry)
+export class BrowseEntry implements ListableObject, TypedObject {
 
   @autoserialize
-  type: string;
+  type: ResourceType;
 
   @autoserialize
   authority: string;
diff --git a/src/app/core/shared/dspace-object.model.ts b/src/app/core/shared/dspace-object.model.ts
index 71c6ee7837..422e215c90 100644
--- a/src/app/core/shared/dspace-object.model.ts
+++ b/src/app/core/shared/dspace-object.model.ts
@@ -3,7 +3,7 @@ import { Observable } from 'rxjs';
 import { MetadataMap, MetadataValue, MetadataValueFilter, MetadatumViewModel } from './metadata.models';
 import { Metadata } from './metadata.utils';
 import { isUndefined } from '../../shared/empty.util';
-import { CacheableObject } from '../cache/object-cache.reducer';
+import { CacheableObject, TypedObject } from '../cache/object-cache.reducer';
 import { RemoteData } from '../data/remote-data';
 import { ResourceType } from './resource-type';
 import { ListableObject } from '../../shared/object-collection/shared/listable-object.model';
@@ -11,7 +11,7 @@ import { ListableObject } from '../../shared/object-collection/shared/listable-o
 /**
  * An abstract model class for a DSpaceObject.
  */
-export class DSpaceObject implements CacheableObject, ListableObject {
+export class DSpaceObject implements CacheableObject, ListableObject, TypedObject {
 
   private _name: string;
 
diff --git a/src/app/core/shared/resource-policy.model.ts b/src/app/core/shared/resource-policy.model.ts
index ee3d5293f5..21dcd44b01 100644
--- a/src/app/core/shared/resource-policy.model.ts
+++ b/src/app/core/shared/resource-policy.model.ts
@@ -1,4 +1,4 @@
-import { CacheableObject } from '../cache/object-cache.reducer';
+import { CacheableObject, TypedObject } from '../cache/object-cache.reducer';
 import { ResourceType } from './resource-type';
 import { Group } from '../eperson/models/group.model';
 import { ActionType } from '../cache/models/action-type.model';
@@ -6,7 +6,7 @@ import { ActionType } from '../cache/models/action-type.model';
 /**
  * Model class for a Resource Policy
  */
-export class ResourcePolicy implements CacheableObject {
+export class ResourcePolicy implements CacheableObject, TypedObject {
   /**
    * The action that is allowed by this Resource Policy
    */
diff --git a/src/app/core/shared/resource-type.decorator.ts b/src/app/core/shared/resource-type.decorator.ts
index a063eb8310..28b2c7cefe 100644
--- a/src/app/core/shared/resource-type.decorator.ts
+++ b/src/app/core/shared/resource-type.decorator.ts
@@ -1,10 +1,11 @@
-import { CacheableObject } from '../cache/object-cache.reducer';
+import { CacheableObject, TypedObject } from '../cache/object-cache.reducer';
 import { GenericConstructor } from './generic-constructor';
+import { ResourceType } from './resource-type';
 
 const resourceTypeForObjectMap = new Map();
 
-export function resourceType(...resourceType: string[]) {
-  return function decorator(objectConstructor: GenericConstructor<CacheableObject>) {
+export function resourceType(...resourceType: ResourceType[]) {
+  return function decorator(objectConstructor: GenericConstructor<TypedObject>) {
     if (!objectConstructor) {
       return;
     }
@@ -13,6 +14,6 @@ export function resourceType(...resourceType: string[]) {
   };
 }
 
-export function getNormalizedConstructorByType(resourceType: string) {
+export function getNormalizedConstructorByType(resourceType: ResourceType) {
   return resourceTypeForObjectMap.get(resourceType);
 }
diff --git a/src/app/core/shared/resource-type.ts b/src/app/core/shared/resource-type.ts
index c4eeb7a27d..47c59b95dc 100644
--- a/src/app/core/shared/resource-type.ts
+++ b/src/app/core/shared/resource-type.ts
@@ -21,5 +21,6 @@ export enum ResourceType {
   SubmissionSections = 'submissionsections',
   SubmissionSection = 'submissionsection',
   AuthStatus = 'status',
-  Authority = 'authority'
+  Authority = 'authority',
+  BrowseEntry = 'browseEntry',
 }
diff --git a/src/app/core/submission/submission-response-parsing.service.ts b/src/app/core/submission/submission-response-parsing.service.ts
index 20dfb43cbd..494e4db46b 100644
--- a/src/app/core/submission/submission-response-parsing.service.ts
+++ b/src/app/core/submission/submission-response-parsing.service.ts
@@ -15,7 +15,6 @@ import { NormalizedWorkspaceItem } from './models/normalized-workspaceitem.model
 import { NormalizedWorkflowItem } from './models/normalized-workflowitem.model';
 import { FormFieldMetadataValueObject } from '../../shared/form/builder/models/form-field-metadata-value.model';
 import { SubmissionObject } from './models/submission-object.model';
-import { NormalizedObjectFactory } from '../cache/models/normalized-object-factory';
 
 /**
  * Export a function to check if object has same properties of FormFieldMetadataValueObject
@@ -75,7 +74,6 @@ export function normalizeSectionData(obj: any) {
 @Injectable()
 export class SubmissionResponseParsingService extends BaseResponseParsingService implements ResponseParsingService {
 
-  protected objectFactory = NormalizedObjectFactory;
   protected toCache = false;
 
   constructor(@Inject(GLOBAL_CONFIG) protected EnvConfig: GlobalConfig,
@@ -94,7 +92,7 @@ export class SubmissionResponseParsingService extends BaseResponseParsingService
     if (isNotEmpty(data.payload)
       && isNotEmpty(data.payload._links)
       && (data.statusCode === 201 || data.statusCode === 200)) {
-      const dataDefinition = this.processResponse<SubmissionObject | ConfigObject, SubmissionResourceType>(data.payload, request.href);
+      const dataDefinition = this.processResponse<SubmissionObject | ConfigObject>(data.payload, request.href);
       return new SubmissionSuccessResponse(dataDefinition, data.statusCode, data.statusText, this.processPageInfo(data.payload));
     } else if (isEmpty(data.payload) && data.statusCode === 204) {
       // Response from a DELETE request
@@ -116,8 +114,8 @@ export class SubmissionResponseParsingService extends BaseResponseParsingService
    * @param {string} requestHref
    * @returns {any[]}
    */
-  protected processResponse<ObjectDomain, ObjectType>(data: any, requestHref: string): any[] {
-    const dataDefinition = this.process<ObjectDomain, ObjectType>(data, requestHref);
+  protected processResponse<ObjectDomain>(data: any, requestHref: string): any[] {
+    const dataDefinition = this.process<ObjectDomain>(data, requestHref);
     const normalizedDefinition = Array.of();
     const processedList = Array.isArray(dataDefinition) ? dataDefinition : Array.of(dataDefinition);
 
-- 
GitLab