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