001    /**
002     * Copyright (c) 2000-2010 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.cmis.model;
016    
017    import com.liferay.portal.kernel.util.DateFormatFactoryUtil;
018    import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    
021    import java.io.Serializable;
022    
023    import java.text.DateFormat;
024    import java.text.Format;
025    
026    import java.util.ArrayList;
027    import java.util.Date;
028    import java.util.List;
029    
030    import org.apache.abdera.factory.Factory;
031    import org.apache.abdera.model.Element;
032    import org.apache.abdera.model.ExtensibleElementWrapper;
033    
034    /**
035     * @author Alexander Chow
036     */
037    public class CMISObject extends ExtensibleElementWrapper {
038    
039            public CMISObject(Element element) {
040                    super(element);
041    
042                    _cmisConstants = CMISConstants.getInstance();
043            }
044    
045            public CMISObject(Factory factory) {
046                    super(factory, CMISConstants.getInstance().OBJECT);
047    
048                    _cmisConstants = CMISConstants.getInstance();
049            }
050    
051            public String getBaseType() {
052                    return getPropertyValue(_cmisConstants.PROPERTY_NAME_BASETYPE);
053            }
054    
055            public String getCheckinComment() {
056                    return getPropertyValue(_cmisConstants.PROPERTY_NAME_CHECKIN_COMMENT);
057            }
058    
059            public String getContentStreamFilename() {
060                    return getPropertyValue(
061                            _cmisConstants.PROPERTY_NAME_CONTENT_STREAM_FILENAME);
062            }
063    
064            public int getContentStreamLength() {
065                    String value = getPropertyValue(
066                            _cmisConstants.PROPERTY_NAME_CONTENT_STREAM_LENGTH);
067    
068                    return GetterUtil.getInteger(value);
069            }
070    
071            public String getContentStreamMimetype() {
072                    return getPropertyValue(
073                            _cmisConstants.PROPERTY_NAME_CONTENT_STREAM_MIMETYPE);
074            }
075    
076            public String getContentStreamUri() {
077                    return getPropertyValue(
078                            _cmisConstants.PROPERTY_NAME_CONTENT_STREAM_URI);
079            }
080    
081            public String getCreatedBy() {
082                    return getPropertyValue(_cmisConstants.PROPERTY_NAME_CREATED_BY);
083            }
084    
085            public Date getCreationDate() {
086                    return getDate(_cmisConstants.PROPERTY_NAME_CREATION_DATE);
087            }
088    
089            public Date getLastModificationDate() {
090                    return getDate(_cmisConstants.PROPERTY_NAME_LAST_MODIFICATION_DATE);
091            }
092    
093            public String getLastModifiedBy() {
094                    return getPropertyValue(_cmisConstants.PROPERTY_NAME_LAST_MODIFIED_BY);
095            }
096    
097            public String getName() {
098                    return getPropertyValue(_cmisConstants.PROPERTY_NAME_NAME);
099            }
100    
101            public String getObjectId() {
102                    return getPropertyValue(_cmisConstants.PROPERTY_NAME_OBJECT_ID);
103            }
104    
105            public String getObjectTypeId() {
106                    return getPropertyValue(_cmisConstants.PROPERTY_NAME_OBJECT_TYPE_ID);
107            }
108    
109            public String getSourceId() {
110                    return getPropertyValue(_cmisConstants.PROPERTY_NAME_SOURCE_ID);
111            }
112    
113            public String getTargetId() {
114                    return getPropertyValue(_cmisConstants.PROPERTY_NAME_TARGET_ID);
115            }
116    
117            public String getVersionLabel() {
118                    return getPropertyValue(_cmisConstants.PROPERTY_NAME_VERSION_LABEL);
119            }
120    
121            public String getVersionSeriesCheckedOutBy() {
122                    return getPropertyValue(
123                            _cmisConstants.PROPERTY_NAME_VERSION_SERIES_CHECKED_OUT_BY);
124            }
125    
126            public String getVersionSeriesCheckedOutId() {
127                    return getPropertyValue(
128                            _cmisConstants.PROPERTY_NAME_VERSION_SERIES_CHECKED_OUT_ID);
129            }
130    
131            public String getVersionSeriesId() {
132                    return getPropertyValue(
133                            _cmisConstants.PROPERTY_NAME_VERSION_SERIES_ID);
134            }
135    
136            public boolean isImmutable() {
137                    return GetterUtil.getBoolean(
138                            getPropertyValue(_cmisConstants.PROPERTY_NAME_IS_IMMUTABLE));
139            }
140    
141            public boolean isLatestMajorVersion() {
142                    return GetterUtil.getBoolean(
143                            getPropertyValue(
144                                    _cmisConstants.PROPERTY_NAME_IS_LATEST_MAJOR_VERSION));
145            }
146    
147            public boolean isLatestVersion() {
148                    return GetterUtil.getBoolean(
149                            getPropertyValue(_cmisConstants.PROPERTY_NAME_IS_LATEST_VERSION));
150            }
151    
152            public boolean isMajorVersion() {
153                    return GetterUtil.getBoolean(
154                            getPropertyValue(_cmisConstants.PROPERTY_NAME_IS_MAJOR_VERSION));
155            }
156    
157            public boolean isVersionSeriesCheckedOut() {
158                    return GetterUtil.getBoolean(
159                            getPropertyValue(
160                                    _cmisConstants.PROPERTY_NAME_IS_VERSION_SERIES_CHECKED_OUT));
161            }
162    
163            public void setValue(String propertyName, Serializable propertyValue) {
164                    Factory factory = getFactory();
165    
166                    Element propertiesElement = getFirstChild(_cmisConstants.PROPERTIES);
167    
168                    if (propertiesElement == null) {
169                            propertiesElement = factory.newElement(_cmisConstants.PROPERTIES);
170    
171                            addExtension(propertiesElement);
172                    }
173    
174                    Element propertyElement = null;
175    
176                    if (propertyValue instanceof Date) {
177                            propertyElement = factory.newElement(
178                                    _cmisConstants.PROPERTY_TYPE_DATETIME, propertiesElement);
179    
180                            propertyValue = _dateFormat.format(propertyValue);
181                    }
182                    else if (propertyValue instanceof Double) {
183                            propertyElement = factory.newElement(
184                                    _cmisConstants.PROPERTY_TYPE_DECIMAL, propertiesElement);
185                    }
186                    else if (propertyValue instanceof Integer) {
187                            propertyElement = factory.newElement(
188                                    _cmisConstants.PROPERTY_TYPE_INTEGER, propertiesElement);
189                    }
190                    else if ((propertyValue.toString()).startsWith("http")) {
191                            propertyElement = factory.newElement(
192                                    _cmisConstants.PROPERTY_TYPE_URI, propertiesElement);
193                    }
194                    else {
195                            propertyElement = factory.newElement(
196                                    _cmisConstants.PROPERTY_TYPE_STRING, propertiesElement);
197                    }
198    
199                    if (_cmisConstants instanceof CMISConstants_1_0_0) {
200                            propertyElement.setAttributeValue(
201                                    _cmisConstants.PROPERTY_DEFINITION_ID, propertyName);
202                    }
203                    else {
204                            propertyElement.setAttributeValue(
205                                    _cmisConstants.PROPERTY_NAME, propertyName);
206                    }
207    
208                    Element valueElement = factory.newElement(
209                            _cmisConstants.PROPERTY_VALUE, propertyElement);
210    
211                    valueElement.setText(propertyValue.toString());
212            }
213    
214            protected Date getDate(String propertyName) {
215                    try {
216                            String value = getPropertyValue(propertyName);
217    
218                            DateFormat dateFormat = DateFormatFactoryUtil.getSimpleDateFormat(
219                                    _DATE_FORMAT_PATTERN);
220    
221                            return dateFormat.parse(value);
222                    }
223                    catch (Exception e) {
224                            return new Date();
225                    }
226            }
227    
228            protected List<String> getPropertyNames() {
229                    List<String> propertyNames = new ArrayList<String>();
230    
231                    Element propertiesElement = getFirstChild(_cmisConstants.PROPERTIES);
232    
233                    for (Element propertyElement : propertiesElement.getElements()) {
234                            String propertyName = propertyElement.getAttributeValue(
235                                    _cmisConstants.PROPERTY_NAME);
236    
237                            propertyNames.add(propertyName);
238                    }
239    
240                    return propertyNames;
241            }
242    
243            protected String getPropertyValue(String propertyName) {
244                    String propertyValue = null;
245    
246                    Element propertiesElement = getFirstChild(_cmisConstants.PROPERTIES);
247    
248                    for (Element propertyElement : propertiesElement.getElements()) {
249                            String curPropertyName = propertyElement.getAttributeValue(
250                                    _cmisConstants.PROPERTY_DEFINITION_ID);
251    
252                            if (propertyName.equals(curPropertyName)) {
253                                    Element propertyValueElement = propertyElement.getFirstChild(
254                                            _cmisConstants.PROPERTY_VALUE);
255    
256                                    if (propertyValueElement != null) {
257                                            propertyValue = propertyValueElement.getText();
258                                    }
259    
260                                    break;
261                            }
262                    }
263    
264                    return propertyValue;
265            }
266    
267            private static final String _DATE_FORMAT_PATTERN =
268                    "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
269    
270            private static Format _dateFormat =
271                    FastDateFormatFactoryUtil.getSimpleDateFormat(_DATE_FORMAT_PATTERN);
272    
273            private CMISConstants _cmisConstants;
274    
275    }