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