001    /**
002     * Copyright (c) 2000-2010 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.util.ContentTypes;
020    import com.liferay.portal.kernel.util.GetterUtil;
021    import com.liferay.portal.kernel.util.HttpUtil;
022    import com.liferay.portal.kernel.util.StringBundler;
023    import com.liferay.portal.kernel.util.StringUtil;
024    import com.liferay.portal.kernel.xml.Document;
025    import com.liferay.portal.kernel.xml.Element;
026    import com.liferay.portal.kernel.xml.SAXReaderUtil;
027    import com.liferay.portal.model.Group;
028    import com.liferay.portal.model.Role;
029    import com.liferay.portal.model.User;
030    import com.liferay.portal.service.GroupServiceUtil;
031    import com.liferay.portal.service.RoleLocalServiceUtil;
032    import com.liferay.portal.service.UserLocalServiceUtil;
033    import com.liferay.portal.sharepoint.dws.MemberResponseElement;
034    import com.liferay.portal.sharepoint.dws.ResponseElement;
035    import com.liferay.portal.sharepoint.dws.RoleResponseElement;
036    import com.liferay.portal.util.PortalUtil;
037    import com.liferay.portal.util.WebKeys;
038    import com.liferay.util.servlet.ServletResponseUtil;
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            protected void doPost(
052                    HttpServletRequest request, HttpServletResponse response) {
053    
054                    try {
055                            getDwsMetaDataResponse(request, response);
056                    }
057                    catch (Exception e) {
058                            _log.error(e, e);
059                    }
060            }
061    
062            protected void getDwsMetaDataResponse(
063                            HttpServletRequest request, HttpServletResponse response)
064                    throws Exception {
065    
066                    StringBundler sb = new StringBundler(12);
067    
068                    sb.append("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"");
069                    sb.append("http://schemas.xmlsoap.org/soap/envelope/\">");
070                    sb.append("<SOAP-ENV:Header/>");
071                    sb.append("<SOAP-ENV:Body>");
072                    sb.append("<GetDwsMetaDataResponse xmlns=\"");
073                    sb.append("http://schemas.microsoft.com/sharepoint/soap/dws/\">");
074                    sb.append("<GetDwsMetaDataResult>");
075    
076                    String results = getResults(request);
077    
078                    int pos = results.indexOf("\n");
079    
080                    if (pos != -1) {
081                            results = results.substring(pos + 1);
082                    }
083    
084                    results = results.replaceAll("<", "&lt;");
085                    results = results.replaceAll(">", "&gt;");
086    
087                    sb.append(results);
088    
089                    sb.append("</GetDwsMetaDataResult>");
090                    sb.append("</GetDwsMetaDataResponse>");
091                    sb.append("</SOAP-ENV:Body>");
092                    sb.append("</SOAP-ENV:Envelope>");
093    
094                    response.setContentType(ContentTypes.TEXT_XML_UTF8);
095    
096                    ServletResponseUtil.write(response, sb.toString());
097            }
098    
099            protected String getResults(HttpServletRequest request)
100                    throws Exception {
101    
102                    String xml = StringUtil.read(request.getInputStream());
103    
104                    String documentName = null;
105    
106                    int beginPos = xml.lastIndexOf("<document>");
107                    int endPos = xml.lastIndexOf("</document>");
108    
109                    if (beginPos != -1) {
110                            documentName = xml.substring(beginPos + 10, endPos);
111    
112                            documentName = HttpUtil.decodeURL(documentName);
113                    }
114    
115                    String path = documentName;
116    
117                    int pos = documentName.lastIndexOf("sharepoint/");
118    
119                    if (pos != -1) {
120                            path = path.substring(pos + 11);
121                    }
122    
123                    Group group = GroupServiceUtil.getGroup(
124                            SharepointUtil.getGroupId(path));
125    
126                    boolean minimal = false;
127    
128                    beginPos = xml.lastIndexOf("<minimal>");
129                    endPos = xml.lastIndexOf("</minimal>");
130    
131                    if (beginPos != -1) {
132                            minimal = GetterUtil.getBoolean(
133                                    xml.substring(beginPos + 9, endPos));
134                    }
135    
136                    Document doc = SAXReaderUtil.createDocument();
137    
138                    Element root = doc.addElement("Results");
139    
140                    String url =
141                            "http://" + request.getLocalAddr() + ":" + request.getServerPort() +
142                                    "/sharepoint";
143    
144                    root.addElement("SubscribeUrl").setText(url);
145                    root.addElement("MtgInstance");
146                    root.addElement("SettingUrl").setText(url);
147                    root.addElement("PermsUrl").setText(url);
148                    root.addElement("UserInfoUrl").setText(url);
149    
150                    Element rolesEl = root.addElement("Roles");
151    
152                    List<Role> roles = RoleLocalServiceUtil.getRoles(
153                            PortalUtil.getCompanyId(request));
154    
155                    for (Role role : roles) {
156                            ResponseElement responseElement = new RoleResponseElement(role);
157    
158                            responseElement.addElement(rolesEl);
159                    }
160    
161                    if (!minimal) {
162                            Element schemaEl = root.addElement("Schema");
163    
164                            schemaEl.addAttribute("Name", "Documents");
165                            schemaEl.addAttribute("Url", group.getName());
166    
167                            Element fieldEl = schemaEl.addElement("Field");
168    
169                            fieldEl.addAttribute("Name", "FileLeafRef");
170                            fieldEl.addAttribute("Required", "true");
171                            fieldEl.addAttribute("Type", "Invalid");
172    
173                            fieldEl.addElement("Choices");
174    
175                            fieldEl = schemaEl.addElement("Field");
176    
177                            fieldEl.addAttribute("Name", "_SourceUrl");
178                            fieldEl.addAttribute("Required", "false");
179                            fieldEl.addAttribute("Type", "Text");
180    
181                            fieldEl.addElement("Choices");
182    
183                            fieldEl = schemaEl.addElement("Field");
184    
185                            fieldEl.addAttribute("Name", "_SharedFileIndex");
186                            fieldEl.addAttribute("Required", "false");
187                            fieldEl.addAttribute("Type", "Text");
188    
189                            fieldEl.addElement("Choices");
190    
191                            fieldEl = schemaEl.addElement("Field");
192    
193                            fieldEl.addAttribute("Name", "Order");
194                            fieldEl.addAttribute("Required", "false");
195                            fieldEl.addAttribute("Type", "Number");
196    
197                            fieldEl.addElement("Choices");
198    
199                            fieldEl = schemaEl.addElement("Field");
200    
201                            fieldEl.addAttribute("Name", "Title");
202                            fieldEl.addAttribute("Required", "false");
203                            fieldEl.addAttribute("Type", "Text");
204    
205                            fieldEl.addElement("Choices");
206    
207                            Element listInfoEl = root.addElement("ListInfo");
208    
209                            listInfoEl.addAttribute("Name", "Links");
210    
211                            listInfoEl.addElement("Moderated").setText(String.valueOf(false));
212    
213                            Element listPermissionsEl = listInfoEl.addElement(
214                                    "ListPermissions");
215    
216                            listPermissionsEl.addElement("DeleteListItems");
217                            listPermissionsEl.addElement("EditListItems");
218                            listPermissionsEl.addElement("InsertListItems");
219                            listPermissionsEl.addElement("ManageRoles");
220                            listPermissionsEl.addElement("ManageWeb");
221                    }
222    
223                    Element permissionsEl = root.addElement("Permissions");
224    
225                    if (!minimal) {
226                            permissionsEl.addElement("DeleteListItems");
227                            permissionsEl.addElement("EditListItems");
228                            permissionsEl.addElement("InsertListItems");
229                            permissionsEl.addElement("ManageRoles");
230                            permissionsEl.addElement("ManageWeb");
231                    }
232    
233                    root.addElement("HasUniquePerm").setText(String.valueOf(true));
234                    root.addElement("WorkspaceType").setText("DWS");
235                    root.addElement("IsADMode").setText(String.valueOf(false));
236                    root.addElement("DocUrl").setText(documentName);
237                    root.addElement("Minimal").setText(String.valueOf(true));
238    
239                    Element resultsEl = root.addElement("Results");
240    
241                    resultsEl.addElement("Title").setText(group.getName());
242                    resultsEl.addElement("LastUpdate");
243    
244                    User user = (User)request.getSession().getAttribute(
245                            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    }