001/*
002 * (C) Copyright 2006-2008 Nuxeo SAS (http://nuxeo.com/) and contributors.
003 *
004 * All rights reserved. This program and the accompanying materials
005 * are made available under the terms of the GNU Lesser General Public License
006 * (LGPL) version 2.1 which accompanies this distribution, and is available at
007 * http://www.gnu.org/licenses/lgpl.html
008 *
009 * This library is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012 * Lesser General Public License for more details.
013 *
014 * Contributors:
015 *     Alexandre Russel
016 *
017 * $Id$
018 */
019
020package org.nuxeo.ecm.platform.annotations.gwt.client.model;
021
022import java.util.Date;
023import java.util.HashMap;
024import java.util.Map;
025
026import com.google.gwt.user.client.Window;
027import org.nuxeo.ecm.platform.annotations.gwt.client.AnnotationConfiguration;
028import org.nuxeo.ecm.platform.annotations.gwt.client.util.XPointer;
029
030import com.google.gwt.i18n.client.DateTimeFormat;
031
032/**
033 * @author Alexandre Russel
034 */
035public class Annotation {
036    private String uuid;
037
038    private XPointer xpointer;
039
040    private boolean isBodyUrl;
041
042    private Date date;
043
044    private String formattedDate = "";
045
046    private String author;
047
048    private String body;
049
050    private String type;
051
052    private int id;
053
054    private Map<String, String> fields = new HashMap<String, String>();
055
056    private Container startContainer;
057
058    private Container endContainer;
059
060    public Annotation(String uuid) {
061        this.uuid = uuid;
062    }
063
064    public Annotation() {
065    }
066
067    public String getUUID() {
068        return uuid;
069    }
070
071    public String getAuthor() {
072        return author;
073    }
074
075    public void setAuthor(String author) {
076        this.author = author;
077    }
078
079    public int getId() {
080        return id;
081    }
082
083    public void setId(int id) {
084        this.id = id;
085    }
086
087    public void setStringDate(String stringDate) {
088        date = computeDate(stringDate);
089        String dateFormatPattern = getDateFormatPattern();
090        DateTimeFormat dateTimeFormat = dateFormatPattern != null ? DateTimeFormat.getFormat(dateFormatPattern)
091                : DateTimeFormat.getShortDateFormat();
092        formattedDate = dateTimeFormat.format(date);
093    }
094
095    private native String getDateFormatPattern() /*-{
096                                                 return top['dateFormatPattern'];
097                                                 }-*/;
098
099    public Annotation(XPointer xpointer) {
100        this.xpointer = xpointer;
101    }
102
103    public boolean isBodyUrl() {
104        return isBodyUrl;
105    }
106
107    public void setBodyUrl(boolean isBodyUrl) {
108        this.isBodyUrl = isBodyUrl;
109    }
110
111    public String getBody() {
112        return body;
113    }
114
115    public void setBody(String body) {
116        this.body = body;
117    }
118
119    public String getType() {
120        return type;
121    }
122
123    public String getShortType() {
124        return type.substring(type.lastIndexOf("#") + 1);
125    }
126
127    public void setType(String type) {
128        this.type = type;
129    }
130
131    public XPointer getXpointer() {
132        return xpointer;
133    }
134
135    public String serialize() {
136        return type + ' ' + xpointer + ' ' + body;
137    }
138
139    public void setXpointer(XPointer xpointer) {
140        this.xpointer = xpointer;
141    }
142
143    public String getFormattedDate() {
144        return formattedDate;
145    }
146
147    public Date getDate() {
148        return date;
149    }
150
151    @SuppressWarnings("deprecation")
152    private static Date computeDate(String stringDate) {
153        String d = stringDate.substring(0, stringDate.indexOf("T"));
154        String t = stringDate.substring(stringDate.indexOf("T") + 1, stringDate.indexOf("Z"));
155        String[] ds = d.split("-");
156        String[] ts = t.split(":");
157        Date now = new Date();
158        int second = ts.length == 3 ? Integer.parseInt(ts[2]) : 0;
159        now = new Date(Date.UTC(Integer.parseInt(ds[0]) - 1900, Integer.parseInt(ds[1]) - 1, Integer.parseInt(ds[2]),
160                Integer.parseInt(ts[0]), Integer.parseInt(ts[1]), second) + now.getTimezoneOffset());
161        return now;
162    }
163
164    public void setFields(Map<String, String> fields) {
165        this.fields = fields;
166    }
167
168    public Map<String, String> getFields() {
169        return fields;
170    }
171
172    public Container getStartContainer() {
173        return startContainer;
174    }
175
176    public void setStartContainer(Container container) {
177        this.startContainer = container;
178    }
179
180    public boolean hasStartContainer() {
181        return startContainer != null;
182    }
183
184    public Container getEndContainer() {
185        return endContainer;
186    }
187
188    public void setEndContainer(Container container) {
189        this.endContainer = container;
190    }
191
192    public boolean hasEndContainer() {
193        return endContainer != null;
194    }
195
196    @Override
197    public boolean equals(Object obj) {
198        if (!(obj instanceof Annotation)) {
199            return false;
200        }
201
202        Annotation annotation = (Annotation) obj;
203        return xpointer.equals(annotation.xpointer) && author.equals(annotation.author);
204    }
205
206    @Override
207    public int hashCode() {
208        int result = 17;
209        result += 17 * xpointer.hashCode();
210        result += 17 * author.hashCode();
211        return result;
212    }
213
214}