@Override
  public ExtRepositoryFolderAdapter updateFolder(
      long folderId, String name, String description, ServiceContext serviceContext)
      throws PortalException {

    String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId);

    ExtRepositoryFolder extRepositoryFolder =
        _extRepository.getExtRepositoryObject(
            ExtRepositoryObjectType.FOLDER, extRepositoryFolderKey);

    ExtRepositoryFolder parentExtRepositoryFolder =
        _extRepository.getExtRepositoryParentFolder(extRepositoryFolder);

    ExtRepositoryFolder newExtRepositoryFolder =
        _extRepository.moveExtRepositoryObject(
            ExtRepositoryObjectType.FOLDER,
            extRepositoryFolderKey,
            parentExtRepositoryFolder.getExtRepositoryModelKey(),
            name);

    ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance();

    extRepositoryAdapterCache.remove(extRepositoryFolderKey);

    return _toExtRepositoryObjectAdapter(
        ExtRepositoryObjectAdapterType.FOLDER, newExtRepositoryFolder);
  }
  private ExtRepositoryFileVersionAdapter _toExtRepositoryFileVersionAdapter(
      ExtRepositoryFileEntryAdapter extRepositoryFileEntryAdapter,
      ExtRepositoryFileVersion extRepositoryFileVersion)
      throws PortalException {

    ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance();

    String extRepositoryModelKey = extRepositoryFileVersion.getExtRepositoryModelKey();

    ExtRepositoryFileVersionAdapter extRepositoryVersionAdapter =
        extRepositoryAdapterCache.get(extRepositoryModelKey);

    if (extRepositoryVersionAdapter == null) {
      RepositoryEntry repositoryEntry = getRepositoryEntry(extRepositoryModelKey);

      extRepositoryVersionAdapter =
          new ExtRepositoryFileVersionAdapter(
              this,
              repositoryEntry.getRepositoryEntryId(),
              repositoryEntry.getUuid(),
              extRepositoryFileEntryAdapter,
              extRepositoryFileVersion);

      extRepositoryAdapterCache.put(extRepositoryVersionAdapter);
    }

    return extRepositoryVersionAdapter;
  }
  @Override
  public FileEntry updateFileEntry(
      long userId,
      long fileEntryId,
      String sourceFileName,
      String mimeType,
      String title,
      String description,
      String changeLog,
      boolean majorVersion,
      InputStream inputStream,
      long size,
      ServiceContext serviceContext)
      throws PortalException {

    String extRepositoryFileEntryKey = getExtRepositoryObjectKey(fileEntryId);

    ExtRepositoryFileEntry extRepositoryFileEntry =
        _extRepository.getExtRepositoryObject(
            ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey);

    boolean needsCheckIn = false;

    if (!isCheckedOut(extRepositoryFileEntry)) {
      _extRepository.checkOutExtRepositoryFileEntry(extRepositoryFileEntryKey);

      needsCheckIn = true;
    }

    if (inputStream != null) {
      extRepositoryFileEntry =
          _extRepository.updateExtRepositoryFileEntry(
              extRepositoryFileEntryKey, mimeType, inputStream);
    }

    if (!title.equals(extRepositoryFileEntry.getTitle())) {
      ExtRepositoryFolder folder =
          _extRepository.getExtRepositoryParentFolder(extRepositoryFileEntry);

      extRepositoryFileEntry =
          _extRepository.moveExtRepositoryObject(
              ExtRepositoryObjectType.FILE,
              extRepositoryFileEntryKey,
              folder.getExtRepositoryModelKey(),
              title);

      ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance();

      extRepositoryAdapterCache.remove(extRepositoryFileEntryKey);
    }

    if (needsCheckIn) {
      _extRepository.checkInExtRepositoryFileEntry(
          extRepositoryFileEntryKey, majorVersion, changeLog);
    }

    return _toExtRepositoryObjectAdapter(
        ExtRepositoryObjectAdapterType.FILE, extRepositoryFileEntry);
  }
  @Override
  public void deleteFolder(long folderId) throws PortalException {
    String extRepositoryFolderKey = getExtRepositoryObjectKey(folderId);

    _extRepository.deleteExtRepositoryObject(
        ExtRepositoryObjectType.FOLDER, extRepositoryFolderKey);

    ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance();

    extRepositoryAdapterCache.remove(extRepositoryFolderKey);
  }
  @Override
  public void deleteFileEntry(long fileEntryId) throws PortalException {
    String extRepositoryFileEntryKey = getExtRepositoryObjectKey(fileEntryId);

    _extRepository.deleteExtRepositoryObject(
        ExtRepositoryObjectType.FILE, extRepositoryFileEntryKey);

    ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance();

    extRepositoryAdapterCache.remove(extRepositoryFileEntryKey);
  }
  @SuppressWarnings("unchecked")
  private <T extends ExtRepositoryObjectAdapter<?>> T _toExtRepositoryObjectAdapter(
      ExtRepositoryObjectAdapterType<T> extRepositoryObjectAdapterType,
      ExtRepositoryObject extRepositoryObject)
      throws PortalException {

    ExtRepositoryAdapterCache extRepositoryAdapterCache = ExtRepositoryAdapterCache.getInstance();

    String extRepositoryModelKey = extRepositoryObject.getExtRepositoryModelKey();

    ExtRepositoryObjectAdapter<?> extRepositoryObjectAdapter =
        extRepositoryAdapterCache.get(extRepositoryModelKey);

    if (extRepositoryObjectAdapter == null) {
      RepositoryEntry repositoryEntry = getRepositoryEntry(extRepositoryModelKey);

      if (extRepositoryObject instanceof ExtRepositoryFolder) {
        ExtRepositoryFolder extRepositoryFolder = (ExtRepositoryFolder) extRepositoryObject;

        extRepositoryObjectAdapter =
            new ExtRepositoryFolderAdapter(
                this,
                repositoryEntry.getRepositoryEntryId(),
                repositoryEntry.getUuid(),
                extRepositoryFolder);
      } else {
        ExtRepositoryFileEntry extRepositoryFileEntry =
            (ExtRepositoryFileEntry) extRepositoryObject;

        extRepositoryObjectAdapter =
            new ExtRepositoryFileEntryAdapter(
                this,
                repositoryEntry.getRepositoryEntryId(),
                repositoryEntry.getUuid(),
                extRepositoryFileEntry);

        _forceGetFileVersions((ExtRepositoryFileEntryAdapter) extRepositoryObjectAdapter);

        _checkAssetEntry((ExtRepositoryFileEntryAdapter) extRepositoryObjectAdapter);
      }

      extRepositoryAdapterCache.put(extRepositoryObjectAdapter);
    }

    if (extRepositoryObjectAdapterType == ExtRepositoryObjectAdapterType.FILE) {

      if (!(extRepositoryObjectAdapter instanceof ExtRepositoryFileEntryAdapter)) {

        throw new NoSuchFileEntryException(
            "External repository object is not a file " + extRepositoryObject);
      }
    } else if (extRepositoryObjectAdapterType == ExtRepositoryObjectAdapterType.FOLDER) {

      if (!(extRepositoryObjectAdapter instanceof ExtRepositoryFolderAdapter)) {

        throw new NoSuchFolderException(
            "External repository object is not a folder " + extRepositoryObject);
      }
    } else if (extRepositoryObjectAdapterType != ExtRepositoryObjectAdapterType.OBJECT) {

      throw new IllegalArgumentException(
          "Unsupported repository object type " + extRepositoryObjectAdapterType);
    }

    return (T) extRepositoryObjectAdapter;
  }