blob: 8882b876a4098d25d331336126eae952a4576a65 [file] [log] [blame]
/*
* Copyright (C) 2010 Google Inc.
*
* 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.google.clearsilver.jsilver.data;
/**
* This is a special implementation of ChainedData to be used for holding the local and global Data
* objects (like local and global HDFs in Clearsilver). It prevents writes and modifications to the
* global Data object and applies them all to the local data object.
*/
public class LocalAndGlobalData extends ChainedData {
private final Data local;
/**
* Creates a Data object that encapsulates both request-scoped local HDF and an application
* global-scoped HDF that can be read from the template renderer. Part of the backwards
* compatibility with JNI Clearsilver and its globalHdf support.
*
* @param local the request-specific HDF data that takes priority.
* @param global application global HDF data that should be read but not written to from the
* template renderer.
*/
public LocalAndGlobalData(Data local, Data global) {
this(local, global, false);
}
/**
* Creates a Data object that encapsulates both request-scoped local HDF and an application
* global-scoped HDF that can be read from the template renderer. Part of the backwards
* compatibility with JNI Clearsilver and its globalHdf support. We wrap the global HDF in an
* UnmodifiableData delegate
*
* @param local the request-specific HDF data that takes priority.
* @param global application global HDF data that should be read but not written to from the
* template renderer.
* @param allowGlobalDataModification if {@code true} then enable legacy mode where we do not wrap
* the global Data with an Unmodifiable wrapper. Should not be set to {@code true} unless
* incompatibilities or performance issues found. Note, that setting to {@code true} could
* introduce bugs in templates that acquire local references to the global data structure
* and then try to modify them, which is not the intended behavior.
*/
public LocalAndGlobalData(Data local, Data global, boolean allowGlobalDataModification) {
super(local, prepareGlobal(global, allowGlobalDataModification));
this.local = local;
}
private static Data prepareGlobal(Data global, boolean allowGlobalDataModification) {
if (allowGlobalDataModification) {
return global;
} else {
return new UnmodifiableData(global);
}
}
@Override
public Data createChild(String path) {
// We never want to modify the global Data object.
return local.createChild(path);
}
}