Removed experimental ccm-pages module
git-svn-id: https://svn.libreccm.org/ccm/trunk@5831 8810af33-2d31-482b-a856-94f89814c4dfmaster
parent
f1a433190e
commit
5fd3a72cf0
|
|
@ -1,30 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
<ccm:application xmlns:ccm="http://ccm.redhat.com/ccm-project"
|
||||
name="ccm-pages"
|
||||
prettyName="Pages"
|
||||
version="6.0.0"
|
||||
release="2"
|
||||
webapp="ROOT">
|
||||
|
||||
<ccm:dependencies>
|
||||
<ccm:requires name="ccm-cms" version="6.6.0" relation="ge" />
|
||||
<ccm:requires name="ccm-core" version="6.6.0" relation="ge" />
|
||||
<ccm:requires name="ccm-ldn-terms" version="6.6.0" relation="ge" />
|
||||
<ccm:requires name="ccm-subsite" version="6.6.0" relation="ge" />
|
||||
<ccm:requires name="ccm-themedirector" version="6.6.0" relation="ge" />
|
||||
</ccm:dependencies>
|
||||
|
||||
<ccm:contacts>
|
||||
<ccm:contact uri="https://www.scientificcms.org" type="website"/>
|
||||
<ccm:contact uri="mailto:info@scentificcms.org" type="support"/>
|
||||
</ccm:contacts>
|
||||
|
||||
<ccm:description>
|
||||
A backport of the new Pages application from 7.0.0. The Pages
|
||||
application replaces ccm-navigation and the current JSP templates 7.0.0.
|
||||
Pages has been backported to ease the migration to 7.0.0. This
|
||||
application only if the ccm-theming application (another backport
|
||||
from 7.0.0) is also installed.
|
||||
</ccm:description>
|
||||
|
||||
</ccm:application>
|
||||
Binary file not shown.
|
|
@ -1,119 +0,0 @@
|
|||
model org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.web.Application;
|
||||
import com.arsdigita.kernel.ACSObject;
|
||||
|
||||
import com.arsdigita.cms.ContentItem;
|
||||
|
||||
object type PageModel {
|
||||
|
||||
BigDecimal[1..1] pageModelId = ccm_page_models.page_model_id INTEGER;
|
||||
|
||||
String[1..1] uuid = ccm_page_models.uuid VARCHAR(38);
|
||||
|
||||
String[1..1] modelUuid = ccm_page_models.model_uuid VARCHAR(38);
|
||||
|
||||
String[1..1] name = ccm_page_models.name VARCHAR(512);
|
||||
|
||||
String[1..1] pageModelVersion = ccm_page_models.page_model_version VARCHAR(256);
|
||||
|
||||
Date[0..1] lastModified = ccm_page_models.last_modified TIMESTAMP;
|
||||
|
||||
String[0..1] title = ccm_page_models.title VARCHAR(1024);
|
||||
|
||||
String[0..1] description = ccm_page_models.description VARCHAR(4096);
|
||||
|
||||
String[0..1] type = ccm_page_models.type VARCHAR(256);
|
||||
|
||||
Application[1..1] application = join ccm_page_models.application_id
|
||||
to applications.application_id;
|
||||
|
||||
ContainerModel[0..n] containerModels = join ccm_page_models.page_model_id
|
||||
to ccm_page_model_container_models.page_model_id;
|
||||
|
||||
object key(pageModelId);
|
||||
}
|
||||
|
||||
object type ContainerModel {
|
||||
|
||||
BigDecimal[1..1] containerModelId = ccm_page_model_container_models.container_model_id INTEGER;
|
||||
|
||||
String[1..1] uuid = ccm_page_model_container_models.uuid VARCHAR(38);
|
||||
|
||||
String[1..1] containerUuid = ccm_page_model_container_models.container_uuid VARCHAR(38);
|
||||
|
||||
String[1..1] key = ccm_page_model_container_models.key VARCHAR(256);
|
||||
|
||||
PageModel[1..1] pageModel = join ccm_page_model_container_models.page_model_id
|
||||
to ccm_page_models.page_model_id;
|
||||
|
||||
ComponentModel[0..n] componentModel = join ccm_page_model_container_models.container_model_id
|
||||
to ccm_page_model_component_models.container_model_id;
|
||||
|
||||
object key(containerModelId);
|
||||
}
|
||||
|
||||
object type ComponentModel {
|
||||
|
||||
BigDecimal[1..1] componentModelId = ccm_page_model_component_models.component_model_id;
|
||||
|
||||
String[1..1] uuid = ccm_page_model_component_models.uuid VARCHAR(38);
|
||||
|
||||
String[1..1] componentModelUuid = ccm_page_model_component_models.component_model_uuid VARCHAR(38);
|
||||
|
||||
String[0..1] idAttribute = ccm_page_model_component_models.id_attribute VARCHAR(255);
|
||||
|
||||
String[0..1] classAttribute = ccm_page_model_component_models.class_attribute VARCHAR(512);
|
||||
|
||||
String[0..1] styleAttribute = ccm_page_model_component_models.style_attribute VARCHAR(1024);
|
||||
|
||||
String[0..1] key = ccm_page_model_component_models.component_key VARCHAR(255);
|
||||
|
||||
object key(componentModelId);
|
||||
}
|
||||
|
||||
object type CategoryTreeComponent extends ComponentModel {
|
||||
|
||||
Boolean[0..1] showFullTree = ccm_page_model_category_tree_components.show_full_tree BIT;
|
||||
|
||||
reference key(ccm_page_model_category_tree_components.component_model_id);
|
||||
}
|
||||
|
||||
object type ContentItemComponent extends ComponentModel {
|
||||
|
||||
String[0..1] mode = ccm_page_model_content_item_components.mode VARCHAR(255);
|
||||
|
||||
reference key(ccm_page_model_item_list_components.component_model_id);
|
||||
}
|
||||
|
||||
object type ItemListComponent extends ComponentModel {
|
||||
|
||||
Boolean[0..1] descending = ccm_page_model_item_list_components.descending BIT;
|
||||
|
||||
String[0..1] limitToType = ccm_page_model_item_list_components.limit_to_type VARCHAR(255);
|
||||
|
||||
Integer[0..1] pageSize = ccm_page_model_item_list_components.page_size INTEGER;
|
||||
|
||||
String[0..1] listOrder = ccm_page_model_item_list_components.list_order VARCHAR(255);
|
||||
|
||||
reference key(ccm_page_model_item_list_components.component_model_id);
|
||||
}
|
||||
|
||||
object type CategorizedItemComponent extends ContentItemComponent {
|
||||
|
||||
reference key(ccm_page_model_categorized_item_components.component_model_id);
|
||||
}
|
||||
|
||||
object type GreetingItemComponent extends ContentItemComponent {
|
||||
|
||||
reference key(ccm_page_model_greeting_item_components.component_model_id);
|
||||
}
|
||||
|
||||
object type FixedContentItemComponent extends ContentItemComponent {
|
||||
|
||||
ContentItem[0..1] contentItem = join ccm_page_model_fixed_content_item_components.content_item_id
|
||||
to cms_items.item_id;
|
||||
|
||||
reference key(ccm_page_model_fixed_content_item_components.component_model_id);
|
||||
}
|
||||
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
model org.librecms.pages.Pages;
|
||||
|
||||
import com.arsdigita.web.Application;
|
||||
import com.arsdigita.kernel.ACSObject;
|
||||
|
||||
import com.arsdigita.subsite.Site;
|
||||
|
||||
import com.arsdigita.london.terms.Domain;
|
||||
|
||||
import org.libreccm.pagemodel.PageModel;
|
||||
|
||||
object type Pages extends Application {
|
||||
|
||||
Site[1..1] site = join ccm_pages.site_id
|
||||
to subsite_sites.site_id;
|
||||
|
||||
Domain[1..1] domainCategory = join ccm_pages.domain_category_id
|
||||
to cat_categories.category_id;
|
||||
|
||||
reference key(ccm_pages.page_id);
|
||||
}
|
||||
|
||||
object type Page extends ACSObject {
|
||||
|
||||
reference key(ccm_pages_pages.page_id);
|
||||
|
||||
PageModel[1..1] indexPageModel = join ccm_pages_pages.index_page_model_id
|
||||
to ccm_page_models.page_model_id;
|
||||
|
||||
PageModel[1..1] itemPageModel = join ccm_pages_pages.item_page_model_id
|
||||
to ccm_page_models.page_model_id;
|
||||
}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
@ ddl/oracle-se/create.sql
|
||||
|
||||
@ ddl/oracle-se/deferred.sql
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
begin;
|
||||
\i ddl/postgres/create.sql
|
||||
\i ddl/postgres/deferred.sql
|
||||
end;
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<registry>
|
||||
</registry>
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
<load>
|
||||
<requires>
|
||||
<table name="inits"/>
|
||||
<table name="acs_objects"/>
|
||||
<!--<initializer class="com.arsdigita.core.Initializer" />-->
|
||||
</requires>
|
||||
<!--<provides>
|
||||
<initializer class="org.librecms.pages.Initializer" />
|
||||
</provides>
|
||||
<scripts>
|
||||
<schema directory="ccm-pages" />
|
||||
<data class="org.librecms.pages.Loader" />
|
||||
</scripts>-->
|
||||
</load>
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2015 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.l10n;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public final class L10NConstants {
|
||||
|
||||
public static final String L10N_XML_NS = "http://l10n.libreccm.org";
|
||||
|
||||
private L10NConstants() {
|
||||
//Nothing
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,193 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2015 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/package org.libreccm.l10n;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||
import org.libreccm.l10n.jaxb.LocalizedStringValuesAdapter;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@XmlRootElement(name = "localized-string",
|
||||
namespace = L10NConstants.L10N_XML_NS)
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class LocalizedString implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* The localised values of the string.
|
||||
*/
|
||||
@XmlElement(name = "values", namespace = L10NConstants.L10N_XML_NS)
|
||||
@XmlJavaTypeAdapter(LocalizedStringValuesAdapter.class)
|
||||
private Map<Locale, String> values;
|
||||
|
||||
/**
|
||||
* Constructor. Only creates the initial, empty map for new instances.
|
||||
*/
|
||||
public LocalizedString() {
|
||||
values = new HashMap<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all localised values.
|
||||
*
|
||||
* @return A unmodifiable {@code Map} containing all localised values of
|
||||
* this localised string.
|
||||
*/
|
||||
public Map<Locale, String> getValues() {
|
||||
if (values == null) {
|
||||
return null;
|
||||
} else {
|
||||
return Collections.unmodifiableMap(values);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for replacing the complete {@code Map} of values. Only to be used
|
||||
* by JPA and the Repository classes in the package.
|
||||
*
|
||||
* @param values The new map of values.
|
||||
*/
|
||||
protected void setValues(final Map<Locale, String> values) {
|
||||
if (values == null) {
|
||||
this.values = new HashMap<>();
|
||||
} else {
|
||||
this.values = new HashMap<>(values);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the values for the default locale.
|
||||
*
|
||||
* @return The localised value for the default locale of the system the
|
||||
* application is running on. In most cases this is not what you
|
||||
* want. Use {@link #getValue(java.util.Locale)} instead.
|
||||
*/
|
||||
public String getValue() {
|
||||
return getValue(Locale.getDefault());
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the localised value of a locale.
|
||||
*
|
||||
* @param locale The locale for which the value shall be retrieved.
|
||||
*
|
||||
* @return The localised for the {@code locale} or {@code null} if there is
|
||||
* no value for the provided locale.
|
||||
*/
|
||||
public String getValue(final Locale locale) {
|
||||
return values.get(locale);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new localised value for a locale. If there is already a value for
|
||||
* the provided locale the value is replaced with the new value.
|
||||
*
|
||||
* @param locale The locale of the provided value.
|
||||
* @param value The localised value for the provided locale.
|
||||
*/
|
||||
public void addValue(final Locale locale, final String value) {
|
||||
values.put(locale, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes the value for the provided locale.
|
||||
*
|
||||
* @param locale The locale for which the value shall be removed.
|
||||
*/
|
||||
public void removeValue(final Locale locale) {
|
||||
values.remove(locale);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a localised string instance has a value for a locale.
|
||||
*
|
||||
* @param locale The locale.
|
||||
*
|
||||
* @return {@code true} if this localised string has a value for the
|
||||
* provided locale, {@code false} if not.
|
||||
*/
|
||||
public boolean hasValue(final Locale locale) {
|
||||
return values.containsKey(locale);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves all present locales.
|
||||
*
|
||||
* @return A {@link Set} containing all locales for which this localised
|
||||
* string has values.
|
||||
*/
|
||||
@JsonIgnore
|
||||
public Set<Locale> getAvailableLocales() {
|
||||
return values.keySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 7;
|
||||
hash = 41 * hash + Objects.hashCode(this.values);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (!(obj instanceof LocalizedString)) {
|
||||
return false;
|
||||
}
|
||||
final LocalizedString other = (LocalizedString) obj;
|
||||
if (!other.canEqual(this)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return Objects.equals(values, other.getValues());
|
||||
}
|
||||
|
||||
public boolean canEqual(final Object obj) {
|
||||
return obj instanceof LocalizedString;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format(
|
||||
"%s{ "
|
||||
+ "%s"
|
||||
+ " }",
|
||||
super.toString(),
|
||||
Objects.toString(values));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,112 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.l10n.jaxb;
|
||||
|
||||
import static org.libreccm.l10n.L10NConstants.*;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlAttribute;
|
||||
import javax.xml.bind.annotation.XmlValue;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class LocalizedStringValue implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 8435485565736441379L;
|
||||
|
||||
@XmlAttribute(name = "lang", namespace = L10N_XML_NS)
|
||||
private String locale;
|
||||
|
||||
@XmlValue
|
||||
private String value;
|
||||
|
||||
public String getLocale() {
|
||||
return locale;
|
||||
}
|
||||
|
||||
public void setLocale(final String locale) {
|
||||
this.locale = locale;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(final String value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 3;
|
||||
hash = 97 * hash + Objects.hashCode(locale);
|
||||
hash = 97 * hash + Objects.hashCode(value);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (!(obj instanceof LocalizedStringValue)) {
|
||||
return false;
|
||||
}
|
||||
final LocalizedStringValue other = (LocalizedStringValue) obj;
|
||||
if (!other.canEqual(this)) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(locale, other.getLocale())) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(value, other.getValue());
|
||||
}
|
||||
|
||||
public boolean canEqual(final Object obj) {
|
||||
return obj instanceof LocalizedStringValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final String toString() {
|
||||
return toString("");
|
||||
}
|
||||
|
||||
public String toString(final String data) {
|
||||
|
||||
return String.format("%s{ "
|
||||
+ "locale = %s, "
|
||||
+ "value = \"%s\"%s"
|
||||
+ " }",
|
||||
super.toString(),
|
||||
Objects.toString(locale),
|
||||
value,
|
||||
data);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,98 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.l10n.jaxb;
|
||||
|
||||
import static org.libreccm.l10n.L10NConstants.*;
|
||||
|
||||
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class LocalizedStringValues implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@JacksonXmlElementWrapper(useWrapping = false)
|
||||
@XmlElement(name = "value", namespace = L10N_XML_NS)
|
||||
private List<LocalizedStringValue> values;
|
||||
|
||||
public List<LocalizedStringValue> getValues() {
|
||||
return new ArrayList<>(values);
|
||||
}
|
||||
|
||||
public void setValues(final List<LocalizedStringValue> values) {
|
||||
this.values = new ArrayList<>(values);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 3;
|
||||
hash = 41 * hash + Objects.hashCode(values);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (!(obj instanceof LocalizedStringValues)) {
|
||||
return false;
|
||||
}
|
||||
final LocalizedStringValues other = (LocalizedStringValues) obj;
|
||||
if (!other.canEqual(this)) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(values, other.getValues());
|
||||
}
|
||||
|
||||
public boolean canEqual(final Object obj) {
|
||||
return obj instanceof LocalizedStringValues;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final String toString() {
|
||||
return toString("");
|
||||
}
|
||||
|
||||
public String toString(final String data) {
|
||||
return String.format("%s{ "
|
||||
+ "values = %s%s"
|
||||
+ " }",
|
||||
super.toString(),
|
||||
Objects.toString(values),
|
||||
data);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,77 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.l10n.jaxb;
|
||||
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.xml.bind.annotation.adapters.XmlAdapter;
|
||||
|
||||
/**
|
||||
* JAXB adapter for {@link LocalizedString#values} to produce a more compact XML
|
||||
* for the values map.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class LocalizedStringValuesAdapter
|
||||
extends XmlAdapter<LocalizedStringValues, Map<Locale, String>> {
|
||||
|
||||
@Override
|
||||
public Map<Locale, String> unmarshal(final LocalizedStringValues values)
|
||||
throws Exception {
|
||||
|
||||
return values
|
||||
.getValues()
|
||||
.stream()
|
||||
.collect(Collectors.toMap(value -> new Locale(value.getLocale()),
|
||||
value -> value.getValue()));
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public LocalizedStringValues marshal(final Map<Locale, String> values)
|
||||
throws Exception {
|
||||
|
||||
final List<LocalizedStringValue> list = values
|
||||
.entrySet()
|
||||
.stream()
|
||||
.map(this::generateValue)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
final LocalizedStringValues result = new LocalizedStringValues();
|
||||
result.setValues(list);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private LocalizedStringValue generateValue(
|
||||
final Map.Entry<Locale, String> entry) {
|
||||
|
||||
final LocalizedStringValue value = new LocalizedStringValue();
|
||||
value.setLocale(entry.getKey().toString());
|
||||
value.setValue(entry.getValue());
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,127 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.pagemodel;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
* An abstract base class for implementations of the {@link PageRenderer}
|
||||
* interface providing some functionality needed by all implementations of the
|
||||
* {@link PageRenderer} interface.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractPageRenderer implements PageRenderer {
|
||||
|
||||
private ComponentRendererManager componentRendererManager;
|
||||
|
||||
/**
|
||||
* Renders a {@code Page} based on a {@link PageModel}. This implementation
|
||||
* first calls {@link #renderPage()} to create the page object. After that
|
||||
* all {@link ComponentModel}s of the {@link PageModel} are processed and
|
||||
* the component objects created by the {@link ComponentRenderer}s are added
|
||||
* to the page.
|
||||
*
|
||||
* @param pageModel The {@link PageModel} to render.
|
||||
* @param parameters Parameters provided by application which wants to
|
||||
* render a {@link PageModel}. The parameters are passed
|
||||
* the {@link ComponentRenderer}s.
|
||||
*
|
||||
* @return A map containing the results from rendering the components of the
|
||||
* page model.
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> renderPage(
|
||||
final PageModel pageModel, final Map<String, Object> parameters) {
|
||||
|
||||
final Map<String, Object> page = renderPage(parameters);
|
||||
|
||||
final ContainerModelCollection containers = pageModel
|
||||
.getContainerModels();
|
||||
while(containers.next()) {
|
||||
final ContainerModel containerModel = containers
|
||||
.getContainerModel();
|
||||
|
||||
final Map<String, Object> container = renderContainer(
|
||||
containerModel, parameters);
|
||||
page.put(containerModel.getKey(), container);
|
||||
}
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
protected Map<String, Object> renderContainer(
|
||||
final ContainerModel containerModel,
|
||||
final Map<String, Object> parameters) {
|
||||
|
||||
final Map<String, Object> container = new HashMap<>();
|
||||
|
||||
container.put("key", containerModel.getKey());
|
||||
|
||||
final ComponentModelCollection components = containerModel
|
||||
.getComponents();
|
||||
while (components.next()) {
|
||||
final ComponentModel componentModel = components.getComponentModel();
|
||||
|
||||
renderComponent(componentModel,
|
||||
componentModel.getClass(),
|
||||
parameters)
|
||||
.ifPresent(component -> container.put(componentModel.getKey(),
|
||||
component));
|
||||
}
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method for rendering the components.
|
||||
*
|
||||
* @param <M> Generics variable for the type of rendered
|
||||
* component
|
||||
* @param componentModel The {@link ComponentModel} to process.
|
||||
* @param componentModelClass The class of the {@link ComponentModel}.
|
||||
* @param parameters Parameters provided by application which wants
|
||||
* to render a {@link PageModel}. The parameters
|
||||
* are passed the {@link ComponentRenderer}s.
|
||||
*
|
||||
* @return A map containing the results from rendering the components of the
|
||||
* page model.
|
||||
*/
|
||||
protected <M extends ComponentModel> Optional<Object> renderComponent(
|
||||
final ComponentModel componentModel,
|
||||
final Class<M> componentModelClass,
|
||||
final Map<String, Object> parameters) {
|
||||
|
||||
final Optional<ComponentRenderer<M>> renderer = componentRendererManager
|
||||
.findComponentRenderer(componentModelClass);
|
||||
|
||||
if (renderer.isPresent()) {
|
||||
@SuppressWarnings("unchecked")
|
||||
final M model = (M) componentModel;
|
||||
return Optional
|
||||
.of(renderer.get().renderComponent(model, parameters));
|
||||
} else {
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
package org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
import com.arsdigita.persistence.OID;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class CategorizedItemComponent extends ContentItemComponent {
|
||||
|
||||
public static final String BASE_DATA_OBJECT_TYPE
|
||||
= "org.libreccm.pagemodel.CategorizedItemComponent";
|
||||
|
||||
public CategorizedItemComponent(final DataObject dataObject) {
|
||||
|
||||
super(dataObject);
|
||||
}
|
||||
|
||||
public CategorizedItemComponent(final OID oid) {
|
||||
super(oid);
|
||||
}
|
||||
|
||||
public CategorizedItemComponent(final BigDecimal componentModelId) {
|
||||
this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
package org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
import com.arsdigita.persistence.OID;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class CategoryTreeComponent extends ComponentModel {
|
||||
|
||||
public static final String BASE_DATA_OBJECT_TYPE = "org.libreccm.pagemodel.CategoryTreeComponent";
|
||||
|
||||
public static final String SHOW_FULL_TREE = "showFullTree";
|
||||
|
||||
public CategoryTreeComponent(final DataObject dataObject) {
|
||||
|
||||
super(dataObject);
|
||||
}
|
||||
|
||||
public CategoryTreeComponent(final OID oid) {
|
||||
|
||||
super(oid);
|
||||
}
|
||||
|
||||
public CategoryTreeComponent(final BigDecimal componentModelId) {
|
||||
|
||||
this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
|
||||
}
|
||||
|
||||
public Boolean isShowFullTree() {
|
||||
|
||||
return (Boolean) get(SHOW_FULL_TREE);
|
||||
}
|
||||
|
||||
public void setShowFullTree(final Boolean showFullTree) {
|
||||
|
||||
set(SHOW_FULL_TREE, showFullTree);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,108 +0,0 @@
|
|||
package org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.domain.DomainObject;
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
import com.arsdigita.persistence.OID;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ComponentModel extends DomainObject {
|
||||
|
||||
public static final String BASE_DATA_OBJECT_TYPE = "org.libreccm.pagemodel.ComponentModel";
|
||||
|
||||
public static final String COMPONENT_MODEL_ID = "componentModelId";
|
||||
|
||||
public static final String UUID = "uuid";
|
||||
|
||||
public static final String MODEL_UUID = "modelUuid";
|
||||
|
||||
public static final String ID_ATTRIBUTE = "idAttribute";
|
||||
|
||||
public static final String CLASS_ATTRIBUTE = "classAttribute";
|
||||
|
||||
public static final String STYLE_ATTRIBUTE = "styleAttribute";
|
||||
|
||||
public static final String KEY = "key";
|
||||
|
||||
public ComponentModel(final DataObject dataObject) {
|
||||
super(dataObject);
|
||||
}
|
||||
|
||||
public ComponentModel(final OID oid) {
|
||||
super(oid);
|
||||
}
|
||||
|
||||
public ComponentModel(final BigDecimal componentModelId) {
|
||||
|
||||
this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
|
||||
}
|
||||
|
||||
public BigDecimal getComponentModelId() {
|
||||
return (BigDecimal) get(COMPONENT_MODEL_ID);
|
||||
}
|
||||
|
||||
protected void setComponentModelId(final BigDecimal componentModelId) {
|
||||
set(COMPONENT_MODEL_ID, componentModelId);
|
||||
}
|
||||
|
||||
public String getUuid() {
|
||||
return (String) get(UUID);
|
||||
}
|
||||
|
||||
protected void setUuid(final String uuid) {
|
||||
set(UUID, uuid);
|
||||
}
|
||||
|
||||
public String getModelUuid() {
|
||||
return (String) get(MODEL_UUID);
|
||||
}
|
||||
|
||||
protected void setModelUuid(final String modelUuid) {
|
||||
set(MODEL_UUID, modelUuid);
|
||||
}
|
||||
|
||||
public String getIdAttribute() {
|
||||
|
||||
return (String) get(ID_ATTRIBUTE);
|
||||
}
|
||||
|
||||
public void setIdAttribute(final String idAttribute) {
|
||||
|
||||
set(ID_ATTRIBUTE, idAttribute);
|
||||
}
|
||||
|
||||
public String getClassAttribute() {
|
||||
|
||||
return (String) get(CLASS_ATTRIBUTE);
|
||||
}
|
||||
|
||||
public void setClassAttribute(final String classAttribute) {
|
||||
|
||||
set(CLASS_ATTRIBUTE, classAttribute);
|
||||
}
|
||||
|
||||
public String getStyleAttribute(final String styleAttribute) {
|
||||
|
||||
return (String) get(STYLE_ATTRIBUTE);
|
||||
}
|
||||
|
||||
public void setStyleAttribute(final String styleAttribute) {
|
||||
|
||||
set(STYLE_ATTRIBUTE, styleAttribute);
|
||||
}
|
||||
|
||||
public String getKey() {
|
||||
|
||||
return (String) get(KEY);
|
||||
}
|
||||
|
||||
public void setKey(final String key) {
|
||||
|
||||
set(KEY, key);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,24 +0,0 @@
|
|||
package org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.domain.DomainCollection;
|
||||
import com.arsdigita.domain.DomainObjectFactory;
|
||||
import com.arsdigita.persistence.DataCollection;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ComponentModelCollection extends DomainCollection {
|
||||
|
||||
public ComponentModelCollection(final DataCollection dataCollection) {
|
||||
|
||||
super(dataCollection);
|
||||
}
|
||||
|
||||
public ComponentModel getComponentModel() {
|
||||
|
||||
return (ComponentModel) DomainObjectFactory
|
||||
.newInstance(m_dataCollection.getDataObject());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.pagemodel;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* A {@code ComponentRenderer} transforms a {@link ComponentModel} into a
|
||||
* component.
|
||||
*
|
||||
* An implementation must be annotation with the {@link RendersComponent}
|
||||
* qualifier annotation.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
* @param <M> Type of the model the component renderer processes.
|
||||
*/
|
||||
public interface ComponentRenderer<M extends ComponentModel> {
|
||||
|
||||
/**
|
||||
* Renders a {@link ComponentModel}.
|
||||
*
|
||||
* The result of the rendering process is a {@link Map} which uses strings
|
||||
* as key. The values are either Java primitive types or Collections. More
|
||||
* exactly the values are objects of one the following types:
|
||||
*
|
||||
* <ul>
|
||||
* <li>{@link Double}</li>
|
||||
* <li>{@link Float}</li>
|
||||
* <li>{@link Integer}</li>
|
||||
* <li>{@link Long}</li>
|
||||
* <li>{@link Short}</li>
|
||||
* <li>{@link String}</li>
|
||||
* <li>{@link List}</li>
|
||||
* <li>{@link Map}</li>
|
||||
* </ul>
|
||||
*
|
||||
* Other subtypes {@link Collection} are might be supported but there is no
|
||||
* guarantee for that. The values in a collection must be one of the types
|
||||
* in the list above. Collections might contain multiple types from the list
|
||||
* above. The keys for a map should always be strings.
|
||||
*
|
||||
* @param componentModel The component model to render.
|
||||
* @param parameters Parameters provided by the calling
|
||||
* {@link PageRenderer}.
|
||||
*
|
||||
* @return A map representing the rendered component.
|
||||
*/
|
||||
Map<String, Object> renderComponent(M componentModel,
|
||||
Map<String, Object> parameters);
|
||||
|
||||
}
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
package org.libreccm.pagemodel;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ComponentRendererManager {
|
||||
|
||||
private static final Logger LOGGER = LogManager
|
||||
.getLogger(ComponentRendererManager.class);
|
||||
|
||||
private static final ComponentRendererManager INSTANCE
|
||||
= new ComponentRendererManager();
|
||||
|
||||
private final Map<Class<?>, ComponentRenderer<?>> componentRenderers;
|
||||
|
||||
public ComponentRendererManager() {
|
||||
|
||||
componentRenderers = new HashMap<>();
|
||||
}
|
||||
|
||||
public static ComponentRendererManager getInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find an implementation of the {@link ComponentRenderer} interface for a
|
||||
* specific {@link ComponentModel}.
|
||||
*
|
||||
* @param <M> Generic variable for the subtype of
|
||||
* {@link ComponentModel} which is produced by
|
||||
* the {@link ComponentRenderer} implementation.
|
||||
* @param componentModelClass The sub class of the {@link ComponentModel}
|
||||
* for which is processed by the
|
||||
* {@link ComponentRenderer}.
|
||||
*
|
||||
* @return An {@link Optional} containing the implementation of the
|
||||
* {@link ComponentRenderer} interface for the specified parameters.
|
||||
* If there is no implementation for the specified parameters an
|
||||
* empty {@link Optional} is returned.
|
||||
*/
|
||||
@SuppressWarnings({"unchecked"})
|
||||
public <M extends ComponentModel> Optional<ComponentRenderer<M>> findComponentRenderer(
|
||||
final Class<M> componentModelClass) {
|
||||
|
||||
if (componentRenderers.containsKey(componentModelClass)) {
|
||||
return Optional.of((ComponentRenderer<M>) componentRenderers
|
||||
.get(componentModelClass));
|
||||
} else {
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
||||
public <M extends ComponentModel> void registerComponentRenderer(
|
||||
final Class<M> componentClass,
|
||||
final ComponentRenderer<M> componentRenderer) {
|
||||
|
||||
componentRenderers.put(componentClass, componentRenderer);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.domain.DomainObject;
|
||||
import com.arsdigita.persistence.DataCollection;
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
import com.arsdigita.persistence.OID;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ContainerModel extends DomainObject {
|
||||
|
||||
public static final String BASE_DATA_OBJECT_TYPE = "org.libreccm.pagemodel.ContainerModel";
|
||||
|
||||
public static final String CONTAINER_ID = "containerId";
|
||||
|
||||
public static final String UUID = "uuid";
|
||||
|
||||
public static final String CONTAINER_UUID = "containerUuid";
|
||||
|
||||
public static final String KEY = "key";
|
||||
|
||||
public static final String PAGE_MODEL = "pageModel";
|
||||
|
||||
public static final String COMPONENT_MODEL = "componentModel";
|
||||
|
||||
public ContainerModel(final DataObject dataObject) {
|
||||
super(dataObject);
|
||||
}
|
||||
|
||||
public ContainerModel(final OID oid) {
|
||||
super(oid);
|
||||
}
|
||||
|
||||
public ContainerModel(final BigDecimal containerModelId) {
|
||||
this(new OID(BASE_DATA_OBJECT_TYPE, containerModelId));
|
||||
}
|
||||
|
||||
public BigDecimal getContainerModelId() {
|
||||
return (BigDecimal) get(CONTAINER_ID);
|
||||
}
|
||||
|
||||
protected void setContainerModelId(final BigDecimal containerModelId) {
|
||||
|
||||
set(CONTAINER_ID, containerModelId);
|
||||
}
|
||||
|
||||
public String getUuid() {
|
||||
return (String) get(UUID);
|
||||
}
|
||||
|
||||
protected void setUuid(final String uuid) {
|
||||
|
||||
set(UUID, uuid);
|
||||
}
|
||||
|
||||
public String getContainerUuid() {
|
||||
|
||||
return (String) get(CONTAINER_UUID);
|
||||
}
|
||||
|
||||
protected void setContainerUuid(final String containerUuid) {
|
||||
|
||||
set(CONTAINER_UUID, containerUuid);
|
||||
}
|
||||
|
||||
public String getKey() {
|
||||
|
||||
return (String) get(KEY);
|
||||
}
|
||||
|
||||
public void setKey(final String key) {
|
||||
|
||||
set(KEY, key);
|
||||
}
|
||||
|
||||
public PageModel getPageModel() {
|
||||
|
||||
return (PageModel) get(PAGE_MODEL);
|
||||
}
|
||||
|
||||
protected void setPageModel(final PageModel pageModel) {
|
||||
|
||||
setAssociation(PAGE_MODEL, pageModel);
|
||||
}
|
||||
|
||||
public ComponentModelCollection getComponents() {
|
||||
|
||||
final DataCollection dataCollection = (DataCollection) get(
|
||||
COMPONENT_MODEL);
|
||||
|
||||
return new ComponentModelCollection(dataCollection);
|
||||
}
|
||||
|
||||
protected void addComponent(final ComponentModel component) {
|
||||
|
||||
add(COMPONENT_MODEL, component);
|
||||
}
|
||||
|
||||
protected void removeComponent(final ComponentModel component) {
|
||||
|
||||
remove(COMPONENT_MODEL, component);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
package org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.domain.DomainCollection;
|
||||
import com.arsdigita.domain.DomainObjectFactory;
|
||||
import com.arsdigita.persistence.DataCollection;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ContainerModelCollection extends DomainCollection {
|
||||
|
||||
public ContainerModelCollection(final DataCollection dataCollection) {
|
||||
super(dataCollection);
|
||||
}
|
||||
|
||||
public ContainerModel getContainerModel() {
|
||||
return (ContainerModel) DomainObjectFactory
|
||||
.newInstance(m_dataCollection.getDataObject());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
package org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
import com.arsdigita.persistence.OID;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ContentItemComponent extends ComponentModel {
|
||||
|
||||
public static final String BASE_DATA_OBJECT_TYPE
|
||||
= "org.libreccm.pagemodel.ContentItemComponent";
|
||||
|
||||
public static final String MODE = "mode";
|
||||
|
||||
public ContentItemComponent(final DataObject dataObject) {
|
||||
|
||||
super(dataObject);
|
||||
}
|
||||
|
||||
public ContentItemComponent(final OID oid) {
|
||||
|
||||
super(oid);
|
||||
}
|
||||
|
||||
public ContentItemComponent(final BigDecimal componentModelId) {
|
||||
|
||||
this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
|
||||
}
|
||||
|
||||
public String getMode() {
|
||||
return (String) get(MODE);
|
||||
}
|
||||
|
||||
public void setMode(final String mode) {
|
||||
|
||||
set(MODE, mode);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
package org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
import com.arsdigita.persistence.OID;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class GreetingItemComponent extends ContentItemComponent {
|
||||
|
||||
public static final String BASE_DATA_OBJECT_TYPE
|
||||
= "org.libreccm.pagemodel.GreetingItemComponent";
|
||||
|
||||
public GreetingItemComponent(final DataObject dataObject) {
|
||||
|
||||
super(dataObject);
|
||||
}
|
||||
|
||||
public GreetingItemComponent(final OID oid) {
|
||||
super(oid);
|
||||
}
|
||||
|
||||
public GreetingItemComponent(final BigDecimal componentModelId) {
|
||||
this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,76 +0,0 @@
|
|||
package org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
import com.arsdigita.persistence.OID;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ItemListComponent extends ComponentModel {
|
||||
|
||||
public static final String BASE_DATA_OBJECT_TYPE = "org.libreccm.pagemodel.ItemListComponent";
|
||||
|
||||
public static final String DESCENDING = "descending";
|
||||
|
||||
public static final String LIMIT_TO_TYPE = "limitToType";
|
||||
|
||||
public static final String PAGE_SIZE = "pageSize";
|
||||
|
||||
public static final String PROPERTIES = "properties";
|
||||
|
||||
public ItemListComponent(final DataObject dataObject) {
|
||||
super(dataObject);
|
||||
}
|
||||
|
||||
public ItemListComponent(final OID oid) {
|
||||
super(oid);
|
||||
}
|
||||
|
||||
public ItemListComponent(final BigDecimal componentModelId) {
|
||||
|
||||
this(new OID(BASE_DATA_OBJECT_TYPE, componentModelId));
|
||||
}
|
||||
|
||||
public Boolean isDescending() {
|
||||
|
||||
return (Boolean) get(DESCENDING);
|
||||
}
|
||||
|
||||
public void setDescending(final Boolean descending) {
|
||||
|
||||
set(DESCENDING, descending);
|
||||
}
|
||||
|
||||
public String getLimitToType() {
|
||||
|
||||
return (String) get(LIMIT_TO_TYPE);
|
||||
}
|
||||
|
||||
public void setLimitToType(final String limitToType) {
|
||||
|
||||
set(LIMIT_TO_TYPE, limitToType);
|
||||
}
|
||||
|
||||
public Integer getPageSize() {
|
||||
|
||||
return (Integer)get(PAGE_SIZE);
|
||||
}
|
||||
|
||||
public void setPageSize(final Integer pageSize) {
|
||||
|
||||
set(PAGE_SIZE, pageSize);
|
||||
}
|
||||
|
||||
public String getProperties() {
|
||||
|
||||
return (String) get(PROPERTIES);
|
||||
}
|
||||
|
||||
public void setProperties(final String properties) {
|
||||
|
||||
set(PROPERTIES, properties);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,151 +0,0 @@
|
|||
package org.libreccm.pagemodel;
|
||||
|
||||
import com.arsdigita.domain.DomainObject;
|
||||
import com.arsdigita.persistence.DataCollection;
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
import com.arsdigita.persistence.OID;
|
||||
import com.arsdigita.web.Application;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class PageModel extends DomainObject {
|
||||
|
||||
public static final String BASE_DATA_OBJECT_TYPE = "org.libreccm.pagemodel.PageModel";
|
||||
|
||||
public static final String PAGE_MODEL_ID = "pageModelId";
|
||||
|
||||
public static final String UUID = "uuid";
|
||||
|
||||
public static final String MODEL_UUID = "modelUuid";
|
||||
|
||||
public static final String NAME = "name";
|
||||
|
||||
public static final String PAGE_MODEL_VERSION = "pageModelVersion";
|
||||
|
||||
public static final String LAST_MODIFIED = "lastModified";
|
||||
|
||||
public static final String TITLE = "title";
|
||||
|
||||
public static final String DESCRIPTION = "description";
|
||||
|
||||
public static final String TYPE = "type";
|
||||
|
||||
public static final String APPLICATION = "application";
|
||||
|
||||
public static final String CONTAINER_MODELS = "containerModels";
|
||||
|
||||
public PageModel(final OID oid) {
|
||||
super(oid);
|
||||
}
|
||||
|
||||
public PageModel(final BigDecimal pageModelId) {
|
||||
this(new OID(BASE_DATA_OBJECT_TYPE, pageModelId));
|
||||
}
|
||||
|
||||
public PageModel(final DataObject dataObject) {
|
||||
super(dataObject);
|
||||
}
|
||||
|
||||
public BigDecimal getPageModelId() {
|
||||
return (BigDecimal) get(PAGE_MODEL_ID);
|
||||
}
|
||||
|
||||
protected void setPageModelId(final BigDecimal pageModelId) {
|
||||
set(PAGE_MODEL_ID, pageModelId);
|
||||
}
|
||||
|
||||
public String getUuid() {
|
||||
return (String) get(UUID);
|
||||
}
|
||||
|
||||
protected void setUuid(final String uuid) {
|
||||
set(UUID, uuid);
|
||||
}
|
||||
|
||||
public String getModelUuid() {
|
||||
return (String) get(MODEL_UUID);
|
||||
}
|
||||
|
||||
protected void setModelUuid(final String modelUuid) {
|
||||
set(MODEL_UUID, modelUuid);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return (String) get(NAME);
|
||||
}
|
||||
|
||||
public void setName(final String name) {
|
||||
set(NAME, name);
|
||||
}
|
||||
|
||||
public String getVersion() {
|
||||
return (String) get(PAGE_MODEL_VERSION);
|
||||
}
|
||||
|
||||
protected void setVersion(final String pageModelVersion) {
|
||||
|
||||
set(PAGE_MODEL_VERSION, pageModelVersion);
|
||||
}
|
||||
|
||||
public Date getLastModified() {
|
||||
return (Date) get(LAST_MODIFIED);
|
||||
}
|
||||
|
||||
protected void setLastModified(final Date lastModified) {
|
||||
set(LAST_MODIFIED, lastModified);
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return (String) get(TITLE);
|
||||
}
|
||||
|
||||
protected void setTitle(final String title) {
|
||||
set(TITLE, title);
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return (String) get(DESCRIPTION);
|
||||
}
|
||||
|
||||
public void setDescription(final String description) {
|
||||
set(DESCRIPTION, description);
|
||||
}
|
||||
|
||||
public Application getApplication() {
|
||||
return (Application) get(APPLICATION);
|
||||
}
|
||||
|
||||
public void setApplication(final Application application) {
|
||||
setAssociation(APPLICATION, application);
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return (String) get(TYPE);
|
||||
}
|
||||
|
||||
public void setType(final String type) {
|
||||
set(TYPE, type);
|
||||
}
|
||||
|
||||
public ContainerModelCollection getContainerModels() {
|
||||
final DataCollection dataCollection = (DataCollection) get(
|
||||
CONTAINER_MODELS);
|
||||
|
||||
return new ContainerModelCollection(dataCollection);
|
||||
}
|
||||
|
||||
protected void addContainerModel(final ContainerModel containerModel) {
|
||||
|
||||
add(CONTAINER_MODELS, containerModel);
|
||||
}
|
||||
|
||||
protected void removeContainerModel(final ContainerModel containerModel) {
|
||||
|
||||
remove(CONTAINER_MODELS, containerModel);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.pagemodel;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class PageModelRepository {
|
||||
|
||||
private static final PageModelRepository INSTANCE = new PageModelRepository();
|
||||
|
||||
private PageModelRepository() {
|
||||
|
||||
}
|
||||
|
||||
public static final PageModelRepository getInstance() {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
public void save(final PageModel pageModel) {
|
||||
|
||||
Objects.requireNonNull(pageModel);
|
||||
|
||||
pageModel.setLastModified(new Date());
|
||||
|
||||
if (pageModel.getUuid() == null) {
|
||||
pageModel.setUuid(UUID.randomUUID().toString());
|
||||
}
|
||||
|
||||
if (pageModel.getModelUuid() == null) {
|
||||
pageModel.setModelUuid(pageModel.getUuid());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,74 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.pagemodel;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Interface for page renderers. A page renderer is invoked to render a page of
|
||||
* specific type. An implementation should be a CDI bean which is annotated with
|
||||
* the qualifier {@link RendersPageModelType}.
|
||||
*
|
||||
* An implementation should add all default components which have to be present
|
||||
* in page. The {@link PageModel} should only specify
|
||||
* <strong>additional</strong> components.
|
||||
*
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public interface PageRenderer {
|
||||
|
||||
/**
|
||||
* Render a page with the default components for a application. An
|
||||
* implementation of {@link #renderPage(org.libreccm.pagemodel.PageModel)}
|
||||
* should use this method for creating the default page.
|
||||
*
|
||||
* The result of the rendering process is a map with the values of the
|
||||
* {@link ComponentModel#key} property as key and the result of rendering
|
||||
* the component as value.
|
||||
*
|
||||
* @param parameters Parameters provided by application which wants to
|
||||
* render a {@link PageModel}. The parameters are passed
|
||||
* the {@link ComponentRenderer}s.
|
||||
*
|
||||
* @return A page with the default components.
|
||||
*/
|
||||
Map<String, Object> renderPage(Map<String, Object> parameters);
|
||||
|
||||
/**
|
||||
* Render a page using the provided {@link PageModel}. Implementations
|
||||
* should call the implementation of {@link #renderPage()} for creating the
|
||||
* basic page with the default components.
|
||||
*
|
||||
* The result of the rendering process is a map with the values of the
|
||||
* {@link ComponentModel#key} property as key and the result of rendering
|
||||
* the component as value.
|
||||
*
|
||||
*
|
||||
* @param pageModel The {@link PageModel} from which the page is generated.
|
||||
* @param parameters Parameters provided by application which wants to
|
||||
* render a {@link PageModel}. The parameters are passed
|
||||
* the {@link ComponentRenderer}s.
|
||||
*
|
||||
* @return The page generated from the provided {@link PageModel}.
|
||||
*/
|
||||
Map<String, Object> renderPage(PageModel pageModel,
|
||||
Map<String, Object> parameters);
|
||||
|
||||
}
|
||||
|
|
@ -1,117 +0,0 @@
|
|||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.libreccm.theming;
|
||||
|
||||
import static org.libreccm.theming.ThemeConstants.*;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@XmlRootElement(name = "application-template", namespace = THEMES_XML_NS)
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class ApplicationTemplate {
|
||||
|
||||
@XmlElement(name = "application-name", namespace = THEMES_XML_NS)
|
||||
private String applicationName;
|
||||
|
||||
@XmlElement(name = "application-class", namespace = THEMES_XML_NS)
|
||||
private String applicationClass;
|
||||
|
||||
@XmlElement(name = "template", namespace = THEMES_XML_NS)
|
||||
private String template;
|
||||
|
||||
public String getApplicationName() {
|
||||
return applicationName;
|
||||
}
|
||||
|
||||
public void setApplicationName(final String applicationName) {
|
||||
this.applicationName = applicationName;
|
||||
}
|
||||
|
||||
public String getApplicationClass() {
|
||||
return applicationClass;
|
||||
}
|
||||
|
||||
public void setApplicationClass(final String applicationClass) {
|
||||
this.applicationClass = applicationClass;
|
||||
}
|
||||
|
||||
public String getTemplate() {
|
||||
return template;
|
||||
}
|
||||
|
||||
public void setTemplate(final String template) {
|
||||
this.template = template;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 7;
|
||||
hash = 79 * hash + Objects.hashCode(applicationName);
|
||||
hash = 79 * hash + Objects.hashCode(applicationClass);
|
||||
hash = 79 * hash + Objects.hashCode(template);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (!(obj instanceof ApplicationTemplate)) {
|
||||
return false;
|
||||
}
|
||||
final ApplicationTemplate other = (ApplicationTemplate) obj;
|
||||
if (!other.canEqual(this)) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(applicationName, other.getApplicationName())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(applicationClass, other.getApplicationClass())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return Objects.equals(template, other.getTemplate());
|
||||
}
|
||||
|
||||
public boolean canEqual(final Object obj) {
|
||||
|
||||
return obj instanceof ApplicationTemplate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final String toString() {
|
||||
return toString("");
|
||||
}
|
||||
|
||||
public String toString(final String data) {
|
||||
|
||||
return String.format("%s{ "
|
||||
+ "applicationName = \"%s\", "
|
||||
+ "applicationClass = \"%s\", "
|
||||
+ "template = \"%s\"%s"
|
||||
+ " }",
|
||||
super.toString(),
|
||||
applicationName,
|
||||
applicationClass,
|
||||
template,
|
||||
data
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,165 +0,0 @@
|
|||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.libreccm.theming;
|
||||
|
||||
import static org.libreccm.theming.ThemeConstants.*;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@XmlRootElement(name = "contentitem-template", namespace = THEMES_XML_NS)
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class ContentItemTemplate {
|
||||
|
||||
@XmlElement(name = "view", namespace = THEMES_XML_NS)
|
||||
private ContentItemViews view;
|
||||
|
||||
@XmlElement(name = "contenttype", namespace = THEMES_XML_NS)
|
||||
private String contentType;
|
||||
|
||||
@XmlElement(name = "style", namespace = THEMES_XML_NS)
|
||||
private String style;
|
||||
|
||||
@XmlElement(name = "contentsection", namespace = THEMES_XML_NS)
|
||||
private String contentSection;
|
||||
|
||||
@XmlElement(name = "category", namespace = THEMES_XML_NS)
|
||||
private String category;
|
||||
|
||||
@XmlElement(name = "template", namespace = THEMES_XML_NS)
|
||||
private String template;
|
||||
|
||||
public ContentItemViews getView() {
|
||||
return view;
|
||||
}
|
||||
|
||||
public void setView(final ContentItemViews view) {
|
||||
this.view = view;
|
||||
}
|
||||
|
||||
public String getContentType() {
|
||||
return contentType;
|
||||
}
|
||||
|
||||
public void setContentType(final String contentType) {
|
||||
this.contentType = contentType;
|
||||
}
|
||||
|
||||
public String getStyle() {
|
||||
return style;
|
||||
}
|
||||
|
||||
public void setStyle(final String style) {
|
||||
this.style = style;
|
||||
}
|
||||
|
||||
public String getContentSection() {
|
||||
return contentSection;
|
||||
}
|
||||
|
||||
public void setContentSection(final String contentSection) {
|
||||
this.contentSection = contentSection;
|
||||
}
|
||||
|
||||
public String getCategory() {
|
||||
return category;
|
||||
}
|
||||
|
||||
public void setCategory(final String category) {
|
||||
this.category = category;
|
||||
}
|
||||
|
||||
public String getTemplate() {
|
||||
return template;
|
||||
}
|
||||
|
||||
public void setTemplate(final String template) {
|
||||
this.template = template;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 7;
|
||||
hash = 73 * hash + Objects.hashCode(view);
|
||||
hash = 73 * hash + Objects.hashCode(contentType);
|
||||
hash = 73 * hash + Objects.hashCode(style);
|
||||
hash = 73 * hash + Objects.hashCode(contentSection);
|
||||
hash = 73 * hash + Objects.hashCode(category);
|
||||
hash = 73 * hash + Objects.hashCode(template);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (!(obj instanceof ContentItemTemplate)) {
|
||||
return false;
|
||||
}
|
||||
final ContentItemTemplate other = (ContentItemTemplate) obj;
|
||||
if (!other.canEqual(this)) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(contentType, other.getContentType())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(style, other.getStyle())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(contentSection, other.getContentSection())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(category, other.getCategory())) {
|
||||
return false;
|
||||
}
|
||||
if (view != other.getView()) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(template, other.getTemplate());
|
||||
}
|
||||
|
||||
public boolean canEqual(final Object obj) {
|
||||
|
||||
return obj instanceof ContentItemTemplate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public final String toString() {
|
||||
|
||||
return toString("");
|
||||
}
|
||||
|
||||
public String toString(final String data) {
|
||||
|
||||
return String.format("%s{ "
|
||||
+ "contentType = \"%s\", "
|
||||
+ "style = \"%s\", "
|
||||
+ "contentSection = \"%s\", "
|
||||
+ "category = \"%s\""
|
||||
+ "template = \"%s\"%s"
|
||||
+ " }",
|
||||
super.toString(),
|
||||
contentType,
|
||||
style,
|
||||
contentSection,
|
||||
category,
|
||||
template,
|
||||
data);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.libreccm.theming;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public enum ContentItemViews {
|
||||
|
||||
DETAIL,
|
||||
GREETING_ITEM,
|
||||
LIST,
|
||||
PORTLET_ITEM,
|
||||
}
|
||||
|
|
@ -1,353 +0,0 @@
|
|||
package org.libreccm.theming;
|
||||
|
||||
import com.arsdigita.bebop.Bebop;
|
||||
import com.arsdigita.bebop.page.PageTransformer;
|
||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
||||
import com.arsdigita.globalization.GlobalizationHelper;
|
||||
import com.arsdigita.subsite.Site;
|
||||
import com.arsdigita.templating.PresentationManager;
|
||||
import com.arsdigita.themedirector.ThemeDirector;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
import com.arsdigita.web.Web;
|
||||
import com.arsdigita.xml.Document;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
|
||||
import freemarker.cache.MultiTemplateLoader;
|
||||
import freemarker.cache.TemplateLoader;
|
||||
import freemarker.cache.WebappTemplateLoader;
|
||||
import freemarker.ext.dom.NodeModel;
|
||||
import freemarker.template.Configuration;
|
||||
import freemarker.template.Template;
|
||||
import freemarker.template.TemplateException;
|
||||
import org.libreccm.theming.manifest.ThemeManifest;
|
||||
import org.libreccm.theming.manifest.ThemeManifestUtil;
|
||||
import org.w3c.dom.NamedNodeMap;
|
||||
import org.w3c.dom.Node;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import javax.servlet.ServletContext;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class FreeMarkerPresentationManager implements PresentationManager {
|
||||
|
||||
@Override
|
||||
public void servePage(final Document document,
|
||||
final HttpServletRequest request,
|
||||
final HttpServletResponse response) {
|
||||
|
||||
final org.w3c.dom.Document w3cDocument = document.getInternalDocument();
|
||||
|
||||
final Node root = w3cDocument.getDocumentElement();
|
||||
|
||||
final String currentSiteName = Web.getConfig().getSiteName();
|
||||
Site subSite;
|
||||
try {
|
||||
subSite = Site.findByHostname(currentSiteName);
|
||||
} catch (DataObjectNotFoundException ex) {
|
||||
subSite = null;
|
||||
}
|
||||
final boolean isSubSite = subSite != null;
|
||||
|
||||
final String defaultTheme;
|
||||
if (subSite == null) {
|
||||
defaultTheme = ThemeDirector
|
||||
.getThemeDirector()
|
||||
.getDefaultTheme()
|
||||
.getURL();
|
||||
} else {
|
||||
defaultTheme = subSite.getStyleDirectory();
|
||||
}
|
||||
|
||||
final String selectedTheme;
|
||||
if (request.getParameter("theme") == null) {
|
||||
selectedTheme = defaultTheme;
|
||||
} else {
|
||||
selectedTheme = request.getParameter("theme");
|
||||
}
|
||||
|
||||
final String previewParam = request.getParameter("preview-theme");
|
||||
boolean preview = previewParam != null
|
||||
&& ("true".equalsIgnoreCase(previewParam)
|
||||
|| "yes".equalsIgnoreCase(previewParam));
|
||||
|
||||
final StringBuilder themePathBuilder = new StringBuilder(
|
||||
"/themes/");
|
||||
if (preview) {
|
||||
themePathBuilder.append("devel-themedir/");
|
||||
} else {
|
||||
themePathBuilder.append("published-themedir/");
|
||||
}
|
||||
themePathBuilder.append(selectedTheme).append("/");
|
||||
final String themePath = themePathBuilder.toString();
|
||||
final String themeManifestPath = String.format(
|
||||
"%s" + ThemeConstants.THEME_MANIFEST_JSON, themePath);
|
||||
|
||||
final ServletContext servletContext = Web.getServletContext();
|
||||
|
||||
// final String themeManifest = "";
|
||||
// final String themeManifest = new BufferedReader(
|
||||
// new InputStreamReader(
|
||||
// servletContext.getResourceAsStream(themeManifestPath),
|
||||
// StandardCharsets.UTF_8))
|
||||
// .lines()
|
||||
// .collect(Collectors.joining(System.lineSeparator()));
|
||||
//
|
||||
// String name = "???";
|
||||
// final JsonFactory jsonFactory = new JsonFactory();
|
||||
// try {
|
||||
// final JsonParser parser = jsonFactory.createParser(servletContext
|
||||
// .getResourceAsStream(themeManifestPath));
|
||||
//
|
||||
// while (!parser.isClosed()) {
|
||||
//
|
||||
// final JsonToken token = parser.nextToken();
|
||||
// if (JsonToken.FIELD_NAME.equals(token)) {
|
||||
// final String fieldName = parser.getCurrentName();
|
||||
//
|
||||
// if ("name".equals(fieldName)) {
|
||||
//
|
||||
// final JsonToken valueToken = parser.nextToken();
|
||||
// final String value = parser.getValueAsString();
|
||||
// name = value;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// }
|
||||
//
|
||||
// } catch (IOException ex) {
|
||||
// throw new UncheckedWrapperException(ex);
|
||||
// }
|
||||
final InputStream manifestInputStream = servletContext
|
||||
.getResourceAsStream(themeManifestPath);
|
||||
if (manifestInputStream == null) {
|
||||
final PageTransformer pageTransformer = new PageTransformer();
|
||||
pageTransformer.servePage(document, request, response);
|
||||
return;
|
||||
}
|
||||
final ThemeManifestUtil manifestUtil = ThemeManifestUtil.getInstance();
|
||||
|
||||
final ThemeManifest manifest = manifestUtil
|
||||
.loadManifest(manifestInputStream,
|
||||
themeManifestPath);
|
||||
|
||||
final ObjectMapper objectMapper = new ObjectMapper();
|
||||
objectMapper.registerModule(new JaxbAnnotationModule());
|
||||
final Templates templates;
|
||||
try {
|
||||
templates = objectMapper.readValue(
|
||||
servletContext.getResourceAsStream(
|
||||
String.format("%stemplates.json", themePath)),
|
||||
Templates.class);
|
||||
} catch (IOException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
// ToDo
|
||||
final NamedNodeMap pageAttrs = root.getAttributes();
|
||||
final Node applicationNameAttr = pageAttrs.getNamedItem("application");
|
||||
final Node applicationClassAttr = pageAttrs.getNamedItem("class");
|
||||
final String applicationName = applicationNameAttr.getNodeValue();
|
||||
final String applicationClass = applicationClassAttr.getNodeValue();
|
||||
|
||||
final Optional<ApplicationTemplate> applicationTemplate
|
||||
= findApplicationTemplate(
|
||||
templates,
|
||||
applicationName,
|
||||
applicationClass);
|
||||
final String applicationTemplatePath;
|
||||
if (applicationTemplate.isPresent()) {
|
||||
applicationTemplatePath = applicationTemplate.get().getTemplate();
|
||||
} else {
|
||||
applicationTemplatePath = templates.getDefaultApplicationTemplate();
|
||||
}
|
||||
|
||||
if ("XSL_FALLBACK.XSL".equals(applicationTemplatePath)) {
|
||||
final PageTransformer pageTransformer = new PageTransformer();
|
||||
pageTransformer.servePage(document, request, response);
|
||||
return;
|
||||
}
|
||||
|
||||
final Configuration configuration = new Configuration(
|
||||
Configuration.VERSION_2_3_28);
|
||||
final WebappTemplateLoader themeTemplateLoader
|
||||
= new WebappTemplateLoader(servletContext,
|
||||
themePath);
|
||||
final WebappTemplateLoader macrosLoader = new WebappTemplateLoader(
|
||||
servletContext,
|
||||
"/themes/freemarker");
|
||||
final MultiTemplateLoader templateLoader = new MultiTemplateLoader(
|
||||
new TemplateLoader[]{themeTemplateLoader, macrosLoader});
|
||||
// configuration.setServletContextForTemplateLoading(servletContext,
|
||||
// themePath);
|
||||
configuration.setTemplateLoader(templateLoader);
|
||||
configuration.setDefaultEncoding("UTF-8");
|
||||
|
||||
final Map<String, Object> data = new HashMap<>();
|
||||
|
||||
// The XML document
|
||||
data.put("model", NodeModel.wrap(root));
|
||||
|
||||
// Parameters (in XSL provided as XSL parameters)
|
||||
data.put("contextPath", request.getContextPath());
|
||||
data.put("contextPrefix",
|
||||
Web.getWebContext().getRequestURL().getContextPath());
|
||||
data.put("dcpOnButtons",
|
||||
Bebop.getConfig().doubleClickProtectionOnButtons());
|
||||
data.put("dcpOnLinks",
|
||||
Bebop.getConfig().doubleClickProtectionOnLinks());
|
||||
data.put("dispatcherPrefix", com.arsdigita.web.URL.getDispatcherPath());
|
||||
final String host;
|
||||
if (request.getServerPort() == 80) {
|
||||
host = String.format("%s://%s",
|
||||
request.getScheme(),
|
||||
request.getServerName());
|
||||
} else {
|
||||
host = String.format("%s://%s:%d",
|
||||
request.getScheme(),
|
||||
request.getServerName(),
|
||||
request.getServerPort());
|
||||
}
|
||||
data.put("host", host);
|
||||
data.put("internalTheme",
|
||||
Web.getWebContext().getRequestURL().getContextPath()
|
||||
+ com.arsdigita.web.URL.INTERNAL_THEME_DIR);
|
||||
data.put("negotiatedLanguage",
|
||||
GlobalizationHelper.getNegotiatedLocale().getLanguage());
|
||||
data.put("requestScheme", request.getScheme());
|
||||
data.put("rootContextPrefix",
|
||||
Web.getConfig().getDispatcherContextPath());
|
||||
final Locale selectedLocale = GlobalizationHelper
|
||||
.getSelectedLocale(request);
|
||||
if (selectedLocale == null) {
|
||||
data.put("selectedLanguage", "");
|
||||
} else {
|
||||
data.put("selectedLanguage", selectedLocale.getLanguage());
|
||||
}
|
||||
data.put("serverName", request.getServerName());
|
||||
data.put("serverPort", request.getServerPort());
|
||||
data.put("userAgent", request.getHeader("user-Agent"));
|
||||
|
||||
final Template template;
|
||||
try {
|
||||
template = configuration.getTemplate(applicationTemplatePath);
|
||||
} catch (IOException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
|
||||
response.setContentType("text/html");
|
||||
|
||||
try (PrintWriter writer = response.getWriter()) {
|
||||
|
||||
template.process(data, writer);
|
||||
|
||||
// writer.append("Data:\n");
|
||||
// writer
|
||||
// .append("Current Site Name: ")
|
||||
// .append(currentSiteName).append("\n");
|
||||
// writer
|
||||
// .append("isSubSite: ")
|
||||
// .append(Boolean.toString(isSubSite))
|
||||
// .append("\n");
|
||||
// writer
|
||||
// .append("default theme: ")
|
||||
// .append(defaultTheme)
|
||||
// .append("\n");
|
||||
// writer
|
||||
// .append("selected theme: ")
|
||||
// .append(selectedTheme)
|
||||
// .append("\n");
|
||||
// writer
|
||||
// .append("preview theme? ")
|
||||
// .append(Boolean.toString(preview))
|
||||
// .append("\n");
|
||||
// writer
|
||||
// .append("themePath: ")
|
||||
// .append(themePath)
|
||||
// .append("\n");
|
||||
// writer
|
||||
// .append("themeManifestPath: ")
|
||||
// .append(themeManifestPath)
|
||||
// .append("\n");
|
||||
// writer
|
||||
// .append("themeManifest: ")
|
||||
// .append(manifest.toString())
|
||||
// .append("\n");
|
||||
// writer
|
||||
// .append("theme name: ")
|
||||
// .append(manifest.getName())
|
||||
// .append("\n");
|
||||
// writer
|
||||
// .append("Application name: ")
|
||||
// .append(applicationName)
|
||||
// .append("\n");
|
||||
// writer
|
||||
// .append("Application class: ")
|
||||
// .append(applicationClass)
|
||||
// .append("\n");
|
||||
// writer
|
||||
// .append("Application templates:\n");
|
||||
// for (final ApplicationTemplate template : templates
|
||||
// .getApplications()) {
|
||||
// writer
|
||||
// .append("\t")
|
||||
// .append(template.toString())
|
||||
// .append("\n");
|
||||
// }
|
||||
} catch (IOException | TemplateException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
|
||||
}
|
||||
|
||||
private Optional<ApplicationTemplate> findApplicationTemplate(
|
||||
final Templates templates,
|
||||
final String applicationName,
|
||||
final String applicationClass) {
|
||||
|
||||
final Optional<ApplicationTemplate> forNameAndClass = templates
|
||||
.getApplications()
|
||||
.stream()
|
||||
.filter(template -> filterApplicationTemplates(template,
|
||||
applicationName,
|
||||
applicationClass))
|
||||
.findAny();
|
||||
if (forNameAndClass.isPresent()) {
|
||||
return forNameAndClass;
|
||||
} else {
|
||||
|
||||
final Optional<ApplicationTemplate> forName = templates
|
||||
.getApplications()
|
||||
.stream()
|
||||
.filter(tpl -> tpl.getApplicationName().equals(applicationName))
|
||||
.findAny();
|
||||
|
||||
return forName;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean filterApplicationTemplates(
|
||||
final ApplicationTemplate template,
|
||||
final String applicationName,
|
||||
final String applicationClass) {
|
||||
|
||||
return template.getApplicationName().equals(applicationName)
|
||||
&& template.getApplicationClass().equals(applicationClass);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,108 +0,0 @@
|
|||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.libreccm.theming;
|
||||
|
||||
|
||||
import static org.libreccm.theming.ThemeConstants.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@XmlRootElement(name = "templates", namespace = THEMES_XML_NS)
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class Templates {
|
||||
|
||||
@XmlElementWrapper(name = "applications", namespace = THEMES_XML_NS)
|
||||
@XmlElement(name = "applications", namespace = THEMES_XML_NS)
|
||||
private List<ApplicationTemplate> applications;
|
||||
|
||||
@XmlElement(name = "default-application-template",
|
||||
namespace = THEMES_XML_NS)
|
||||
private String defaultApplicationTemplate;
|
||||
|
||||
@XmlElementWrapper(name = "contentitems", namespace = THEMES_XML_NS)
|
||||
@XmlElement(name = "contentitems", namespace = THEMES_XML_NS)
|
||||
private List<ContentItemTemplate> contentItems;
|
||||
|
||||
@XmlElement(name = "default-contentitem-template",
|
||||
namespace = THEMES_XML_NS)
|
||||
private String defaultContentItemsTemplate;
|
||||
|
||||
public Templates() {
|
||||
|
||||
applications = new ArrayList<>();
|
||||
contentItems= new ArrayList<>();
|
||||
}
|
||||
|
||||
public List<ApplicationTemplate> getApplications() {
|
||||
|
||||
return Collections.unmodifiableList(applications);
|
||||
}
|
||||
|
||||
public void addApplication(final ApplicationTemplate template) {
|
||||
|
||||
applications.add(template);
|
||||
}
|
||||
|
||||
public void removeApplication(final ApplicationTemplate template) {
|
||||
|
||||
applications.remove(template);
|
||||
}
|
||||
|
||||
public void setApplications(final List<ApplicationTemplate> applications) {
|
||||
|
||||
this.applications = new ArrayList<>(applications);
|
||||
}
|
||||
|
||||
public String getDefaultApplicationTemplate() {
|
||||
return defaultApplicationTemplate;
|
||||
}
|
||||
|
||||
public void setDefaultApplicationTemplate(
|
||||
final String defaultApplicationTemplate) {
|
||||
this.defaultApplicationTemplate = defaultApplicationTemplate;
|
||||
}
|
||||
|
||||
public List<ContentItemTemplate> getContentItems() {
|
||||
|
||||
return Collections.unmodifiableList(contentItems);
|
||||
}
|
||||
|
||||
public void addContentItem(final ContentItemTemplate template) {
|
||||
|
||||
contentItems.add(template);
|
||||
}
|
||||
|
||||
public void removeContentItem(final ContentItemTemplate template) {
|
||||
|
||||
contentItems.remove(template);
|
||||
}
|
||||
|
||||
public void setContentItems(final List<ContentItemTemplate> contentItems) {
|
||||
|
||||
this.contentItems = new ArrayList<>(contentItems);
|
||||
}
|
||||
|
||||
public String getDefaultContentItemsTemplate() {
|
||||
return defaultContentItemsTemplate;
|
||||
}
|
||||
|
||||
public void setDefaultContentItemsTemplate(
|
||||
final String defaultContentItemsTemplate) {
|
||||
this.defaultContentItemsTemplate = defaultContentItemsTemplate;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.theming;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public final class ThemeConstants {
|
||||
|
||||
public static final String PAGE_PARAMETER_TEMPLATE = "template";
|
||||
|
||||
public final static String THEME_MANIFEST_JSON = "theme.json";
|
||||
public final static String THEME_MANIFEST_XML = "theme.xml";
|
||||
|
||||
public final static String THEMES_XML_NS = "http://themes.libreccm.org";
|
||||
|
||||
private ThemeConstants() {
|
||||
//Nothing
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,240 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.theming.manifest;
|
||||
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
import static org.libreccm.theming.ThemeConstants.*;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
/**
|
||||
* Each theme contains a Manifest (either in XML or JSON format) which provides
|
||||
* informations about the theme.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@XmlRootElement(name = "theme", namespace = THEMES_XML_NS)
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class ThemeManifest implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = 699497658459398231L;
|
||||
|
||||
/**
|
||||
* The name of the theme. Usually the same as the name of directory which
|
||||
* contains the theme.
|
||||
*/
|
||||
@XmlElement(name = "name", namespace = THEMES_XML_NS)
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* The type of the theme, for example XSLT.
|
||||
*/
|
||||
@XmlElement(name = "type", namespace = THEMES_XML_NS)
|
||||
private String type;
|
||||
|
||||
@XmlElement(name = "master-theme", namespace = THEMES_XML_NS)
|
||||
private String masterTheme;
|
||||
|
||||
/**
|
||||
* The (localised) title of the theme.
|
||||
*/
|
||||
@XmlElement(name = "title", namespace = THEMES_XML_NS)
|
||||
private LocalizedString title;
|
||||
|
||||
/**
|
||||
* A (localised) description of the theme.
|
||||
*/
|
||||
@XmlElement(name = "description", namespace = THEMES_XML_NS)
|
||||
private LocalizedString description;
|
||||
|
||||
/**
|
||||
* The templates provided by the theme.
|
||||
*/
|
||||
@XmlElementWrapper(name = "templates", namespace = THEMES_XML_NS)
|
||||
@XmlElement(name = "template", namespace = THEMES_XML_NS)
|
||||
private List<ThemeTemplate> templates;
|
||||
|
||||
/**
|
||||
* Path of the default template.
|
||||
*/
|
||||
@XmlElement(name = "default-template", namespace = THEMES_XML_NS)
|
||||
private String defaultTemplate;
|
||||
|
||||
public ThemeManifest() {
|
||||
templates = new ArrayList<>();
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(final String type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getMasterTheme() {
|
||||
return masterTheme;
|
||||
}
|
||||
|
||||
public void setMasterTheme(final String masterTheme) {
|
||||
this.masterTheme = masterTheme;
|
||||
}
|
||||
|
||||
public LocalizedString getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(final LocalizedString title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public LocalizedString getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(final LocalizedString description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public List<ThemeTemplate> getTemplates() {
|
||||
return Collections.unmodifiableList(templates);
|
||||
}
|
||||
|
||||
public void setTemplates(final List<ThemeTemplate> templates) {
|
||||
this.templates = new ArrayList<>(templates);
|
||||
}
|
||||
|
||||
public void addThemeTemplate(final ThemeTemplate template) {
|
||||
templates.add(template);
|
||||
}
|
||||
|
||||
public void removeThemeTemplate(final ThemeTemplate template) {
|
||||
templates.remove(template);
|
||||
}
|
||||
|
||||
public String getDefaultTemplate() {
|
||||
return defaultTemplate;
|
||||
}
|
||||
|
||||
public void setDefaultTemplate(final String defaultTemplate) {
|
||||
this.defaultTemplate = defaultTemplate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 7;
|
||||
hash = 83 * hash + Objects.hashCode(name);
|
||||
hash = 83 * hash + Objects.hashCode(type);
|
||||
hash = 83 * hash + Objects.hashCode(masterTheme);
|
||||
hash = 83 * hash + Objects.hashCode(title);
|
||||
hash = 83 * hash + Objects.hashCode(description);
|
||||
hash = 83 * hash + Objects.hashCode(templates);
|
||||
hash = 83 * hash + Objects.hashCode(defaultTemplate);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (!(obj instanceof ThemeManifest)) {
|
||||
return false;
|
||||
}
|
||||
final ThemeManifest other = (ThemeManifest) obj;
|
||||
if (!other.canEqual(this)) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(name, other.getName())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(type, other.getType())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(masterTheme, other.getMasterTheme())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(title, other.getTitle())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(description, other.getDescription())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(templates, other.getTemplates())) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(defaultTemplate, other.getDefaultTemplate());
|
||||
}
|
||||
|
||||
public boolean canEqual(final Object obj) {
|
||||
return obj instanceof ThemeManifest;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return toString("");
|
||||
}
|
||||
|
||||
public String toString(final String data) {
|
||||
|
||||
return String.format("%s{ "
|
||||
+ "name = \"%s\", "
|
||||
+ "type = \"%s\", "
|
||||
+ "masterTheme = \"%s\", "
|
||||
+ "title = \"%s\", "
|
||||
+ "description = \"%s\", "
|
||||
+ "templates = %s, "
|
||||
+ "defaultTemplate%s"
|
||||
+ " }",
|
||||
super.toString(),
|
||||
name,
|
||||
type,
|
||||
masterTheme,
|
||||
Objects.toString(title),
|
||||
Objects.toString(description),
|
||||
Objects.toString(templates),
|
||||
defaultTemplate,
|
||||
data);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,202 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.theming.manifest;
|
||||
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import static org.libreccm.theming.ThemeConstants.*;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule;
|
||||
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
|
||||
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.io.Serializable;
|
||||
import java.io.StringWriter;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.Locale;
|
||||
|
||||
|
||||
/**
|
||||
* A Utility class for loading them manifest file of a theme.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ThemeManifestUtil implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -7650437144515619682L;
|
||||
|
||||
private static final ThemeManifestUtil INSTANCE = new ThemeManifestUtil();
|
||||
|
||||
private ThemeManifestUtil() {};
|
||||
|
||||
public static final ThemeManifestUtil getInstance() {
|
||||
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the manifest file at {@code path}.
|
||||
*
|
||||
* @param path The path of the manifest file.
|
||||
*
|
||||
* @return The parsed manifest file.
|
||||
*/
|
||||
public ThemeManifest loadManifest(final Path path) {
|
||||
|
||||
// final String pathStr = path.toString().toLowerCase(Locale.ROOT);
|
||||
final BufferedReader reader;
|
||||
try {
|
||||
reader = Files.newBufferedReader(path, Charset.forName("UTF-8"));
|
||||
} catch (IOException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
return parseManifest(reader, path.toString());
|
||||
|
||||
// final ObjectMapper mapper;
|
||||
// if (pathStr.endsWith(THEME_MANIFEST_JSON)) {
|
||||
// mapper = new ObjectMapper();
|
||||
// } else if (pathStr.endsWith(THEME_MANIFEST_XML)) {
|
||||
// final JacksonXmlModule xmlModule = new JacksonXmlModule();
|
||||
// mapper = new XmlMapper(xmlModule);
|
||||
// } else {
|
||||
// throw new IllegalArgumentException(String
|
||||
// .format("The provided path \"%s\" does not point to a theme "
|
||||
// + "manifest file.",
|
||||
// path.toString()));
|
||||
// }
|
||||
//
|
||||
// mapper.registerModule(new JaxbAnnotationModule());
|
||||
//
|
||||
// final ThemeManifest manifest;
|
||||
// try {
|
||||
// manifest = mapper.readValue(reader, ThemeManifest.class);
|
||||
// } catch (IOException ex) {
|
||||
// throw new UnexpectedErrorException(ex);
|
||||
// }
|
||||
// return manifest;
|
||||
}
|
||||
|
||||
public ThemeManifest loadManifest(final InputStream inputStream,
|
||||
final String fileName) {
|
||||
|
||||
final InputStreamReader reader;
|
||||
try {
|
||||
reader = new InputStreamReader(inputStream, "UTF-8");
|
||||
} catch (UnsupportedEncodingException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
return parseManifest(reader, fileName);
|
||||
|
||||
// final ObjectMapper mapper;
|
||||
// if (fileName.endsWith(THEME_MANIFEST_JSON)) {
|
||||
// mapper = new ObjectMapper();
|
||||
// } else if (fileName.endsWith(THEME_MANIFEST_XML)) {
|
||||
// final JacksonXmlModule xmlModule = new JacksonXmlModule();
|
||||
// mapper = new XmlMapper(xmlModule);
|
||||
// } else {
|
||||
// throw new IllegalArgumentException(String
|
||||
// .format("The provided path \"%s\" does not point to a theme "
|
||||
// + "manifest file.",
|
||||
// fileName));
|
||||
// }
|
||||
//
|
||||
// mapper.registerModule(new JaxbAnnotationModule());
|
||||
//
|
||||
// final ThemeManifest manifest;
|
||||
// try {
|
||||
// manifest = mapper.readValue(reader, ThemeManifest.class);
|
||||
// } catch (IOException ex) {
|
||||
// throw new UnexpectedErrorException(ex);
|
||||
// }
|
||||
// return manifest;
|
||||
}
|
||||
|
||||
public String serializeManifest(final ThemeManifest manifest,
|
||||
final String format) {
|
||||
|
||||
final ObjectMapper mapper;
|
||||
|
||||
switch (format) {
|
||||
case THEME_MANIFEST_JSON:
|
||||
mapper = new ObjectMapper();
|
||||
break;
|
||||
case THEME_MANIFEST_XML:
|
||||
final JacksonXmlModule xmlModule = new JacksonXmlModule();
|
||||
mapper = new XmlMapper(xmlModule);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException(
|
||||
"Unsupported format for ThemeManifest");
|
||||
}
|
||||
|
||||
mapper.registerModule(new JaxbAnnotationModule());
|
||||
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
|
||||
|
||||
final StringWriter writer = new StringWriter();
|
||||
try {
|
||||
mapper.writeValue(writer, manifest);
|
||||
} catch (IOException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
return writer.toString();
|
||||
}
|
||||
|
||||
private ThemeManifest parseManifest(final Reader reader,
|
||||
final String path) {
|
||||
|
||||
final String pathStr = path.toLowerCase(Locale.ROOT);
|
||||
|
||||
final ObjectMapper mapper;
|
||||
if (pathStr.endsWith(THEME_MANIFEST_JSON)) {
|
||||
mapper = new ObjectMapper();
|
||||
} else if (pathStr.endsWith(THEME_MANIFEST_XML)) {
|
||||
final JacksonXmlModule xmlModule = new JacksonXmlModule();
|
||||
mapper = new XmlMapper(xmlModule);
|
||||
} else {
|
||||
throw new IllegalArgumentException(String
|
||||
.format("The provided path \"%s\" does not point to a theme "
|
||||
+ "manifest file.",
|
||||
path));
|
||||
}
|
||||
|
||||
mapper.registerModule(new JaxbAnnotationModule());
|
||||
|
||||
final ThemeManifest manifest;
|
||||
try {
|
||||
manifest = mapper.readValue(reader, ThemeManifest.class);
|
||||
} catch (IOException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
return manifest;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,160 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package org.libreccm.theming.manifest;
|
||||
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Objects;
|
||||
|
||||
import javax.xml.bind.annotation.XmlAccessType;
|
||||
import javax.xml.bind.annotation.XmlAccessorType;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
|
||||
/**
|
||||
* Informations about a template provided by a theme.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
@XmlRootElement(name = "template", namespace = "http://themes.libreccm.org")
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class ThemeTemplate implements Serializable {
|
||||
|
||||
private static final long serialVersionUID = -9034588759798295569L;
|
||||
|
||||
/**
|
||||
* The name of the template (usually the filename).
|
||||
*/
|
||||
@XmlElement(name = "name", namespace = "http://themes.libreccm.org")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* The (localised) title of the template.
|
||||
*/
|
||||
@XmlElement(name = "title", namespace = "http://themes.libreccm.org")
|
||||
private LocalizedString title;
|
||||
|
||||
/**
|
||||
* A (localised) description of the template.
|
||||
*/
|
||||
@XmlElement(name = "description", namespace = "http://themes.libreccm.org")
|
||||
private LocalizedString description;
|
||||
|
||||
/**
|
||||
* Path of template relative to the directory of the theme.
|
||||
*/
|
||||
@XmlElement(name = "path", namespace = "http://themes.libreccm.org")
|
||||
private String path;
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public LocalizedString getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(final LocalizedString title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public LocalizedString getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(final LocalizedString description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
public void setPath(final String path) {
|
||||
this.path = path;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = 3;
|
||||
hash = 67 * hash + Objects.hashCode(name);
|
||||
hash = 67 * hash + Objects.hashCode(title);
|
||||
hash = 67 * hash + Objects.hashCode(description);
|
||||
hash = 67 * hash + Objects.hashCode(path);
|
||||
return hash;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
if (obj == null) {
|
||||
return false;
|
||||
}
|
||||
if (!(obj instanceof ThemeTemplate)) {
|
||||
return false;
|
||||
}
|
||||
final ThemeTemplate other = (ThemeTemplate) obj;
|
||||
if (!other.canEqual(this)) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(name, other.getName())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(path, other.getPath())) {
|
||||
return false;
|
||||
}
|
||||
if (!Objects.equals(title, other.getTitle())) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(description, other.getDescription());
|
||||
}
|
||||
|
||||
public boolean canEqual(final Object obj) {
|
||||
return obj instanceof ThemeTemplate;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return toString("");
|
||||
}
|
||||
|
||||
public String toString(final String data) {
|
||||
|
||||
return String.format("%s{ "
|
||||
+ "name = \"%s\", "
|
||||
+ "title = %s, "
|
||||
+ "description = %s, "
|
||||
+ "path = \"%s\"%s"
|
||||
+ " }",
|
||||
super.toString(),
|
||||
name,
|
||||
Objects.toString(title),
|
||||
Objects.toString(description),
|
||||
path,
|
||||
data);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,80 +0,0 @@
|
|||
package org.librecms.pages;
|
||||
|
||||
import com.arsdigita.categorization.Category;
|
||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
||||
import com.arsdigita.london.terms.Domain;
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
import com.arsdigita.persistence.OID;
|
||||
import com.arsdigita.subsite.Site;
|
||||
import com.arsdigita.web.Application;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
public class Pages extends Application {
|
||||
|
||||
public static final String BASE_DATA_OBJECT_TYPE = "org.librecms.cms.Pages";
|
||||
|
||||
public static final String SITE = "site";
|
||||
public static final String DOMAIN_CATEGORY = "domainCategory";
|
||||
|
||||
public Pages(final OID oid) {
|
||||
super(oid);
|
||||
}
|
||||
|
||||
public Pages(final DataObject dataObject) {
|
||||
super(dataObject);
|
||||
}
|
||||
|
||||
public Pages(final BigDecimal pagesId) throws DataObjectNotFoundException {
|
||||
|
||||
this(new OID(BASE_DATA_OBJECT_TYPE, pagesId));
|
||||
}
|
||||
|
||||
public Site getSite() {
|
||||
|
||||
final Object obj = get(SITE);
|
||||
|
||||
if (obj == null) {
|
||||
return null;
|
||||
} else {
|
||||
return (Site) obj;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void setSite(final Site site) {
|
||||
|
||||
setAssociation(SITE, site);
|
||||
}
|
||||
|
||||
public Domain getCategoryDomain() {
|
||||
|
||||
final Object dataObject = get(DOMAIN_CATEGORY);
|
||||
|
||||
if (dataObject == null) {
|
||||
return null;
|
||||
} else {
|
||||
final Category domainCategory = (Category) dataObject;
|
||||
|
||||
return Domain.findByModel(domainCategory);
|
||||
}
|
||||
}
|
||||
|
||||
protected void setCategoryDomain(final Domain domain) {
|
||||
|
||||
final Category domainCategory;
|
||||
if (domain == null) {
|
||||
domainCategory = null;
|
||||
} else {
|
||||
domainCategory = domain.getModel();
|
||||
}
|
||||
|
||||
setAssociation(DOMAIN_CATEGORY, domainCategory);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServletPath() {
|
||||
return "/";
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
<#ftl ns_prefixes={
|
||||
"bebop":"http://www.arsdigita.com/bebop/1.0",
|
||||
"cms":"http://www.arsdigita.com/cms/1.0",
|
||||
"nav":"http://ccm.redhat.com/navigation",
|
||||
"ui": "http://www.arsdigita.com/ui/1.0"}
|
||||
>
|
||||
|
||||
<#macro availableLanguages>
|
||||
|
||||
<#assign langs=["empty"]>
|
||||
<#if (model["/bebop:page/cms:contentPanel"]?size > 0)>
|
||||
<#assign langs=model["/bebop:page/cms:contentPanel/availableLanguages/language/@locale"]>
|
||||
<#elseif (model["/bebop:page/nav:greetingItem"]?size > 0)>
|
||||
<#assign langs=model["/bebop:page/nav:greetingItem/availableLanguages/language/@locale"]>
|
||||
<#else>
|
||||
<#assign langs=model["/bebop:page/ui:siteBanner/supportedLanguages/language/@locale"]>
|
||||
</#if>
|
||||
|
||||
<#list langs?sort as lang>
|
||||
<#nested lang, lang==negotiatedLanguage>
|
||||
</#list>
|
||||
|
||||
</#macro>
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
<#ftl ns_prefixes={
|
||||
"bebop":"http://www.arsdigita.com/bebop/1.0",
|
||||
"cms":"http://www.arsdigita.com/cms/1.0",
|
||||
"nav":"http://ccm.redhat.com/navigation",
|
||||
"ui": "http://www.arsdigita.com/ui/1.0"}
|
||||
>
|
||||
|
||||
<#-- Move to Navigation tags? -->
|
||||
<#macro pageTitle>
|
||||
${model["//nav:categoryMenu/nav:category/@title"]}
|
||||
</#macro>
|
||||
|
||||
Loading…
Reference in New Issue