blob: 2621d2ff142341c93b74f99fb1dd47d5132db08c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. The ASF licenses this file to You
* under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License. For additional information regarding
* copyright in this work, please see the NOTICE file in the top level
* directory of this distribution.
*/
package org.apache.roller.weblogger.ui.struts2.editor;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.roller.util.RollerConstants;
import org.apache.roller.weblogger.WebloggerException;
import org.apache.roller.weblogger.business.WebloggerFactory;
import org.apache.roller.weblogger.pojos.CustomTemplateRendition;
import org.apache.roller.weblogger.pojos.TemplateRendition.RenditionType;
import org.apache.roller.weblogger.pojos.TemplateRendition.TemplateLanguage;
import org.apache.roller.weblogger.pojos.ThemeTemplate.ComponentType;
import org.apache.roller.weblogger.pojos.WeblogTemplate;
import org.apache.roller.weblogger.pojos.WeblogTheme;
import org.apache.roller.weblogger.ui.struts2.util.UIAction;
import org.apache.struts2.convention.annotation.AllowedMethods;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
/**
* Templates listing page.
*/
// TODO: make this work @AllowedMethods({"execute","add"})
public class Templates extends UIAction {
private static Log log = LogFactory.getLog(Templates.class);
// list of templates to display
private List<WeblogTemplate> templates = Collections.emptyList();
// list of template action types user is allowed to create
private Map<ComponentType, String> availableActions = Collections.emptyMap();
// name and action of new template if we are adding a template
private String newTmplName = null;
private ComponentType newTmplAction = null;
public Templates() {
this.actionName = "templates";
this.desiredMenu = "editor";
this.pageTitle = "pagesForm.title";
}
public String execute() {
// query for templates list
try {
// get current list of templates, minus custom stylesheet
List<WeblogTemplate> raw = WebloggerFactory.getWeblogger()
.getWeblogManager().getTemplates(getActionWeblog());
List<WeblogTemplate> pages = new ArrayList<WeblogTemplate>();
pages.addAll(raw);
// Remove style sheet from list so not to show when theme is
// selected in shared theme mode
if (getActionWeblog().getTheme().getStylesheet() != null) {
pages.remove(WebloggerFactory.getWeblogger().getWeblogManager()
.getTemplateByLink(getActionWeblog(), getActionWeblog().getTheme().getStylesheet().getLink()));
}
setTemplates(pages);
// build list of action types that may be added
Map<ComponentType, String> actionsMap = new EnumMap<ComponentType, String>(ComponentType.class);
addComponentTypeToMap(actionsMap, ComponentType.CUSTOM);
if (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme())) {
// if the weblog is using a custom theme then determine which
// action templates are still available to be created
addComponentTypeToMap(actionsMap, ComponentType.PERMALINK);
addComponentTypeToMap(actionsMap, ComponentType.SEARCH);
addComponentTypeToMap(actionsMap, ComponentType.WEBLOG);
addComponentTypeToMap(actionsMap, ComponentType.TAGSINDEX);
for (WeblogTemplate tmpPage : getTemplates()) {
if (!ComponentType.CUSTOM.equals(tmpPage.getAction())) {
actionsMap.remove(tmpPage.getAction());
}
}
} else {
// Make sure we have an option for the default web page
addComponentTypeToMap(actionsMap, ComponentType.WEBLOG);
if (getNewTmplAction() == null) {
setNewTmplAction(ComponentType.WEBLOG);
}
for (WeblogTemplate tmpPage : getTemplates()) {
if (ComponentType.WEBLOG.equals(tmpPage.getAction())) {
actionsMap.remove(ComponentType.WEBLOG);
setNewTmplAction(null);
break;
}
}
}
setAvailableActions(actionsMap);
} catch (WebloggerException ex) {
log.error("Error getting templates for weblog - "
+ getActionWeblog().getHandle(), ex);
addError("Error getting template list - check Roller logs");
}
return LIST;
}
private void addComponentTypeToMap(Map<ComponentType, String> map, ComponentType component) {
map.put(component, component.getReadableName());
}
/**
* Save a new template.
*/
public String add() {
// validation
myValidate();
if (!hasActionErrors()) {
try {
WeblogTemplate newTemplate = new WeblogTemplate();
newTemplate.setWeblog(getActionWeblog());
newTemplate.setAction(getNewTmplAction());
newTemplate.setName(getNewTmplName());
newTemplate.setHidden(false);
newTemplate.setNavbar(false);
newTemplate.setLastModified(new Date());
if (ComponentType.CUSTOM.equals(getNewTmplAction())) {
newTemplate.setLink(getNewTmplName());
}
// Make sure we have always have a Weblog main page. Stops
// deleting main page in custom theme mode also.
if (ComponentType.WEBLOG.equals(getNewTmplAction())) {
newTemplate.setName(WeblogTemplate.DEFAULT_PAGE);
}
// save the new Template
WebloggerFactory.getWeblogger().getWeblogManager().saveTemplate(newTemplate);
// Create weblog template renditions for available types.
CustomTemplateRendition standardRendition =
new CustomTemplateRendition( newTemplate, RenditionType.STANDARD);
standardRendition.setTemplate(getText("pageForm.newTemplateContent"));
standardRendition.setTemplateLanguage(TemplateLanguage.VELOCITY);
WebloggerFactory.getWeblogger().getWeblogManager().saveTemplateRendition(standardRendition);
/* TODO: need a way for user to specify dual or single template via UI
CustomTemplateRendition mobileRendition = new CustomTemplateRendition(
newTemplate.getId(), RenditionType.MOBILE);
mobileRendition.setTemplate(newTemplate.getContents());
mobileRendition.setTemplateLanguage(TemplateLanguage.VELOCITY);
WebloggerFactory.getWeblogger().getWeblogManager()
.saveTemplateRendition(mobileRendition);
*/
// if this person happened to create a Weblog template from
// scratch then make sure and set the defaultPageId.
if (WeblogTemplate.DEFAULT_PAGE.equals(newTemplate.getName())) {
WebloggerFactory.getWeblogger().getWeblogManager().saveWeblog(getActionWeblog());
}
// flush results to db
WebloggerFactory.getWeblogger().flush();
// reset form fields
setNewTmplName(null);
setNewTmplAction(null);
} catch (WebloggerException ex) {
log.error("Error adding new template for weblog - " + getActionWeblog().getHandle(), ex);
addError("Error adding new template - check Roller logs");
}
}
return execute();
}
// validation when adding a new template
private void myValidate() {
// make sure name is non-null and within proper size
if (StringUtils.isEmpty(getNewTmplName())) {
addError("Template.error.nameNull");
} else if (getNewTmplName().length() > RollerConstants.TEXTWIDTH_255) {
addError("Template.error.nameSize");
}
// make sure action is a valid
if (getNewTmplAction() == null) {
addError("Template.error.actionNull");
}
// check if template by that name already exists
try {
WeblogTemplate existingPage = WebloggerFactory.getWeblogger().getWeblogManager()
.getTemplateByName(getActionWeblog(), getNewTmplName());
if (existingPage != null) {
addError("pagesForm.error.alreadyExists", getNewTmplName());
}
} catch (WebloggerException ex) {
log.error("Error checking for existing template", ex);
}
}
/**
* Checks if is custom theme.
*
* @return true, if is custom theme
*/
public boolean isCustomTheme() {
return (WeblogTheme.CUSTOM.equals(getActionWeblog().getEditorTheme()));
}
public List<WeblogTemplate> getTemplates() {
return templates;
}
public void setTemplates(List<WeblogTemplate> templates) {
this.templates = templates;
}
public Map<ComponentType, String> getAvailableActions() {
return availableActions;
}
public void setAvailableActions(Map<ComponentType, String> availableActions) {
this.availableActions = availableActions;
}
public String getNewTmplName() {
return newTmplName;
}
public void setNewTmplName(String newTmplName) {
this.newTmplName = newTmplName;
}
public ComponentType getNewTmplAction() {
return newTmplAction;
}
public void setNewTmplAction(ComponentType newTmplAction) {
this.newTmplAction = newTmplAction;
}
}