Como trabalhar com marcas sociais no SharePoint 2010

Artigo original publicado em 29 de setembro de 2011, quinta-feira

OBSERVAÇÃO: Baixe o anexo para obter um documento de Word com essa postagem em formato legível.

Recentemente, tive um pedido interessante de uma pessoa que queria ajuda essencialmente para conseguir migrar marcas sociais entre dois farms diferentes. Existem algumas coisas prontas que podem ajudá-lo a realizar isso, e algumas que são tentadoras, mas não totalmente suficientes.

Eu testei pegar algumas marcas sociais sem nenhum tipo de representação real. Funcionou para mim, mas não posso garantir que vá funcionar em todos os casos porque eu estava logado como UPA admin. Se não funcionar, você pode usar a mesma técnica de representação descrita abaixo. Para obter as marcas de um usuário, eu tentei criar um contexto SPSite como aquele usuário e criei todos os objetos de contexto necessários para retomar as marcas para aquele usuário, desta forma:

SPUserToken sut = null;

//obtenha o token do primeiro usuário de forma que possamos

//usá-lo para obter um contexto de site conforme aquele usuário

using (SPSite userSite = new SPSite(UrlTxt.Text))

{

   using (SPWeb rootWeb = userSite.RootWeb)

   {

       SPUser socialUser =

          rootWeb.EnsureUser(AccountTxt.Text);

       sut = socialUser.UserToken;

   }

}

                

//agora pegue o site conforme aquele usuário – OBSERVAÇÃO: são

//todas variáveis classificadas como escopo

using (SPSite newSite = new SPSite(UrlTxt.Text, sut))

{

   sc = SPServiceContext.GetContext(newSite);

   stm = new SocialTagManager(sc);

   upm = new UserProfileManager(sc);

   up = upm.GetUserProfile(AccountTxt.Text);

}

 

Uma vez que tenho os contextos criados como usuário atual, fica fácil obter as marcas para aquele usuário:

SocialTag[] tags = stm.GetTags(up);

 

TagLst.Items.Clear();

foreach (SocialTag tag in tags)

{

   TagLst.Items.Add(tag.Term.Name + " - " + tag.Url.ToString());

}

 

Essa parte foi bastante direta e fácil. Escrever uma marca social para um usuário diferente não foi, infelizmente, nem de perto tão fácil. A SocialTagManager inclui um método AddTag, mas não fornece uma sobrecarga que inclui um UserProfile como faz o método GetTags. Esse equívoco é complicado e, infelizmente, usar o contexto do usuário que foi passado no novo construtor SPSite não ajuda. Como resultado, você precisa usar a personificação para fazer isso. Nesse caso, eu apenas reusei a abordagem descrita nesta postagem – https://blogs.msdn.com/b/sharepoint_br/archive/2011/10/07/usando-declara-231-245-es-saml-sharepoint-wcf-declara-231-245-es-para-o-servi-231-o-de-token-do-windows-e-a-delega-231-227-o-restrita-para-acessar-o-sql-server.aspxdelegation-to-access-sql-server.aspx. Eu configurei o CTWTS para me permitir (uma vez que meu aplicativo estava sendo executado em meu contexto de usuário) representar os usuários. Detalhes específicos de como fazer isso são descritos aqui. https://msdn.microsoft.com/en-us/library/ee517258.aspx.

Então, com essa abordagem em mente, segue como eu fiz a representação primeiramente:

//inicie a representação

//crie a WindowsIdentity para representação

WindowsIdentity wid = null;

 

try

{

   wid = S4UClient.UpnLogon(EmailTxt.Text);

}

catch (SecurityAccessDeniedException adEx)

{

   MessageBox.Show("Could not map the Email to " +

       "a valid windows identity: " + adEx.Message);

}

 

//veja se conseguimos fazer logon de forma bem-sucedida

if (wid != null)

{

   using (WindowsImpersonationContext ctx = wid.Impersonate())

   {

       //o código vai aqui para adicionar uma nova marca

   }

}

else

{

   MessageBox.Show("Couldn't impersonate user - can't add tag.");

}

 

A representação do código mesmo não é particularmente complexa – você só precisa do endereço de email do usuário (o qual você provavelmente consegue a partir do UserProfile dele, o qual esse código retoma). Você também precisa que o CTWTS esteja sendo executado, o qual se instala em cada servidor do SharePoint, e esse código precisa ser executado em um servidor do SharePoint, uma vez que ele usa o modelo de objeto. Assim, novamente, isso não deve ser um grande obstáculo.

Finalmente, adicionar a nova marca para o usuário requer alguns sacrifícios, mas é perfeitamente manejável. O código se parece com o seguinte:

//esse é o código que obtém o SPSite, o SPServiceContext, etc.

GetServiceContext();

 

//trabalhe com as classes de taxonomia de forma que

//possamos reusar qualquer termo existente, ou criar

//um novo se ele não existir

TaxonomySession txs = stm.TaxonomySession;

TermStore ts = txs.DefaultKeywordsTermStore;

 

TermCollection terms =

   ts.KeywordsTermSet.GetTerms(TagTxt.Text,

   ts.DefaultLanguage, true);

 

Term t = null;

 

if (terms.Count == 0)

{

   t = ts.KeywordsTermSet.CreateTerm(TagTxt.Text,

       ts.DefaultLanguage);

       ts.CommitAll();

}

else

   t = terms[0];

 

//adicionar a marca

stm.AddTag(new Uri(TagUrlTxt.Text), t);

 

Então, o que acontece aqui é que apenas olhamos o armazenamento de taxonomia para a marca que está sendo adicionada. Se nós a encontrarmos lá dentro, aí nós usamos aquele termo; caso não, nós o criamos e o adicionamos ao armazenamento de termo. Então nós o adicionamos e o associamos com a Url, e ele é adicionado para aquelas marcas sociais do usuário.

No geral, o código e a abordagem são bastante diretos. O principal problema aqui é justamente trabalhar em volta da inabilidade de especificar para qual usuário a marca social deve ser adicionada. O código de caracterização e o CTWTS cuidam dessa parte para nós sem precisar da senha de cada usuário. O código-fonte para esse projeto está anexado à postagem.

 

Esta é uma postagem de blog traduzida. Veja o artigo original em Working with Social Tags in SharePoint 2010