001    /**
002     * Copyright (c) 2000-2012 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
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                    int pos = documentName.lastIndexOf("sharepoint/");
124    
125                    if (pos != -1) {
126                            path = path.substring(pos + 11);
127                    }
128    
129                    Group group = GroupServiceUtil.getGroup(
130                            SharepointUtil.getGroupId(path));
131    
132                    boolean minimal = false;
133    
134                    beginPos = xml.lastIndexOf("<minimal>");
135                    endPos = xml.lastIndexOf("</minimal>");
136    
137                    if (beginPos != -1) {
138                            minimal = GetterUtil.getBoolean(
139                                    xml.substring(beginPos + 9, endPos));
140                    }
141    
142                    Document doc = SAXReaderUtil.createDocument();
143    
144                    Element root = doc.addElement("Results");
145    
146                    String url =
147                            "http://" + request.getLocalAddr() + ":" + request.getServerPort() +
148                                    "/sharepoint";
149    
150                    root.addElement("SubscribeUrl").setText(url);
151                    root.addElement("MtgInstance");
152                    root.addElement("SettingUrl").setText(url);
153                    root.addElement("PermsUrl").setText(url);
154                    root.addElement("UserInfoUrl").setText(url);
155    
156                    Element rolesEl = root.addElement("Roles");
157    
158                    List<Role> roles = RoleLocalServiceUtil.getRoles(
159                            PortalUtil.getCompanyId(request));
160    
161                    for (Role role : roles) {
162                            ResponseElement responseElement = new RoleResponseElement(role);
163    
164                            responseElement.addElement(rolesEl);
165                    }
166    
167                    if (!minimal) {
168                            Element schemaEl = root.addElement("Schema");
169    
170                            schemaEl.addAttribute("Name", "Documents");
171                            schemaEl.addAttribute("Url", group.getName());
172    
173                            Element fieldEl = schemaEl.addElement("Field");
174    
175                            fieldEl.addAttribute("Name", "FileLeafRef");
176                            fieldEl.addAttribute("Required", "true");
177                            fieldEl.addAttribute("Type", "Invalid");
178    
179                            fieldEl.addElement("Choices");
180    
181                            fieldEl = schemaEl.addElement("Field");
182    
183                            fieldEl.addAttribute("Name", "_SourceUrl");
184                            fieldEl.addAttribute("Required", "false");
185                            fieldEl.addAttribute("Type", "Text");
186    
187                            fieldEl.addElement("Choices");
188    
189                            fieldEl = schemaEl.addElement("Field");
190    
191                            fieldEl.addAttribute("Name", "_SharedFileIndex");
192                            fieldEl.addAttribute("Required", "false");
193                            fieldEl.addAttribute("Type", "Text");
194    
195                            fieldEl.addElement("Choices");
196    
197                            fieldEl = schemaEl.addElement("Field");
198    
199                            fieldEl.addAttribute("Name", "Order");
200                            fieldEl.addAttribute("Required", "false");
201                            fieldEl.addAttribute("Type", "Number");
202    
203                            fieldEl.addElement("Choices");
204    
205                            fieldEl = schemaEl.addElement("Field");
206    
207                            fieldEl.addAttribute("Name", "Title");
208                            fieldEl.addAttribute("Required", "false");
209                            fieldEl.addAttribute("Type", "Text");
210    
211                            fieldEl.addElement("Choices");
212    
213                            Element listInfoEl = root.addElement("ListInfo");
214    
215                            listInfoEl.addAttribute("Name", "Links");
216    
217                            listInfoEl.addElement("Moderated").setText(String.valueOf(false));
218    
219                            Element listPermissionsEl = listInfoEl.addElement(
220                                    "ListPermissions");
221    
222                            listPermissionsEl.addElement("DeleteListItems");
223                            listPermissionsEl.addElement("EditListItems");
224                            listPermissionsEl.addElement("InsertListItems");
225                            listPermissionsEl.addElement("ManageRoles");
226                            listPermissionsEl.addElement("ManageWeb");
227                    }
228    
229                    Element permissionsEl = root.addElement("Permissions");
230    
231                    if (!minimal) {
232                            permissionsEl.addElement("DeleteListItems");
233                            permissionsEl.addElement("EditListItems");
234                            permissionsEl.addElement("InsertListItems");
235                            permissionsEl.addElement("ManageRoles");
236                            permissionsEl.addElement("ManageWeb");
237                    }
238    
239                    root.addElement("HasUniquePerm").setText(String.valueOf(true));
240                    root.addElement("WorkspaceType").setText("DWS");
241                    root.addElement("IsADMode").setText(String.valueOf(false));
242                    root.addElement("DocUrl").setText(documentName);
243                    root.addElement("Minimal").setText(String.valueOf(true));
244    
245                    Element resultsEl = root.addElement("Results");
246    
247                    resultsEl.addElement("Title").setText(group.getName());
248                    resultsEl.addElement("LastUpdate");
249    
250                    User user = (User)request.getSession().getAttribute(WebKeys.USER);
251    
252                    ResponseElement responseElement = new MemberResponseElement(
253                            user, false);
254    
255                    responseElement.addElement(resultsEl);
256    
257                    Element membersEl = resultsEl.addElement("Members");
258    
259                    List<User> users = UserLocalServiceUtil.getGroupUsers(
260                            group.getGroupId());
261    
262                    for (User member : users) {
263                            responseElement = new MemberResponseElement(member, true);
264    
265                            responseElement.addElement(membersEl);
266                    }
267    
268                    if (!minimal) {
269                            Element assigneesEl = resultsEl.addElement("Assignees");
270    
271                            for (User member : users) {
272                                    responseElement = new MemberResponseElement(member, true);
273    
274                                    responseElement.addElement(assigneesEl);
275                            }
276    
277                            Element listEl = resultsEl.addElement("List");
278    
279                            listEl.addAttribute("Name", "Documents");
280    
281                            listEl.addElement("ID");
282    
283                            String parentFolderPath = path;
284    
285                            pos = parentFolderPath.lastIndexOf("/");
286    
287                            if (pos != -1) {
288                                    parentFolderPath = parentFolderPath.substring(0, pos);
289                            }
290    
291                            SharepointStorage storage = SharepointUtil.getStorage(
292                                    parentFolderPath);
293    
294                            SharepointRequest sharepointRequest = new SharepointRequest(
295                                    parentFolderPath);
296    
297                            storage.addDocumentElements(sharepointRequest, listEl);
298                    }
299    
300                    return doc.asXML();
301            }
302    
303            private static Log _log = LogFactoryUtil.getLog(SharepointServlet.class);
304    
305    }