1
14
15 package com.liferay.portlet;
16
17 import com.liferay.portal.SystemException;
18 import com.liferay.portal.kernel.io.unsync.UnsyncStringReader;
19 import com.liferay.portal.kernel.util.GetterUtil;
20 import com.liferay.portal.kernel.util.Validator;
21 import com.liferay.portal.kernel.xml.simple.Element;
22 import com.liferay.portal.xml.StAXReaderUtil;
23
24 import java.util.ArrayList;
25 import java.util.Iterator;
26 import java.util.List;
27 import java.util.Map;
28
29 import javax.portlet.PortletPreferences;
30
31 import javax.xml.stream.XMLEventReader;
32 import javax.xml.stream.XMLInputFactory;
33 import javax.xml.stream.XMLStreamException;
34 import javax.xml.stream.events.EndElement;
35 import javax.xml.stream.events.StartElement;
36 import javax.xml.stream.events.XMLEvent;
37
38
47 public class PortletPreferencesSerializer {
48
49 public static PortletPreferences fromDefaultXML(String xml)
50 throws SystemException {
51
52 PortletPreferencesImpl preferences = new PortletPreferencesImpl();
53
54 if (Validator.isNull(xml)) {
55 return preferences;
56 }
57
58 Map<String, Preference> preferencesMap = preferences.getPreferences();
59
60 XMLEventReader xmlEventReader = null;
61
62 try {
63 XMLInputFactory xmlInputFactory =
64 StAXReaderUtil.getXMLInputFactory();
65
66 xmlEventReader = xmlInputFactory.createXMLEventReader(
67 new UnsyncStringReader(xml));
68
69 while (xmlEventReader.hasNext()) {
70 XMLEvent xmlEvent = xmlEventReader.nextEvent();
71
72 if (xmlEvent.isStartElement()) {
73 StartElement startElement = xmlEvent.asStartElement();
74
75 String elementName = startElement.getName().getLocalPart();
76
77 if (elementName.equals("preference")) {
78 Preference preference = _readPreference(xmlEventReader);
79
80 preferencesMap.put(preference.getName(), preference);
81 }
82 }
83 }
84
85 return preferences;
86 }
87 catch (XMLStreamException xse) {
88 throw new SystemException(xse);
89 }
90 finally {
91 if (xmlEventReader != null) {
92 try {
93 xmlEventReader.close();
94 }
95 catch (XMLStreamException xse) {
96 }
97 }
98 }
99 }
100
101 public static PortletPreferencesImpl fromXML(
102 long companyId, long ownerId, int ownerType, long plid,
103 String portletId, String xml)
104 throws SystemException {
105
106 try {
107 PortletPreferencesImpl preferences =
108 (PortletPreferencesImpl)fromDefaultXML(xml);
109
110 preferences = new PortletPreferencesImpl(
111 companyId, ownerId, ownerType, plid, portletId,
112 preferences.getPreferences());
113
114 return preferences;
115 }
116 catch (SystemException se) {
117 throw se;
118 }
119 }
120
121 public static String toXML(PortletPreferencesImpl preferences) {
122 Map<String, Preference> preferencesMap = preferences.getPreferences();
123
124 Element portletPreferencesElement = new Element(
125 "portlet-preferences", false);
126
127 Iterator<Map.Entry<String, Preference>> itr =
128 preferencesMap.entrySet().iterator();
129
130 while (itr.hasNext()) {
131 Map.Entry<String, Preference> entry = itr.next();
132
133 Preference preference = entry.getValue();
134
135 Element preferenceElement = portletPreferencesElement.addElement(
136 "preference");
137
138 preferenceElement.addElement("name", preference.getName());
139
140 for (String value : preference.getValues()) {
141 preferenceElement.addElement("value", value);
142 }
143
144 if (preference.isReadOnly()) {
145 preferenceElement.addElement("read-only", Boolean.TRUE);
146 }
147 }
148
149 return portletPreferencesElement.toXMLString();
150 }
151
152 private static Preference _readPreference(XMLEventReader xmlEventReader)
153 throws XMLStreamException {
154
155 String name = null;
156 List<String> values = new ArrayList<String>();
157 boolean readOnly = false;
158
159 while (xmlEventReader.hasNext()) {
160 XMLEvent xmlEvent = xmlEventReader.nextEvent();
161
162 if (xmlEvent.isStartElement()) {
163 StartElement startElement = xmlEvent.asStartElement();
164
165 String elementName = startElement.getName().getLocalPart();
166
167 if (elementName.equals("name")) {
168 name = StAXReaderUtil.read(xmlEventReader);
169 }
170 else if (elementName.equals("value")) {
171 String value = StAXReaderUtil.read(xmlEventReader);
172
173 values.add(value);
174 }
175 else if (elementName.equals("read-only")) {
176 String value = StAXReaderUtil.read(xmlEventReader);
177
178 readOnly = GetterUtil.getBoolean(value);
179 }
180 }
181 else if (xmlEvent.isEndElement()){
182 EndElement endElement = xmlEvent.asEndElement();
183
184 String elementName = endElement.getName().getLocalPart();
185
186 if (elementName.equals("preference")) {
187 break;
188 }
189 }
190 }
191
192 return new Preference(
193 name, values.toArray(new String[values.size()]), readOnly);
194 }
195
196 }