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 }