2013-12-20 3 views
0

Тонкий клиентский URI - это веб-адрес, который вы можете ввести, чтобы просмотреть сведения о файле или папке, в удобном веб-интерфейсе пользователя.Как получить тонкий URI клиента в папке/документе Alfresco?

Например, мое приложение для Android использует CMIS API Alfresco, но для сложных операций (например, для запуска рабочего процесса в этом файле) вы можете щелкнуть ссылку, и это приведет вас к полноценному веб-интерфейсу (предоставляемый сервером Alfresco).

Как рассчитать этот тонкий URI клиента, для любой папки/документа Alfresco?

Хорошим началом является использование thinClientURI feature of the CMIS protocol. К сожалению, он работает только для корня репозитория.

Совершенный алгоритм показывает узлы Alfresco Share на своем веб-сайте Alfresco Share, а не в общем браузере репозитория Share.

+1

Есть ли причина, по которой вы хотели бы видеть старый интерфейс Explorer? Для просмотра веб-страниц, Share должен быть всем, на что вы хотите посмотреть. – skuro

+0

@skuro: Браузер репозитория Share's отлично подходит для всего, что не находится в '/ Sites' :-) –

+0

Использует ли веб-сайт' SiteShareViewUrlGet' (в '/ api/sites/shareUrl') не покрывают вас? – Gagravarr

ответ

1

Alfresco действительно имеет небольшую известность, чтобы делать то, что вам нужно! Я считаю, что он был реализован в Enterprise 4.0.3ish, готовый к 4.1, и его основное использование до сих пор находится в Cloud Sync.

Веб-сайт, который вы ищете, является org.alfresco.repository.site.site-share-view-url.get, и он отображается как /api/sites/shareUrl?nodeRef=nodeRef. Она возвращает простой битый JSON, такие как:

{ 
    "site": "alfresco-test", 
    "url": "https:\/\/my.alfresco.com\/share\/test.com\/page\/site\/alfresco-test\/document-details?nodeRef=workspace:\/\/SpacesStore\/aae3b33fd-23d4-4091-ae64-44a8e332091341" 
} 

(приведенный выше пример взят из облачной версии Alfresco, но она должна присутствовать в поздних выпусках 4,0 предприятия, предприятие 4.1 и сообщество + предприятие 4.2 по направлению вперед)

Если вы хотите увидеть, какие виды контента он поддерживает, лучше всего смотреть на класс Java, который питает его, org.alfresco.repo.web.scripts.site.SiteShareViewUrlGet

Однако одно небольшое ограничение в том, что он поддерживает только узлы, расположенные внутри сайтов. Если у вас есть узел без сайта, вам придется самостоятельно вычислить URL-адрес браузера репозитория ...

0

Ниже приводится моя текущая реализация.
Это (очень) далеко не идеальный, поскольку он работает только для папок, и только в Alfresco Share.

 string suffix1 = "alfresco/cmisatom"; 
     string suffix2 = "alfresco/service/cmis"; 
     if (repo.Address.AbsoluteUri.EndsWith(suffix1) || repo.Address.AbsoluteUri.EndsWith(suffix2)) 
     { 
      // Detect suffix length. 
      int suffixLength = 0; 
      if (repo.Address.AbsoluteUri.EndsWith(suffix1)) 
       suffixLength = suffix1.Length; 
      if (repo.Address.AbsoluteUri.EndsWith(suffix2)) 
       suffixLength = suffix2.Length; 

      string root = repo.Address.AbsoluteUri.Substring(0, repo.Address.AbsoluteUri.Length - suffixLength); 
      if (repo.RemotePath.StartsWith("/Sites")) 
      { 
       // Case of Alfresco Share. 

       // Example RemotePath: /Sites/thesite 
       // Result: http://server/share/page/site/thesite/documentlibrary 
       // Example RemotePath: /Sites/thesite/documentLibrary/somefolder/anotherfolder 
       // Result: http://server/share/page/site/thesite/documentlibrary#filter=path|%2Fsomefolder%2Fanotherfolder 
       // Example RemotePath: /Sites/s1/documentLibrary/éß和ệ 
       // Result: http://server/share/page/site/s1/documentlibrary#filter=path|%2F%25E9%25DF%25u548C%25u1EC7 
       // Example RemotePath: /Sites/s1/documentLibrary/a#bc/éß和ệ 
       // Result: http://server/share/page/site/thesite/documentlibrary#filter=path%7C%2Fa%2523bc%2F%25E9%25DF%25u548C%25u1EC7%7C 

       string path = repo.RemotePath.Substring("/Sites/".Length); 
       if (path.Contains("documentLibrary")) 
       { 
        int firstSlashPosition = path.IndexOf('/'); 
        string siteName = path.Substring(0, firstSlashPosition); 
        string pathWithinSite = path.Substring(firstSlashPosition + "/documentLibrary".Length); 
        string escapedPathWithinSite = HttpUtility.UrlEncode(pathWithinSite); 
        string reescapedPathWithinSite = HttpUtility.UrlEncode(escapedPathWithinSite); 
        string sharePath = reescapedPathWithinSite.Replace("%252f", "%2F"); 
        return root + "share/page/site/" + siteName + "/documentlibrary#filter=path|" + sharePath; 
       } 
       else 
       { 
        // Site name only. 
        return root + "share/page/site/" + path + "/documentlibrary"; 
       } 
      } 
      else 
      { 
       // Case of Alfresco Web Client. Difficult to build a direct URL, so return root. 
       return root; 
      } 
     }