/*
* $Id: IWBundleStarter.java,v 1.49 2009/06/12 10:52:36 valdas Exp $
* Created on 3.11.2004
*
* Copyright (C) 2004 Idega Software hf. All Rights Reserved.
*
* This software is the proprietary information of Idega hf.
* Use is subject to license terms.
*/
package com.idega.content;
import java.io.FileInputStream;
import java.io.InputStream;
import java.rmi.RemoteException;
import java.util.Collection;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.idega.block.rss.business.RSSProducerRegistry;
import com.idega.builder.business.BuilderLogicWrapper;
import com.idega.business.IBOLookup;
import com.idega.business.IBOLookupException;
import com.idega.content.business.ContentIWActionURIHandler;
import com.idega.content.business.ContentRSSProducer;
import com.idega.content.themes.business.TemplatesLoader;
import com.idega.content.themes.business.ThemesService;
import com.idega.content.themes.helpers.bean.Setting;
import com.idega.content.themes.helpers.business.ThemesConstants;
import com.idega.content.themes.helpers.business.ThemesHelper;
import com.idega.content.view.ContentViewManager;
import com.idega.core.accesscontrol.business.StandardRoles;
import com.idega.core.uri.IWActionURIManager;
import com.idega.idegaweb.IWApplicationContext;
import com.idega.idegaweb.IWBundle;
import com.idega.idegaweb.IWBundleStartable;
import com.idega.idegaweb.IWMainApplication;
import com.idega.idegaweb.IWMainApplicationSettings;
import com.idega.servlet.filter.IWBundleResourceFilter;
import com.idega.slide.business.IWSlideService;
import com.idega.user.business.GroupBusiness;
import com.idega.user.data.Group;
import com.idega.util.IOUtil;
import com.idega.util.ListUtil;
import com.idega.util.expression.ELUtil;
/**
*
* Last modified: $Date: 2009/06/12 10:52:36 $ by $Author: valdas $
*
* @author <a href="mailto:tryggvil@idega.com">Tryggvi Larusson</a>
* @version $Revision: 1.49 $
*/
public class IWBundleStarter implements IWBundleStartable{
@Autowired
private ThemesHelper themesHelper;
/**
*
*/
public IWBundleStarter() {
super();
}
public void start(IWBundle starterBundle) {
ThemesConstants.initializeThemeConstants();
addIWActionURIHandlers();
addRSSProducers(starterBundle);
addContentRoleGroups(starterBundle.getApplication().getIWApplicationContext());
ContentViewManager cViewManager = ContentViewManager.getInstance(starterBundle.getApplication());
cViewManager.initializeStandardNodes(starterBundle);
IWApplicationContext iwac = starterBundle.getApplication().getIWApplicationContext();
try {
IWSlideService service = IBOLookup.getServiceInstance(iwac,IWSlideService.class);
service.addIWSlideChangeListeners((ThemesService) IBOLookup.getServiceInstance(iwac, ThemesService.class));
} catch (Exception e) {
e.printStackTrace();
}
loadThemeValues(starterBundle);
IWMainApplication iwmain = starterBundle.getApplication();
TemplatesLoader templatesLoader = TemplatesLoader.getInstance(iwmain);
templatesLoader.loadTemplatesFromBundles();
}
/**
* Auto generate groups for the editor and author roles so we can set them in the Lucid app
* @param iwac
*/
protected void addContentRoleGroups(IWApplicationContext iwac) {
boolean clearCache = false;
try {
GroupBusiness groupBiz = IBOLookup.getServiceInstance(iwac, GroupBusiness.class);
@SuppressWarnings("unchecked")
Collection<Group> editorGroups = groupBiz.getGroupsByGroupName(StandardRoles.ROLE_KEY_EDITOR);
@SuppressWarnings("unchecked")
Collection<Group> authorGroups = groupBiz.getGroupsByGroupName(StandardRoles.ROLE_KEY_AUTHOR);
// Only generate groups if none exist
if (editorGroups == null || editorGroups.isEmpty()){
Group editorGroup = groupBiz.createGroup(StandardRoles.ROLE_KEY_EDITOR, "This is the system group for content editors.", groupBiz.getGroupTypeHome().getPermissionGroupTypeString(), true);
iwac.getIWMainApplication().getAccessController().addRoleToGroup(StandardRoles.ROLE_KEY_EDITOR,editorGroup, iwac);
clearCache = true;
}
if (authorGroups == null || authorGroups.isEmpty()) {
Group authorGroup = groupBiz.createGroup(StandardRoles.ROLE_KEY_AUTHOR, "This is the system group for content authors.", groupBiz.getGroupTypeHome().getPermissionGroupTypeString(), true);
iwac.getIWMainApplication().getAccessController().addRoleToGroup(StandardRoles.ROLE_KEY_AUTHOR,authorGroup, iwac);
clearCache = true;
}
if (clearCache) {
BuilderLogicWrapper builderLogic = ELUtil.getInstance().getBean(BuilderLogicWrapper.SPRING_BEAN_NAME_BUILDER_LOGIC_WRAPPER);
builderLogic.reloadGroupsInCachedDomain(iwac, null);
}
} catch(Exception e) {
e.printStackTrace();
}
}
public void stop(IWBundle starterBundle) {
}
/**
*
*/
private void addIWActionURIHandlers() {
IWActionURIManager manager = IWActionURIManager.getInstance();
manager.registerHandler(new ContentIWActionURIHandler());
}
private void loadThemeValues(IWBundle bundle) {
InputStream stream = null;
IWMainApplication app = bundle.getApplication();
try {
stream = new FileInputStream(IWBundleResourceFilter.copyResourceFromJarToWebapp(app, bundle.getResourcesPath() + "/themes/theme.xml"));
} catch(Exception e) {
e.printStackTrace();
}
if (stream == null) {
return;
}
if (themesHelper == null) {
ELUtil.getInstance().autowire(this);
}
try {
themesHelper.loadThemeSettings(stream);
} catch(Exception e) {
e.printStackTrace();
} finally {
IOUtil.closeInputStream(stream);
}
List<Setting> settings = themesHelper.getThemeSettings();
if (ListUtil.isEmpty(settings)) {
return;
}
IWMainApplicationSettings applicationSettings = bundle.getApplication().getSettings();
for (Setting setting : settings) {
String key = ThemesConstants.THEMES_PROPERTY_START + setting.getCode() + ThemesConstants.THEMES_PROPERTY_END;
if (applicationSettings.getProperty(key) == null) { // Not overriding existing values
applicationSettings.setProperty(key, setting.getDefaultValue());
}
}
}
private void addRSSProducers(IWBundle starterBundle) {
RSSProducerRegistry registry = RSSProducerRegistry.getInstance();
//ContentRSSProducer, also a IWSlideChangeListener
ContentRSSProducer contentProducer = new ContentRSSProducer();
registry.addRSSProducer("content", contentProducer);
IWApplicationContext iwac = starterBundle.getApplication().getIWApplicationContext();
try {
IWSlideService service = IBOLookup.getServiceInstance(iwac,IWSlideService.class);
service.addIWSlideChangeListeners(contentProducer);
} catch (IBOLookupException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}