View Javadoc

1   /**
2    * This file Copyright (c) 2011 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.templating.editor.client.dom;
35  
36  import java.util.HashMap;
37  
38  import com.google.gwt.dom.client.Element;
39  import com.google.gwt.regexp.shared.MatchResult;
40  import com.google.gwt.regexp.shared.RegExp;
41  
42  
43  /**
44  * CMSComment Constructor.
45  *
46  * @throws IllegalArgumentException if the tagname does not start with cms:
47  */
48  public class CMSComment {
49  
50      private Element element;
51      private String comment;
52      private String tagName;
53      private boolean isClosing = false;
54  
55      private HashMap<String, String> attributes;
56  
57      public CMSComment(Comment comment) throws IllegalArgumentException {
58          this.setElement((Element)comment.cast());
59          this.comment = comment.getData().trim();
60  
61  
62          int delimiter = this.comment.indexOf(" ");
63          String attributeString = "";
64  
65          if (delimiter < 0){
66              this.tagName = this.comment;
67          }
68          else {
69              this.tagName = this.comment.substring(0, delimiter);
70              attributeString = this.comment.substring(delimiter + 1);
71          }
72  
73          if (this.tagName.startsWith("/")) {
74              setClosing(true);
75              this.tagName = this.tagName.substring(1);
76          }
77  
78  
79          if (this.tagName.startsWith("cms:")) {
80              String[] keyValue;
81              this.attributes = new HashMap<String, String>();
82              RegExp regExp = RegExp.compile("(\\S+=[\"'][^\"]*[\"'])", "g");
83              for (MatchResult matcher = regExp.exec(attributeString); matcher != null; matcher = regExp.exec(attributeString)) {
84                  keyValue = matcher.getGroup(0).split("=");
85                  this.attributes.put(keyValue[0], keyValue[1].replace("\"", ""));
86              }
87          }
88          else {
89              throw new IllegalArgumentException("Tagname must start with 'cms:'.");
90          }
91  
92      }
93  
94      public boolean isClosing() {
95          return isClosing;
96      }
97  
98      public void setClosing(boolean isClosing) {
99          this.isClosing = isClosing;
100     }
101 
102 
103     public String getAttribute(String name) {
104         return this.attributes.get(name);
105     }
106 
107     public boolean hasAttribute(String name) {
108         return this.attributes.containsKey(name);
109     }
110 
111     public String getTagName() {
112         return this.tagName;
113     }
114 
115     @Override
116     public String toString() {
117         return this.comment;
118     }
119 
120     public void setElement(Element element) {
121         this.element = element;
122     }
123 
124     public Element getElement() {
125         return element;
126     }
127 
128 }