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 Avalon Context of Fortress and Phoenix 035 * container to a standard Merlin context. 036 * 037 * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a> 038 */ 039 040 public class AvalonToYaafiContextMapper 041 { 042 /** The directory for storing temporary files */ 043 private File tempRootDir; 044 045 /** Our default context */ 046 private DefaultContext defaultContext; 047 048 /** our defaul class loader */ 049 private ClassLoader classLoader; 050 051 /** 052 * Constructor 053 * 054 * @param tempRootDir current temp directory 055 * @param context the existing context 056 */ 057 public AvalonToYaafiContextMapper( 058 File tempRootDir, 059 Context context, 060 ClassLoader classLoader) 061 { 062 Validate.notNull( tempRootDir, "tempRootDir" ); 063 Validate.notNull( context, "context" ); 064 Validate.notNull( classLoader, "classLoader" ); 065 066 this.tempRootDir = tempRootDir; 067 this.classLoader = classLoader; 068 069 // here we have to create a new DefaultContext since 070 // it contains service specific entries 071 072 this.defaultContext = new DefaultContext( context ); 073 } 074 075 /** 076 * Map a Avalon context to the YAAFI (Merlin) incarnation whereas 077 * the following containers are supported 078 * <ul> 079 * <li>merlin</li> 080 * <li>fortress</li> 081 * <li>phoenix</li> 082 * </ul> 083 * 084 * @param context the Avalon context to map 085 * @param from Avalon container identifier 086 * @return the mapped Avalon context 087 * @throws ContextException Accessing the context failed 088 */ 089 public Context mapFrom( Context context, String from ) 090 throws ContextException 091 { 092 Validate.notNull( context, "context" ); 093 Validate.notEmpty( from, "from" ); 094 095 if( AvalonPhoenixConstants.AVALON_CONTAINER_PHOENIX.equals(from) ) 096 { 097 return mapFromPhoenix(context); 098 099 } 100 else if( AvalonFortressConstants.AVALON_CONTAINER_FORTESS.equals(from) ) 101 { 102 return mapFromFortress(context); 103 104 } 105 else if( AvalonMerlinConstants.AVALON_CONTAINER_MERLIN.equals(from) ) 106 { 107 return mapFromMerlin(context); 108 } 109 else if( AvalonYaafiConstants.AVALON_CONTAINER_YAAFI.equals(from) ) 110 { 111 return mapFromMerlin(context); 112 } 113 else 114 { 115 String msg = "Don't know the following container type : " + from; 116 throw new IllegalArgumentException(msg); 117 } 118 } 119 120 /** 121 * Map a Avalon Phoenix context to the YAAFI (Merlin) incarnation 122 * 123 * @param context the Avalon context to map 124 * @return the mapped Avalon context 125 * @throws ContextException Accessing the context failed 126 */ 127 private Context mapFromPhoenix(Context context) 128 throws ContextException 129 { 130 DefaultContext result = this.getDefaultContext(); 131 132 String urnAvalonName = AvalonYaafiConstants.AVALON_CONTAINER_YAAFI; 133 String urnAvalonPartition = (String) context.get( AvalonPhoenixConstants.PHOENIX_APP_NAME ); 134 File urnAvalonHome = (File) context.get( AvalonPhoenixConstants.PHOENIX_APP_HOME ); 135 File urnAvalonTemp = this.getTempRootDir(); 136 137 // add the Merlin specific parameters 138 139 result.put( AvalonYaafiConstants.URN_AVALON_NAME, urnAvalonName ); 140 result.put( AvalonYaafiConstants.URN_AVALON_PARTITION, urnAvalonPartition ); 141 result.put( AvalonYaafiConstants.URN_AVALON_HOME, urnAvalonHome ); 142 result.put( AvalonYaafiConstants.URN_AVALON_TEMP, urnAvalonTemp ); 143 result.put( AvalonYaafiConstants.URN_AVALON_CLASSLOADER, this.getClassLoader() ); 144 145 // add the deprecated ECM parameter 146 147 result.put(AvalonYaafiConstants.COMPONENT_APP_ROOT, urnAvalonHome.getAbsolutePath()); 148 149 // add the Fortress specific parameters 150 151 result.put(AvalonFortressConstants.FORTRESS_COMPONENT_ID,urnAvalonPartition); 152 result.put(AvalonFortressConstants.FORTRESS_COMPONENT_LOGGER,urnAvalonName); 153 result.put(AvalonFortressConstants.FORTRESS_CONTEXT_ROOT,urnAvalonHome); 154 result.put(AvalonFortressConstants.FORTRESS_IMPL_WORKDIR,urnAvalonTemp); 155 156 return result; 157 } 158 159 /** 160 * Map a Avalon Fortress context to the YAAFI (Merlin) incarnation 161 * 162 * @param context the Avalon context to map 163 * @return the mapped Avalon context 164 * @throws ContextException Accessing the context failed 165 */ 166 private Context mapFromFortress(Context context) 167 throws ContextException 168 { 169 DefaultContext result = this.getDefaultContext(); 170 171 String urnAvalonPartition = (String) context.get( AvalonFortressConstants.FORTRESS_COMPONENT_ID ); 172 File urnAvalonHome = (File) context.get( AvalonFortressConstants.FORTRESS_CONTEXT_ROOT ); 173 File urnAvalonTemp = (File) context.get( AvalonFortressConstants.FORTRESS_IMPL_WORKDIR ); 174 175 // add the Merlin specific parameters 176 177 result.put( AvalonYaafiConstants.URN_AVALON_NAME, AvalonYaafiConstants.AVALON_CONTAINER_YAAFI ); 178 result.put( AvalonYaafiConstants.URN_AVALON_PARTITION, urnAvalonPartition ); 179 result.put( AvalonYaafiConstants.URN_AVALON_HOME, urnAvalonHome ); 180 result.put( AvalonYaafiConstants.URN_AVALON_TEMP, urnAvalonTemp ); 181 result.put( AvalonYaafiConstants.URN_AVALON_CLASSLOADER, this.getClassLoader() ); 182 183 // add the deprecated ECM parameter 184 185 result.put(AvalonYaafiConstants.COMPONENT_APP_ROOT, urnAvalonHome.getAbsolutePath()); 186 187 188 return result; 189 } 190 191 /** 192 * Map a Avalon Merlin context to the YAAFI (Merlin) incarnation 193 * 194 * @param context the Avalon context to map 195 * @return the mapped Avalon context 196 * @throws ContextException Accessing the context failed 197 */ 198 private Context mapFromMerlin(Context context) 199 throws ContextException 200 { 201 DefaultContext result = this.getDefaultContext(); 202 203 String urnAvalonPartition = (String) context.get(AvalonYaafiConstants.URN_AVALON_PARTITION); 204 File urnAvalonHome = (File) context.get(AvalonYaafiConstants.URN_AVALON_HOME); 205 File urnAvalonTemp = (File) context.get(AvalonYaafiConstants.URN_AVALON_TEMP); 206 String urnAvalonName = (String) (String) context.get(AvalonYaafiConstants.URN_AVALON_NAME); 207 208 // add the Fortress specific parameters 209 210 result.put(AvalonFortressConstants.FORTRESS_COMPONENT_ID,urnAvalonPartition); 211 result.put(AvalonFortressConstants.FORTRESS_COMPONENT_LOGGER,urnAvalonName); 212 result.put(AvalonFortressConstants.FORTRESS_CONTEXT_ROOT,urnAvalonHome); 213 result.put(AvalonFortressConstants.FORTRESS_IMPL_WORKDIR,urnAvalonTemp); 214 215 // add the deprecated ECM parameter 216 217 result.put(AvalonYaafiConstants.COMPONENT_APP_ROOT, urnAvalonHome.getAbsolutePath()); 218 219 return result; 220 221 } 222 223 /** 224 * @return Returns the classLoader. 225 */ 226 private ClassLoader getClassLoader() 227 { 228 return this.classLoader; 229 } 230 231 /** 232 * @return Returns the defaultContext. 233 */ 234 private DefaultContext getDefaultContext() 235 { 236 return this.defaultContext; 237 } 238 239 /** 240 * @return Returns the tempRootDir. 241 */ 242 private File getTempRootDir() 243 { 244 return this.tempRootDir; 245 } 246 }