/*
* (C) Copyright 2011 Nuxeo SA (http://nuxeo.com/) and others.
*
* 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.
*
* Contributors:
* Anahide Tchertchian
*/
package org.nuxeo.theme.styling.service.descriptors;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.nuxeo.common.xmap.annotation.XNode;
import org.nuxeo.common.xmap.annotation.XNodeList;
import org.nuxeo.common.xmap.annotation.XObject;
import org.nuxeo.ecm.web.resources.api.ResourceBundle;
import org.nuxeo.ecm.web.resources.api.ResourceType;
import org.nuxeo.ecm.web.resources.core.ResourceBundleDescriptor;
/**
* Descriptor to associate resources and flavors to a page.
*
* @since 7.4
*/
@XObject("page")
public class PageDescriptor {
public static final String RESOURCE_BUNDLE_PREFIX = "pageResourceBundle_";
@XNode("@name")
String name;
/**
* @since 7.4
*/
@XNode("@charset")
String charset;
@XNode("defaultFlavor")
String defaultFlavor;
/**
* @deprecated since 7.4: use resources instead
*/
@Deprecated
@XNode("styles@append")
boolean appendStyles;
/**
* @deprecated since 7.4: use resources instead
*/
@Deprecated
@XNodeList(value = "styles/style", type = ArrayList.class, componentType = String.class)
List<String> styles;
@XNode("flavors@append")
boolean appendFlavors;
@XNodeList(value = "flavors/flavor", type = ArrayList.class, componentType = String.class)
List<String> flavors;
@XNode("resources@append")
boolean appendResources;
@XNodeList(value = "resources/resource", type = ArrayList.class, componentType = String.class)
List<String> resources;
/**
* @since 7.4
*/
@XNodeList(value = "resources/bundle", type = ArrayList.class, componentType = String.class)
List<String> bundles;
public String getName() {
return name;
}
public String getDefaultFlavor() {
return defaultFlavor;
}
public void setDefaultFlavor(String defaultFlavor) {
this.defaultFlavor = defaultFlavor;
}
/**
* @deprecated since 7.4: use resources instead
*/
public boolean getAppendStyles() {
return appendStyles;
}
/**
* @deprecated since 7.4: use resources instead
*/
public List<String> getStyles() {
return styles;
}
public boolean getAppendFlavors() {
return appendFlavors;
}
public List<String> getFlavors() {
return flavors;
}
public void setName(String name) {
this.name = name;
}
public void setStyles(List<String> styles) {
this.styles = styles;
}
public void setFlavors(List<String> flavors) {
this.flavors = flavors;
}
public boolean getAppendResources() {
return appendResources;
}
public boolean hasResources() {
return !getResources().isEmpty();
}
public List<String> getResources() {
List<String> res = new ArrayList<String>();
// BBB
if (styles != null) {
for (String style : styles) {
if (style == null) {
continue;
}
if (style.endsWith(ResourceType.css.name())) {
res.add(style);
} else {
res.add(style + "." + ResourceType.css.name());
}
}
}
if (resources != null) {
res.addAll(resources);
}
return res;
}
public void setResources(List<String> resources) {
this.resources = resources;
}
public String getComputedResourceBundleName() {
if ("*".equals(getName())) {
return RESOURCE_BUNDLE_PREFIX + "*";
}
return RESOURCE_BUNDLE_PREFIX + getName().replaceAll("[^a-zA-Z]+", "_");
}
public ResourceBundle getComputedResourceBundle() {
if (hasResources()) {
ResourceBundleDescriptor bundle = new ResourceBundleDescriptor();
bundle.setName(getComputedResourceBundleName());
bundle.setResources(getResources());
bundle.setAppend(getAppendResources());
return bundle;
}
return null;
}
/**
* @since 7.4
*/
public List<String> getResourceBundles() {
List<String> all = new ArrayList<String>();
if (bundles != null) {
all.addAll(bundles);
}
if (hasResources()) {
all.add(getComputedResourceBundleName());
}
return all;
}
/**
* @since 7.4
*/
public void setResourceBundles(List<String> bundles) {
this.bundles = bundles;
}
public void setAppendStyles(boolean appendStyles) {
this.appendStyles = appendStyles;
}
public void setAppendFlavors(boolean appendFlavors) {
this.appendFlavors = appendFlavors;
}
public void setAppendResources(boolean appendResources) {
this.appendResources = appendResources;
}
/**
* @since 7.4
*/
public String getCharset() {
return charset;
}
/**
* @since 7.4
*/
public void setCharset(String charset) {
this.charset = charset;
}
public void merge(PageDescriptor src) {
String newFlavor = src.getDefaultFlavor();
if (newFlavor != null) {
setDefaultFlavor(newFlavor);
}
String newCharset = src.getCharset();
if (newCharset != null) {
setCharset(newCharset);
}
List<String> newStyles = src.getStyles();
if (newStyles != null) {
List<String> merged = new ArrayList<String>();
merged.addAll(newStyles);
boolean keepOld = src.getAppendStyles() || (newStyles.isEmpty() && !src.getAppendStyles());
if (keepOld) {
// add back old contributions
List<String> oldStyles = getStyles();
if (oldStyles != null) {
merged.addAll(0, oldStyles);
}
}
setStyles(merged);
}
List<String> newFlavors = src.getFlavors();
if (newFlavors != null) {
List<String> merged = new ArrayList<String>();
merged.addAll(newFlavors);
boolean keepOld = src.getAppendFlavors() || (newFlavors.isEmpty() && !src.getAppendFlavors());
if (keepOld) {
// add back old contributions
List<String> oldFlavors = getFlavors();
if (oldFlavors != null) {
merged.addAll(0, oldFlavors);
}
}
setFlavors(merged);
}
List<String> newResources = src.resources;
if (newResources != null) {
List<String> merged = new ArrayList<String>();
merged.addAll(newResources);
boolean keepOld = src.getAppendResources() || (newResources.isEmpty() && !src.getAppendResources());
if (keepOld) {
// add back old contributions
List<String> oldResources = resources;
if (oldResources != null) {
merged.addAll(0, oldResources);
}
}
setResources(merged);
}
List<String> newBundles = src.bundles;
if (newBundles != null) {
List<String> merged = new ArrayList<String>();
merged.addAll(newBundles);
boolean keepOld = src.getAppendResources() || (newBundles.isEmpty() && !src.getAppendResources());
if (keepOld) {
// add back old contributions
List<String> oldBundles = bundles;
if (oldBundles != null) {
merged.addAll(0, oldBundles);
}
}
setResourceBundles(merged);
}
}
@Override
public PageDescriptor clone() {
PageDescriptor clone = new PageDescriptor();
clone.setName(getName());
clone.setCharset(getCharset());
clone.setDefaultFlavor(getDefaultFlavor());
clone.setAppendStyles(getAppendStyles());
List<String> styles = getStyles();
if (styles != null) {
clone.setStyles(new ArrayList<String>(styles));
}
clone.setAppendFlavors(getAppendFlavors());
List<String> flavors = getFlavors();
if (flavors != null) {
clone.setFlavors(new ArrayList<String>(flavors));
}
clone.setAppendResources(getAppendResources());
if (resources != null) {
clone.setResources(new ArrayList<String>(resources));
}
if (bundles != null) {
clone.setResourceBundles(new ArrayList<String>(bundles));
}
return clone;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof PageDescriptor)) {
return false;
}
if (obj == this) {
return true;
}
PageDescriptor p = (PageDescriptor) obj;
return new EqualsBuilder().append(name, p.name).append(charset, p.charset).append(defaultFlavor,
p.defaultFlavor).append(appendStyles, p.appendStyles).append(styles, p.styles).append(appendFlavors,
p.appendFlavors).append(flavors, p.flavors).append(appendResources, p.appendResources).append(
resources, p.resources).append(bundles, p.bundles).isEquals();
}
}