1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.exoplatform.services.wcm.javascript;
18
19 import javax.jcr.Node;
20
21 import org.exoplatform.services.jcr.ext.common.SessionProvider;
22 import org.exoplatform.services.wcm.core.BaseWebSchemaHandler;
23 import org.exoplatform.services.wcm.core.WebSchemaConfigService;
24 import org.exoplatform.services.wcm.portal.PortalFolderSchemaHandler;
25
26
27
28
29
30
31
32 public class JSFileHandler extends BaseWebSchemaHandler {
33
34 protected String getHandlerNodeType() { return "nt:file"; }
35 protected String getParentNodeType() { return "exo:jsFolder" ;}
36 private boolean isPortalJSFolder = false;
37
38 public boolean matchHandler(SessionProvider sessionProvider, Node node) throws Exception {
39 if(!matchNodeType(node))
40 return false;
41 if(!matchMimeType(node))
42 return false;
43 isPortalJSFolder = isInPortalJSFolder(sessionProvider, node);
44 if(isPortalJSFolder) {
45 return true;
46 }
47 if(!matchParenNodeType(node)) {
48 return false;
49 }
50 return true;
51 }
52
53 private boolean matchNodeType(Node node) throws Exception{
54 return node.getPrimaryNodeType().getName().equals("nt:file");
55 }
56
57 private boolean matchParenNodeType(Node node ) throws Exception{
58 return node.getParent().isNodeType("exo:jsFolder");
59 }
60
61 private boolean matchMimeType(Node node) throws Exception{
62 String mimeType = getFileMimeType(node);
63 if("text/javascript".equals(mimeType))
64 return true;
65 if("application/x-javascript".equals(mimeType))
66 return true;
67 if("text/ecmascript".equals(mimeType))
68 return true;
69 if("text/plain".equals(mimeType))
70 return true;
71 return false;
72 }
73
74 private boolean isInPortalJSFolder(SessionProvider sessionProvider, Node file) throws Exception {
75 Node portal = findPortalNode(sessionProvider, file);
76 if(portal == null) {
77 return false;
78 }
79 WebSchemaConfigService schemaConfigService = getService(WebSchemaConfigService.class);
80 PortalFolderSchemaHandler schemaHandler = schemaConfigService.getWebSchemaHandlerByType(PortalFolderSchemaHandler.class);
81 Node jsFolder = schemaHandler.getJSFolder(portal);
82 return jsFolder == null ? false : file.getPath().startsWith(jsFolder.getPath());
83 }
84
85 public void onCreateNode(SessionProvider sessionProvider, Node file) throws Exception {
86 addMixin(file, "exo:jsFile") ;
87 addMixin(file,"exo:owneable");
88 file.setProperty("exo:presentationType","exo:jsFile");
89
90 if(isPortalJSFolder) {
91 file.setProperty("exo:sharedJS",true);
92 }
93 }
94
95 public void onModifyNode(SessionProvider sessionProvider, Node file) throws Exception {
96 if(isPortalJSFolder) {
97 Node portal = findPortalNode(sessionProvider, file);
98 XJavascriptService javascriptService = getService(XJavascriptService.class);
99 javascriptService.updatePortalJSOnModify(portal, file);
100 }
101 }
102
103 public void onRemoveNode(SessionProvider sessionProvider, Node file) throws Exception {
104 if(isPortalJSFolder) {
105 Node portal = findPortalNode(sessionProvider, file);
106 XJavascriptService javascriptService = getService(XJavascriptService.class);
107 javascriptService.updatePortalJSOnRemove(portal, file);
108 }
109 }
110
111 }