package com.idega.builder; import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.logging.Logger; import javax.ejb.FinderException; import com.idega.builder.app.IBApplication; import com.idega.builder.business.BuilderSlideListenerBean; import com.idega.builder.business.ComponentPropertyHandler; import com.idega.builder.business.IBMainServiceBean; import com.idega.builder.business.IBPropertyHandler; import com.idega.builder.business.PageUrl; import com.idega.builder.business.UserLoggedInListener; import com.idega.builder.dynamicpagetrigger.data.DynamicPageTrigger; import com.idega.builder.presentation.InvisibleInBuilder; import com.idega.builder.view.BuilderApplicationViewNode; import com.idega.builder.view.BuilderRootViewNode; import com.idega.business.IBOLookup; import com.idega.business.IBOLookupException; import com.idega.core.accesscontrol.business.AuthenticationBusiness; import com.idega.core.accesscontrol.business.StandardRoles; import com.idega.core.builder.business.BuilderPageWriterService; import com.idega.core.builder.business.BuilderService; import com.idega.core.builder.data.ICDynamicPageTrigger; import com.idega.core.builder.data.ICPage; import com.idega.core.builder.data.ICPageHome; import com.idega.core.view.ComponentClassViewNode; import com.idega.core.view.DefaultViewNode; import com.idega.core.view.FramedApplicationViewNode; import com.idega.core.view.KeyboardShortcut; import com.idega.core.view.ViewManager; import com.idega.core.view.ViewNode; import com.idega.data.IDOLookup; import com.idega.data.IDOLookupException; import com.idega.idegaweb.IWApplicationContext; import com.idega.idegaweb.IWBundle; import com.idega.idegaweb.IWBundleStartable; import com.idega.idegaweb.IWMainApplication; import com.idega.presentation.Applet; import com.idega.presentation.GenericPlugin; import com.idega.presentation.ui.DropdownMenu; import com.idega.repository.data.ImplementorRepository; import com.idega.repository.data.SingletonRepository; import com.idega.slide.business.IWSlideService; import com.idega.util.CoreConstants; /** * <p>Title: idegaWeb</p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: idega Software</p> * @author <a href="thomas@idega.is">Thomas Hilbig</a> * @version 1.0 * Created on Jun 10, 2004 */ public class IWBundleStarter implements IWBundleStartable { public static final String BUILDER_ROOT_VIEW_NODE_NAME = "pages"; static Logger log = Logger.getLogger(IWBundleStarter.class.getName()); @Override public void start(IWBundle starterBundle) { // implementors ImplementorRepository repository = ImplementorRepository.getInstance(); repository.addImplementor(InvisibleInBuilder.class, Applet.class); repository.addImplementor(InvisibleInBuilder.class, GenericPlugin.class); repository.addImplementor(InvisibleInBuilder.class, DropdownMenu.class); repository.addImplementor(ICDynamicPageTrigger.class, DynamicPageTrigger.class); // services registration IBOLookup.registerImplementationForBean(BuilderService.class, IBMainServiceBean.class); IBOLookup.registerImplementationForBean(BuilderPageWriterService.class, IBMainServiceBean.class); //Registering the views: //This is the way it should be but doesn't work because of the startTemporaryBundleStarers() method in IWMainApplicationStarter /*if(starterBundle!=null){ IWMainApplication iwma = starterBundle.getApplication(); //IWMainApplication iwma = IWMainApplication.getDefaultIWMainApplication(); ViewManager viewManager = ViewManager.getInstance(iwma); BuilderRootViewNode pagesViewNode = new BuilderRootViewNode(BUILDER_ROOT_VIEW_NODE_NAME,viewManager.getApplicationRoot()); pagesViewNode.setKeyboardShortcut(new KeyboardShortcut("p")); }*/ try { AuthenticationBusiness authentication = IBOLookup.getServiceInstance(starterBundle.getApplication().getIWApplicationContext(), AuthenticationBusiness.class); authentication.addAuthenticationListener(new UserLoggedInListener()); } catch (IBOLookupException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } addViewNodes(starterBundle); updateBuilderPageUris(); registerSlideListener(starterBundle); } /** * <p> * TODO tryggvil describe method addViewNodes * </p> */ private void addViewNodes(IWBundle starterBundle) { //Registering the views: //FIXME: This is the way it should be but doesn't work because of the startTemporaryBundleStarers() method in IWMainApplicationStarter if(starterBundle!=null){ IWMainApplication iwma = starterBundle.getApplication(); ViewManager viewManager = ViewManager.getInstance(iwma); BuilderRootViewNode pagesViewNode = new BuilderRootViewNode(BUILDER_ROOT_VIEW_NODE_NAME, viewManager.getApplicationRoot()); pagesViewNode.setKeyboardShortcut(new KeyboardShortcut("p")); ViewNode workspaceNode = viewManager.getWorkspaceRoot(); Collection<String> roles = new ArrayList<String>(); roles.add(StandardRoles.ROLE_KEY_BUILDER); DefaultViewNode builderAppNode = new DefaultViewNode(CoreConstants.BUILDER_APPLICATION, workspaceNode); builderAppNode.setName("#{localizedStrings['com.idega.builder']['builder']}"); builderAppNode.setAuthorizedRoles(roles); builderAppNode.setVisibleInMenus(false); FramedApplicationViewNode builderNode = new FramedApplicationViewNode("builder", workspaceNode); builderNode.setAuthorizedRoles(roles); builderNode.setJspUri(starterBundle.getJSPURI("builderapp.jsp")); builderNode.setKeyboardShortcut(new KeyboardShortcut("2")); builderNode.setVisibleInMenus(false); DefaultViewNode setupNode = new DefaultViewNode("initialsetup",builderNode); setupNode.setJspUri(starterBundle.getJSPURI("initialSetup.jsp")); setupNode.setName("#{localizedStrings['com.idega.builder']['initialsetup']}"); setupNode.setVisibleInMenus(false); DefaultViewNode applicationNode = new BuilderApplicationViewNode("application"); applicationNode.setParent(builderNode); applicationNode.setVisibleInMenus(false); builderNode.setFrameUrl(applicationNode.getURI()); ComponentClassViewNode afterinitialsetupNode = new ComponentClassViewNode("afterinitialsetup"); afterinitialsetupNode.setParent(builderNode); afterinitialsetupNode.setComponentClass(IBApplication.class); afterinitialsetupNode.setVisibleInMenus(false); } } /** * This method updates the ib_page table with creating a generated URI for all pages that had it set null. */ private void updateBuilderPageUris() { try { ICPageHome pHome = (ICPageHome)IDOLookup.getHome(ICPage.class); Collection<ICPage> pages = pHome.findAllPagesWithoutUri(); int domainId=-1; for (Iterator<ICPage> iter = pages.iterator(); iter.hasNext();) { ICPage page = iter.next(); //TODO: implemennt support for domainId: try{ PageUrl newUrl = new PageUrl(page,domainId); String newGeneratedUri = newUrl.getGeneratedUrlFromName(); page.setDefaultPageURI(newGeneratedUri); log.info("Updating Builder Page with uri="+newGeneratedUri); page.store(); } catch(Exception e){ log.throwing("IWBundleStarter","updateBuilderPageUris",e); } } } catch (IDOLookupException e) { } catch (FinderException e) { log.throwing("IWBundleStarter","updateBuilderPageUris",e); } } @Override public void stop(IWBundle starterBundle) { SingletonRepository repository = SingletonRepository.getRepository(); repository.unloadInstance(ComponentPropertyHandler.class); repository.unloadInstance(IBPropertyHandler.class); } public void registerSlideListener(IWBundle bundle){ // FIXME: This is the way it should be but doesn't work because of the startTemporaryBundleStarers() method in IWMainApplicationStarter if (bundle != null) { try { IWApplicationContext iwac = bundle.getApplication().getIWApplicationContext(); IWSlideService service = IBOLookup.getServiceInstance(iwac, IWSlideService.class); //add it as a slide change listener for caching purposes service.addIWSlideChangeListeners(new BuilderSlideListenerBean()); } catch (IBOLookupException e) { e.printStackTrace(); } catch (RemoteException e) { e.printStackTrace(); } } } }