/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.sharepoint; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.model.Group; import com.liferay.portal.kernel.model.Role; import com.liferay.portal.kernel.model.User; import com.liferay.portal.kernel.service.GroupServiceUtil; import com.liferay.portal.kernel.service.RoleLocalServiceUtil; import com.liferay.portal.kernel.service.UserLocalServiceUtil; import com.liferay.portal.kernel.servlet.HttpHeaders; import com.liferay.portal.kernel.servlet.ServletResponseUtil; import com.liferay.portal.kernel.util.ContentTypes; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.HttpUtil; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringUtil; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.portal.kernel.xml.Document; import com.liferay.portal.kernel.xml.Element; import com.liferay.portal.kernel.xml.SAXReaderUtil; import com.liferay.portal.sharepoint.dws.MemberResponseElement; import com.liferay.portal.sharepoint.dws.ResponseElement; import com.liferay.portal.sharepoint.dws.RoleResponseElement; import java.util.List; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author Bruno Farache */ public class SharepointDocumentWorkspaceServlet extends HttpServlet { @Override protected void doPost( HttpServletRequest request, HttpServletResponse response) { if (_log.isInfoEnabled()) { _log.info( request.getHeader(HttpHeaders.USER_AGENT) + " " + request.getMethod() + " " + request.getRequestURI()); } try { getDwsMetaDataResponse(request, response); } catch (Exception e) { _log.error(e, e); } } protected void getDwsMetaDataResponse( HttpServletRequest request, HttpServletResponse response) throws Exception { StringBundler sb = new StringBundler(12); sb.append("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\""); sb.append("http://schemas.xmlsoap.org/soap/envelope/\">"); sb.append("<SOAP-ENV:Header/>"); sb.append("<SOAP-ENV:Body>"); sb.append("<GetDwsMetaDataResponse xmlns=\""); sb.append("http://schemas.microsoft.com/sharepoint/soap/dws/\">"); sb.append("<GetDwsMetaDataResult>"); String results = getResults(request); int pos = results.indexOf("\n"); if (pos != -1) { results = results.substring(pos + 1); } results = StringUtil.replace(results, '<', "<"); results = StringUtil.replace(results, '>', ">"); sb.append(results); sb.append("</GetDwsMetaDataResult>"); sb.append("</GetDwsMetaDataResponse>"); sb.append("</SOAP-ENV:Body>"); sb.append("</SOAP-ENV:Envelope>"); response.setContentType(ContentTypes.TEXT_XML_UTF8); ServletResponseUtil.write(response, sb.toString()); } protected String getResults(HttpServletRequest request) throws Exception { String xml = StringUtil.read(request.getInputStream()); String documentName = null; int beginPos = xml.lastIndexOf("<document>"); int endPos = xml.lastIndexOf("</document>"); if (beginPos != -1) { documentName = xml.substring(beginPos + 10, endPos); documentName = HttpUtil.decodeURL(documentName); } String path = documentName; if (_log.isInfoEnabled()) { _log.info("Original path " + path); } path = SharepointUtil.stripService(path, true); if (_log.isInfoEnabled()) { _log.info("Modified path " + path); } Group group = GroupServiceUtil.getGroup( SharepointUtil.getGroupId(path)); boolean minimal = false; beginPos = xml.lastIndexOf("<minimal>"); endPos = xml.lastIndexOf("</minimal>"); if (beginPos != -1) { minimal = GetterUtil.getBoolean( xml.substring(beginPos + 9, endPos)); } Document doc = SAXReaderUtil.createDocument(); Element root = doc.addElement("Results"); String url = "http://" + request.getLocalAddr() + ":" + request.getServerPort() + "/sharepoint"; root.addElement("SubscribeUrl").setText(url); root.addElement("MtgInstance"); root.addElement("SettingUrl").setText(url); root.addElement("PermsUrl").setText(url); root.addElement("UserInfoUrl").setText(url); Element rolesEl = root.addElement("Roles"); List<Role> roles = RoleLocalServiceUtil.getRoles( PortalUtil.getCompanyId(request)); for (Role role : roles) { ResponseElement responseElement = new RoleResponseElement(role); responseElement.addElement(rolesEl); } if (!minimal) { Element schemaEl = root.addElement("Schema"); schemaEl.addAttribute("Name", "Documents"); schemaEl.addAttribute("Url", group.getDescriptiveName()); Element fieldEl = schemaEl.addElement("Field"); fieldEl.addAttribute("Name", "FileLeafRef"); fieldEl.addAttribute("Required", "true"); fieldEl.addAttribute("Type", "Invalid"); fieldEl.addElement("Choices"); fieldEl = schemaEl.addElement("Field"); fieldEl.addAttribute("Name", "_SourceUrl"); fieldEl.addAttribute("Required", "false"); fieldEl.addAttribute("Type", "Text"); fieldEl.addElement("Choices"); fieldEl = schemaEl.addElement("Field"); fieldEl.addAttribute("Name", "_SharedFileIndex"); fieldEl.addAttribute("Required", "false"); fieldEl.addAttribute("Type", "Text"); fieldEl.addElement("Choices"); fieldEl = schemaEl.addElement("Field"); fieldEl.addAttribute("Name", "Order"); fieldEl.addAttribute("Required", "false"); fieldEl.addAttribute("Type", "Number"); fieldEl.addElement("Choices"); fieldEl = schemaEl.addElement("Field"); fieldEl.addAttribute("Name", "Title"); fieldEl.addAttribute("Required", "false"); fieldEl.addAttribute("Type", "Text"); fieldEl.addElement("Choices"); Element listInfoEl = root.addElement("ListInfo"); listInfoEl.addAttribute("Name", "Links"); listInfoEl.addElement("Moderated").setText(String.valueOf(false)); Element listPermissionsEl = listInfoEl.addElement( "ListPermissions"); listPermissionsEl.addElement("DeleteListItems"); listPermissionsEl.addElement("EditListItems"); listPermissionsEl.addElement("InsertListItems"); listPermissionsEl.addElement("ManageRoles"); listPermissionsEl.addElement("ManageWeb"); } Element permissionsEl = root.addElement("Permissions"); if (!minimal) { permissionsEl.addElement("DeleteListItems"); permissionsEl.addElement("EditListItems"); permissionsEl.addElement("InsertListItems"); permissionsEl.addElement("ManageRoles"); permissionsEl.addElement("ManageWeb"); } root.addElement("HasUniquePerm").setText(String.valueOf(true)); root.addElement("WorkspaceType").setText("DWS"); root.addElement("IsADMode").setText(String.valueOf(false)); root.addElement("DocUrl").setText(documentName); root.addElement("Minimal").setText(String.valueOf(true)); Element resultsEl = root.addElement("Results"); resultsEl.addElement("Title").setText(group.getDescriptiveName()); resultsEl.addElement("LastUpdate"); User user = (User)request.getSession().getAttribute(WebKeys.USER); ResponseElement responseElement = new MemberResponseElement( user, false); responseElement.addElement(resultsEl); Element membersEl = resultsEl.addElement("Members"); List<User> users = UserLocalServiceUtil.getGroupUsers( group.getGroupId()); for (User member : users) { responseElement = new MemberResponseElement(member, true); responseElement.addElement(membersEl); } if (minimal) { return doc.asXML(); } Element assigneesEl = resultsEl.addElement("Assignees"); for (User member : users) { responseElement = new MemberResponseElement(member, true); responseElement.addElement(assigneesEl); } Element listEl = resultsEl.addElement("List"); listEl.addAttribute("Name", "Documents"); listEl.addElement("ID"); String parentFolderPath = path; int pos = parentFolderPath.lastIndexOf("/"); if (pos != -1) { parentFolderPath = parentFolderPath.substring(0, pos); } SharepointStorage storage = SharepointUtil.getStorage(parentFolderPath); SharepointRequest sharepointRequest = new SharepointRequest( parentFolderPath); storage.addDocumentElements(sharepointRequest, listEl); return doc.asXML(); } private static final Log _log = LogFactoryUtil.getLog( SharepointDocumentWorkspaceServlet.class); }