| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * 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. |
| */ |
| package org.apache.cocoon.portal.profile.impl; |
| |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| |
| import org.apache.avalon.framework.CascadingRuntimeException; |
| import org.apache.avalon.framework.service.ServiceException; |
| import org.apache.avalon.framework.service.ServiceSelector; |
| import org.apache.cocoon.ProcessingException; |
| import org.apache.cocoon.portal.PortalService; |
| import org.apache.cocoon.portal.coplet.CopletData; |
| import org.apache.cocoon.portal.coplet.CopletFactory; |
| import org.apache.cocoon.portal.coplet.CopletInstanceData; |
| import org.apache.cocoon.portal.coplet.adapter.CopletAdapter; |
| import org.apache.cocoon.portal.layout.CompositeLayout; |
| import org.apache.cocoon.portal.layout.Item; |
| import org.apache.cocoon.portal.layout.Layout; |
| import org.apache.cocoon.portal.layout.LayoutFactory; |
| |
| /** |
| * The profile manager using the authentication framework |
| * |
| * @author <a href="mailto:cziegeler@s-und-n.de">Carsten Ziegeler</a> |
| * @author <a href="mailto:bluetkemeier@s-und-n.de">Björn Lütkemeier</a> |
| * @deprecated Use the {@link org.apache.cocoon.portal.profile.impl.GroupBasedProfileManager} |
| * @version CVS $Id$ |
| */ |
| public abstract class AbstractUserProfileManager |
| extends AbstractProfileManager { |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#login() |
| */ |
| public void login() { |
| super.login(); |
| // TODO - we should move most of the stuff from getPortalLayout to here |
| // for now we use a hack :) |
| this.getPortalLayout(null, null); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#logout() |
| */ |
| public void logout() { |
| PortalService service = null; |
| ServiceSelector adapterSelector = null; |
| try { |
| adapterSelector = (ServiceSelector)this.manager.lookup(CopletAdapter.ROLE+"Selector"); |
| service = (PortalService)this.manager.lookup(PortalService.ROLE); |
| final String layoutKey = service.getDefaultLayoutKey(); |
| |
| CopletInstanceDataManager copletInstanceDataManager = (CopletInstanceDataManager)service.getAttribute("CopletInstanceData:"+layoutKey); |
| if ( copletInstanceDataManager != null ) { |
| Iterator iter = copletInstanceDataManager.getCopletInstanceData().values().iterator(); |
| while ( iter.hasNext() ) { |
| CopletInstanceData cid = (CopletInstanceData) iter.next(); |
| CopletAdapter adapter = null; |
| try { |
| adapter = (CopletAdapter)adapterSelector.select(cid.getCopletData().getCopletBaseData().getCopletAdapterName()); |
| adapter.logout( cid ); |
| } finally { |
| adapterSelector.release( adapter ); |
| } |
| } |
| } |
| |
| service.removeAttribute("CopletData:"+layoutKey); |
| service.removeAttribute("CopletInstanceData:"+layoutKey); |
| service.removeAttribute("Layout:"+layoutKey); |
| } catch (ServiceException e) { |
| throw new CascadingRuntimeException("Unable to lookup portal service.", e); |
| } finally { |
| this.manager.release(service); |
| this.manager.release(adapterSelector); |
| } |
| super.logout(); |
| } |
| |
| /** |
| * @param layoutMap |
| * @param layout |
| */ |
| protected void cacheLayouts(Map layoutMap, Layout layout) { |
| if ( layout != null ) { |
| if ( layout.getId() != null ) { |
| layoutMap.put( layout.getId(), layout ); |
| } |
| if ( layout instanceof CompositeLayout ) { |
| CompositeLayout cl = (CompositeLayout)layout; |
| Iterator i = cl.getItems().iterator(); |
| while ( i.hasNext() ) { |
| Item current = (Item)i.next(); |
| this.cacheLayouts( layoutMap, current.getLayout() ); |
| } |
| } |
| } |
| |
| } |
| |
| /** |
| * Prepares the object by using the specified factory. |
| */ |
| protected void prepareObject(Object object, Object factory) |
| throws ProcessingException { |
| if (factory != null && object != null) { |
| if (object instanceof Layout) { |
| ((LayoutFactory)factory).prepareLayout((Layout)object); |
| } else if (object instanceof CopletDataManager) { |
| CopletFactory copletFactory = (CopletFactory)factory; |
| Iterator iterator = ((CopletDataManager)object).getCopletData().values().iterator(); |
| while (iterator.hasNext()) { |
| CopletData cd = (CopletData)iterator.next(); |
| copletFactory.prepare(cd); |
| } |
| } else if (object instanceof CopletInstanceDataManager) { |
| CopletFactory copletFactory = (CopletFactory)factory; |
| Iterator iterator = ((CopletInstanceDataManager)object).getCopletInstanceData().values().iterator(); |
| while (iterator.hasNext()) { |
| CopletInstanceData cid = (CopletInstanceData)iterator.next(); |
| copletFactory.prepare(cid); |
| } |
| } |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#getCopletInstanceData(java.lang.String) |
| */ |
| public CopletInstanceData getCopletInstanceData(String copletID) { |
| PortalService service = null; |
| String attribute = null; |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| final String layoutKey = service.getDefaultLayoutKey(); |
| |
| attribute = "CopletInstanceData:"+layoutKey; |
| CopletInstanceDataManager copletInstanceDataManager = (CopletInstanceDataManager)service.getAttribute(attribute); |
| |
| return copletInstanceDataManager.getCopletInstanceData(copletID); |
| } catch (ServiceException e) { |
| throw new CascadingRuntimeException("Unable to lookup portal service.", e); |
| } finally { |
| this.manager.release(service); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#getCopletData(java.lang.String) |
| */ |
| public CopletData getCopletData(String copletDataId) { |
| PortalService service = null; |
| String attribute = null; |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| final String layoutKey = service.getDefaultLayoutKey(); |
| |
| attribute = "CopletInstanceData:"+layoutKey; |
| CopletInstanceDataManager copletInstanceDataManager = (CopletInstanceDataManager)service.getAttribute(attribute); |
| |
| Iterator i = copletInstanceDataManager.getCopletInstanceData().values().iterator(); |
| boolean found = false; |
| CopletInstanceData current = null; |
| while ( !found && i.hasNext() ) { |
| current = (CopletInstanceData)i.next(); |
| found = current.getCopletData().getId().equals(copletDataId); |
| } |
| if ( found ) { |
| return current.getCopletData(); |
| } |
| return null; |
| } catch (ServiceException e) { |
| throw new CascadingRuntimeException("Unable to lookup portal service.", e); |
| } finally { |
| this.manager.release(service); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#getCopletInstanceData(org.apache.cocoon.portal.coplet.CopletData) |
| */ |
| public List getCopletInstanceData(CopletData data) { |
| List coplets = new ArrayList(); |
| PortalService service = null; |
| String attribute = null; |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| final String layoutKey = service.getDefaultLayoutKey(); |
| |
| attribute = "CopletInstanceData:" + layoutKey; |
| CopletInstanceDataManager copletInstanceDataManager = (CopletInstanceDataManager)service.getAttribute(attribute); |
| |
| Iterator iter = copletInstanceDataManager.getCopletInstanceData().values().iterator(); |
| while ( iter.hasNext() ) { |
| CopletInstanceData current = (CopletInstanceData)iter.next(); |
| if ( current.getCopletData().equals(data) ) { |
| coplets.add( current ); |
| } |
| } |
| return coplets; |
| } catch (ServiceException e) { |
| throw new CascadingRuntimeException("Unable to lookup portal service.", e); |
| } finally { |
| this.manager.release(service); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#register(org.apache.cocoon.portal.coplet.CopletInstanceData) |
| */ |
| public void register(CopletInstanceData coplet) { |
| PortalService service = null; |
| String attribute = null; |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| final String layoutKey = service.getDefaultLayoutKey(); |
| |
| attribute = "CopletInstanceData:" + layoutKey; |
| CopletInstanceDataManager copletInstanceDataManager = (CopletInstanceDataManager)service.getAttribute(attribute); |
| |
| copletInstanceDataManager.putCopletInstanceData( coplet ); |
| |
| } catch (ServiceException e) { |
| throw new CascadingRuntimeException("Unable to lookup portal service.", e); |
| } finally { |
| this.manager.release(service); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#unregister(org.apache.cocoon.portal.coplet.CopletInstanceData) |
| */ |
| public void unregister(CopletInstanceData coplet) { |
| PortalService service = null; |
| String attribute = null; |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| final String layoutKey = service.getDefaultLayoutKey(); |
| |
| attribute = "CopletInstanceData:" + layoutKey; |
| CopletInstanceDataManager copletInstanceDataManager = (CopletInstanceDataManager)service.getAttribute(attribute); |
| |
| copletInstanceDataManager.getCopletInstanceData().remove(coplet.getId()); |
| |
| } catch (ServiceException e) { |
| throw new CascadingRuntimeException("Unable to lookup portal service.", e); |
| } finally { |
| this.manager.release(service); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#register(org.apache.cocoon.portal.layout.Layout) |
| */ |
| public void register(Layout layout) { |
| PortalService service = null; |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| final String layoutKey = service.getDefaultLayoutKey(); |
| |
| Map layoutMap = (Map)service.getAttribute("Layout-Map:" + layoutKey); |
| if ( layoutMap == null ) { |
| layout = (Layout)service.getAttribute("Layout:" + layoutKey); |
| if (layout != null) { |
| layoutMap = new HashMap(); |
| this.cacheLayouts(layoutMap, layout); |
| service.setAttribute("Layout-Map:" + layoutKey, layoutMap); |
| } |
| } |
| |
| if ( layoutMap != null) { |
| layoutMap.put(layout.getId(), layout); |
| } |
| |
| } catch (ServiceException e) { |
| throw new CascadingRuntimeException("Unable to lookup portal service.", e); |
| } finally { |
| this.manager.release(service); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#unregister(org.apache.cocoon.portal.layout.Layout) |
| */ |
| public void unregister(Layout layout) { |
| PortalService service = null; |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| final String layoutKey = service.getDefaultLayoutKey(); |
| |
| Map layoutMap = (Map)service.getAttribute("Layout-Map:" + layoutKey); |
| |
| if ( layoutMap != null) { |
| layoutMap.remove(layout.getId()); |
| } |
| |
| } catch (ServiceException e) { |
| throw new CascadingRuntimeException("Unable to lookup portal service.", e); |
| } finally { |
| this.manager.release(service); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#getPortalLayout(java.lang.String, java.lang.String) |
| */ |
| public Layout getPortalLayout(String layoutKey, String layoutID) { |
| PortalService service = null; |
| ServiceSelector adapterSelector = null; |
| |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| LayoutFactory factory = service.getComponentManager().getLayoutFactory(); |
| CopletFactory copletFactory = service.getComponentManager().getCopletFactory(); |
| |
| adapterSelector = (ServiceSelector)this.manager.lookup(CopletAdapter.ROLE+"Selector"); |
| |
| if ( null == layoutKey ) { |
| layoutKey = service.getDefaultLayoutKey(); |
| } |
| |
| final String layoutAttributeKey = "Layout:" + layoutKey; |
| final String layoutObjectsAttributeKey = "Layout-Map:" + layoutKey; |
| |
| Layout layout = (Layout)service.getAttribute(layoutAttributeKey); |
| if (layout == null) { |
| layout = this.loadProfile(layoutKey, service, copletFactory, factory, adapterSelector); |
| } |
| |
| if ( layoutID != null ) { |
| // now search for a layout |
| Map layoutMap = (Map)service.getAttribute(layoutObjectsAttributeKey); |
| if ( layoutMap == null ) { |
| layoutMap = new HashMap(); |
| this.cacheLayouts(layoutMap, layout); |
| service.setAttribute(layoutObjectsAttributeKey, layoutMap); |
| } |
| if ( layoutMap != null) { |
| return (Layout) layoutMap.get( layoutID ); |
| } |
| } |
| |
| return layout; |
| } catch (Exception ce) { |
| throw new CascadingRuntimeException("Exception during loading of profile.", ce); |
| } finally { |
| this.manager.release(service); |
| this.manager.release(adapterSelector); |
| } |
| } |
| |
| /** |
| * This loads a new profile |
| */ |
| protected abstract Layout loadProfile(String layoutKey, |
| PortalService service, |
| CopletFactory copletFactory, |
| LayoutFactory layoutFactory, |
| ServiceSelector adapterSelector) |
| throws Exception; |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#getCopletDatas() |
| */ |
| public Collection getCopletDatas() { |
| PortalService service = null; |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| final String layoutKey = service.getDefaultLayoutKey(); |
| CopletDataManager manager = (CopletDataManager)service.getAttribute("CopletData:" + layoutKey); |
| return manager.getCopletData().values(); |
| } catch (Exception e) { |
| throw new CascadingRuntimeException("Error in getCopletDatas.", e); |
| } finally { |
| this.manager.release(service); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#getCopletInstanceDatas() |
| */ |
| public Collection getCopletInstanceDatas() { |
| PortalService service = null; |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| final String layoutKey = service.getDefaultLayoutKey(); |
| CopletInstanceDataManager manager = (CopletInstanceDataManager)service.getAttribute("CopletInstanceData:" + layoutKey); |
| return manager.getCopletInstanceData().values(); |
| } catch (Exception e) { |
| throw new CascadingRuntimeException("Error in getCopletInstanceDatas.", e); |
| } finally { |
| this.manager.release(service); |
| } |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.portal.profile.ProfileManager#storeProfile(org.apache.cocoon.portal.layout.Layout, java.lang.String) |
| */ |
| public void storeProfile(Layout rootLayout, String layoutKey) { |
| PortalService service = null; |
| |
| try { |
| service = (PortalService) this.manager.lookup(PortalService.ROLE); |
| if ( null == layoutKey ) { |
| layoutKey = service.getDefaultLayoutKey(); |
| } |
| |
| final String layoutAttributeKey = "Layout:" + layoutKey; |
| |
| service.setAttribute(layoutAttributeKey, rootLayout); |
| } catch (Exception ce) { |
| throw new CascadingRuntimeException("Exception during loading of profile.", ce); |
| } finally { |
| this.manager.release(service); |
| } |
| } |
| } |