001// Copyright 2004, 2005 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.hivemind.impl;
016
017import java.util.List;
018
019import org.apache.hivemind.InterceptorStack;
020import org.apache.hivemind.ServiceInterceptorFactory;
021import org.apache.hivemind.internal.Module;
022import org.apache.hivemind.internal.ServiceInterceptorContribution;
023import org.apache.hivemind.internal.ServicePoint;
024import org.apache.hivemind.schema.Schema;
025import org.apache.hivemind.util.ToStringBuilder;
026
027/**
028 * Implementation of {@link org.apache.hivemind.internal.ServiceInterceptorContribution}.
029 * 
030 * @author Howard Lewis Ship
031 */
032
033public final class ServiceInterceptorContributionImpl extends BaseLocatable implements
034        ServiceInterceptorContribution
035{
036    private String _factoryServiceId;
037
038    private Module _contributingModule;
039
040    private List _parameters;
041
042    private List _convertedParameters;
043
044    private ServiceInterceptorFactory _factory;
045
046    private String _precedingInterceptorIds;
047
048    private String _followingInterceptorIds;
049
050    private String _name;
051    
052    public String toString()
053    {
054        ToStringBuilder builder = new ToStringBuilder(this);
055        builder.append("factoryServiceId", _factoryServiceId);
056        builder.append("parameters", _parameters);
057        builder.append("precedingInterceptorIds", _precedingInterceptorIds);
058        builder.append("followingInterceptorIds", _followingInterceptorIds);
059        builder.append("name", _name );
060        return builder.toString();
061    }
062
063    
064    /**
065     * @return Returns the name.
066     */
067    public String getName()
068    {
069        if( _name == null )
070        {
071            return getFactoryServiceId();
072        }
073        return _name;
074    }
075    
076    public void setName( String name )
077    {
078        _name = name;
079    }
080    
081    public String getFactoryServiceId()
082    {
083        return _factoryServiceId;
084    }
085
086    public void setFactoryServiceId(String string)
087    {
088        _factoryServiceId = string;
089    }
090
091    public void createInterceptor(InterceptorStack stack)
092    {
093        setup();
094
095        _factory.createInterceptor(stack, _contributingModule, _convertedParameters);
096    }
097
098    private synchronized void setup()
099    {
100        if (_factory == null)
101        {
102            ServicePoint factoryPoint = _contributingModule.getServicePoint(_factoryServiceId);
103
104            _factory = (ServiceInterceptorFactory) factoryPoint
105                    .getService(ServiceInterceptorFactory.class);
106
107            Schema schema = factoryPoint.getParametersSchema();
108
109            SchemaProcessorImpl processor = new SchemaProcessorImpl(factoryPoint.getErrorLog(),
110                    schema);
111
112            processor.process(_parameters, _contributingModule);
113
114            _convertedParameters = processor.getElements();
115        }
116    }
117
118    public void setContributingModule(Module module)
119    {
120        _contributingModule = module;
121    }
122
123    public void setParameters(List list)
124    {
125        _parameters = list;
126    }
127
128    public String getFollowingInterceptorIds()
129    {
130        return _followingInterceptorIds;
131    }
132
133    public String getPrecedingInterceptorIds()
134    {
135        return _precedingInterceptorIds;
136    }
137
138    public void setFollowingInterceptorIds(String string)
139    {
140        _followingInterceptorIds = string;
141    }
142
143    public void setPrecedingInterceptorIds(String string)
144    {
145        _precedingInterceptorIds = string;
146    }
147
148}