1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portal.sharepoint;
24  
25  import com.liferay.portal.kernel.log.Log;
26  import com.liferay.portal.kernel.log.LogFactoryUtil;
27  import com.liferay.portal.kernel.util.ContentTypes;
28  import com.liferay.portal.kernel.util.GetterUtil;
29  import com.liferay.portal.kernel.util.HttpUtil;
30  import com.liferay.portal.kernel.xml.Document;
31  import com.liferay.portal.kernel.xml.Element;
32  import com.liferay.portal.kernel.xml.SAXReaderUtil;
33  import com.liferay.portal.model.Group;
34  import com.liferay.portal.model.Role;
35  import com.liferay.portal.model.User;
36  import com.liferay.portal.service.GroupServiceUtil;
37  import com.liferay.portal.service.RoleLocalServiceUtil;
38  import com.liferay.portal.service.UserLocalServiceUtil;
39  import com.liferay.portal.sharepoint.dws.MemberResponseElement;
40  import com.liferay.portal.sharepoint.dws.ResponseElement;
41  import com.liferay.portal.sharepoint.dws.RoleResponseElement;
42  import com.liferay.portal.util.PortalUtil;
43  import com.liferay.portal.util.WebKeys;
44  import com.liferay.util.servlet.ServletResponseUtil;
45  
46  import java.util.List;
47  
48  import javax.servlet.http.HttpServlet;
49  import javax.servlet.http.HttpServletRequest;
50  import javax.servlet.http.HttpServletResponse;
51  
52  import org.aspectj.util.FileUtil;
53  
54  /**
55   * <a href="SharepointDocumentWorkspaceServlet.java.html"><b><i>View Source</i>
56   * </b></a>
57   *
58   * @author Bruno Farache
59   *
60   */
61  public class SharepointDocumentWorkspaceServlet extends HttpServlet {
62  
63      protected void doPost(
64          HttpServletRequest request, HttpServletResponse response) {
65  
66          try {
67              getDwsMetaDataResponse(request, response);
68          }
69          catch (Exception e) {
70              _log.error(e, e);
71          }
72      }
73  
74      protected void getDwsMetaDataResponse(
75              HttpServletRequest request, HttpServletResponse response)
76          throws Exception {
77  
78          StringBuilder sb = new StringBuilder();
79  
80          sb.append("<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"");
81          sb.append("http://schemas.xmlsoap.org/soap/envelope/\">");
82          sb.append("<SOAP-ENV:Header/>");
83          sb.append("<SOAP-ENV:Body>");
84          sb.append("<GetDwsMetaDataResponse xmlns=\"");
85          sb.append("http://schemas.microsoft.com/sharepoint/soap/dws/\">");
86          sb.append("<GetDwsMetaDataResult>");
87  
88          String results = getResults(request);
89  
90          int pos = results.indexOf("\n");
91  
92          if (pos != -1) {
93              results = results.substring(pos + 1);
94          }
95  
96          results = results.replaceAll("<", "&lt;");
97          results = results.replaceAll(">", "&gt;");
98  
99          sb.append(results);
100 
101         sb.append("</GetDwsMetaDataResult>");
102         sb.append("</GetDwsMetaDataResponse>");
103         sb.append("</SOAP-ENV:Body>");
104         sb.append("</SOAP-ENV:Envelope>");
105 
106         response.setContentType(ContentTypes.TEXT_XML_UTF8);
107 
108         ServletResponseUtil.write(response, sb.toString());
109     }
110 
111     protected String getResults(HttpServletRequest request)
112         throws Exception {
113 
114         String xml = FileUtil.readAsString(request.getInputStream());
115 
116         String documentName = null;
117 
118         int beginPos = xml.lastIndexOf("<document>");
119         int endPos = xml.lastIndexOf("</document>");
120 
121         if (beginPos != -1) {
122             documentName = xml.substring(beginPos + 10, endPos);
123 
124             documentName = HttpUtil.decodeURL(documentName);
125         }
126 
127         String path = documentName;
128 
129         int pos = documentName.lastIndexOf("sharepoint/");
130 
131         if (pos != -1) {
132             path = path.substring(pos + 11);
133         }
134 
135         Group group = GroupServiceUtil.getGroup(
136             SharepointUtil.getGroupId(path));
137 
138         boolean minimal = false;
139 
140         beginPos = xml.lastIndexOf("<minimal>");
141         endPos = xml.lastIndexOf("</minimal>");
142 
143         if (beginPos != -1) {
144             minimal = GetterUtil.getBoolean(
145                 xml.substring(beginPos + 9, endPos));
146         }
147 
148         Document doc = SAXReaderUtil.createDocument();
149 
150         Element root = doc.addElement("Results");
151 
152         String url =
153             "http://" + request.getLocalAddr() + ":" + request.getServerPort() +
154                 "/sharepoint";
155 
156         root.addElement("SubscribeUrl").setText(url);
157         root.addElement("MtgInstance");
158         root.addElement("SettingUrl").setText(url);
159         root.addElement("PermsUrl").setText(url);
160         root.addElement("UserInfoUrl").setText(url);
161 
162         Element rolesEl = root.addElement("Roles");
163 
164         List<Role> roles = RoleLocalServiceUtil.getRoles(
165             PortalUtil.getCompanyId(request));
166 
167         for (Role role : roles) {
168             ResponseElement responseElement = new RoleResponseElement(role);
169 
170             responseElement.addElement(rolesEl);
171         }
172 
173         if (!minimal) {
174             Element schemaEl = root.addElement("Schema");
175 
176             schemaEl.addAttribute("Name", "Documents");
177             schemaEl.addAttribute("Url", group.getName());
178 
179             Element fieldEl = schemaEl.addElement("Field");
180 
181             fieldEl.addAttribute("Name", "FileLeafRef");
182             fieldEl.addAttribute("Required", "true");
183             fieldEl.addAttribute("Type", "Invalid");
184 
185             fieldEl.addElement("Choices");
186 
187             fieldEl = schemaEl.addElement("Field");
188 
189             fieldEl.addAttribute("Name", "_SourceUrl");
190             fieldEl.addAttribute("Required", "false");
191             fieldEl.addAttribute("Type", "Text");
192 
193             fieldEl.addElement("Choices");
194 
195             fieldEl = schemaEl.addElement("Field");
196 
197             fieldEl.addAttribute("Name", "_SharedFileIndex");
198             fieldEl.addAttribute("Required", "false");
199             fieldEl.addAttribute("Type", "Text");
200 
201             fieldEl.addElement("Choices");
202 
203             fieldEl = schemaEl.addElement("Field");
204 
205             fieldEl.addAttribute("Name", "Order");
206             fieldEl.addAttribute("Required", "false");
207             fieldEl.addAttribute("Type", "Number");
208 
209             fieldEl.addElement("Choices");
210 
211             fieldEl = schemaEl.addElement("Field");
212 
213             fieldEl.addAttribute("Name", "Title");
214             fieldEl.addAttribute("Required", "false");
215             fieldEl.addAttribute("Type", "Text");
216 
217             fieldEl.addElement("Choices");
218 
219             Element listInfoEl = root.addElement("ListInfo");
220 
221             listInfoEl.addAttribute("Name", "Links");
222 
223             listInfoEl.addElement("Moderated").setText(String.valueOf(false));
224 
225             Element listPermissionsEl = listInfoEl.addElement(
226                 "ListPermissions");
227 
228             listPermissionsEl.addElement("DeleteListItems");
229             listPermissionsEl.addElement("EditListItems");
230             listPermissionsEl.addElement("InsertListItems");
231             listPermissionsEl.addElement("ManageRoles");
232             listPermissionsEl.addElement("ManageWeb");
233         }
234 
235         Element permissionsEl = root.addElement("Permissions");
236 
237         if (!minimal) {
238             permissionsEl.addElement("DeleteListItems");
239             permissionsEl.addElement("EditListItems");
240             permissionsEl.addElement("InsertListItems");
241             permissionsEl.addElement("ManageRoles");
242             permissionsEl.addElement("ManageWeb");
243         }
244 
245         root.addElement("HasUniquePerm").setText(String.valueOf(true));
246         root.addElement("WorkspaceType").setText("DWS");
247         root.addElement("IsADMode").setText(String.valueOf(false));
248         root.addElement("DocUrl").setText(documentName);
249         root.addElement("Minimal").setText(String.valueOf(true));
250 
251         Element resultsEl = root.addElement("Results");
252 
253         resultsEl.addElement("Title").setText(group.getName());
254         resultsEl.addElement("LastUpdate");
255 
256         User user = (User)request.getSession().getAttribute(
257             WebKeys.USER);
258 
259         ResponseElement responseElement = new MemberResponseElement(
260             user, false);
261 
262         responseElement.addElement(resultsEl);
263 
264         Element membersEl = resultsEl.addElement("Members");
265 
266         List<User> users = UserLocalServiceUtil.getGroupUsers(
267             group.getGroupId());
268 
269         for (User member : users) {
270             responseElement = new MemberResponseElement(member, true);
271 
272             responseElement.addElement(membersEl);
273         }
274 
275         if (!minimal) {
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             pos = parentFolderPath.lastIndexOf("/");
293 
294             if (pos != -1) {
295                 parentFolderPath = parentFolderPath.substring(0, pos);
296             }
297 
298             SharepointStorage storage = SharepointUtil.getStorage(
299                 parentFolderPath);
300 
301             SharepointRequest sharepointRequest = new SharepointRequest(
302                 parentFolderPath);
303 
304             storage.addDocumentElements(sharepointRequest, listEl);
305         }
306 
307         return doc.asXML();
308     }
309 
310     private static Log _log = LogFactoryUtil.getLog(SharepointServlet.class);
311 
312 }