001    package org.apache.fulcrum.yaafi.framework.context;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one
005     * or more contributor license agreements.  See the NOTICE file
006     * distributed with this work for additional information
007     * regarding copyright ownership.  The ASF licenses this file
008     * to you under the Apache License, Version 2.0 (the
009     * "License"); you may not use this file except in compliance
010     * with the License.  You may obtain a copy of the License at
011     *
012     *   http://www.apache.org/licenses/LICENSE-2.0
013     *
014     * Unless required by applicable law or agreed to in writing,
015     * software distributed under the License is distributed on an
016     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017     * KIND, either express or implied.  See the License for the
018     * specific language governing permissions and limitations
019     * under the License.
020     */
021    
022    import java.io.File;
023    
024    import org.apache.avalon.framework.context.Context;
025    import org.apache.avalon.framework.context.ContextException;
026    import org.apache.avalon.framework.context.DefaultContext;
027    import org.apache.fulcrum.yaafi.framework.constant.AvalonFortressConstants;
028    import org.apache.fulcrum.yaafi.framework.constant.AvalonMerlinConstants;
029    import org.apache.fulcrum.yaafi.framework.constant.AvalonPhoenixConstants;
030    import org.apache.fulcrum.yaafi.framework.constant.AvalonYaafiConstants;
031    import org.apache.fulcrum.yaafi.framework.util.Validate;
032    
033    /**
034     * Helper for converting a YAAFI context to a different container
035     *
036     * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
037     */
038    
039    public class YaafiToAvalonContextMapper
040    {
041        /** the name of the component for which we create the context */
042        private String urnAvalonName;
043    
044        /** the classloader of the component */
045        private ClassLoader urnAvalonClassLoader;
046    
047        /**
048         * Constructor
049         *
050         * @param urnAvalonName the name of the component for which we create the context
051         * @param urnAvalonClassLoader the classloader of the component
052         */
053        public YaafiToAvalonContextMapper( String urnAvalonName, ClassLoader urnAvalonClassLoader )
054        {
055            Validate.notEmpty( urnAvalonName, "urnAvalonName" );
056            Validate.notNull( urnAvalonClassLoader, "urnAvalonClassLoader" );
057    
058            this.urnAvalonName = urnAvalonName;
059            this.urnAvalonClassLoader = urnAvalonClassLoader;
060        }
061    
062        /**
063         * @return Returns the urnAvalonClassLoader.
064         */
065        public ClassLoader getUrnAvalonClassLoader()
066        {
067            return urnAvalonClassLoader;
068        }
069    
070        /**
071         * @return Returns the urnAvalonName.
072         */
073        public String getUrnAvalonName()
074        {
075            return urnAvalonName;
076        }
077    
078        /**
079         * Map a YAAFI (Merlin) context to a different incarnation
080         *
081         * @param context the context to be mapped
082         * @param to the target Avalon container
083         * @return the mapped context
084         * @throws ContextException accessing the context failed
085         */
086        public DefaultContext mapTo( Context context, String to )
087            throws ContextException
088        {
089            Validate.notNull( context, "context" );
090            Validate.notEmpty( to, "to" );
091    
092            if( AvalonPhoenixConstants.AVALON_CONTAINER_PHOENIX.equals(to) )
093            {
094                return mapToPhoenix(context);
095    
096            }
097            else if( AvalonFortressConstants.AVALON_CONTAINER_FORTESS.equals(to) )
098            {
099                return mapToFortress(context);
100    
101            }
102            else if( AvalonMerlinConstants.AVALON_CONTAINER_MERLIN.equals(to) )
103            {
104                return mapToMerlin(context);
105            }
106            else if( AvalonYaafiConstants.AVALON_CONTAINER_YAAFI.equals(to) )
107            {
108                return mapToYaafi(context);
109            }
110            else
111            {
112                String msg = "Don't know the following container type : " + to;
113                throw new IllegalArgumentException(msg);
114            }
115        }
116    
117        /**
118         * Map to a Phoenix context
119         *
120         * @param context the original context
121         * @return the mapped context
122         * @throws ContextException accessing the context failed
123         */
124        private DefaultContext mapToPhoenix( Context context )
125            throws ContextException
126        {
127            DefaultContext result = createDefaultContext(context);
128    
129            String urnAvalonPartition = (String) context.get(AvalonYaafiConstants.URN_AVALON_PARTITION);
130            File urnAvalonHome = (File) context.get(AvalonYaafiConstants.URN_AVALON_HOME);
131            String urnAvalonName = this.getUrnAvalonName();
132    
133            result.put(AvalonPhoenixConstants.PHOENIX_APP_NAME,urnAvalonPartition);
134            result.put(AvalonPhoenixConstants.PHOENIX_APP_HOME,urnAvalonHome);
135            result.put(AvalonPhoenixConstants.PHOENIX_BLOCK_NAME,urnAvalonName);
136    
137            return result;
138        }
139    
140        /**
141         * Map to a Fortress context
142         *
143         * @param context the original context
144         * @return the mapped context
145         * @throws ContextException accessing the context failed
146         */
147        private DefaultContext mapToFortress( Context context )
148            throws ContextException
149        {
150            DefaultContext result = createDefaultContext(context);
151    
152            String urnAvalonPartition = (String) context.get(AvalonYaafiConstants.URN_AVALON_PARTITION);
153            File urnAvalonHome = (File) context.get(AvalonYaafiConstants.URN_AVALON_HOME);
154            File urnAvalonTemp = (File) context.get(AvalonYaafiConstants.URN_AVALON_TEMP);
155            String urnAvalonName = this.getUrnAvalonName();
156    
157            result.put(AvalonFortressConstants.FORTRESS_COMPONENT_ID,urnAvalonPartition);
158            result.put(AvalonFortressConstants.FORTRESS_COMPONENT_LOGGER,urnAvalonName);
159            result.put(AvalonFortressConstants.FORTRESS_CONTEXT_ROOT,urnAvalonHome);
160            result.put(AvalonFortressConstants.FORTRESS_IMPL_WORKDIR,urnAvalonTemp);
161    
162            return result;
163        }
164    
165        /**
166         * Map to a Merlin context. Actually there is nothing to do but
167         * we do the full monty to ensure that context mannipulation wirks.
168         *
169         * @param context the original context
170         * @return the mapped context
171         * @throws ContextException accessing the context failed
172         */
173        private DefaultContext mapToMerlin( Context context )
174            throws ContextException
175        {
176            DefaultContext result = createDefaultContext(context);
177    
178            String urnAvalonPartition = (String) context.get(AvalonYaafiConstants.URN_AVALON_PARTITION);
179            File urnAvalonHome = (File) context.get(AvalonYaafiConstants.URN_AVALON_HOME);
180            File urnAvalonTemp = (File) context.get(AvalonYaafiConstants.URN_AVALON_TEMP);
181            String urnAvalonName = this.getUrnAvalonName();
182            ClassLoader urnAvalonClossLoader = this.getUrnAvalonClassLoader();
183    
184            result.put(AvalonMerlinConstants.URN_AVALON_PARTITION,urnAvalonPartition);
185            result.put(AvalonMerlinConstants.URN_AVALON_NAME,urnAvalonName);
186            result.put(AvalonMerlinConstants.URN_AVALON_HOME,urnAvalonHome);
187            result.put(AvalonMerlinConstants.URN_AVALON_TEMP,urnAvalonTemp);
188            result.put(AvalonMerlinConstants.URN_AVALON_CLASSLOADER,urnAvalonClossLoader);
189    
190            return result;
191        }
192    
193        /**
194         * Map to a YAAFI context.
195         *
196         * @param context the original context
197         * @return the mapped context
198         * @throws ContextException accessing the context failed
199         */
200        private DefaultContext mapToYaafi( Context context )
201            throws ContextException
202        {
203            DefaultContext result = createDefaultContext(context);
204    
205            String urnAvalonPartition = (String) context.get(AvalonYaafiConstants.URN_AVALON_PARTITION);
206            File urnAvalonHome = (File) context.get(AvalonYaafiConstants.URN_AVALON_HOME);
207            File urnAvalonTemp = (File) context.get(AvalonYaafiConstants.URN_AVALON_TEMP);
208            String urnAvalonName = this.getUrnAvalonName();
209            ClassLoader urnAvalonClossLoader = this.getUrnAvalonClassLoader();
210    
211            result.put(AvalonYaafiConstants.URN_AVALON_PARTITION,urnAvalonPartition);
212            result.put(AvalonYaafiConstants.URN_AVALON_NAME,urnAvalonName);
213            result.put(AvalonYaafiConstants.URN_AVALON_HOME,urnAvalonHome);
214            result.put(AvalonYaafiConstants.URN_AVALON_TEMP,urnAvalonTemp);
215            result.put(AvalonYaafiConstants.URN_AVALON_CLASSLOADER,urnAvalonClossLoader);
216            result.put(AvalonYaafiConstants.COMPONENT_APP_ROOT,urnAvalonHome.getAbsolutePath());
217    
218            return result;
219        }
220    
221        /**
222         * Create a context to work with
223         */
224        private DefaultContext createDefaultContext(Context context)
225        {
226            return new DefaultContext(context);
227        }
228    }