001 package org.apache.fulcrum.yaafi.framework.role;
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.util.ArrayList;
023
024 import org.apache.avalon.framework.configuration.Configuration;
025 import org.apache.avalon.framework.configuration.ConfigurationException;
026 import org.apache.fulcrum.yaafi.framework.constant.AvalonFortressConstants;
027 import org.apache.fulcrum.yaafi.framework.constant.AvalonPhoenixConstants;
028 import org.apache.fulcrum.yaafi.framework.constant.AvalonYaafiConstants;
029 import org.apache.fulcrum.yaafi.framework.util.Validate;
030
031 /**
032 * Parses the role configuration file of various Avalon containers.
033 *
034 * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
035 */
036
037 public class RoleConfigurationParserImpl
038 implements RoleConfigurationParser
039 {
040 /** The flavour of Avalon container */
041 private String containerFlavour;
042
043 /**
044 * Constructor
045 * @param containerFlavour The flavour of Avalon container
046 */
047 public RoleConfigurationParserImpl( String containerFlavour )
048 {
049 Validate.notEmpty( containerFlavour, "containerFlavour" );
050 this.containerFlavour = containerFlavour;
051 }
052
053 /**
054 * Parses a role configuration file.
055 *
056 * @param roleConfiguration the role configuration file to parse
057 * @return the parsed RoleEntries
058 * @throws ConfigurationException the configuration couldn't be processsed
059 */
060 public RoleEntry[] parse( Configuration roleConfiguration )
061 throws ConfigurationException
062 {
063 Validate.notNull( roleConfiguration, "roleConfiguration" );
064
065 if( AvalonYaafiConstants.AVALON_CONTAINER_YAAFI.equals(containerFlavour) )
066 {
067 return mapFromYaafi(roleConfiguration);
068
069 }
070 if( AvalonPhoenixConstants.AVALON_CONTAINER_PHOENIX.equals(containerFlavour) )
071 {
072 return mapFromPhoenix(roleConfiguration);
073
074 }
075 else if( AvalonFortressConstants.AVALON_CONTAINER_FORTESS.equals(containerFlavour) )
076 {
077 return mapFromFortress(roleConfiguration);
078
079 }
080 else
081 {
082 String msg = "Don't know the following container flavour : " + containerFlavour;
083 throw new IllegalArgumentException(msg);
084 }
085 }
086
087 /**
088 * Parses a YAAFI role configuration file.
089 *
090 * @param roleConfiguration the role configuration
091 * @return the role entries from the configuration file
092 * @throws ConfigurationException the configuration couldn't be processsed
093 */
094 private RoleEntry[] mapFromYaafi( Configuration roleConfiguration )
095 throws ConfigurationException
096 {
097 Validate.notNull(roleConfiguration, "roleConfiguration");
098
099 String clazzName = null;
100 String name = null;
101 String shorthand = null;
102 boolean isEarlyInit = false;
103 String description = null;
104 String componentType = null;
105 String componentFlavour = null;
106 boolean hasProxy = false;
107 ArrayList interceptorList = null;
108 String logCategory = null;
109 RoleEntry roleEntry = null;
110
111 Configuration[] list = roleConfiguration.getChildren( "role" );
112 RoleEntry[] result = new RoleEntry[list.length];
113
114 for( int i=0; i<list.length; i++ )
115 {
116 clazzName = list[i].getAttribute("default-class");
117 name = list[i].getAttribute("name",clazzName);
118 shorthand = list[i].getAttribute("shorthand",name);
119 isEarlyInit = list[i].getAttributeAsBoolean("early-init",true);
120 description = list[i].getAttribute("description",null);
121 componentType = list[i].getAttribute("component-type","avalon");
122 componentFlavour = list[i].getAttribute("component-flavour", AvalonYaafiConstants.AVALON_CONTAINER_YAAFI);
123 hasProxy = list[i].getAttributeAsBoolean("has-proxy",true);
124 logCategory = list[i].getAttribute("logger",shorthand);
125
126 // parse the list of defined interceptors
127
128 Configuration[] interceptorConfigList = list[i].getChild("interceptors").getChildren("interceptor");
129 interceptorList = new ArrayList();
130
131 for( int j=0; j<interceptorConfigList.length; j++ )
132 {
133 interceptorList.add(interceptorConfigList[j].getValue("interceptor"));
134 }
135
136 // create a role entry
137
138 roleEntry = new RoleEntryImpl(
139 name,
140 clazzName,
141 shorthand,
142 isEarlyInit,
143 description,
144 componentType,
145 componentFlavour,
146 hasProxy,
147 interceptorList,
148 logCategory
149 );
150
151 result[i] = roleEntry;
152 }
153
154 return result;
155 }
156
157 private RoleEntry[] mapFromPhoenix( Configuration roleConfiguration )
158 throws ConfigurationException
159 {
160 Validate.notNull(roleConfiguration, "roleConfiguration");
161 throw new ConfigurationException("Not supported yet");
162 }
163
164 private RoleEntry[] mapFromFortress( Configuration roleConfiguration )
165 throws ConfigurationException
166 {
167 Validate.notNull(roleConfiguration, "roleConfiguration");
168 throw new ConfigurationException("Not supported yet");
169 }
170 }