UnmodifiableData.java revision 56ed4167b942ec265f9cee70ac4d71d10b3835ce
1/*
2 * Copyright (C) 2010 Google Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.clearsilver.jsilver.data;
18
19import com.google.clearsilver.jsilver.autoescape.EscapeMode;
20
21import java.util.Iterator;
22
23/**
24 * Data wrapper that prevents modifying the delegated Data node or its tree.
25 */
26public class UnmodifiableData extends DelegatedData {
27
28  private static final String MODIFICATION_ERROR_MSG = "Cannot modify this Data object.";
29
30  public UnmodifiableData(Data delegate) {
31    super(delegate);
32  }
33
34  @Override
35  protected DelegatedData newInstance(Data newDelegate) {
36    return newDelegate == null ? null : new UnmodifiableData(newDelegate);
37  }
38
39  @Override
40  public void copy(Data from) {
41    throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
42  }
43
44  @Override
45  public void copy(String toPath, Data from) {
46    throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
47  }
48
49  /**
50   * {@link #createChild} calls {@link #getChild} and throws {@link UnsupportedOperationException}
51   * if no object was found.
52   */
53  @Override
54  public Data createChild(String path) {
55    // Check if child already exists
56    Data child = getChild(path);
57
58    if (child == null) {
59      // If the child described by path does not exist we throw
60      // an exception as we cannot create a new one.
61      throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
62    }
63    return child;
64  }
65
66  protected class UnmodifiableIterator extends DelegatedIterator {
67    UnmodifiableIterator(Iterator<? extends Data> iterator) {
68      super(iterator);
69    }
70
71    public void remove() {
72      throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
73    }
74  }
75
76  /**
77   * Override in order to not allow modifying children with remove().
78   */
79  @Override
80  protected Iterator<DelegatedData> newChildIterator() {
81    return new UnmodifiableIterator(getDelegate().getChildren().iterator());
82  }
83
84  // Below we disable modification operations.
85
86  @Override
87  public void setSymlink(String sourcePath, Data destination) {
88    throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
89  }
90
91  @Override
92  public void setSymlink(String sourcePath, String destinationPath) {
93    throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
94  }
95
96  @Override
97  public void setSymlink(Data symLink) {
98    throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
99  }
100
101  @Override
102  public void setAttribute(String key, String value) {
103    throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
104  }
105
106  @Override
107  public void removeTree(String path) {
108    throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
109  }
110
111  @Override
112  public void setValue(String path, String value) {
113    throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
114  }
115
116  @Override
117  public void setValue(String value) {
118    throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
119  }
120
121  @Override
122  public void setEscapeMode(EscapeMode mode) {
123    throw new UnsupportedOperationException(MODIFICATION_ERROR_MSG);
124  }
125}
126