1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.portals.applications.springmvc;
18
19 import java.io.InputStream;
20 import java.io.IOException;
21 import java.util.Iterator;
22 import java.util.List;
23 import java.util.Enumeration;
24 import java.util.ArrayList;
25 import java.util.SortedSet;
26 import java.util.TreeSet;
27 import java.util.regex.Pattern;
28 import java.util.regex.Matcher;
29
30 import javax.portlet.PortletPreferences;
31 import javax.portlet.PortletRequest;
32 import javax.portlet.PortletContext;
33 import javax.portlet.ReadOnlyException;
34 import javax.portlet.ValidatorException;
35 import javax.xml.parsers.DocumentBuilder;
36 import javax.xml.parsers.DocumentBuilderFactory;
37 import javax.xml.parsers.ParserConfigurationException;
38
39 import org.apache.commons.logging.Log;
40 import org.apache.commons.logging.LogFactory;
41 import org.springframework.beans.BeansException;
42 import org.springframework.context.support.ApplicationObjectSupport;
43
44 import org.w3c.dom.Node ;
45 import org.w3c.dom.NodeList ;
46
47 public class DOMTreeService extends ApplicationObjectSupport
48 {
49 private static final String DOM_TREE_NO_PATH = "domtree_no_path";
50 private static final String DOM_TREE_NO_PARSE = "domtree_no_parse";
51 private static final Log log = LogFactory.getLog( DOMTreeService.class);
52
53 protected DocumentBuilderFactory domFactory = null;
54
55 public void initApplicationContext() throws BeansException
56 {
57 domFactory = DocumentBuilderFactory.newInstance();
58 domFactory.setValidating(false);
59 }
60
61 public DOMTree getDOMTree( String name, PortletRequest request )
62 {
63 if ( name == null ) name = "";
64 PortletPreferences prefs = request.getPreferences();
65 String path = prefs.getValue( name, "" );
66 return new DOMTree( name, path );
67 }
68
69 public void saveDOMTree( String name, String path, PortletRequest request )
70 {
71 DOMTree dt = new DOMTree( name, path );
72 saveDOMTree( dt, request );
73 }
74
75 public void saveDOMTree( DOMTree dt, PortletRequest request )
76 {
77 if ( dt == null ) return ;
78 PortletPreferences prefs = request.getPreferences();
79 try
80 {
81 prefs.setValue( dt.getName(), dt.getPath() );
82 prefs.store();
83 }
84 catch ( ReadOnlyException e ) { }
85 catch ( IOException e ) { }
86 catch ( ValidatorException e ) { }
87 }
88
89 public void deleteDOMTree( String name, PortletRequest request )
90 {
91 if ( name == null ) name = "";
92 PortletPreferences prefs = request.getPreferences();
93 try
94 {
95 prefs.reset( name );
96 prefs.store();
97 }
98 catch ( ReadOnlyException e ) { }
99 catch ( IOException e ) { }
100 catch ( ValidatorException e ) { }
101 }
102
103 public SortedSet getAllDOMTrees( PortletRequest request )
104 {
105 return getAllDOMTrees( request, null );
106 }
107 public SortedSet getAllDOMTrees( PortletRequest request, List addTo )
108 {
109 if ( addTo == null )
110 {
111 addTo = new ArrayList();
112 }
113 PortletPreferences prefs = request.getPreferences();
114 Enumeration e = prefs.getNames();
115 while ( e.hasMoreElements() )
116 {
117 String name = (String)e.nextElement();
118 String path = prefs.getValue( name, "" );
119 addTo.add( new DOMTree( name, path ) );
120 }
121 return (SortedSet) new TreeSet( addTo );
122 }
123
124 public SortedSet parseAllDOMTrees( PortletRequest request, PortletContext context, List addTo )
125 {
126 SortedSet domTreeSet = getAllDOMTrees( request, addTo );
127 Iterator domTreeSetIter = domTreeSet.iterator();
128 while ( domTreeSetIter.hasNext() )
129 {
130 DOMTree dt = (DOMTree)domTreeSetIter.next();
131 if ( dt.getPath() == null || dt.getPath().length() == 0 )
132 {
133 dt.setMessage( DOM_TREE_NO_PATH );
134 }
135 else
136 {
137 InputStream is = context.getResourceAsStream( dt.getPath() );
138 org.w3c.dom.Document doc = parseXml( is );
139 dt.setParsedDocument( doc );
140 if ( doc == null )
141 {
142 dt.setMessage( DOM_TREE_NO_PARSE );
143 }
144 }
145 }
146 return domTreeSet;
147 }
148
149
150
151
152 protected org.w3c.dom.Document parseXml( InputStream is )
153 {
154 DocumentBuilder docBuilder = null;
155 org.w3c.dom.Document doc = null;
156 try
157 {
158 docBuilder = domFactory.newDocumentBuilder();
159 }
160 catch (ParserConfigurationException e)
161 {
162 log.error( "Cannot create DocumentBuilder due to " + e.getClass().getName() + " " + e.getMessage() );
163 }
164 if ( docBuilder != null )
165 {
166 try
167 {
168 doc = docBuilder.parse(is);
169 }
170 catch (Exception e)
171 {
172 log.error( "Cannot parse due to " + e.getClass().getName() + " " + e.getMessage() );
173 }
174 }
175 return doc;
176 }
177 public static class DOMNodeHelper
178 {
179 public DOMNodeHelper()
180 {
181 }
182 public List createNodeList( NodeList nl )
183 {
184 List domNodeList = new ArrayList();
185 if ( nl != null )
186 {
187 for ( int i = 0 ; i < nl.getLength() ; i++ )
188 {
189 domNodeList.add( nl.item( i ) );
190 }
191 }
192 return domNodeList;
193 }
194 public boolean isElementNode( Node n )
195 {
196 return n != null && n.getNodeType() == Node.ELEMENT_NODE;
197 }
198 public boolean isTextNode( Node n )
199 {
200 return n != null && n.getNodeType() == Node.TEXT_NODE;
201 }
202 public boolean isNonEmptyTextNode( Node n )
203 {
204 if ( n != null && n.getNodeType() == Node.TEXT_NODE )
205 {
206 String nodeVal = n.getNodeValue();
207 if ( nodeVal != null && nodeVal.trim().length() > 0 )
208 {
209 return true ;
210 }
211 }
212 return false;
213 }
214 public boolean isAttributeNode( Node n )
215 {
216 return n != null && n.getNodeType() == Node.ATTRIBUTE_NODE;
217 }
218 public boolean isDocumentNode( Node n )
219 {
220 return n != null && n.getNodeType() == Node.DOCUMENT_NODE;
221 }
222 public String replaceLineBreaks( String s )
223 {
224 Pattern p = Pattern.compile( "//s*((//r//n)|//n)//s*" );
225 Matcher m = p.matcher( s );
226 return m.replaceAll( " " );
227 }
228 }
229 }