/*
* (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.io.Serializable;
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;
/**
* A flavor represents the set of information that can be used to switch the theme styling on a given page.
* <p>
* It holds presets that can be referenced in CSS files, as well as logo information. It can extend another flavor, in
* case it will its logo and presets. The name and label are not inherited.
* <p>
* At registration, presets and log information are merged of a previous contribution with the same name already held
* that kind of information. When emptying the list of presets.
*
* @since 5.5
*/
@XObject("flavor")
public class FlavorDescriptor implements Serializable {
private static final long serialVersionUID = 1L;
@XNode("@name")
String name;
@XNode("label")
String label;
@XNode("@extends")
String extendsFlavor;
@XNode("logo")
LogoDescriptor logo;
@XNode("palettePreview")
PalettePreview palettePreview;
/**
* @since 7.4
*/
@XNode("sass@append")
boolean appendSass;
@XNode("presetsList@append")
boolean appendPresets;
/**
* @since 7.4
*/
@XNodeList(value = "sass/import", type = ArrayList.class, componentType = SassImport.class)
List<SassImport> sassImports;
@XNodeList(value = "presetsList/presets", type = ArrayList.class, componentType = FlavorPresets.class)
List<FlavorPresets> presets;
/**
* @since 7.4
*/
@XNodeList(value = "links/icon", type = ArrayList.class, componentType = IconDescriptor.class)
List<IconDescriptor> favicons;
@Override
public FlavorDescriptor clone() {
FlavorDescriptor clone = new FlavorDescriptor();
clone.setName(getName());
clone.setLabel(getLabel());
LogoDescriptor logo = getLogo();
if (logo != null) {
clone.setLogo(logo.clone());
}
PalettePreview pp = getPalettePreview();
if (pp != null) {
clone.setPalettePreview(pp.clone());
}
clone.setExtendsFlavor(getExtendsFlavor());
clone.setAppendPresets(getAppendPresets());
List<FlavorPresets> presets = getPresets();
if (presets != null) {
List<FlavorPresets> newPresets = new ArrayList<FlavorPresets>();
for (FlavorPresets item : presets) {
newPresets.add(item.clone());
}
clone.setPresets(newPresets);
}
clone.setAppendSass(getAppendSass());
List<SassImport> sassVariables = getSassImports();
if (sassVariables != null) {
List<SassImport> cSassVariables = new ArrayList<SassImport>();
for (SassImport var : sassVariables) {
cSassVariables.add(var.clone());
}
clone.setSassImports(cSassVariables);
}
List<IconDescriptor> favicons = getFavicons();
if (favicons != null) {
List<IconDescriptor> icons = new ArrayList<IconDescriptor>();
for (IconDescriptor icon : favicons) {
icons.add(icon.clone());
}
clone.setFavicons(icons);
}
return clone;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof FlavorDescriptor)) {
return false;
}
if (obj == this) {
return true;
}
FlavorDescriptor f = (FlavorDescriptor) obj;
return new EqualsBuilder().append(name, f.name).append(label, f.label).append(extendsFlavor,
f.extendsFlavor).append(logo, f.logo).append(palettePreview, f.palettePreview).append(appendPresets,
f.appendPresets).append(presets, f.presets).append(appendSass, f.appendSass).append(sassImports,
f.sassImports).append(favicons, f.favicons).isEquals();
}
public boolean getAppendPresets() {
return appendPresets;
}
/**
* @since 7.4
*/
public boolean getAppendSass() {
return appendSass;
}
public String getExtendsFlavor() {
return extendsFlavor;
}
/**
* @since 7.4
*/
public List<IconDescriptor> getFavicons() {
return favicons;
}
public String getLabel() {
return label;
}
public LogoDescriptor getLogo() {
return logo;
}
public String getName() {
return name;
}
public PalettePreview getPalettePreview() {
return palettePreview;
}
public List<FlavorPresets> getPresets() {
return presets;
}
/**
* @since 7.4
*/
public List<SassImport> getSassImports() {
return sassImports;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (appendPresets ? 1231 : 1237);
result = prime * result + (appendSass ? 1231 : 1237);
result = prime * result + ((extendsFlavor == null) ? 0 : extendsFlavor.hashCode());
result = prime * result + ((favicons == null) ? 0 : favicons.hashCode());
result = prime * result + ((label == null) ? 0 : label.hashCode());
result = prime * result + ((logo == null) ? 0 : logo.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((palettePreview == null) ? 0 : palettePreview.hashCode());
result = prime * result + ((presets == null) ? 0 : presets.hashCode());
result = prime * result + ((sassImports == null) ? 0 : sassImports.hashCode());
return result;
}
public void merge(FlavorDescriptor src) {
String newExtend = src.getExtendsFlavor();
if (newExtend != null) {
setExtendsFlavor(newExtend);
}
String newLabel = src.getLabel();
if (newLabel != null) {
setLabel(newLabel);
}
LogoDescriptor logo = src.getLogo();
if (logo != null) {
LogoDescriptor newLogo = getLogo();
if (newLogo == null) {
newLogo = logo.clone();
} else {
// merge logo info
if (logo.getHeight() != null) {
newLogo.setHeight(logo.getHeight());
}
if (logo.getWidth() != null) {
newLogo.setWidth(logo.getWidth());
}
if (logo.getTitle() != null) {
newLogo.setTitle(logo.getTitle());
}
if (logo.getPath() != null) {
newLogo.setPath(logo.getPath());
}
}
setLogo(newLogo);
}
PalettePreview pp = src.getPalettePreview();
if (pp != null) {
setPalettePreview(pp);
}
List<FlavorPresets> newPresets = src.getPresets();
if (newPresets != null) {
List<FlavorPresets> merged = new ArrayList<FlavorPresets>();
merged.addAll(newPresets);
boolean keepOld = src.getAppendPresets() || (newPresets.isEmpty() && !src.getAppendPresets());
if (keepOld) {
// add back old contributions
List<FlavorPresets> oldPresets = getPresets();
if (oldPresets != null) {
merged.addAll(0, oldPresets);
}
}
setPresets(merged);
}
List<SassImport> newSassImports = src.getSassImports();
if (newSassImports != null) {
List<SassImport> merged = new ArrayList<SassImport>();
merged.addAll(newSassImports);
boolean keepOld = src.getAppendSass() || (newSassImports.isEmpty() && !src.getAppendSass());
if (keepOld) {
// add back old contributions
List<SassImport> oldSassImports = getSassImports();
if (oldSassImports != null) {
merged.addAll(0, oldSassImports);
}
}
setSassImports(merged);
}
List<IconDescriptor> newFavicons = src.getFavicons();
if (newFavicons != null && !newFavicons.isEmpty()) {
setFavicons(newFavicons);
}
}
public void setAppendPresets(boolean appendPresets) {
this.appendPresets = appendPresets;
}
/**
* @since 7.4
*/
public void setAppendSass(boolean appendSass) {
this.appendSass = appendSass;
}
public void setExtendsFlavor(String extendsFlavor) {
this.extendsFlavor = extendsFlavor;
}
/**
* @since 7.4
*/
public void setFavicons(List<IconDescriptor> favicons) {
this.favicons = favicons;
}
public void setLabel(String label) {
this.label = label;
}
public void setLogo(LogoDescriptor logo) {
this.logo = logo;
}
public void setName(String name) {
this.name = name;
}
public void setPalettePreview(PalettePreview palettePreview) {
this.palettePreview = palettePreview;
}
public void setPresets(List<FlavorPresets> presets) {
this.presets = presets;
}
/**
* @since 7.4
*/
public void setSassImports(List<SassImport> sassImports) {
this.sassImports = sassImports;
}
}