aboutsummaryrefslogtreecommitdiffstats
path: root/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/wizards/templates/FmEscapePropertyValueMethod.java
blob: c6dc704e355a535dffef40a390cc153306cd477d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.ide.eclipse.adt.internal.wizards.templates;

import com.android.utils.SdkUtils;
import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;

import java.io.IOException;
import java.io.StringWriter;
import java.util.List;
import java.util.Properties;

/** Escapes a property value (such that its syntax is valid in a Java properties file */
public class FmEscapePropertyValueMethod implements TemplateMethodModel {
  @Override
  public TemplateModel exec(List args) throws TemplateModelException {
    if (args.size() != 1) {
      throw new TemplateModelException("Wrong arguments");
    }

    // Slow, stupid implementation, but is 100% compatible with Java's property file implementation
    Properties properties = new Properties();
    String value = args.get(0).toString();
    properties.setProperty("k", value); // key doesn't matter
    StringWriter writer = new StringWriter();
    String escaped;
    try {
      properties.store(writer, null);
      String s = writer.toString();
      int end = s.length();

      // Writer inserts trailing newline
      String lineSeparator = SdkUtils.getLineSeparator();
      if (s.endsWith(lineSeparator)) {
        end -= lineSeparator.length();
      }

      int start = s.indexOf('=');
      assert start != -1 : s;
      escaped = s.substring(start + 1, end);
    }
    catch (IOException e) {
      escaped = value; // shouldn't happen; we're not going to disk
    }

    return new SimpleScalar(escaped);
  }
}