You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2005/08/18 09:06:48 UTC

svn commit: r233293 - /cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java

Author: cziegeler
Date: Thu Aug 18 00:06:43 2005
New Revision: 233293

URL: http://svn.apache.org/viewcvs?rev=233293&view=rev
Log:
Add missing class...hmm

Added:
    cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java   (with props)

Added: cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java
URL: http://svn.apache.org/viewcvs/cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java?rev=233293&view=auto
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java (added)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java Thu Aug 18 00:06:43 2005
@@ -0,0 +1,441 @@
+/*
+ * Copyright 1999-2002,2004 The Apache Software Foundation.
+ * 
+ * Licensed 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.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.context.Contextualizable;
+import org.apache.avalon.framework.logger.AbstractLogEnabled;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.avalon.framework.thread.ThreadSafe;
+import org.apache.cocoon.components.ContextHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.wrapper.RequestParameters;
+import org.apache.cocoon.portal.LinkService;
+import org.apache.cocoon.portal.event.ComparableEvent;
+import org.apache.cocoon.portal.event.Event;
+import org.apache.cocoon.portal.event.EventConverter;
+import org.apache.cocoon.portal.event.RequestEvent;
+import org.apache.cocoon.portal.event.ConvertableEvent;
+import org.apache.cocoon.util.NetUtils;
+
+/**
+ *
+ * @author <a href="mailto:cziegeler@s-und-n.de">Carsten Ziegeler</a>
+ * @author <a href="mailto:volker.schmitt@basf-it-services.com">Volker Schmitt</a>
+ * 
+ * @version CVS $Id$
+ */
+public class DefaultLinkService 
+    extends AbstractLogEnabled
+    implements ThreadSafe, LinkService, Serviceable, Disposable, Contextualizable {
+
+    /**
+     * Helper class containing the information about the request uri
+     */
+    static class Info {
+        StringBuffer  linkBase = new StringBuffer();
+        boolean       hasParameters = false;
+        ArrayList     comparableEvents = new ArrayList(5);
+
+        public String getBase(Boolean secure) {
+            // TODO - Does null always mean FALSE?
+            // it might be that the current request is also https,
+            // in that case we return https even if secure is FALSE.
+            if ( secure == null || secure.equals(Boolean.FALSE) ) {
+                return linkBase.toString();
+            }
+            // FIXME - Perhaps there is a better way
+            String link = linkBase.toString();
+            if ( link.startsWith("https") ) {
+                return link;
+            }
+            return "https" + linkBase.toString().substring(4);
+        }
+    }
+    
+    /** The converter used to convert an event into a request parameter */
+    protected EventConverter   converter;
+    /** The service manager */
+    protected ServiceManager manager;
+    /** The cocoon context */
+    protected Context context;
+
+    protected Boolean eventsMarshalled;
+
+    /* (non-Javadoc)
+     * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
+     */
+    public void service(ServiceManager manager) throws ServiceException {
+        this.manager = manager;
+        this.converter = (EventConverter)this.manager.lookup(EventConverter.ROLE);
+    }
+
+    /**
+     * Return the current info for the request
+     * @return An Info object
+     */
+    protected Info getInfo() {
+        final Request request = ContextHelper.getRequest( this.context );
+        Info info = (Info)request.getAttribute(DefaultLinkService.class.getName());
+        if ( info == null ) {
+            synchronized ( this ) {
+                info = (Info)request.getAttribute(DefaultLinkService.class.getName());
+                if ( info == null ) {
+                    info = new Info();
+                    request.setAttribute(DefaultLinkService.class.getName(), info);
+                    info.linkBase.append(request.getScheme());
+                    info.linkBase.append("://");
+                    info.linkBase.append(request.getServerName());
+                    if ( request.getServerPort() != 80 ) {
+                        info.linkBase.append(':');
+                        info.linkBase.append(request.getServerPort());
+                    }
+                    if ( request.getContextPath().length() > 0 ) {
+                        info.linkBase.append(request.getContextPath());
+                    } else {
+                        info.linkBase.append('/');                        
+                    }
+                    if ( request.getSitemapURIPrefix().length() > 0 ) {
+                        info.linkBase.append(request.getSitemapURIPrefix());
+                    }
+                    info.linkBase.append(request.getSitemapURI());
+                }
+            }
+        }
+        return info;
+    }
+
+    /* (non-Javadoc)
+    * @see org.apache.cocoon.portal.LinkService#isSecure()
+    */
+    public boolean isSecure() {
+        return ContextHelper.getRequest(this.context).isSecure();
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.portal.LinkService#encodeURL(String url).
+     */
+    public String encodeURL(String url) {
+        return ContextHelper.getResponse(this.context).encodeURL(url);
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.portal.LinkService#getLinkURI(org.apache.cocoon.portal.event.Event)
+     */
+    public String getLinkURI(Event event) {
+        return this.getLinkURI(event, null);
+    }
+
+    /* (non-Javadoc)
+    * @see org.apache.cocoon.portal.LinkService#getLinkURI(org.apache.cocoon.portal.event.Event, boolean)
+    */
+    public String getLinkURI(Event event, Boolean secure) {
+        if (event == null) {
+            return this.getRefreshLinkURI(secure);
+        }
+        final Info info = this.getInfo();
+        final StringBuffer buffer = new StringBuffer(info.getBase(secure));
+        boolean hasParams = info.hasParameters;
+
+        // add comparable events
+        final boolean comparableEvent = event instanceof ComparableEvent;
+        Iterator iter = info.comparableEvents.iterator();
+        while (iter.hasNext()) {
+            Object[] objects = (Object[]) iter.next();
+            ComparableEvent current = (ComparableEvent) objects[0];
+            if (!comparableEvent || !current.equalsEvent((ComparableEvent) event)) {
+                if (hasParams) {
+                    buffer.append('&');
+                } else {
+                    buffer.append('?');
+                }
+                try {
+                    buffer.append((String) objects[1]).append('=').append(NetUtils.encode((String) objects[2], "utf-8"));
+                } catch (UnsupportedEncodingException uee) {
+                    // ignore this as utf-8 is always supported
+                }
+                hasParams = true;
+            }
+        }
+
+        // now add event
+        hasParams = this.addEvent(buffer, event, hasParams);
+
+        return buffer.toString();
+    }
+
+    /**
+     * 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 ( hasParams ) {
+            buffer.append('&');
+        } else {
+            buffer.append('?');
+        }
+        StringBuffer value = new StringBuffer("");
+        String parameterName = processEvent(event, value);
+        try {
+            buffer.append(parameterName).append('=').append(NetUtils.encode(value.toString(), "utf-8"));
+        } catch (UnsupportedEncodingException uee) {
+            // ignore this as utf-8 is always supported
+        }
+        return true;
+    }
+    
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.portal.LinkService#getLinkURI(java.util.List)
+     */
+    public String getLinkURI(List events) {
+        return this.getLinkURI(events, null);
+    }
+
+    /* (non-Javadoc)
+    * @see org.apache.cocoon.portal.LinkService#getLinkURI(java.util.List)
+    */
+    public String getLinkURI(List events, Boolean secure) {
+        if (events == null || events.size() == 0) {
+            return this.getRefreshLinkURI(secure);
+        }
+        final Info info = this.getInfo();
+        boolean hasParams = info.hasParameters;
+        final StringBuffer buffer = new StringBuffer(info.getBase(secure));
+
+        // add comparable events
+        Iterator iter = info.comparableEvents.iterator();
+        while (iter.hasNext()) {
+            Object[] objects = (Object[]) iter.next();
+            ComparableEvent current = (ComparableEvent) objects[0];
+
+            Iterator eventIterator = events.iterator();
+            boolean found = false;
+            while (!found && eventIterator.hasNext()) {
+                final Object inEvent = eventIterator.next();
+                if (inEvent instanceof ComparableEvent
+                    && current.equalsEvent((ComparableEvent) inEvent)) {
+                    found = true;
+                }
+            }
+            if (!found) {
+                if (hasParams) {
+                    buffer.append('&');
+                } else {
+                    buffer.append('?');
+                }
+                try {
+                    buffer.append((String) objects[1]).append('=').append(NetUtils.encode((String) objects[2], "utf-8"));
+                } catch (UnsupportedEncodingException uee) {
+                    // ignore this as utf-8 is always supported
+                }
+                hasParams = true;
+            }
+        }
+
+        // now add events
+        iter = events.iterator();
+        while (iter.hasNext()) {
+            final Object current = iter.next();
+            if (current instanceof Event) {
+                hasParams = this.addEvent(buffer, (Event) current, hasParams);
+            } else if ( current instanceof ParameterDescription ) {
+                if (hasParams) {
+                    buffer.append('&');
+                } else {
+                    buffer.append('?');
+                    hasParams = true;
+                }
+                buffer.append(((ParameterDescription) current).parameters);
+            }
+        }
+        return buffer.toString();
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.portal.LinkService#addEventToLink(org.apache.cocoon.portal.event.Event)
+     */
+    public void addEventToLink(Event event) {
+        if (event == null) {
+            return;
+        }
+        StringBuffer value = new StringBuffer("");
+        String parameterName = processEvent(event, value);
+
+        final Info info = this.getInfo();
+        if (event instanceof ComparableEvent) {
+            // search if we already have an event for this!
+            final Iterator iter = info.comparableEvents.iterator();
+            boolean found = false;
+            while (!found && iter.hasNext()) {
+                Object[] objects = (Object[])iter.next();
+                if (((ComparableEvent) objects[0]).equalsEvent((ComparableEvent) event)) {
+                    found = true;
+                    info.comparableEvents.remove(objects);
+                }
+            }
+            info.comparableEvents.add(new Object[]{event, parameterName, value.toString()});
+        } else {
+            this.addParameterToLink(parameterName, value.toString());
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.portal.LinkService#addParameterToLink(java.lang.String, java.lang.String)
+     */
+    public void addParameterToLink(String name, String value) {
+        final Info info = this.getInfo();
+        if ( info.hasParameters ) {
+            info.linkBase.append('&');
+        } else {
+            info.linkBase.append('?');
+        }
+        try {
+            info.linkBase.append(name).append('=').append(NetUtils.encode(value, "utf-8"));
+        } catch (UnsupportedEncodingException uee) {
+            // ignore this as utf-8 is always supported
+        }
+        info.hasParameters = true;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.cocoon.portal.LinkService#addUniqueParameterToLink(java.lang.String, java.lang.String)
+     */
+    public void addUniqueParameterToLink(String name, String value) {
+        final Info info = this.getInfo();
+        if ( info.hasParameters ) {
+            final int pos = info.linkBase.toString().indexOf("?");
+            final String queryString = info.linkBase.substring(pos + 1);
+            final RequestParameters params = new RequestParameters(queryString);
+            if ( params.getParameter(name) != null ) {
+                // the parameter is available, so remove it
+                info.linkBase.delete(pos, info.linkBase.length() + 1);
+                info.hasParameters = false;
+                
+                Enumeration enumeration = params.getParameterNames();
+                while ( enumeration.hasMoreElements() ) {
+                    final String paramName = (String)enumeration.nextElement();
+                    if ( !paramName.equals(name) ) {
+                        String[] values = params.getParameterValues(paramName);
+                        for( int i = 0; i < values.length; i++ ) {
+                            this.addParameterToLink(paramName, values[i]);
+                        }
+                    }
+                }
+            }
+        }
+        // the parameter is not available, so just add it
+        this.addParameterToLink(name, value);
+    }
+    
+    /**
+     * @see org.apache.cocoon.portal.LinkService#getRefreshLinkURI()
+     */
+    public String getRefreshLinkURI() {
+        return this.getRefreshLinkURI(null);
+    }
+
+    /**
+     * @see org.apache.cocoon.portal.LinkService#getRefreshLinkURI(java.lang.Boolean)
+     */
+    public String getRefreshLinkURI(Boolean secure) {
+        final Info info = this.getInfo();
+
+        final StringBuffer buffer = new StringBuffer(info.getBase(secure));
+
+        // add comparable events
+        Iterator iter = info.comparableEvents.iterator();
+        boolean hasParams = info.hasParameters;
+        while (iter.hasNext()) {
+            Object[] objects = (Object[])iter.next();
+            if ( hasParams ) {
+                buffer.append('&');
+            } else {
+                buffer.append('?');
+            }
+            try {
+                buffer.append((String)objects[1]).append('=').append(NetUtils.encode((String)objects[2], "utf-8"));
+            } catch (UnsupportedEncodingException uee) {
+                // ignore this as utf-8 is always supported
+            }
+            hasParams = true;
+        }
+        return buffer.toString();
+    }
+    
+    /* (non-Javadoc)
+     * @see org.apache.avalon.framework.activity.Disposable#dispose()
+     */
+    public void dispose() {
+        if (this.manager != null) {
+            this.manager.release( this.converter );
+            this.converter = null;
+            this.manager = null;
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
+     */
+    public void contextualize(Context context) throws ContextException {
+        this.context = context;
+    }
+
+    private boolean getEventsMarshalled() {
+        if (this.eventsMarshalled == null) {
+            this.eventsMarshalled = new Boolean(this.converter.isMarshallEvents());
+        }
+        return this.eventsMarshalled.booleanValue();
+    }
+
+    private String processEvent(Event event, StringBuffer value) {
+        String parameterName = DEFAULT_REQUEST_EVENT_PARAMETER_NAME;
+        if (event instanceof ConvertableEvent && getEventsMarshalled()) {
+            final String eventParName = ((ConvertableEvent) event).getRequestParameterName();
+            String eventStr = ((ConvertableEvent) event).asString();
+            if (eventStr == null) {
+                // Could not convert the event
+                value.append(this.converter.encode(event));
+            } else {
+                parameterName = DEFAULT_CONVERTABLE_EVENT_PARAMETER_NAME;
+                try {
+                    String eventValue = NetUtils.encode(eventStr, "utf-8");
+                    value.append(eventParName).append('(').append(eventValue).append(')');
+                } catch (UnsupportedEncodingException uee) {
+                    // ignore this as utf-8 is always supported
+                }
+            }
+        } else {
+            if (event instanceof RequestEvent) {
+                final String eventParName = ((RequestEvent) event).getRequestParameterName();
+                if (eventParName != null) {
+                    parameterName = eventParName;
+                }
+            }
+            value.append(this.converter.encode(event));
+        }
+        return parameterName;
+    }
+}

Propchange: cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/branches/BRANCH_2_1_X/src/blocks/portal/java/org/apache/cocoon/portal/impl/DefaultLinkService.java
------------------------------------------------------------------------------
    svn:keywords = Id