156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/* 256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Copyright (C) 2010 Google Inc. 356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * you may not use this file except in compliance with the License. 656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * You may obtain a copy of the License at 756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * http://www.apache.org/licenses/LICENSE-2.0 956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 1056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Unless required by applicable law or agreed to in writing, software 1156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * distributed under the License is distributed on an "AS IS" BASIS, 1256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * See the License for the specific language governing permissions and 1456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * limitations under the License. 1556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 1656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 1756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpackage com.google.clearsilver.jsilver.data; 1856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 1956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport com.google.clearsilver.jsilver.autoescape.EscapeMode; 2056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 2156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.io.IOException; 2256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.util.Iterator; 2356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonimport java.util.Map; 2456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 2556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson/** 2656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Class that wraps a Data object and exports the same interface. Useful for extending the 2756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * capabilities of an existing implementation. 2856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 2956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodsonpublic class DelegatedData implements Data { 3056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 3156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private final Data delegate; 3256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 3356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public DelegatedData(Data delegate) { 3456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (delegate == null) { 3556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson throw new NullPointerException("Delegate Data must not be null."); 3656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 3756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.delegate = delegate; 3856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 3956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 4056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 4156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Subclasses will want to override this method to return a Data object of their specific type. 4256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 4356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @param newDelegate the Data object to wrap with a new delegator 4456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @return a DelegateData type or subclass. 4556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 4656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson protected DelegatedData newInstance(Data newDelegate) { 4756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return newDelegate == null ? null : new DelegatedData(newDelegate); 4856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 4956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 5056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson protected Data getDelegate() { 5156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return delegate; 5256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 5356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 5456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson protected static Data unwrap(Data data) { 5556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson if (data instanceof DelegatedData) { 5656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson data = ((DelegatedData) data).getDelegate(); 5756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 5856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return data; 5956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 6056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 6156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 6256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String getName() { 6356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getName(); 6456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 6556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 6656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 6756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String getValue() { 6856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getValue(); 6956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 7056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 7156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 7256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public int getIntValue() { 7356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getIntValue(); 7456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 7556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 7656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 7756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public boolean getBooleanValue() { 7856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getBooleanValue(); 7956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 8056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 8156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 8256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void setValue(String value) { 8356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().setValue(value); 8456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 8556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 8656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 8756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String getFullPath() { 8856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getFullPath(); 8956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 9056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 9156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 9256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void setAttribute(String key, String value) { 9356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().setAttribute(key, value); 9456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 9556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 9656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 9756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String getAttribute(String key) { 9856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getAttribute(key); 9956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 10056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 10256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public boolean hasAttribute(String key) { 10356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().hasAttribute(key); 10456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 10556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 10656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 10756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public int getAttributeCount() { 10856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getAttributeCount(); 10956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 11056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 11156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 11256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public Iterable<Map.Entry<String, String>> getAttributes() { 11356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getAttributes(); 11456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 11556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 11656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 11756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public Data getRoot() { 11856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return newInstance(getDelegate().getRoot()); 11956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 12156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 12256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public Data getParent() { 12356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return newInstance(getDelegate().getParent()); 12456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 12556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 12656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 12756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public boolean isFirstSibling() { 12856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().isFirstSibling(); 12956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 13056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 13156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 13256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public boolean isLastSibling() { 13356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().isLastSibling(); 13456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 13556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 13656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 13756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public Data getNextSibling() { 13856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return newInstance(getDelegate().getNextSibling()); 13956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 14056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 14156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 14256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public int getChildCount() { 14356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getChildCount(); 14456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 14556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 14656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 14756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Wrapping implementation of iterator that makes sure any Data object returned by the underlying 14856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * iterator is wrapped with the right DelegatedData type. 14956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 15056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson protected class DelegatedIterator implements Iterator<DelegatedData> { 15156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private final Iterator<? extends Data> iterator; 15256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 15356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson DelegatedIterator(Iterator<? extends Data> iterator) { 15456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson this.iterator = iterator; 15556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 15656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 15756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public boolean hasNext() { 15856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return iterator.hasNext(); 15956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 16056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 16156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public DelegatedData next() { 16256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return newInstance(iterator.next()); 16356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 16456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 16556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void remove() { 16656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson iterator.remove(); 16756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 16856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 16956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 17056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 17156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Subclasses can override this method to return specialized child iterators. For example, if they 17256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * don't want to support the remove() operation. 17356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * 17456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * @return Iterator of children of delegate Data object that returns wrapped Data nodes. 17556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 17656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson protected Iterator<DelegatedData> newChildIterator() { 17756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return new DelegatedIterator(getDelegate().getChildren().iterator()); 17856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 17956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 18056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson /** 18156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * Single Iterable object for each node. All it does is return a DelegatedIterator when asked for 18256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson * iterator. 18356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson */ 18456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson private final Iterable<DelegatedData> delegatedIterable = new Iterable<DelegatedData>() { 18556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public Iterator<DelegatedData> iterator() { 18656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return newChildIterator(); 18756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 18856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson }; 18956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 19056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 19156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public Iterable<? extends Data> getChildren() { 19256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return delegatedIterable; 19356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 19456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 19556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 19656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public Data getChild(String path) { 19756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return newInstance(getDelegate().getChild(path)); 19856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 19956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 20056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 20156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public Data createChild(String path) { 20256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return newInstance(getDelegate().createChild(path)); 20356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 20456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 20556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 20656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void removeTree(String path) { 20756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().removeTree(path); 20856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 20956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 21056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 21156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void setSymlink(String sourcePath, String destinationPath) { 21256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().setSymlink(sourcePath, destinationPath); 21356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 21456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 21556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 21656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void setSymlink(String sourcePath, Data destination) { 21756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson destination = unwrap(destination); 21856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().setSymlink(sourcePath, destination); 21956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 22056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 22156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 22256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void setSymlink(Data symLink) { 22356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson symLink = unwrap(symLink); 22456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().setSymlink(symLink); 22556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 22656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 22756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 22856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public Data getSymlink() { 22956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return newInstance(getDelegate().getSymlink()); 23056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 23156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 23256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 23356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void copy(String toPath, Data from) { 23456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson from = unwrap(from); 23556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().copy(toPath, from); 23656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 23756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 23856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 23956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void copy(Data from) { 24056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson from = unwrap(from); 24156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().copy(from); 24256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 24356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 24456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 24556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String getValue(String path, String defaultValue) { 24656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getValue(path, defaultValue); 24756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 24856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 24956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 25056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public int getIntValue(String path, int defaultValue) { 25156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getIntValue(path, defaultValue); 25256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 25356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 25456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 25556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String getValue(String path) { 25656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getValue(path); 25756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 25856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 25956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 26056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public int getIntValue(String path) { 26156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getIntValue(path); 26256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 26356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 26456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 26556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public boolean getBooleanValue(String path) { 26656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getBooleanValue(path); 26756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 26856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 26956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 27056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void setValue(String path, String value) { 27156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().setValue(path, value); 27256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 27356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 27456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 27556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public String toString() { 27656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().toString(); 27756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 27856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 27956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 28056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void toString(StringBuilder out, int indent) { 28156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().toString(out, indent); 28256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 28356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 28456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 28556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void write(Appendable out, int indent) throws IOException { 28656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().write(out, indent); 28756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 28856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 28956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 29056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void optimize() { 29156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().optimize(); 29256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 29356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 29456ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 29556ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public void setEscapeMode(EscapeMode mode) { 29656ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson getDelegate().setEscapeMode(mode); 29756ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 29856ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson 29956ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson @Override 30056ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson public EscapeMode getEscapeMode() { 30156ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson return getDelegate().getEscapeMode(); 30256ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson } 30356ed4167b942ec265f9cee70ac4d71d10b3835ceBen Dodson} 304