View Javadoc
1   /*
2    * (c) Copyright 2006-2020 by rapiddweller GmbH & Volker Bergmann. All rights reserved.
3    *
4    * Redistribution and use in source and binary forms, with or without
5    * modification, is permitted under the terms of the
6    * GNU General Public License.
7    *
8    * For redistributing this software or a derivative work under a license other
9    * than the GPL-compatible Free Software License as defined by the Free
10   * Software Foundation or approved by OSI, you must first obtain a commercial
11   * license to this software product from rapiddweller GmbH & Volker Bergmann.
12   *
13   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14   * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
15   * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
16   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
17   * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24   * POSSIBILITY OF SUCH DAMAGE.
25   */
26  
27  package com.rapiddweller.platform.edi;
28  
29  import freemarker.template.TemplateMethodModelEx;
30  
31  import java.util.List;
32  
33  /**
34   * Provides Edifact character escaping in FreeMarker templates.<br/><br/>
35   * Created: 30.06.2014 11:14:26
36   *
37   * @author Volker Bergmann
38   * @since 0.9.7
39   */
40  public class EdiEscapeFreeMarkerMethod implements TemplateMethodModelEx {
41  
42    private char componentSeparator = ':';
43    private char elementSeparator = '+';
44    private char escapeChar = '?';
45    private char segmentSeparator = '\'';
46  
47    /**
48     * Gets component separator.
49     *
50     * @return the component separator
51     */
52    public char getComponentSeparator() {
53      return componentSeparator;
54    }
55  
56    /**
57     * Sets component separator.
58     *
59     * @param componentSeparator the component separator
60     */
61    public void setComponentSeparator(char componentSeparator) {
62      this.componentSeparator = componentSeparator;
63    }
64  
65    /**
66     * Gets element separator.
67     *
68     * @return the element separator
69     */
70    public char getElementSeparator() {
71      return elementSeparator;
72    }
73  
74    /**
75     * Sets element separator.
76     *
77     * @param elementSeparator the element separator
78     */
79    public void setElementSeparator(char elementSeparator) {
80      this.elementSeparator = elementSeparator;
81    }
82  
83    /**
84     * Gets escape char.
85     *
86     * @return the escape char
87     */
88    public char getEscapeChar() {
89      return escapeChar;
90    }
91  
92    /**
93     * Sets escape char.
94     *
95     * @param escapeChar the escape char
96     */
97    public void setEscapeChar(char escapeChar) {
98      this.escapeChar = escapeChar;
99    }
100 
101   /**
102    * Gets segment separator.
103    *
104    * @return the segment separator
105    */
106   public char getSegmentSeparator() {
107     return segmentSeparator;
108   }
109 
110   /**
111    * Sets segment separator.
112    *
113    * @param segmentSeparator the segment separator
114    */
115   public void setSegmentSeparator(char segmentSeparator) {
116     this.segmentSeparator = segmentSeparator;
117   }
118 
119   @Override
120   public Object exec(List args) {
121     StringBuilder builder = new StringBuilder();
122     for (int index = 0; index < args.size(); index++) {
123       if (index > 0) {
124         builder.append(':');
125       }
126       String s = String.valueOf(args.get(index));
127       for (int i = 0; i < s.length(); i++) {
128         char c = s.charAt(i);
129         if (needsEscaping(c)) {
130           builder.append(escapeChar);
131         }
132         builder.append(c);
133       }
134     }
135     return builder.toString();
136   }
137 
138   private boolean needsEscaping(char c) {
139     return (c == componentSeparator || c == elementSeparator ||
140         c == escapeChar || c == segmentSeparator);
141   }
142 
143 }