1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   *
12   *
13   */
14  
15  package com.liferay.portal.sharepoint;
16  
17  import com.liferay.portal.kernel.log.Log;
18  import com.liferay.portal.kernel.log.LogFactoryUtil;
19  import com.liferay.portal.kernel.util.ContentTypes;
20  import com.liferay.portal.kernel.util.GetterUtil;
21  import com.liferay.portal.kernel.util.HttpUtil;
22  import com.liferay.portal.kernel.util.StringBundler;
23  import com.liferay.portal.kernel.util.StringUtil;
24  import com.liferay.portal.kernel.xml.Document;
25  import com.liferay.portal.kernel.xml.Element;
26  import com.liferay.portal.kernel.xml.SAXReaderUtil;
27  import com.liferay.portal.model.Group;
28  import com.liferay.portal.model.Role;
29  import com.liferay.portal.model.User;
30  import com.liferay.portal.service.GroupServiceUtil;
31  import com.liferay.portal.service.RoleLocalServiceUtil;
32  import com.liferay.portal.service.UserLocalServiceUtil;
33  import com.liferay.portal.sharepoint.dws.MemberResponseElement;
34  import com.liferay.portal.sharepoint.dws.ResponseElement;
35  import com.liferay.portal.sharepoint.dws.RoleResponseElement;
36  import com.liferay.portal.util.PortalUtil;
37  import com.liferay.portal.util.WebKeys;
38  import com.liferay.util.servlet.ServletResponseUtil;
39  
40  import java.util.List;
41  
42  import javax.servlet.http.HttpServlet;
43  import javax.servlet.http.HttpServletRequest;
44  import javax.servlet.http.HttpServletResponse;
45  
46  /**
47   * <a href="SharepointDocumentWorkspaceServlet.java.html"><b><i>View Source</i>
48   * </b></a>
49   *
50   * @author Bruno Farache
51   */
52  public class SharepointDocumentWorkspaceServlet extends HttpServlet {
53  
54      protected void doPost(
55          HttpServletRequest request, HttpServletResponse response) {
56  
57          try {
58              getDwsMetaDataResponse(request, response);
59          }
60          catch (Exception e) {
61              _log.error(e, e);
62          }
63      }
64  
65      protected void getDwsMetaDataResponse(
66              HttpServletRequest request, HttpServletResponse response)
67          throws Exception {
68  
69          StringBundler sb = new StringBundler(12);
70  
71          sb.append("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"");
72          sb.append("http://schemas.xmlsoap.org/soap/envelope/\">");
73          sb.append("<SOAP-ENV:Header/>");
74          sb.append("<SOAP-ENV:Body>");
75          sb.append("<GetDwsMetaDataResponse xmlns=\"");
76          sb.append("http://schemas.microsoft.com/sharepoint/soap/dws/\">");
77          sb.append("<GetDwsMetaDataResult>");
78  
79          String results = getResults(request);
80  
81          int pos = results.indexOf("\n");
82  
83          if (pos != -1) {
84              results = results.substring(pos + 1);
85          }
86  
87          results = results.replaceAll("<", "&lt;");
88          results = results.replaceAll(">", "&gt;");
89  
90          sb.append(results);
91  
92          sb.append("</GetDwsMetaDataResult>");
93          sb.append("</GetDwsMetaDataResponse>");
94          sb.append("</SOAP-ENV:Body>");
95          sb.append("</SOAP-ENV:Envelope>");
96  
97          response.setContentType(ContentTypes.TEXT_XML_UTF8);
98  
99          ServletResponseUtil.write(response, sb.toString());
100     }
101 
102     protected String getResults(HttpServletRequest request)
103         throws Exception {
104 
105         String xml = StringUtil.read(request.getInputStream());
106 
107         String documentName = null;
108 
109         int beginPos = xml.lastIndexOf("<document>");
110         int endPos = xml.lastIndexOf("</document>");
111 
112         if (beginPos != -1) {
113             documentName = xml.substring(beginPos + 10, endPos);
114 
115             documentName = HttpUtil.decodeURL(documentName);
116         }
117 
118         String path = documentName;
119 
120         int pos = documentName.lastIndexOf("sharepoint/");
121 
122         if (pos != -1) {
123             path = path.substring(pos + 11);
124         }
125 
126         Group group = GroupServiceUtil.getGroup(
127             SharepointUtil.getGroupId(path));
128 
129         boolean minimal = false;
130 
131         beginPos = xml.lastIndexOf("<minimal>");
132         endPos = xml.lastIndexOf("</minimal>");
133 
134         if (beginPos != -1) {
135             minimal = GetterUtil.getBoolean(
136                 xml.substring(beginPos + 9, endPos));
137         }
138 
139         Document doc = SAXReaderUtil.createDocument();
140 
141         Element root = doc.addElement("Results");
142 
143         String url =
144             "http://" + request.getLocalAddr() + ":" + request.getServerPort() +
145                 "/sharepoint";
146 
147         root.addElement("SubscribeUrl").setText(url);
148         root.addElement("MtgInstance");
149         root.addElement("SettingUrl").setText(url);
150         root.addElement("PermsUrl").setText(url);
151         root.addElement("UserInfoUrl").setText(url);
152 
153         Element rolesEl = root.addElement("Roles");
154 
155         List<Role> roles = RoleLocalServiceUtil.getRoles(
156             PortalUtil.getCompanyId(request));
157 
158         for (Role role : roles) {
159             ResponseElement responseElement = new RoleResponseElement(role);
160 
161             responseElement.addElement(rolesEl);
162         }
163 
164         if (!minimal) {
165             Element schemaEl = root.addElement("Schema");
166 
167             schemaEl.addAttribute("Name", "Documents");
168             schemaEl.addAttribute("Url", group.getName());
169 
170             Element fieldEl = schemaEl.addElement("Field");
171 
172             fieldEl.addAttribute("Name", "FileLeafRef");
173             fieldEl.addAttribute("Required", "true");
174             fieldEl.addAttribute("Type", "Invalid");
175 
176             fieldEl.addElement("Choices");
177 
178             fieldEl = schemaEl.addElement("Field");
179 
180             fieldEl.addAttribute("Name", "_SourceUrl");
181             fieldEl.addAttribute("Required", "false");
182             fieldEl.addAttribute("Type", "Text");
183 
184             fieldEl.addElement("Choices");
185 
186             fieldEl = schemaEl.addElement("Field");
187 
188             fieldEl.addAttribute("Name", "_SharedFileIndex");
189             fieldEl.addAttribute("Required", "false");
190             fieldEl.addAttribute("Type", "Text");
191 
192             fieldEl.addElement("Choices");
193 
194             fieldEl = schemaEl.addElement("Field");
195 
196             fieldEl.addAttribute("Name", "Order");
197             fieldEl.addAttribute("Required", "false");
198             fieldEl.addAttribute("Type", "Number");
199 
200             fieldEl.addElement("Choices");
201 
202             fieldEl = schemaEl.addElement("Field");
203 
204             fieldEl.addAttribute("Name", "Title");
205             fieldEl.addAttribute("Required", "false");
206             fieldEl.addAttribute("Type", "Text");
207 
208             fieldEl.addElement("Choices");
209 
210             Element listInfoEl = root.addElement("ListInfo");
211 
212             listInfoEl.addAttribute("Name", "Links");
213 
214             listInfoEl.addElement("Moderated").setText(String.valueOf(false));
215 
216             Element listPermissionsEl = listInfoEl.addElement(
217                 "ListPermissions");
218 
219             listPermissionsEl.addElement("DeleteListItems");
220             listPermissionsEl.addElement("EditListItems");
221             listPermissionsEl.addElement("InsertListItems");
222             listPermissionsEl.addElement("ManageRoles");
223             listPermissionsEl.addElement("ManageWeb");
224         }
225 
226         Element permissionsEl = root.addElement("Permissions");
227 
228         if (!minimal) {
229             permissionsEl.addElement("DeleteListItems");
230             permissionsEl.addElement("EditListItems");
231             permissionsEl.addElement("InsertListItems");
232             permissionsEl.addElement("ManageRoles");
233             permissionsEl.addElement("ManageWeb");
234         }
235 
236         root.addElement("HasUniquePerm").setText(String.valueOf(true));
237         root.addElement("WorkspaceType").setText("DWS");
238         root.addElement("IsADMode").setText(String.valueOf(false));
239         root.addElement("DocUrl").setText(documentName);
240         root.addElement("Minimal").setText(String.valueOf(true));
241 
242         Element resultsEl = root.addElement("Results");
243 
244         resultsEl.addElement("Title").setText(group.getName());
245         resultsEl.addElement("LastUpdate");
246 
247         User user = (User)request.getSession().getAttribute(
248             WebKeys.USER);
249 
250         ResponseElement responseElement = new MemberResponseElement(
251             user, false);
252 
253         responseElement.addElement(resultsEl);
254 
255         Element membersEl = resultsEl.addElement("Members");
256 
257         List<User> users = UserLocalServiceUtil.getGroupUsers(
258             group.getGroupId());
259 
260         for (User member : users) {
261             responseElement = new MemberResponseElement(member, true);
262 
263             responseElement.addElement(membersEl);
264         }
265 
266         if (!minimal) {
267             Element assigneesEl = resultsEl.addElement("Assignees");
268 
269             for (User member : users) {
270                 responseElement = new MemberResponseElement(member, true);
271 
272                 responseElement.addElement(assigneesEl);
273             }
274 
275             Element listEl = resultsEl.addElement("List");
276 
277             listEl.addAttribute("Name", "Documents");
278 
279             listEl.addElement("ID");
280 
281             String parentFolderPath = path;
282 
283             pos = parentFolderPath.lastIndexOf("/");
284 
285             if (pos != -1) {
286                 parentFolderPath = parentFolderPath.substring(0, pos);
287             }
288 
289             SharepointStorage storage = SharepointUtil.getStorage(
290                 parentFolderPath);
291 
292             SharepointRequest sharepointRequest = new SharepointRequest(
293                 parentFolderPath);
294 
295             storage.addDocumentElements(sharepointRequest, listEl);
296         }
297 
298         return doc.asXML();
299     }
300 
301     private static Log _log = LogFactoryUtil.getLog(SharepointServlet.class);
302 
303 }