/* * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package flex2.compiler.config; import java.lang.reflect.*; import java.util.Map; import java.util.List; import java.util.Set; /** * Flex MXMLC compiler uses the result of the client configuration parser * to generate mixin initialization source code to be added to the SWF by * PreLink. It also requires a list of channel classes to be added as * dependencies. * * @exclude */ public class ServicesDependenciesWrapper { private Object servicesDependenciesInstance; private Class servicesDependenciesClass; @SuppressWarnings("unchecked") public ServicesDependenciesWrapper(String path, String parserClass, String contextRoot) { try { servicesDependenciesClass = Class.forName("flex.messaging.config.ServicesDependencies"); } catch (ClassNotFoundException e) { return; } Class partypes[] = new Class[3]; partypes[0] = String.class; partypes[1] = String.class; partypes[2] = String.class; try { Constructor ct = servicesDependenciesClass.getConstructor(partypes); Object arglist[] = new Object[3]; arglist[0] = path; arglist[1] = parserClass; arglist[2] = contextRoot; try { servicesDependenciesInstance = ct.newInstance(arglist); } catch (Exception e3) { if(e3 instanceof InvocationTargetException) { e3.getCause().printStackTrace(); } else { e3.printStackTrace(); } } } catch (NoSuchMethodException e2) { } } @SuppressWarnings("unchecked") public Set getLazyAssociations(String destination) { if (servicesDependenciesClass != null) { try { Method method = servicesDependenciesClass.getMethod("getLazyAssociations", new Class[] {String.class}); Object arglist[] = new Object[1]; arglist[0] = destination; return (Set)method.invoke(servicesDependenciesInstance, arglist); } catch (Exception e) { } } return null; } @SuppressWarnings("unchecked") public void addLazyAssociation(String destination, String associationProp) { if (servicesDependenciesClass != null) { try { Method method = servicesDependenciesClass.getMethod("getLazyAssociations", new Class[] {String.class}); Object arglist[] = new Object[2]; arglist[0] = destination; arglist[1] = associationProp; method.invoke(servicesDependenciesInstance, arglist); } catch (Exception e) { } } } @SuppressWarnings("unchecked") public String getServerConfigXmlInit() { if (servicesDependenciesClass != null) { try { Method method = servicesDependenciesClass.getMethod("getServerConfigXmlInit", new Class[] {} ); Object arglist[] = new Object[0]; return (String)method.invoke(servicesDependenciesInstance, arglist); } catch (Exception e) { } } return null; } @SuppressWarnings("unchecked") public String getImports() { if (servicesDependenciesClass != null) { try { Method method = servicesDependenciesClass.getMethod("getImports", new Class[] {} ); Object arglist[] = new Object[0]; return (String)method.invoke(servicesDependenciesInstance, arglist); } catch (Exception e) { } } return null; } @SuppressWarnings("unchecked") public String getReferences() { if (servicesDependenciesClass != null) { try { Method method = servicesDependenciesClass.getMethod("getReferences", new Class[] {} ); Object arglist[] = new Object[0]; return (String)method.invoke(servicesDependenciesInstance, arglist); } catch (Exception e) { } } return null; } @SuppressWarnings("unchecked") public List getChannelClasses() { if (servicesDependenciesClass != null) { try { Method method = servicesDependenciesClass.getMethod("getChannelClasses", new Class[] {} ); Object arglist[] = new Object[0]; return (List)method.invoke(servicesDependenciesInstance, arglist); } catch (Exception e) { } } return null; } @SuppressWarnings("unchecked") public void addChannelClass(String className) { if (servicesDependenciesClass != null) { try { Method method = servicesDependenciesClass.getMethod("addChannelClass", new Class[] {} ); Object arglist[] = new Object[0]; method.invoke(servicesDependenciesInstance, arglist); } catch (Exception e) { } } } @SuppressWarnings("unchecked") public void addConfigPath(String path, long modified) { if (servicesDependenciesClass != null) { try { Method method = servicesDependenciesClass.getMethod("addConfigPath", new Class[] { String.class, Long.TYPE } ); Object arglist[] = new Object[2]; arglist[0] = path; arglist[1] = modified; method.invoke(servicesDependenciesInstance, arglist); } catch (Exception e) { } } } @SuppressWarnings("unchecked") public Map getConfigPaths() { if (servicesDependenciesClass != null) { try { Method method = servicesDependenciesClass.getMethod("getConfigPaths", new Class[] {} ); Object arglist[] = new Object[0]; return (Map)method.invoke(servicesDependenciesInstance, arglist); } catch (Exception e) { } } return null; } /* public static ClientConfiguration getClientConfiguration(String path, String parserClass) { ClientConfiguration config = new ClientConfiguration(); ConfigurationParser parser = getConfigurationParser(parserClass); if (parser == null) { // "Unable to create a parser to load messaging configuration." LocalizedException lme = new LocalizedException(); lme.setMessage(10138); throw lme; } LocalFileResolver local = new LocalFileResolver(); parser.parse(path, local, config); config.addConfigPath(path, new File(path).lastModified()); return config; } static ConfigurationParser getConfigurationParser(String className) { ConfigurationParser parser = null; Class parserClass = null; // Check for Custom Parser Specification if (className != null) { try { parserClass = Class.forName(className); parser = (ConfigurationParser)parserClass.newInstance(); } catch (Exception t) { if (traceConfig) { System.out.println("Could not load services configuration parser as: " + className); } } } // Try Sun JRE 1.4 / Apache Xalan Based Implementation if (parser == null) { try { Class.forName("org.apache.xpath.CachedXPathAPI"); className = "flex.messaging.config.ApacheXPathClientConfigurationParser"; parserClass = Class.forName(className); parser = (ConfigurationParser)parserClass.newInstance(); } catch (Exception t) { if (traceConfig) { System.out.println("Could not load configuration parser as: " + className); } } } // Try Sun JRE 1.5 Based Implementation if (parser == null) { try { className = "flex.messaging.config.XPathClientConfigurationParser"; parserClass = Class.forName(className); // double-check, on some systems the above loads but the import classes don't Class.forName("javax.xml.xpath.XPathExpressionException"); parser = (ConfigurationParser)parserClass.newInstance(); } catch (Exception t) { if (traceConfig) { System.out.println("Could not load configuration parser as: " + className); } } } if (traceConfig && parser != null) { System.out.println("Services Configuration Parser: " + parser.getClass().getName()); } return parser; } private static List listChannelClasses(ServicesConfiguration config) { List channelList = new ArrayList(); Iterator it = config.getAllChannelSettings().values().iterator(); while (it.hasNext()) { ChannelSettings settings = (ChannelSettings)it.next(); if (!settings.serverOnly) { String clientType = settings.getClientType(); channelList.add(clientType); } } return channelList; } */ /** * public void codegenServiceAssociations(ConfigMap metadata, StringBuffer e4x, String destination, String relation) { if (servicesDependenciesClass != null) { try { Method method = servicesDependenciesClass.getMethod("getConfigPaths", new Class[] { ConfigMap.class, StringBuffer.class, String.class, String.class } ); Object arglist[] = new Object[4]; arglist[0] = metadata; arglist[1] = e4x; arglist[2] = destination; arglist[3] = relation; method.invoke(servicesDependenciesInstance, arglist); } catch (Exception e) { } } } */ /** * This method will return an import and variable reference for channels specified in the map. * @param map HashMap containing the client side channel type to be used, typically of the form * "mx.messaging.channels.XXXXChannel", where the key and value are equal. * @param imports StringBuffer of the imports needed for the given channel definitions * @param references StringBuffer of the required references so that these classes will be linked in. public static void codegenServiceImportsAndReferences(Map map, StringBuffer imports, StringBuffer references) { String channelSetImplType = (String)map.remove("ChannelSetImpl"); String type; imports.append("import mx.messaging.config.ServerConfig;\n"); references.append(" // static references for configured channels\n"); for (Iterator chanIter = map.values().iterator(); chanIter.hasNext();) { type = (String)chanIter.next(); imports.append("import "); imports.append(type); imports.append(";\n"); references.append(" private static var "); references.append(type.replace('.', '_')); references.append("_ref:"); references.append(type.substring(type.lastIndexOf(".") +1) +";\n"); } if (channelSetImplType != null) imports.append("import mx.messaging.AdvancedChannelSet;\nimport mx.messaging.messages.ReliabilityMessage;\n"); } */ }