| /* |
| * 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.impl; |
| |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.ArrayList; |
| |
| import org.apache.cocoon.portal.event.Event; |
| import org.apache.cocoon.portal.event.impl.ChangeAspectDataEvent; |
| import org.apache.cocoon.portal.layout.CompositeLayout; |
| import org.apache.cocoon.portal.layout.Item; |
| import org.apache.cocoon.portal.layout.NamedItem; |
| import org.apache.cocoon.environment.Request; |
| import org.apache.cocoon.components.ContextHelper; |
| import org.apache.avalon.framework.service.ServiceException; |
| import org.apache.avalon.framework.service.ServiceManager; |
| |
| /** |
| * The PageLabelLinkService generates links for named items defined in the layout portal.xml. Links |
| * for other entities are passed to the DefaultLinkService to be resolved. |
| * |
| * @author Ralph Goers |
| * @version CVS $Id:$ |
| */ |
| public class PageLabelLinkService extends DefaultLinkService |
| { |
| |
| protected String apectName; |
| |
| /** |
| * The label manager |
| */ |
| protected PageLabelManager labelManager; |
| |
| |
| /* (non-Javadoc) |
| * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager) |
| */ |
| public void service(ServiceManager manager) throws ServiceException { |
| super.service(manager); |
| this.labelManager = (PageLabelManager) this.manager.lookup(PageLabelManager.ROLE); |
| } |
| |
| |
| /** |
| * @see org.apache.cocoon.portal.LinkService#getLinkURI(java.util.List) |
| */ |
| public String getLinkURI(List events, Boolean secure) { |
| List eventList = new ArrayList(); |
| Iterator iter = events.iterator(); |
| Event aspectEvent = null; |
| while (iter.hasNext()) { |
| Event event = (Event)iter.next(); |
| if (event instanceof ChangeAspectDataEvent && |
| ((ChangeAspectDataEvent) event).getTarget() instanceof CompositeLayout) { |
| aspectEvent = event; |
| } else { |
| eventList.add(event); |
| } |
| } |
| if (aspectEvent != null) { |
| eventList.add(0, aspectEvent); |
| } |
| return super.getLinkURI(eventList, secure); |
| } |
| |
| protected String initBuffer(LinkInfo info, Event event, Boolean secure) { |
| StringBuffer base = new StringBuffer(info.getBase(secure)); |
| if (this.labelManager == null || !this.labelManager.isUrlPath()) { |
| return base.toString(); |
| } |
| |
| String label; |
| if (event != null && event instanceof ChangeAspectDataEvent && |
| ((ChangeAspectDataEvent) event).getTarget() instanceof CompositeLayout) { |
| label = getLabel((ChangeAspectDataEvent)event); |
| } else { |
| label = this.labelManager.getCurrentLabel(); |
| } |
| if (label.length() > 0) { |
| base.setLength(0); |
| base.append(label); |
| } |
| |
| return base.toString(); |
| } |
| |
| protected String initBuffer(LinkInfo info, List events, Boolean secure) { |
| if (this.labelManager == null || !this.labelManager.isUrlPath()) { |
| return info.getBase(secure); |
| } |
| |
| Iterator iter = events.iterator(); |
| Event aspectEvent = null; |
| while (iter.hasNext()) { |
| Event event = (Event) iter.next(); |
| if (event instanceof ChangeAspectDataEvent && |
| ((ChangeAspectDataEvent) event).getTarget() instanceof CompositeLayout) { |
| aspectEvent = event; |
| } |
| } |
| return initBuffer(info, aspectEvent, secure); |
| } |
| |
| /** |
| * Add one event to the buffer |
| * |
| * @return Returns true, if the link contains a parameter |
| */ |
| protected boolean addEvent(StringBuffer buffer, Event event, boolean hasParams) { |
| if (this.labelManager != null && this.labelManager.isUrlPath() && |
| event instanceof ChangeAspectDataEvent && |
| ((ChangeAspectDataEvent) event).getTarget() instanceof CompositeLayout) { |
| return true; |
| } |
| |
| return super.addEvent(buffer, event, hasParams); |
| } |
| |
| |
| protected String processEvent(Event event, StringBuffer value) { |
| if (this.labelManager != null && |
| event instanceof ChangeAspectDataEvent && |
| ((ChangeAspectDataEvent) event).getTarget() instanceof CompositeLayout) { |
| value.append(getLabel((ChangeAspectDataEvent)event)); |
| return this.labelManager.getRequestParameterName(); |
| } |
| return super.processEvent(event, value); |
| } |
| |
| /* (non-Javadoc) |
| * @see org.apache.avalon.framework.activity.Disposable#dispose() |
| */ |
| public void dispose() { |
| if (this.manager != null) { |
| if (this.labelManager != null) { |
| this.manager.release(this.labelManager); |
| this.labelManager = null; |
| } |
| } |
| super.dispose(); |
| } |
| |
| /** |
| * Return the current info for the request. |
| * |
| * @return A LinkInfo object. |
| */ |
| protected LinkInfo getInfo() { |
| if (!labelManager.isUrlPath()) |
| { |
| return super.getInfo(); |
| } |
| final Request request = ContextHelper.getRequest(this.context); |
| LinkInfo info = (LinkInfo) request.getAttribute(DefaultLinkService.class.getName()); |
| if (info == null) { |
| synchronized (this) { |
| info = (LinkInfo) request.getAttribute(DefaultLinkService.class.getName()); |
| if (info == null) { |
| info = new PageLabelLinkInfo(labelManager, request, this.defaultPort, this.defaultSecurePort); |
| request.setAttribute(DefaultLinkService.class.getName(), info); |
| } |
| } |
| } |
| return info; |
| } |
| |
| |
| private String getLabel(ChangeAspectDataEvent event) { |
| CompositeLayout layout = (CompositeLayout) event.getTarget(); |
| int i = ((Integer) event.getData()).intValue(); |
| |
| Item item = layout.getItem(i); |
| StringBuffer key = new StringBuffer(""); |
| if (item instanceof NamedItem) { |
| getKey(item, key); |
| } |
| return key.toString(); |
| } |
| /* |
| * Generates the page label. |
| * @param item An Item. |
| * @param key The StringBuffer in which to create the page label. |
| */ |
| private void getKey(Item item, StringBuffer key) { |
| CompositeLayout parentLayout = item.getParent(); |
| Item parentItem = parentLayout.getParent(); |
| |
| if (parentItem != null) { |
| getKey(parentItem, key); |
| } |
| |
| if (key.length() > 0) { |
| key.append('.'); |
| } |
| if (item instanceof NamedItem) { |
| key.append(((NamedItem) item).getName()); |
| } else { |
| key.append(parentLayout.getItems().indexOf(item)); |
| } |
| } |
| } |