001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.sharepoint;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.log.LogFactoryUtil;
019    import com.liferay.portal.kernel.servlet.HttpHeaders;
020    import com.liferay.portal.kernel.servlet.ServletResponseUtil;
021    import com.liferay.portal.kernel.util.ContentTypes;
022    import com.liferay.portal.kernel.util.GetterUtil;
023    import com.liferay.portal.kernel.util.HttpUtil;
024    import com.liferay.portal.kernel.util.StringBundler;
025    import com.liferay.portal.kernel.util.StringUtil;
026    import com.liferay.portal.kernel.xml.Document;
027    import com.liferay.portal.kernel.xml.Element;
028    import com.liferay.portal.kernel.xml.SAXReaderUtil;
029    import com.liferay.portal.model.Group;
030    import com.liferay.portal.model.Role;
031    import com.liferay.portal.model.User;
032    import com.liferay.portal.service.GroupServiceUtil;
033    import com.liferay.portal.service.RoleLocalServiceUtil;
034    import com.liferay.portal.service.UserLocalServiceUtil;
035    import com.liferay.portal.sharepoint.dws.MemberResponseElement;
036    import com.liferay.portal.sharepoint.dws.ResponseElement;
037    import com.liferay.portal.sharepoint.dws.RoleResponseElement;
038    import com.liferay.portal.util.PortalUtil;
039    import com.liferay.portal.util.WebKeys;
040    
041    import java.util.List;
042    
043    import javax.servlet.http.HttpServlet;
044    import javax.servlet.http.HttpServletRequest;
045    import javax.servlet.http.HttpServletResponse;
046    
047    /**
048     * @author Bruno Farache
049     */
050    public class SharepointDocumentWorkspaceServlet extends HttpServlet {
051    
052            @Override
053            protected void doPost(
054                    HttpServletRequest request, HttpServletResponse response) {
055    
056                    if (_log.isInfoEnabled()) {
057                            _log.info(
058                                    request.getHeader(HttpHeaders.USER_AGENT) + " " +
059                                            request.getMethod() + " " + request.getRequestURI());
060                    }
061    
062                    try {
063                            getDwsMetaDataResponse(request, response);
064                    }
065                    catch (Exception e) {
066                            _log.error(e, e);
067                    }
068            }
069    
070            protected void getDwsMetaDataResponse(
071                            HttpServletRequest request, HttpServletResponse response)
072                    throws Exception {
073    
074                    StringBundler sb = new StringBundler(12);
075    
076                    sb.append("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"");
077                    sb.append("http://schemas.xmlsoap.org/soap/envelope/\">");
078                    sb.append("<SOAP-ENV:Header/>");
079                    sb.append("<SOAP-ENV:Body>");
080                    sb.append("<GetDwsMetaDataResponse xmlns=\"");
081                    sb.append("http://schemas.microsoft.com/sharepoint/soap/dws/\">");
082                    sb.append("<GetDwsMetaDataResult>");
083    
084                    String results = getResults(request);
085    
086                    int pos = results.indexOf("\n");
087    
088                    if (pos != -1) {
089                            results = results.substring(pos + 1);
090                    }
091    
092                    results = results.replaceAll("<", "&lt;");
093                    results = results.replaceAll(">", "&gt;");
094    
095                    sb.append(results);
096    
097                    sb.append("</GetDwsMetaDataResult>");
098                    sb.append("</GetDwsMetaDataResponse>");
099                    sb.append("</SOAP-ENV:Body>");
100                    sb.append("</SOAP-ENV:Envelope>");
101    
102                    response.setContentType(ContentTypes.TEXT_XML_UTF8);
103    
104                    ServletResponseUtil.write(response, sb.toString());
105            }
106    
107            protected String getResults(HttpServletRequest request) throws Exception {
108                    String xml = StringUtil.read(request.getInputStream());
109    
110                    String documentName = null;
111    
112                    int beginPos = xml.lastIndexOf("<document>");
113                    int endPos = xml.lastIndexOf("</document>");
114    
115                    if (beginPos != -1) {
116                            documentName = xml.substring(beginPos + 10, endPos);
117    
118                            documentName = HttpUtil.decodeURL(documentName);
119                    }
120    
121                    String path = documentName;
122    
123                    if (_log.isInfoEnabled()) {
124                            _log.info("Original path " + path);
125                    }
126    
127                    path = SharepointUtil.stripService(path, true);
128    
129                    if (_log.isInfoEnabled()) {
130                            _log.info("Modified path " + path);
131                    }
132    
133                    Group group = GroupServiceUtil.getGroup(
134                            SharepointUtil.getGroupId(path));
135    
136                    boolean minimal = false;
137    
138                    beginPos = xml.lastIndexOf("<minimal>");
139                    endPos = xml.lastIndexOf("</minimal>");
140    
141                    if (beginPos != -1) {
142                            minimal = GetterUtil.getBoolean(
143                                    xml.substring(beginPos + 9, endPos));
144                    }
145    
146                    Document doc = SAXReaderUtil.createDocument();
147    
148                    Element root = doc.addElement("Results");
149    
150                    String url =
151                            "http://" + request.getLocalAddr() + ":" + request.getServerPort() +
152                                    "/sharepoint";
153    
154                    root.addElement("SubscribeUrl").setText(url);
155                    root.addElement("MtgInstance");
156                    root.addElement("SettingUrl").setText(url);
157                    root.addElement("PermsUrl").setText(url);
158                    root.addElement("UserInfoUrl").setText(url);
159    
160                    Element rolesEl = root.addElement("Roles");
161    
162                    List<Role> roles = RoleLocalServiceUtil.getRoles(
163                            PortalUtil.getCompanyId(request));
164    
165                    for (Role role : roles) {
166                            ResponseElement responseElement = new RoleResponseElement(role);
167    
168                            responseElement.addElement(rolesEl);
169                    }
170    
171                    if (!minimal) {
172                            Element schemaEl = root.addElement("Schema");
173    
174                            schemaEl.addAttribute("Name", "Documents");
175                            schemaEl.addAttribute("Url", group.getName());
176    
177                            Element fieldEl = schemaEl.addElement("Field");
178    
179                            fieldEl.addAttribute("Name", "FileLeafRef");
180                            fieldEl.addAttribute("Required", "true");
181                            fieldEl.addAttribute("Type", "Invalid");
182    
183                            fieldEl.addElement("Choices");
184    
185                            fieldEl = schemaEl.addElement("Field");
186    
187                            fieldEl.addAttribute("Name", "_SourceUrl");
188                            fieldEl.addAttribute("Required", "false");
189                            fieldEl.addAttribute("Type", "Text");
190    
191                            fieldEl.addElement("Choices");
192    
193                            fieldEl = schemaEl.addElement("Field");
194    
195                            fieldEl.addAttribute("Name", "_SharedFileIndex");
196                            fieldEl.addAttribute("Required", "false");
197                            fieldEl.addAttribute("Type", "Text");
198    
199                            fieldEl.addElement("Choices");
200    
201                            fieldEl = schemaEl.addElement("Field");
202    
203                            fieldEl.addAttribute("Name", "Order");
204                            fieldEl.addAttribute("Required", "false");
205                            fieldEl.addAttribute("Type", "Number");
206    
207                            fieldEl.addElement("Choices");
208    
209                            fieldEl = schemaEl.addElement("Field");
210    
211                            fieldEl.addAttribute("Name", "Title");
212                            fieldEl.addAttribute("Required", "false");
213                            fieldEl.addAttribute("Type", "Text");
214    
215                            fieldEl.addElement("Choices");
216    
217                            Element listInfoEl = root.addElement("ListInfo");
218    
219                            listInfoEl.addAttribute("Name", "Links");
220    
221                            listInfoEl.addElement("Moderated").setText(String.valueOf(false));
222    
223                            Element listPermissionsEl = listInfoEl.addElement(
224                                    "ListPermissions");
225    
226                            listPermissionsEl.addElement("DeleteListItems");
227                            listPermissionsEl.addElement("EditListItems");
228                            listPermissionsEl.addElement("InsertListItems");
229                            listPermissionsEl.addElement("ManageRoles");
230                            listPermissionsEl.addElement("ManageWeb");
231                    }
232    
233                    Element permissionsEl = root.addElement("Permissions");
234    
235                    if (!minimal) {
236                            permissionsEl.addElement("DeleteListItems");
237                            permissionsEl.addElement("EditListItems");
238                            permissionsEl.addElement("InsertListItems");
239                            permissionsEl.addElement("ManageRoles");
240                            permissionsEl.addElement("ManageWeb");
241                    }
242    
243                    root.addElement("HasUniquePerm").setText(String.valueOf(true));
244                    root.addElement("WorkspaceType").setText("DWS");
245                    root.addElement("IsADMode").setText(String.valueOf(false));
246                    root.addElement("DocUrl").setText(documentName);
247                    root.addElement("Minimal").setText(String.valueOf(true));
248    
249                    Element resultsEl = root.addElement("Results");
250    
251                    resultsEl.addElement("Title").setText(group.getName());
252                    resultsEl.addElement("LastUpdate");
253    
254                    User user = (User)request.getSession().getAttribute(WebKeys.USER);
255    
256                    ResponseElement responseElement = new MemberResponseElement(
257                            user, false);
258    
259                    responseElement.addElement(resultsEl);
260    
261                    Element membersEl = resultsEl.addElement("Members");
262    
263                    List<User> users = UserLocalServiceUtil.getGroupUsers(
264                            group.getGroupId());
265    
266                    for (User member : users) {
267                            responseElement = new MemberResponseElement(member, true);
268    
269                            responseElement.addElement(membersEl);
270                    }
271    
272                    if (minimal) {
273                            return doc.asXML();
274                    }
275    
276                    Element assigneesEl = resultsEl.addElement("Assignees");
277    
278                    for (User member : users) {
279                            responseElement = new MemberResponseElement(member, true);
280    
281                            responseElement.addElement(assigneesEl);
282                    }
283    
284                    Element listEl = resultsEl.addElement("List");
285    
286                    listEl.addAttribute("Name", "Documents");
287    
288                    listEl.addElement("ID");
289    
290                    String parentFolderPath = path;
291    
292                    int pos = parentFolderPath.lastIndexOf("/");
293    
294                    if (pos != -1) {
295                            parentFolderPath = parentFolderPath.substring(0, pos);
296                    }
297    
298                    SharepointStorage storage = SharepointUtil.getStorage(parentFolderPath);
299    
300                    SharepointRequest sharepointRequest = new SharepointRequest(
301                            parentFolderPath);
302    
303                    storage.addDocumentElements(sharepointRequest, listEl);
304    
305                    return doc.asXML();
306            }
307    
308            private static Log _log = LogFactoryUtil.getLog(
309                    SharepointDocumentWorkspaceServlet.class);
310    
311    }