1   /**
2    * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
3    *
4    * This library is free software; you can redistribute it and/or modify it under
5    * the terms of the GNU Lesser General Public License as published by the Free
6    * Software Foundation; either version 2.1 of the License, or (at your option)
7    * any later version.
8    *
9    * This library is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11   * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12   * details.
13   */
14  
15  package com.liferay.portlet;
16  
17  import com.liferay.portal.kernel.exception.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  /**
39   * <a href="PortletPreferencesSerializer.java.html"><b><i>View Source</i></b>
40   * </a>
41   *
42   * @author Brian Wing Shun Chan
43   * @author Jon Steer
44   * @author Zongliang Li
45   * @author Shuyang Zhou
46   */
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 }