From scm-return-20922-apmail-geronimo-scm-archive=geronimo.apache.org@geronimo.apache.org Wed Aug 01 15:06:18 2007 Return-Path: Delivered-To: apmail-geronimo-scm-archive@www.apache.org Received: (qmail 40589 invoked from network); 1 Aug 2007 15:06:14 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 1 Aug 2007 15:06:14 -0000 Received: (qmail 84318 invoked by uid 500); 1 Aug 2007 15:06:14 -0000 Delivered-To: apmail-geronimo-scm-archive@geronimo.apache.org Received: (qmail 84281 invoked by uid 500); 1 Aug 2007 15:06:14 -0000 Mailing-List: contact scm-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list scm@geronimo.apache.org Received: (qmail 84270 invoked by uid 99); 1 Aug 2007 15:06:14 -0000 Received: from Unknown (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 01 Aug 2007 08:06:14 -0700 X-ASF-Spam-Status: No, hits=-100.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 01 Aug 2007 15:06:02 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 679041A9831; Wed, 1 Aug 2007 08:05:24 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r561821 [11/12] - in /geronimo/sandbox/j2g: ./ configurator/ doc/ plugins/ plugins/org.apache.geronimo.j2g.common/ plugins/org.apache.geronimo.j2g.descriptors/ plugins/org.apache.geronimo.j2g.descriptors/src/ plugins/org.apache.geronimo.j2g... Date: Wed, 01 Aug 2007 15:05:17 -0000 To: scm@geronimo.apache.org From: pmcmahan@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070801150524.679041A9831@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/AbsoluteNameSolver.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/AbsoluteNameSolver.java?view=diff&rev=561821&r1=561820&r2=561821 ============================================================================== --- geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/AbsoluteNameSolver.java (original) +++ geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/AbsoluteNameSolver.java Wed Aug 1 08:05:12 2007 @@ -1,469 +1,469 @@ -/** - * 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 org.apache.geronimo.j2g.sources.environment; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; -import java.util.Properties; - -import org.apache.geronimo.j2g.common.IOutput; -import org.apache.geronimo.j2g.common.Tool; -import org.dom4j.Document; -import org.dom4j.DocumentException; -import org.dom4j.Element; -import org.dom4j.Node; -import org.dom4j.io.OutputFormat; -import org.dom4j.io.SAXReader; -import org.dom4j.io.XMLWriter; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.ITypeBinding; -import org.eclipse.jdt.core.dom.Type; - - -/** - * Provides a mechanism to solve absolute JNDI name used in javax.naming.lookup - * method. - */ -public class AbsoluteNameSolver { - /** Static couner for generating valid ejb names. */ - private static int counter = 0; - - /** Property file with EJB interfaces */ - public final static String INTERFACES_PROP_FILENAME = "beans-interfaces.properties"; - public final static String INTERFACES_PROP_DIRECTORY = System.getenv("ECLIPSE_HOME")+"/plugins/org.apache.geronimo.j2g.sources.environment/"; - - /** Property file with paths for searching types in jboss.xml */ - public final static String BEANS_TYPES_PROP_FILENAME = "beans-types.properties"; - public final static String BEANS_TYPES_PROP_DIRECTORY = System.getenv("ECLIPSE_HOME")+"/plugins/org.apache.geronimo.j2g.sources.environment/"; - - /** - * Property file with paths for searching home and remote interfaces in - * ejb-jar.xml - */ - public final static String BEANS_REFS_PROP_FILENAME = "beans-references.properties"; - public final static String BEANS_REFS_PROP_DIRECTORY = System.getenv("ECLIPSE_HOME")+"/plugins/org.apache.geronimo.j2g.sources.environment/"; - - /** References in ejb-jar.xml to be found */ - private final static String[] EJB_REFS = { "ejb-ref", "ejb-local-ref", - "resource-ref", "resource-env-ref" }; - - /** Separator string for XPath */ - private final static String XPATH_SEPARATOR = "/"; - - /** Separator string for XPath for access elements by non-full names. */ - private final static String DOUBLE_XPATH_SEPARATOR = "//"; - - /** Ejb classname element int ejb-jar.xml */ - private final static String EJB_CLASS_ELM = "ejb-class"; - - /** Ejb name element. */ - private final static String EJB_NAME_ELM = "ejb-name"; - - /** Ejb reference element for add references to ejb-jar.xml */ - private final static String EJB_REF_ELM = "ejb-ref"; - - /** Ejb reference element for add references to ejb-jar.xml */ - private final static String EJB_LOCAL_REF_ELM = "ejb-local-ref"; - - /** Ejb reference JNDI name element. */ - private final static String EJB_REF_NAME_ELM = "ejb-ref-name"; - - /** Ejb reference type element. (Session | Entity) */ - private final static String EJB_REF_TYPE_ELM = "ejb-ref-type"; - - /** Ejb link element. */ - private final static String EJB_LINK_ELM = "ejb-link"; - - /** Base name for generating full ejb reference name. */ - private final static String BASE_JNDI_NAME = "ejb/"; - - /** Session reference type */ - private final static String SESSION_TYPE = "Session"; - - /** Entity reference type */ - private final static String ENTITY_TYPE = "Entity"; - - /** Property file with EJB interfaces */ - public static Properties interfaces; - - /** Property file with paths for searching types in jboss.xml */ - private static Properties beansTypes; - - /** - * Property file with paths for searching home and remote interfaces in - * ejb-jar.xml - */ - private static Properties beansRefs; - - /** Home interface suffix */ - private final static String HOME_INTERFACE_SUFFIX = "-home"; - - /** XPath to session elements. */ - private final static String SESSION_XPATH = "/ejb-jar/enterprise-beans/session/"; - - /** XPath to entity elements */ - private final static String ENTITY_XPATH = "/ejb-jar/enterprise-beans/entity/"; - - /** Full qualified classname for current class */ - private String qualifiedClassName; - - /** Superinterfaces for current class. */ - private List superInterfaces; - - /** Output */ - private IOutput out; - - /** Current compilation unit */ - private CompilationUnit unit; - - /** SAX reader */ - private SAXReader xmlReader; - - /** XPath path for class */ - private String pathForClass; - - /** - * Constructor. - * - * @param qualifiedClassName - * full qualified class name which defined in compilation unit. - * @param unit - * compilation unit. - * @param superIterfaces - * super interfaces implemented by class which defined in - * compilation unit. - * @throws NameSolvingException - */ - public AbsoluteNameSolver(String qualifiedClassName, List superIterfaces, - CompilationUnit unit) throws NameSolvingException { - this.out = Tool.getCurrent().getOutput(); - this.qualifiedClassName = qualifiedClassName; - this.superInterfaces = superIterfaces; - this.unit = unit; - pathForClass = getPathForClass(); - xmlReader = new SAXReader(true); - } - - /** - * Tries to find already existing references to current class. If none - * found, tries to resolve type of the current ejb and to add ejb reference - * for current absolute name. - * - * @param absoluteName - * absolute name which should be solved. - * @param position - * position in compilation unit. - * @param ejbJar - * existed ejb-jar.xml descriptor. (META-INF/ejb-jar.xml) - * @param jbossXml - * existed jboss.xml descriptor. (META-INf/jboss.xml) - * @return JNDI name in local context which was referenced in ejb-jar - * descriptor. - * @throws NameSolvingException - * if any errors occurs while solving absolute names. - */ - public String solveName(String absoluteName, int position, File ejbJar, - File jbossXml) throws NameSolvingException { - loadProperties(); - if (pathForClass != null) { - Document ejbJarDoc = null; - try { - ejbJarDoc = xmlReader.read(ejbJar); - } catch (DocumentException ex) { - throw new NameSolvingException( - "Error occured while reading xml descriptor " - + jbossXml.getAbsolutePath() - + ". It is possible that the migrator cannot download the xml schema or the xml file has incorrect syntax. Nested exception:" - + ex.getMessage()); - } - - List nodes = ejbJarDoc.selectNodes(pathForClass + XPATH_SEPARATOR - + EJB_CLASS_ELM); - Iterator nodesIter = nodes.iterator(); - Node ejbJarNode = null; - while (nodesIter.hasNext()) { - Node node = (Node) nodesIter.next(); - if (qualifiedClassName.equals(node.getStringValue().trim())) { - ejbJarNode = node.getParent(); - for (int i = 0; i < EJB_REFS.length; i++) { - List refsNodes = ejbJarNode - .selectNodes(DOUBLE_XPATH_SEPARATOR - + EJB_REFS[i]); - if (!refsNodes.isEmpty()) { - Iterator references = refsNodes.iterator(); - - while (references.hasNext()) { - Node referenceNode = (Node) references.next(); - String refName = getNodeValueByName( - referenceNode, EJB_REF_NAME_ELM); - if (refName != null - && absoluteName.equals(refName.trim())) { - out - .warn(AbsoluteNameSolver.class.getSimpleName(), - "Cannot add reference to the absolute name '" - + absoluteName - + "' because the reference in ejb-jar.xml descriptor to current class is already defined.", - unit - .getLineNumber(position), - unit - .getColumnNumber(position)); - return null; - } - } - } - } - break; - } - } - if (ejbJarNode != null) { - Document jbossXmlDoc = null; - try { - jbossXmlDoc = xmlReader.read(jbossXml); - } catch (DocumentException ex) { - throw new NameSolvingException( - "Error occured while reading xml descriptor " - + jbossXml.getAbsolutePath() - + ". It is possible that the migrator cannot download the xml schema or the xml file has incorrect syntax. Nested exception:" - + ex.getMessage()); - } - Enumeration paths = beansTypes.keys(); - while (paths.hasMoreElements()) { - String path = (String) paths.nextElement(); - List findedNodes = jbossXmlDoc.selectNodes(path); - Iterator findedNodesIter = findedNodes.iterator(); - while (findedNodesIter.hasNext()) { - Node jbossXmlNode = (Node) findedNodesIter.next(); - if (absoluteName.equals(jbossXmlNode.getStringValue() - .trim())) { - String type = beansTypes.getProperty(path); - String ejbName = getNodeValueByName( - jbossXmlNode.getParent(), EJB_NAME_ELM) - .trim(); - Node referenceNode = null; - String ejbRefType = null; - List sessionNodes = ejbJarDoc - .selectNodes(SESSION_XPATH + EJB_NAME_ELM); - Iterator sessionNodesIter = sessionNodes.iterator(); - while (sessionNodesIter.hasNext()) { - Node ejbNameNode = (Node) sessionNodesIter - .next(); - if (ejbName - .equals(ejbNameNode.getStringValue())) { - referenceNode = ejbNameNode.getParent(); - ejbRefType = SESSION_TYPE; - break; - } - } - if (ejbRefType == null) { - List entityNodes = ejbJarDoc - .selectNodes(ENTITY_XPATH - + EJB_NAME_ELM); - Iterator entityNodesIter = entityNodes - .iterator(); - while (entityNodesIter.hasNext()) { - Node ejbNameNode = (Node) entityNodesIter - .next(); - if (ejbName.equals(ejbNameNode - .getStringValue())) { - referenceNode = ejbNameNode.getParent(); - ejbRefType = ENTITY_TYPE; - break; - } - } - } - if (referenceNode != null) { - String homeIterfacePath = beansRefs - .getProperty(type - + HOME_INTERFACE_SUFFIX); - String homeIterface = getNodeValueByName( - referenceNode, homeIterfacePath); - String objectIterfacePath = beansRefs - .getProperty(type); - String objectIterface = getNodeValueByName( - referenceNode, objectIterfacePath); - Element ejbJarElement = (Element) ejbJarNode; - Element ejbRef = null; - if (objectIterfacePath.equals("remote")) { - ejbRef = ejbJarElement - .addElement(EJB_REF_ELM); - } else { - ejbRef = ejbJarElement - .addElement(EJB_LOCAL_REF_ELM); - } - - String refName = generateNewRefName(); - ejbRef.addElement(EJB_REF_NAME_ELM).addText( - refName); - ejbRef.addElement(EJB_REF_TYPE_ELM).addText( - ejbRefType); - ejbRef.addElement(homeIterfacePath).addText( - homeIterface); - ejbRef.addElement(objectIterfacePath).addText( - objectIterface); - ejbRef.addElement(EJB_LINK_ELM) - .addText(ejbName); - serializetoXML(ejbJar, ejbJarDoc); - return refName; - } else { - out.error(AbsoluteNameSolver.class.getSimpleName(), "Cannot find the EJB definition in ejb-jar.xml to create a reference for it."); - } - } - } - } - } - } - return null; - } - - /** - * Generates new names for ejb references. It looks like - * 'ejb/SimpleClassName_x' - * - * @return new generated reference name. - */ - private String generateNewRefName() { - String simpleClassName = qualifiedClassName - .substring(qualifiedClassName.lastIndexOf(".") + 1); - return BASE_JNDI_NAME + simpleClassName + "_" + (counter++); - } - - /** - * Saves document to file. - * - * @param xmlFile - * destination file. - * @param doc - * xml document. - * @throws NameSolvingException - * if cannot save document. - */ - private void serializetoXML(File xmlFile, Document doc) - throws NameSolvingException { - try { - OutputStream output = new FileOutputStream(xmlFile); - OutputFormat outformat = OutputFormat.createPrettyPrint(); - XMLWriter writer = new XMLWriter(output, outformat); - writer.write(doc); - writer.flush(); - } catch (Exception ex) { - throw new NameSolvingException( - "Error occurs while xml descriptors saving.", ex); - } - } - - /** - * Gets string value of element in node by it name. - * - * @param parent - * parent node. - * @param name - * element name. - * @return string value of element in node. - */ - private String getNodeValueByName(Node parent, String name) { - Node node = parent.selectSingleNode(name); - if (node != null) { - return node.getStringValue(); - } - return null; - } - - /** - * Gets XPath where need to search already defined references for current - * class defined in current compilation unit and determines type of - * reference required for current class. - * - * @return XPath in ejb-jar.xml descriptor. - * @throws NameSolvingException - * if cannot load properties files. - */ - private String getPathForClass() throws NameSolvingException { - loadProperties(); - Enumeration enumeration = interfaces.keys(); - while (enumeration.hasMoreElements()) { - String ejbInterface = (String) enumeration.nextElement(); - Iterator types = superInterfaces.iterator(); - while (types.hasNext()) { - Type superType = (Type) types.next(); - ITypeBinding bind = superType.resolveBinding(); - if (bind != null - && bind.getQualifiedName().equals(ejbInterface)) { - String path = interfaces.getProperty(ejbInterface); - return path; - } - } - } - return null; - } - - /** - * @return true if class is an EJB bean. - */ - public boolean isEjbBeanClass() { - return (pathForClass != null); - } - - /** - * Loads all necessary properties files. - * - * @throws NameSolvingException - * if cannot load one or more properts files. - */ - private void loadProperties() throws NameSolvingException { - if (interfaces == null) { - interfaces = new Properties(); - try { - File propertyFile = new File(INTERFACES_PROP_DIRECTORY + INTERFACES_PROP_FILENAME); - interfaces.load(new FileInputStream(propertyFile)); - } catch (IOException ex) { - throw new NameSolvingException( - "Cannot read system property file: " + INTERFACES_PROP_FILENAME, - ex); - } - } - - if (beansTypes == null) { - beansTypes = new Properties(); - try { - File propertyFile = new File(BEANS_TYPES_PROP_DIRECTORY + BEANS_TYPES_PROP_FILENAME); - beansTypes.load(new FileInputStream(propertyFile)); - } catch (IOException ex) { - throw new NameSolvingException( - "Cannot read system property file: " + BEANS_TYPES_PROP_FILENAME, - ex); - } - } - - if (beansRefs == null) { - beansRefs = new Properties(); - try { - File propertyFile = new File(BEANS_REFS_PROP_DIRECTORY + BEANS_REFS_PROP_FILENAME); - beansRefs.load(new FileInputStream(propertyFile)); - } catch (IOException ex) { - throw new NameSolvingException( - "Cannot read system property file: " + BEANS_REFS_PROP_FILENAME, - ex); - } - } - } -} +/** + * 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 org.apache.geronimo.j2g.sources.environment; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; + +import org.apache.geronimo.j2g.common.IOutput; +import org.apache.geronimo.j2g.common.Tool; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.Node; +import org.dom4j.io.OutputFormat; +import org.dom4j.io.SAXReader; +import org.dom4j.io.XMLWriter; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.core.dom.Type; + + +/** + * Provides a mechanism to solve absolute JNDI name used in javax.naming.lookup + * method. + */ +public class AbsoluteNameSolver { + /** Static couner for generating valid ejb names. */ + private static int counter = 0; + + /** Property file with EJB interfaces */ + public final static String INTERFACES_PROP_FILENAME = "beans-interfaces.properties"; + public final static String INTERFACES_PROP_DIRECTORY = System.getenv("ECLIPSE_HOME")+"/plugins/org.apache.geronimo.j2g.sources.environment/"; + + /** Property file with paths for searching types in jboss.xml */ + public final static String BEANS_TYPES_PROP_FILENAME = "beans-types.properties"; + public final static String BEANS_TYPES_PROP_DIRECTORY = System.getenv("ECLIPSE_HOME")+"/plugins/org.apache.geronimo.j2g.sources.environment/"; + + /** + * Property file with paths for searching home and remote interfaces in + * ejb-jar.xml + */ + public final static String BEANS_REFS_PROP_FILENAME = "beans-references.properties"; + public final static String BEANS_REFS_PROP_DIRECTORY = System.getenv("ECLIPSE_HOME")+"/plugins/org.apache.geronimo.j2g.sources.environment/"; + + /** References in ejb-jar.xml to be found */ + private final static String[] EJB_REFS = { "ejb-ref", "ejb-local-ref", + "resource-ref", "resource-env-ref" }; + + /** Separator string for XPath */ + private final static String XPATH_SEPARATOR = "/"; + + /** Separator string for XPath for access elements by non-full names. */ + private final static String DOUBLE_XPATH_SEPARATOR = "//"; + + /** Ejb classname element int ejb-jar.xml */ + private final static String EJB_CLASS_ELM = "ejb-class"; + + /** Ejb name element. */ + private final static String EJB_NAME_ELM = "ejb-name"; + + /** Ejb reference element for add references to ejb-jar.xml */ + private final static String EJB_REF_ELM = "ejb-ref"; + + /** Ejb reference element for add references to ejb-jar.xml */ + private final static String EJB_LOCAL_REF_ELM = "ejb-local-ref"; + + /** Ejb reference JNDI name element. */ + private final static String EJB_REF_NAME_ELM = "ejb-ref-name"; + + /** Ejb reference type element. (Session | Entity) */ + private final static String EJB_REF_TYPE_ELM = "ejb-ref-type"; + + /** Ejb link element. */ + private final static String EJB_LINK_ELM = "ejb-link"; + + /** Base name for generating full ejb reference name. */ + private final static String BASE_JNDI_NAME = "ejb/"; + + /** Session reference type */ + private final static String SESSION_TYPE = "Session"; + + /** Entity reference type */ + private final static String ENTITY_TYPE = "Entity"; + + /** Property file with EJB interfaces */ + public static Properties interfaces; + + /** Property file with paths for searching types in jboss.xml */ + private static Properties beansTypes; + + /** + * Property file with paths for searching home and remote interfaces in + * ejb-jar.xml + */ + private static Properties beansRefs; + + /** Home interface suffix */ + private final static String HOME_INTERFACE_SUFFIX = "-home"; + + /** XPath to session elements. */ + private final static String SESSION_XPATH = "/ejb-jar/enterprise-beans/session/"; + + /** XPath to entity elements */ + private final static String ENTITY_XPATH = "/ejb-jar/enterprise-beans/entity/"; + + /** Full qualified classname for current class */ + private String qualifiedClassName; + + /** Superinterfaces for current class. */ + private List superInterfaces; + + /** Output */ + private IOutput out; + + /** Current compilation unit */ + private CompilationUnit unit; + + /** SAX reader */ + private SAXReader xmlReader; + + /** XPath path for class */ + private String pathForClass; + + /** + * Constructor. + * + * @param qualifiedClassName + * full qualified class name which defined in compilation unit. + * @param unit + * compilation unit. + * @param superIterfaces + * super interfaces implemented by class which defined in + * compilation unit. + * @throws NameSolvingException + */ + public AbsoluteNameSolver(String qualifiedClassName, List superIterfaces, + CompilationUnit unit) throws NameSolvingException { + this.out = Tool.getCurrent().getOutput(); + this.qualifiedClassName = qualifiedClassName; + this.superInterfaces = superIterfaces; + this.unit = unit; + pathForClass = getPathForClass(); + xmlReader = new SAXReader(true); + } + + /** + * Tries to find already existing references to current class. If none + * found, tries to resolve type of the current ejb and to add ejb reference + * for current absolute name. + * + * @param absoluteName + * absolute name which should be solved. + * @param position + * position in compilation unit. + * @param ejbJar + * existed ejb-jar.xml descriptor. (META-INF/ejb-jar.xml) + * @param jbossXml + * existed jboss.xml descriptor. (META-INf/jboss.xml) + * @return JNDI name in local context which was referenced in ejb-jar + * descriptor. + * @throws NameSolvingException + * if any errors occurs while solving absolute names. + */ + public String solveName(String absoluteName, int position, File ejbJar, + File jbossXml) throws NameSolvingException { + loadProperties(); + if (pathForClass != null) { + Document ejbJarDoc = null; + try { + ejbJarDoc = xmlReader.read(ejbJar); + } catch (DocumentException ex) { + throw new NameSolvingException( + "Error occured while reading xml descriptor " + + jbossXml.getAbsolutePath() + + ". It is possible that the migrator cannot download the xml schema or the xml file has incorrect syntax. Nested exception:" + + ex.getMessage()); + } + + List nodes = ejbJarDoc.selectNodes(pathForClass + XPATH_SEPARATOR + + EJB_CLASS_ELM); + Iterator nodesIter = nodes.iterator(); + Node ejbJarNode = null; + while (nodesIter.hasNext()) { + Node node = (Node) nodesIter.next(); + if (qualifiedClassName.equals(node.getStringValue().trim())) { + ejbJarNode = node.getParent(); + for (int i = 0; i < EJB_REFS.length; i++) { + List refsNodes = ejbJarNode + .selectNodes(DOUBLE_XPATH_SEPARATOR + + EJB_REFS[i]); + if (!refsNodes.isEmpty()) { + Iterator references = refsNodes.iterator(); + + while (references.hasNext()) { + Node referenceNode = (Node) references.next(); + String refName = getNodeValueByName( + referenceNode, EJB_REF_NAME_ELM); + if (refName != null + && absoluteName.equals(refName.trim())) { + out + .warn(AbsoluteNameSolver.class.getSimpleName(), + "Cannot add reference to the absolute name '" + + absoluteName + + "' because the reference in ejb-jar.xml descriptor to current class is already defined.", + unit + .getLineNumber(position), + unit + .getColumnNumber(position)); + return null; + } + } + } + } + break; + } + } + if (ejbJarNode != null) { + Document jbossXmlDoc = null; + try { + jbossXmlDoc = xmlReader.read(jbossXml); + } catch (DocumentException ex) { + throw new NameSolvingException( + "Error occured while reading xml descriptor " + + jbossXml.getAbsolutePath() + + ". It is possible that the migrator cannot download the xml schema or the xml file has incorrect syntax. Nested exception:" + + ex.getMessage()); + } + Enumeration paths = beansTypes.keys(); + while (paths.hasMoreElements()) { + String path = (String) paths.nextElement(); + List findedNodes = jbossXmlDoc.selectNodes(path); + Iterator findedNodesIter = findedNodes.iterator(); + while (findedNodesIter.hasNext()) { + Node jbossXmlNode = (Node) findedNodesIter.next(); + if (absoluteName.equals(jbossXmlNode.getStringValue() + .trim())) { + String type = beansTypes.getProperty(path); + String ejbName = getNodeValueByName( + jbossXmlNode.getParent(), EJB_NAME_ELM) + .trim(); + Node referenceNode = null; + String ejbRefType = null; + List sessionNodes = ejbJarDoc + .selectNodes(SESSION_XPATH + EJB_NAME_ELM); + Iterator sessionNodesIter = sessionNodes.iterator(); + while (sessionNodesIter.hasNext()) { + Node ejbNameNode = (Node) sessionNodesIter + .next(); + if (ejbName + .equals(ejbNameNode.getStringValue())) { + referenceNode = ejbNameNode.getParent(); + ejbRefType = SESSION_TYPE; + break; + } + } + if (ejbRefType == null) { + List entityNodes = ejbJarDoc + .selectNodes(ENTITY_XPATH + + EJB_NAME_ELM); + Iterator entityNodesIter = entityNodes + .iterator(); + while (entityNodesIter.hasNext()) { + Node ejbNameNode = (Node) entityNodesIter + .next(); + if (ejbName.equals(ejbNameNode + .getStringValue())) { + referenceNode = ejbNameNode.getParent(); + ejbRefType = ENTITY_TYPE; + break; + } + } + } + if (referenceNode != null) { + String homeIterfacePath = beansRefs + .getProperty(type + + HOME_INTERFACE_SUFFIX); + String homeIterface = getNodeValueByName( + referenceNode, homeIterfacePath); + String objectIterfacePath = beansRefs + .getProperty(type); + String objectIterface = getNodeValueByName( + referenceNode, objectIterfacePath); + Element ejbJarElement = (Element) ejbJarNode; + Element ejbRef = null; + if (objectIterfacePath.equals("remote")) { + ejbRef = ejbJarElement + .addElement(EJB_REF_ELM); + } else { + ejbRef = ejbJarElement + .addElement(EJB_LOCAL_REF_ELM); + } + + String refName = generateNewRefName(); + ejbRef.addElement(EJB_REF_NAME_ELM).addText( + refName); + ejbRef.addElement(EJB_REF_TYPE_ELM).addText( + ejbRefType); + ejbRef.addElement(homeIterfacePath).addText( + homeIterface); + ejbRef.addElement(objectIterfacePath).addText( + objectIterface); + ejbRef.addElement(EJB_LINK_ELM) + .addText(ejbName); + serializetoXML(ejbJar, ejbJarDoc); + return refName; + } else { + out.error(AbsoluteNameSolver.class.getSimpleName(), "Cannot find the EJB definition in ejb-jar.xml to create a reference for it."); + } + } + } + } + } + } + return null; + } + + /** + * Generates new names for ejb references. It looks like + * 'ejb/SimpleClassName_x' + * + * @return new generated reference name. + */ + private String generateNewRefName() { + String simpleClassName = qualifiedClassName + .substring(qualifiedClassName.lastIndexOf(".") + 1); + return BASE_JNDI_NAME + simpleClassName + "_" + (counter++); + } + + /** + * Saves document to file. + * + * @param xmlFile + * destination file. + * @param doc + * xml document. + * @throws NameSolvingException + * if cannot save document. + */ + private void serializetoXML(File xmlFile, Document doc) + throws NameSolvingException { + try { + OutputStream output = new FileOutputStream(xmlFile); + OutputFormat outformat = OutputFormat.createPrettyPrint(); + XMLWriter writer = new XMLWriter(output, outformat); + writer.write(doc); + writer.flush(); + } catch (Exception ex) { + throw new NameSolvingException( + "Error occurs while xml descriptors saving.", ex); + } + } + + /** + * Gets string value of element in node by it name. + * + * @param parent + * parent node. + * @param name + * element name. + * @return string value of element in node. + */ + private String getNodeValueByName(Node parent, String name) { + Node node = parent.selectSingleNode(name); + if (node != null) { + return node.getStringValue(); + } + return null; + } + + /** + * Gets XPath where need to search already defined references for current + * class defined in current compilation unit and determines type of + * reference required for current class. + * + * @return XPath in ejb-jar.xml descriptor. + * @throws NameSolvingException + * if cannot load properties files. + */ + private String getPathForClass() throws NameSolvingException { + loadProperties(); + Enumeration enumeration = interfaces.keys(); + while (enumeration.hasMoreElements()) { + String ejbInterface = (String) enumeration.nextElement(); + Iterator types = superInterfaces.iterator(); + while (types.hasNext()) { + Type superType = (Type) types.next(); + ITypeBinding bind = superType.resolveBinding(); + if (bind != null + && bind.getQualifiedName().equals(ejbInterface)) { + String path = interfaces.getProperty(ejbInterface); + return path; + } + } + } + return null; + } + + /** + * @return true if class is an EJB bean. + */ + public boolean isEjbBeanClass() { + return (pathForClass != null); + } + + /** + * Loads all necessary properties files. + * + * @throws NameSolvingException + * if cannot load one or more properts files. + */ + private void loadProperties() throws NameSolvingException { + if (interfaces == null) { + interfaces = new Properties(); + try { + File propertyFile = new File(INTERFACES_PROP_DIRECTORY + INTERFACES_PROP_FILENAME); + interfaces.load(new FileInputStream(propertyFile)); + } catch (IOException ex) { + throw new NameSolvingException( + "Cannot read system property file: " + INTERFACES_PROP_FILENAME, + ex); + } + } + + if (beansTypes == null) { + beansTypes = new Properties(); + try { + File propertyFile = new File(BEANS_TYPES_PROP_DIRECTORY + BEANS_TYPES_PROP_FILENAME); + beansTypes.load(new FileInputStream(propertyFile)); + } catch (IOException ex) { + throw new NameSolvingException( + "Cannot read system property file: " + BEANS_TYPES_PROP_FILENAME, + ex); + } + } + + if (beansRefs == null) { + beansRefs = new Properties(); + try { + File propertyFile = new File(BEANS_REFS_PROP_DIRECTORY + BEANS_REFS_PROP_FILENAME); + beansRefs.load(new FileInputStream(propertyFile)); + } catch (IOException ex) { + throw new NameSolvingException( + "Cannot read system property file: " + BEANS_REFS_PROP_FILENAME, + ex); + } + } + } +} Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/AbsoluteNameSolver.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/AbsoluteNameSolver.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/AbsoluteNameSolver.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/BlockVisitor.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/BlockVisitor.java?view=diff&rev=561821&r1=561820&r2=561821 ============================================================================== --- geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/BlockVisitor.java (original) +++ geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/BlockVisitor.java Wed Aug 1 08:05:12 2007 @@ -1,464 +1,464 @@ -/** - * 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 org.apache.geronimo.j2g.sources.environment; - -import java.io.File; -import java.util.HashMap; -import java.util.List; - -import org.apache.geronimo.j2g.common.FatalToolException; -import org.apache.geronimo.j2g.common.IOutput; -import org.apache.geronimo.j2g.common.Tool; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.core.dom.ASTNode; -import org.eclipse.jdt.core.dom.ASTVisitor; -import org.eclipse.jdt.core.dom.Assignment; -import org.eclipse.jdt.core.dom.CastExpression; -import org.eclipse.jdt.core.dom.ClassInstanceCreation; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.Expression; -import org.eclipse.jdt.core.dom.ITypeBinding; -import org.eclipse.jdt.core.dom.MethodInvocation; -import org.eclipse.jdt.core.dom.SimpleName; -import org.eclipse.jdt.core.dom.StringLiteral; -import org.eclipse.jdt.core.dom.Type; -import org.eclipse.jdt.core.dom.VariableDeclarationFragment; - - -/** - * The algorithm of work as follows:
- * 1. Searches invocations of the javax.naming.Context#lookup method;
- * - * 2. If the lookup meets the following conditions:
- * a) It is performed from an EJB;
- * b) JNDI name is a string constant;
- * c) JNDI name is a path in the EJB environment (starts with "java:comp/env" or equals to - * "java:comp/UserTransaction", "java:comp/ORB" );
- * then the plug-in considers this lookup as correct.
- * - * 3. If the lookup meets the following conditions:
- * a) It is performed from an EJB;
- * b) JNDI name is a string constant;
- * c) JNDI name is a full direct path;
- * d) EJB does not have any environment references;
- * then the plug-in should add the resource reference in the EJB component's deployment descriptor - * and replace the use of a direct name with this name from the component's environment.
- * - * 4. Otherwise the plug-in outputs a warning message that the lookup might be incorrect. - */ -public class BlockVisitor extends ASTVisitor { - - /** Lookup method simple name. */ - private final static String LOOKUP_METHOD_NAME = "lookup"; - - /** Full qualified name for Context interface. */ - private final static String CONTEXT_INTERFACE_NAME = "javax.naming.Context"; - - /** Full qualified name for InitialContext class. */ - private final static String INIT_CONTEXT_CLASSNAME = "javax.naming.InitialContext"; - - /** Initial context. */ - private final static String INITIAL_CONTEXT = ""; - - /** Compilation unit. */ - private CompilationUnit unit; - - /** Tool output. */ - private IOutput out; - - /** HashMap for the context variables. */ - private HashMap varsMap; - - /** Solver for absolute JNDI names used in lookup methods. */ - private AbsoluteNameSolver solver; - - /** Allowed objects for JNDI lookup. */ - private final static String[] ALLOWED_OBJECTS = { "java:comp/UserTransaction", "java:comp/ORB" }; - - /** Local context. */ - private final static String LOCAL_CONTEXT = "java:comp/env/"; - - /** Meta-inf directory default name. */ - public final static String META_INF_DIR = "META-INF"; - - /** EJB deployment descriptor default filename. */ - public final static String EJB_JAR_FILE = "ejb-jar.xml"; - - /** JBoss descriptor default filename. */ - public final static String JBOSS_XML_FILE = "jboss.xml"; - - /** Last catched string literal for lookup method. */ - private StringLiteral lastStrLiteral; - - /** - * Visitor constructor. Setups compilation unit and output. - * @param unit current compilation unit. - * @param solver initialized absolute names solver for visiting class. - */ - public BlockVisitor(CompilationUnit unit, AbsoluteNameSolver solver) { - super(false); - this.unit = unit; - this.solver = solver; - varsMap = new HashMap(); - out = Tool.getCurrent().getOutput(); - } - - /** - * Checks method and if it is a javax.naming.Context#lookup resolves and analizes context. - * @param methodInvocation method invocation. - */ - public boolean visit(MethodInvocation methodInvocation) { - int position = methodInvocation.getStartPosition(); - if (isLookupMethodInvocation(methodInvocation)) { - String jndiName = getLookupArgument(methodInvocation); - try { - analizeLookupJNDIName(jndiName, position); - } catch (FatalToolException ex) { - out.error(BlockVisitor.class.getSimpleName(), "Cannot check correctness of lookup method using: " + ex.getMessage(), unit.getLineNumber(position), unit.getColumnNumber(position)); - } - } - return true; - } - - /** - * If it's an assign for a variable which type is javax.naming.Context then analizes correctness - * of initializer and puts variable assignment to the varsMap. - * @param assignment assignment. - */ - public boolean visit(Assignment assignment) { - Expression leftSide = assignment.getLeftHandSide(); - if (leftSide instanceof SimpleName) { - SimpleName varName = (SimpleName) leftSide; - if (isValidType(varName)) { - Expression rightSide = assignment.getRightHandSide(); - ASTNode parent = getParentBlock(assignment); - int exprEnd = parent.getStartPosition() + parent.getLength(); - if (isValidContextInitializer(rightSide)) { - String key = varName.getIdentifier(); - VarContext var = new VarContext(INITIAL_CONTEXT, exprEnd, true); - varsMap.put(key, var); - return false; - } - else { - String cast = checkCastToContext(rightSide); - if (cast != null) { - String key = varName.getIdentifier(); - VarContext var = new VarContext(cast, exprEnd, true); - varsMap.put(key, var); - return false; - } - else { - String key = varName.getIdentifier(); - VarContext var = new VarContext(INITIAL_CONTEXT, exprEnd, false); - varsMap.put(key, var); - return true; - } - } - } - } - return true; - } - - /** - * If it's the declaration of the variable which type is javax.naming.Context and initializer - * not null then analizes it correctness and puts variable assignment to the varsMap. - * @param fragment variable declaration fragment. - */ - public boolean visit(VariableDeclarationFragment fragment) { - Expression initializer = fragment.getInitializer(); - if (initializer != null) { - SimpleName varName = fragment.getName(); - if (isValidType(varName)) { - ASTNode parent = getParentBlock(fragment); - int exprEnd = parent.getStartPosition() + parent.getLength(); - if (isValidContextInitializer(initializer)) { - String key = varName.getIdentifier(); - VarContext var = new VarContext(INITIAL_CONTEXT, exprEnd, true); - varsMap.put(key, var); - return false; - } - else { - String cast = checkCastToContext(fragment.getInitializer()); - if (cast != null) { - String key = varName.getIdentifier(); - VarContext var = new VarContext(cast, exprEnd, true); - varsMap.put(key, var); - return false; - } - else { - String key = varName.getIdentifier(); - VarContext var = new VarContext(INITIAL_CONTEXT, exprEnd, false); - varsMap.put(key, var); - return true; - } - } - } - else { - return true; - } - } - return false; - } - - /** - * Checks that expression is a creation of InitailContext class instance without - * parameters. - * @param expr initializer expression. - * @return true if expr looks like this new InitialContext(). - */ - private boolean isValidContextInitializer(Expression expr) { - if (expr instanceof ClassInstanceCreation) { - ClassInstanceCreation instanceCreation = (ClassInstanceCreation) expr; - Type type = instanceCreation.getType(); - ITypeBinding typeBind = type.resolveBinding(); - if (typeBind.getQualifiedName().equals(INIT_CONTEXT_CLASSNAME)) { - if (instanceCreation.arguments().isEmpty()) { - return true; - } - } - } - return false; - } - - /** - * Checks that expression has javax.naming.Context type or its type implements - * that interface. - * - * @param expr expression which will be checked. - * @return true if expression has javax.naming.Context type or its type - * implements that interface. - */ - private boolean isValidType(Expression expr) { - ITypeBinding bind = expr.resolveTypeBinding(); - if (bind != null) { - if (bind.getQualifiedName().equals(CONTEXT_INTERFACE_NAME)) { - return true; - } - else { - ITypeBinding[] interfaces = bind.getInterfaces(); - for (int i = 0; i < interfaces.length; i++) { - if (interfaces[i].getQualifiedName().equals(CONTEXT_INTERFACE_NAME)) { - return true; - } - } - } - } - return false; - } - - /** - * Checks that expression is cast object returned by javax.naming.Context#lookup - * method to the javax.naming.Context type. - * - * @param expr expression which will be checked. - * @return JNDI name for Context presented by cast or null if it cannot be - * unambiguously resolved or if expression is invalid. - */ - private String checkCastToContext(Expression expr) { - if (expr != null && isValidType(expr)) { - if (expr instanceof CastExpression) { - CastExpression castExpr = (CastExpression) expr; - Expression castArg = castExpr.getExpression(); - if (castArg instanceof MethodInvocation) { - MethodInvocation invocation = (MethodInvocation) castArg; - if (isLookupMethodInvocation(invocation)) { - String name = getLookupArgument(invocation); - return name; - } - else { - return null; - } - - } - } - } - return null; - } - - /** - * Checks a javax.naming.Context#lookup method invocation and tries to resolve context. - * @param invocation lookup method invocation node. - * @return JNDI name for object returned by lookup method or null if it cannot be - * unambiguously resolved or it is not lookup method. - */ - private String getLookupArgument(MethodInvocation invocation) { - Expression expr = invocation.getExpression(); - String history = getExpressionHistory(expr); - if (history != null) { - List arguments = invocation.arguments(); - if (arguments.size() != 0) { - Expression arg = (Expression) arguments.get(0); - if (arg instanceof StringLiteral) { - StringLiteral literal = (StringLiteral) arg; - String resultContext = history + literal.getLiteralValue(); - this.lastStrLiteral = literal; - return resultContext; - } - } - } - return null; - } - - /** - * Checks is it lookup method or not. - * @param invocation method invocation node. - * @return true if it is a javax.naming.Context#lookup and false - * in another cases. - */ - private boolean isLookupMethodInvocation(MethodInvocation invocation) { - if (invocation.getName().getIdentifier().equals(LOOKUP_METHOD_NAME)) { - Expression expr = invocation.getExpression(); - if (isValidType(expr)) { - return true; - } - } - return false; - } - - /** - * If expr is a variable then gets variable context from varsMap and returns its value if it's - * correct. - * @param expr which type is a javax.naming.Context. - * @return JNDI name presented by this expression or null if it cannot be - * unambiguously resolved - */ - private String getExpressionHistory(Expression expr) { - if (expr instanceof SimpleName) { - SimpleName name = (SimpleName) expr; - String varName = name.getIdentifier(); - VarContext var = (VarContext) varsMap.get(varName); - if (var != null && var.isValid() && var.getAreaEnd() > name.getStartPosition()) { - return var.getJNDIName(); - } - } - return null; - } - - /** - * Gets parent node for a variable declaration fragment. - * @param fragment - * @return parent block for the specified VariableDeclarationFragment. - */ - private ASTNode getParentBlock(VariableDeclarationFragment fragment) { - return fragment.getParent().getParent().getParent(); - } - - /** - * Gets parent node for an assignment. - * @param assignment - * @return parent block for the specified Assignment. - */ - private ASTNode getParentBlock(Assignment assignment) { - return assignment.getParent().getParent(); - } - - /** - * Checks the correctness of the JNDI name. - * @param name JNDI name. - * @param position position in the source file. - * @throws FatalToolException if any exceptions occurs while checks JNDI name. - */ - private void analizeLookupJNDIName(String name, int position) throws FatalToolException { - if (name != null) { - if (!isValidJNDIName(name)) { - String literalValue = lastStrLiteral.getLiteralValue(); - if (literalValue.equals(name)) { - String solvedName = solveAbsoluteName(name, position); - if (solvedName != null) { - String localJNDIName = LOCAL_CONTEXT + solvedName; - out.info(BlockVisitor.class.getSimpleName(), "A reference to the current EJB was added to " + EJB_JAR_FILE + " deployment descriptor. Use of direct name '" + name + "' was replaced by '" + localJNDIName + "' local name.", unit.getLineNumber(position), unit.getColumnNumber(position)); - lastStrLiteral.setLiteralValue(localJNDIName); - return; - } - else { - out.warn(BlockVisitor.class.getSimpleName(), "Use of an absolute JNDI name might be incorrect.", unit.getLineNumber(position), unit.getColumnNumber(position)); - return; - } - } - } else{ - return; - } - - } - out.warn(BlockVisitor.class.getSimpleName(), "Lookup use might be incorrect.", unit.getLineNumber(position), unit.getColumnNumber(position)); - } - - /** - * Tries to find META-INF/ejb-jar.xml and META-INF/jboss.xml descriptors and if its exests tries - * to add references for JNDI name to its. - * @param absoluteName absolute JNDI name. - * @param position position in the source file. - * @return JNDI name in local context or null if cannot unambiguously solve references. - * @throws FatalToolException if any errors occurs while solving name. - */ - private String solveAbsoluteName(String absoluteName, int position) throws FatalToolException { - if (solver.isEjbBeanClass()) { - try { - String pack = unit.getPackage().getName().getFullyQualifiedName().replace('.', File.separatorChar); - String unitFile = unit.getJavaElement().getUnderlyingResource().getRawLocation().toFile().getAbsolutePath(); - String rootDir = unitFile.substring(0, unitFile.lastIndexOf(pack)); - File metaInfDir = new File(rootDir + META_INF_DIR); - if (metaInfDir.exists() && metaInfDir.isDirectory()) { - File ejbJar = new File(metaInfDir, EJB_JAR_FILE); - File jbossXml = new File(metaInfDir, JBOSS_XML_FILE); - if (ejbJar.exists()) { - if (jbossXml.exists()) { - String solvedName = solver.solveName(absoluteName, position, ejbJar, jbossXml); - return solvedName; - } - else { - out.error(BlockVisitor.class.getSimpleName(), "Cannot add reference for absolute name '" + absoluteName + "' : cannot find " + jbossXml.getAbsolutePath() + " file.", unit.getLineNumber(position), unit.getColumnNumber(position)); - } - } - else { - out.error(BlockVisitor.class.getSimpleName(), "Cannot add reference for absolute name '" + absoluteName + "' : cannot find " + ejbJar.getAbsolutePath() + " file.", unit.getLineNumber(position), unit.getColumnNumber(position)); - } - - } - else { - out.error(BlockVisitor.class.getSimpleName(), "Cannot add reference for absolute name '" + absoluteName + "' : cannot find " + metaInfDir.getAbsolutePath() + " directory.", unit.getLineNumber(position), unit.getColumnNumber(position)); - return null; - } - - } catch (JavaModelException ex) { - throw new FatalToolException("Cannot access to source file.", ex); - } catch (NameSolvingException ex) { - out.error(BlockVisitor.class.getSimpleName(), "Cannot add reference for absolute name '" + absoluteName + "' :" + ex.getMessage()); - } - } - return null; - } - - /** - * Checks correctness of constant JNDI name. - * @param name JNDI name. - * @return true if it's correct JNDI name (Starts with 'java:comp/env/' or equals to allowed - * strings). - */ - private boolean isValidJNDIName(String name) { - if (name.startsWith(LOCAL_CONTEXT)) { - return true; - } - for (int i = 0; i < ALLOWED_OBJECTS.length; i++) { - if (ALLOWED_OBJECTS[i].equals(name)) { - return true; - } - } - return false; - } -} +/** + * 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 org.apache.geronimo.j2g.sources.environment; + +import java.io.File; +import java.util.HashMap; +import java.util.List; + +import org.apache.geronimo.j2g.common.FatalToolException; +import org.apache.geronimo.j2g.common.IOutput; +import org.apache.geronimo.j2g.common.Tool; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.ASTVisitor; +import org.eclipse.jdt.core.dom.Assignment; +import org.eclipse.jdt.core.dom.CastExpression; +import org.eclipse.jdt.core.dom.ClassInstanceCreation; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.Expression; +import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.core.dom.MethodInvocation; +import org.eclipse.jdt.core.dom.SimpleName; +import org.eclipse.jdt.core.dom.StringLiteral; +import org.eclipse.jdt.core.dom.Type; +import org.eclipse.jdt.core.dom.VariableDeclarationFragment; + + +/** + * The algorithm of work as follows:
+ * 1. Searches invocations of the javax.naming.Context#lookup method;
+ * + * 2. If the lookup meets the following conditions:
+ * a) It is performed from an EJB;
+ * b) JNDI name is a string constant;
+ * c) JNDI name is a path in the EJB environment (starts with "java:comp/env" or equals to + * "java:comp/UserTransaction", "java:comp/ORB" );
+ * then the plug-in considers this lookup as correct.
+ * + * 3. If the lookup meets the following conditions:
+ * a) It is performed from an EJB;
+ * b) JNDI name is a string constant;
+ * c) JNDI name is a full direct path;
+ * d) EJB does not have any environment references;
+ * then the plug-in should add the resource reference in the EJB component's deployment descriptor + * and replace the use of a direct name with this name from the component's environment.
+ * + * 4. Otherwise the plug-in outputs a warning message that the lookup might be incorrect. + */ +public class BlockVisitor extends ASTVisitor { + + /** Lookup method simple name. */ + private final static String LOOKUP_METHOD_NAME = "lookup"; + + /** Full qualified name for Context interface. */ + private final static String CONTEXT_INTERFACE_NAME = "javax.naming.Context"; + + /** Full qualified name for InitialContext class. */ + private final static String INIT_CONTEXT_CLASSNAME = "javax.naming.InitialContext"; + + /** Initial context. */ + private final static String INITIAL_CONTEXT = ""; + + /** Compilation unit. */ + private CompilationUnit unit; + + /** Tool output. */ + private IOutput out; + + /** HashMap for the context variables. */ + private HashMap varsMap; + + /** Solver for absolute JNDI names used in lookup methods. */ + private AbsoluteNameSolver solver; + + /** Allowed objects for JNDI lookup. */ + private final static String[] ALLOWED_OBJECTS = { "java:comp/UserTransaction", "java:comp/ORB" }; + + /** Local context. */ + private final static String LOCAL_CONTEXT = "java:comp/env/"; + + /** Meta-inf directory default name. */ + public final static String META_INF_DIR = "META-INF"; + + /** EJB deployment descriptor default filename. */ + public final static String EJB_JAR_FILE = "ejb-jar.xml"; + + /** JBoss descriptor default filename. */ + public final static String JBOSS_XML_FILE = "jboss.xml"; + + /** Last catched string literal for lookup method. */ + private StringLiteral lastStrLiteral; + + /** + * Visitor constructor. Setups compilation unit and output. + * @param unit current compilation unit. + * @param solver initialized absolute names solver for visiting class. + */ + public BlockVisitor(CompilationUnit unit, AbsoluteNameSolver solver) { + super(false); + this.unit = unit; + this.solver = solver; + varsMap = new HashMap(); + out = Tool.getCurrent().getOutput(); + } + + /** + * Checks method and if it is a javax.naming.Context#lookup resolves and analizes context. + * @param methodInvocation method invocation. + */ + public boolean visit(MethodInvocation methodInvocation) { + int position = methodInvocation.getStartPosition(); + if (isLookupMethodInvocation(methodInvocation)) { + String jndiName = getLookupArgument(methodInvocation); + try { + analizeLookupJNDIName(jndiName, position); + } catch (FatalToolException ex) { + out.error(BlockVisitor.class.getSimpleName(), "Cannot check correctness of lookup method using: " + ex.getMessage(), unit.getLineNumber(position), unit.getColumnNumber(position)); + } + } + return true; + } + + /** + * If it's an assign for a variable which type is javax.naming.Context then analizes correctness + * of initializer and puts variable assignment to the varsMap. + * @param assignment assignment. + */ + public boolean visit(Assignment assignment) { + Expression leftSide = assignment.getLeftHandSide(); + if (leftSide instanceof SimpleName) { + SimpleName varName = (SimpleName) leftSide; + if (isValidType(varName)) { + Expression rightSide = assignment.getRightHandSide(); + ASTNode parent = getParentBlock(assignment); + int exprEnd = parent.getStartPosition() + parent.getLength(); + if (isValidContextInitializer(rightSide)) { + String key = varName.getIdentifier(); + VarContext var = new VarContext(INITIAL_CONTEXT, exprEnd, true); + varsMap.put(key, var); + return false; + } + else { + String cast = checkCastToContext(rightSide); + if (cast != null) { + String key = varName.getIdentifier(); + VarContext var = new VarContext(cast, exprEnd, true); + varsMap.put(key, var); + return false; + } + else { + String key = varName.getIdentifier(); + VarContext var = new VarContext(INITIAL_CONTEXT, exprEnd, false); + varsMap.put(key, var); + return true; + } + } + } + } + return true; + } + + /** + * If it's the declaration of the variable which type is javax.naming.Context and initializer + * not null then analizes it correctness and puts variable assignment to the varsMap. + * @param fragment variable declaration fragment. + */ + public boolean visit(VariableDeclarationFragment fragment) { + Expression initializer = fragment.getInitializer(); + if (initializer != null) { + SimpleName varName = fragment.getName(); + if (isValidType(varName)) { + ASTNode parent = getParentBlock(fragment); + int exprEnd = parent.getStartPosition() + parent.getLength(); + if (isValidContextInitializer(initializer)) { + String key = varName.getIdentifier(); + VarContext var = new VarContext(INITIAL_CONTEXT, exprEnd, true); + varsMap.put(key, var); + return false; + } + else { + String cast = checkCastToContext(fragment.getInitializer()); + if (cast != null) { + String key = varName.getIdentifier(); + VarContext var = new VarContext(cast, exprEnd, true); + varsMap.put(key, var); + return false; + } + else { + String key = varName.getIdentifier(); + VarContext var = new VarContext(INITIAL_CONTEXT, exprEnd, false); + varsMap.put(key, var); + return true; + } + } + } + else { + return true; + } + } + return false; + } + + /** + * Checks that expression is a creation of InitailContext class instance without + * parameters. + * @param expr initializer expression. + * @return true if expr looks like this new InitialContext(). + */ + private boolean isValidContextInitializer(Expression expr) { + if (expr instanceof ClassInstanceCreation) { + ClassInstanceCreation instanceCreation = (ClassInstanceCreation) expr; + Type type = instanceCreation.getType(); + ITypeBinding typeBind = type.resolveBinding(); + if (typeBind.getQualifiedName().equals(INIT_CONTEXT_CLASSNAME)) { + if (instanceCreation.arguments().isEmpty()) { + return true; + } + } + } + return false; + } + + /** + * Checks that expression has javax.naming.Context type or its type implements + * that interface. + * + * @param expr expression which will be checked. + * @return true if expression has javax.naming.Context type or its type + * implements that interface. + */ + private boolean isValidType(Expression expr) { + ITypeBinding bind = expr.resolveTypeBinding(); + if (bind != null) { + if (bind.getQualifiedName().equals(CONTEXT_INTERFACE_NAME)) { + return true; + } + else { + ITypeBinding[] interfaces = bind.getInterfaces(); + for (int i = 0; i < interfaces.length; i++) { + if (interfaces[i].getQualifiedName().equals(CONTEXT_INTERFACE_NAME)) { + return true; + } + } + } + } + return false; + } + + /** + * Checks that expression is cast object returned by javax.naming.Context#lookup + * method to the javax.naming.Context type. + * + * @param expr expression which will be checked. + * @return JNDI name for Context presented by cast or null if it cannot be + * unambiguously resolved or if expression is invalid. + */ + private String checkCastToContext(Expression expr) { + if (expr != null && isValidType(expr)) { + if (expr instanceof CastExpression) { + CastExpression castExpr = (CastExpression) expr; + Expression castArg = castExpr.getExpression(); + if (castArg instanceof MethodInvocation) { + MethodInvocation invocation = (MethodInvocation) castArg; + if (isLookupMethodInvocation(invocation)) { + String name = getLookupArgument(invocation); + return name; + } + else { + return null; + } + + } + } + } + return null; + } + + /** + * Checks a javax.naming.Context#lookup method invocation and tries to resolve context. + * @param invocation lookup method invocation node. + * @return JNDI name for object returned by lookup method or null if it cannot be + * unambiguously resolved or it is not lookup method. + */ + private String getLookupArgument(MethodInvocation invocation) { + Expression expr = invocation.getExpression(); + String history = getExpressionHistory(expr); + if (history != null) { + List arguments = invocation.arguments(); + if (arguments.size() != 0) { + Expression arg = (Expression) arguments.get(0); + if (arg instanceof StringLiteral) { + StringLiteral literal = (StringLiteral) arg; + String resultContext = history + literal.getLiteralValue(); + this.lastStrLiteral = literal; + return resultContext; + } + } + } + return null; + } + + /** + * Checks is it lookup method or not. + * @param invocation method invocation node. + * @return true if it is a javax.naming.Context#lookup and false + * in another cases. + */ + private boolean isLookupMethodInvocation(MethodInvocation invocation) { + if (invocation.getName().getIdentifier().equals(LOOKUP_METHOD_NAME)) { + Expression expr = invocation.getExpression(); + if (isValidType(expr)) { + return true; + } + } + return false; + } + + /** + * If expr is a variable then gets variable context from varsMap and returns its value if it's + * correct. + * @param expr which type is a javax.naming.Context. + * @return JNDI name presented by this expression or null if it cannot be + * unambiguously resolved + */ + private String getExpressionHistory(Expression expr) { + if (expr instanceof SimpleName) { + SimpleName name = (SimpleName) expr; + String varName = name.getIdentifier(); + VarContext var = (VarContext) varsMap.get(varName); + if (var != null && var.isValid() && var.getAreaEnd() > name.getStartPosition()) { + return var.getJNDIName(); + } + } + return null; + } + + /** + * Gets parent node for a variable declaration fragment. + * @param fragment + * @return parent block for the specified VariableDeclarationFragment. + */ + private ASTNode getParentBlock(VariableDeclarationFragment fragment) { + return fragment.getParent().getParent().getParent(); + } + + /** + * Gets parent node for an assignment. + * @param assignment + * @return parent block for the specified Assignment. + */ + private ASTNode getParentBlock(Assignment assignment) { + return assignment.getParent().getParent(); + } + + /** + * Checks the correctness of the JNDI name. + * @param name JNDI name. + * @param position position in the source file. + * @throws FatalToolException if any exceptions occurs while checks JNDI name. + */ + private void analizeLookupJNDIName(String name, int position) throws FatalToolException { + if (name != null) { + if (!isValidJNDIName(name)) { + String literalValue = lastStrLiteral.getLiteralValue(); + if (literalValue.equals(name)) { + String solvedName = solveAbsoluteName(name, position); + if (solvedName != null) { + String localJNDIName = LOCAL_CONTEXT + solvedName; + out.info(BlockVisitor.class.getSimpleName(), "A reference to the current EJB was added to " + EJB_JAR_FILE + " deployment descriptor. Use of direct name '" + name + "' was replaced by '" + localJNDIName + "' local name.", unit.getLineNumber(position), unit.getColumnNumber(position)); + lastStrLiteral.setLiteralValue(localJNDIName); + return; + } + else { + out.warn(BlockVisitor.class.getSimpleName(), "Use of an absolute JNDI name might be incorrect.", unit.getLineNumber(position), unit.getColumnNumber(position)); + return; + } + } + } else{ + return; + } + + } + out.warn(BlockVisitor.class.getSimpleName(), "Lookup use might be incorrect.", unit.getLineNumber(position), unit.getColumnNumber(position)); + } + + /** + * Tries to find META-INF/ejb-jar.xml and META-INF/jboss.xml descriptors and if its exests tries + * to add references for JNDI name to its. + * @param absoluteName absolute JNDI name. + * @param position position in the source file. + * @return JNDI name in local context or null if cannot unambiguously solve references. + * @throws FatalToolException if any errors occurs while solving name. + */ + private String solveAbsoluteName(String absoluteName, int position) throws FatalToolException { + if (solver.isEjbBeanClass()) { + try { + String pack = unit.getPackage().getName().getFullyQualifiedName().replace('.', File.separatorChar); + String unitFile = unit.getJavaElement().getUnderlyingResource().getRawLocation().toFile().getAbsolutePath(); + String rootDir = unitFile.substring(0, unitFile.lastIndexOf(pack)); + File metaInfDir = new File(rootDir + META_INF_DIR); + if (metaInfDir.exists() && metaInfDir.isDirectory()) { + File ejbJar = new File(metaInfDir, EJB_JAR_FILE); + File jbossXml = new File(metaInfDir, JBOSS_XML_FILE); + if (ejbJar.exists()) { + if (jbossXml.exists()) { + String solvedName = solver.solveName(absoluteName, position, ejbJar, jbossXml); + return solvedName; + } + else { + out.error(BlockVisitor.class.getSimpleName(), "Cannot add reference for absolute name '" + absoluteName + "' : cannot find " + jbossXml.getAbsolutePath() + " file.", unit.getLineNumber(position), unit.getColumnNumber(position)); + } + } + else { + out.error(BlockVisitor.class.getSimpleName(), "Cannot add reference for absolute name '" + absoluteName + "' : cannot find " + ejbJar.getAbsolutePath() + " file.", unit.getLineNumber(position), unit.getColumnNumber(position)); + } + + } + else { + out.error(BlockVisitor.class.getSimpleName(), "Cannot add reference for absolute name '" + absoluteName + "' : cannot find " + metaInfDir.getAbsolutePath() + " directory.", unit.getLineNumber(position), unit.getColumnNumber(position)); + return null; + } + + } catch (JavaModelException ex) { + throw new FatalToolException("Cannot access to source file.", ex); + } catch (NameSolvingException ex) { + out.error(BlockVisitor.class.getSimpleName(), "Cannot add reference for absolute name '" + absoluteName + "' :" + ex.getMessage()); + } + } + return null; + } + + /** + * Checks correctness of constant JNDI name. + * @param name JNDI name. + * @return true if it's correct JNDI name (Starts with 'java:comp/env/' or equals to allowed + * strings). + */ + private boolean isValidJNDIName(String name) { + if (name.startsWith(LOCAL_CONTEXT)) { + return true; + } + for (int i = 0; i < ALLOWED_OBJECTS.length; i++) { + if (ALLOWED_OBJECTS[i].equals(name)) { + return true; + } + } + return false; + } +} Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/BlockVisitor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/BlockVisitor.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/BlockVisitor.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/EjbEnvJavaMigration.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/EjbEnvJavaMigration.java?view=diff&rev=561821&r1=561820&r2=561821 ============================================================================== --- geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/EjbEnvJavaMigration.java (original) +++ geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/EjbEnvJavaMigration.java Wed Aug 1 08:05:12 2007 @@ -1,66 +1,66 @@ -/** - * 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 org.apache.geronimo.j2g.sources.environment; - -import org.apache.geronimo.j2g.common.IJavaMigration; -import org.apache.geronimo.j2g.common.IOutput; -import org.apache.geronimo.j2g.common.Tool; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.core.dom.ASTNode; -import org.eclipse.jdt.core.dom.CompilationUnit; - - -/** - * @see IJavaMigration - */ -public class EjbEnvJavaMigration implements IJavaMigration { - /** - * Plug-in name. - */ - private final static String PLUGIN_NAME = "EJB environment plug-in"; - - /** - * Tool output. - */ - private IOutput out; - - /** - * Finds access of a component to the named object in the source code outside of its own - * environment and tries to ascertain is it correct or not. - * @param source compilation unit for migration. - * @throws JavaModelException - */ - public boolean migrate(ASTNode source) { - out = Tool.getCurrent().getOutput(); - if (source instanceof CompilationUnit) { - CompilationUnit unit = (CompilationUnit) source; - out.info(EjbEnvJavaMigration.class.getSimpleName(), "[" + PLUGIN_NAME + "] " + "Migration started: " + unit.getJavaElement().getElementName()); - long initialChanges = unit.getAST().modificationCount(); - MethodsVisitor methodsVisitor = new MethodsVisitor(unit); - unit.accept(methodsVisitor); - //methodsVisitor.visit(unit); - long finalChanges = unit.getAST().modificationCount(); - out.info(EjbEnvJavaMigration.class.getSimpleName(), "[" + PLUGIN_NAME + "] " + "Migration finished: " + unit.getJavaElement().getElementName()); - return initialChanges != finalChanges; - } - else { - out.error(EjbEnvJavaMigration.class.getSimpleName(), "[" + PLUGIN_NAME + "] " + "Wrong type of source node."); - } - return false; - } -} +/** + * 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 org.apache.geronimo.j2g.sources.environment; + +import org.apache.geronimo.j2g.common.IJavaMigration; +import org.apache.geronimo.j2g.common.IOutput; +import org.apache.geronimo.j2g.common.Tool; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.CompilationUnit; + + +/** + * @see IJavaMigration + */ +public class EjbEnvJavaMigration implements IJavaMigration { + /** + * Plug-in name. + */ + private final static String PLUGIN_NAME = "EJB environment plug-in"; + + /** + * Tool output. + */ + private IOutput out; + + /** + * Finds access of a component to the named object in the source code outside of its own + * environment and tries to ascertain is it correct or not. + * @param source compilation unit for migration. + * @throws JavaModelException + */ + public boolean migrate(ASTNode source) { + out = Tool.getCurrent().getOutput(); + if (source instanceof CompilationUnit) { + CompilationUnit unit = (CompilationUnit) source; + out.info(EjbEnvJavaMigration.class.getSimpleName(), "[" + PLUGIN_NAME + "] " + "Migration started: " + unit.getJavaElement().getElementName()); + long initialChanges = unit.getAST().modificationCount(); + MethodsVisitor methodsVisitor = new MethodsVisitor(unit); + unit.accept(methodsVisitor); + //methodsVisitor.visit(unit); + long finalChanges = unit.getAST().modificationCount(); + out.info(EjbEnvJavaMigration.class.getSimpleName(), "[" + PLUGIN_NAME + "] " + "Migration finished: " + unit.getJavaElement().getElementName()); + return initialChanges != finalChanges; + } + else { + out.error(EjbEnvJavaMigration.class.getSimpleName(), "[" + PLUGIN_NAME + "] " + "Wrong type of source node."); + } + return false; + } +} Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/EjbEnvJavaMigration.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/EjbEnvJavaMigration.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/EjbEnvJavaMigration.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/MethodsVisitor.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/MethodsVisitor.java?view=diff&rev=561821&r1=561820&r2=561821 ============================================================================== --- geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/MethodsVisitor.java (original) +++ geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/MethodsVisitor.java Wed Aug 1 08:05:12 2007 @@ -1,83 +1,83 @@ -/** - * 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 org.apache.geronimo.j2g.sources.environment; - -import java.util.List; - -import org.apache.geronimo.j2g.common.Tool; -import org.eclipse.jdt.core.dom.ASTVisitor; -import org.eclipse.jdt.core.dom.Block; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.ITypeBinding; -import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.SimpleName; -import org.eclipse.jdt.core.dom.TypeDeclaration; - - -/** - * Visits types declarations, creates absolute name solvers and then visits methods declarations of - * these types. For each method declaration creates and starts {@link BlockVisitor}. - */ -public class MethodsVisitor extends ASTVisitor { - /** Compilation unit. */ - private CompilationUnit unit; - - /** Solver for absolute JNDI names. */ - private AbsoluteNameSolver solver; - - /** - * Constructor. - * @param unit compilation unit. - */ - public MethodsVisitor(CompilationUnit unit) { - super(false); - this.unit = unit; - } - - /** - * Creates absolute names solver for this type declaration. - * @param declaration type declaration. - */ - public boolean visit(TypeDeclaration declaration) { - List superInterfaces = declaration.superInterfaceTypes(); - SimpleName className = declaration.getName(); - ITypeBinding bind = className.resolveTypeBinding(); - String qualifiedName = bind.getQualifiedName(); - try { - solver = new AbsoluteNameSolver(qualifiedName, superInterfaces, unit); - return true; - } catch (NameSolvingException e) { - Tool.getCurrent().getOutput().fatal(MethodsVisitor.class.getSimpleName(), "Internal error occured. " + e.getMessage()); - } - return false; - } - - /** - * Creates and starts {@link BlockVisitor} if method is not empty. - * @param methodDeclaration method declaration. - */ - public boolean visit(MethodDeclaration methodDeclaration) { - Block block = methodDeclaration.getBody(); - if (block != null) { - BlockVisitor blockVisitor = new BlockVisitor(unit, solver); - methodDeclaration.accept(blockVisitor); - //blockVisitor.visit(block); - } - return false; - } -} +/** + * 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 org.apache.geronimo.j2g.sources.environment; + +import java.util.List; + +import org.apache.geronimo.j2g.common.Tool; +import org.eclipse.jdt.core.dom.ASTVisitor; +import org.eclipse.jdt.core.dom.Block; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.core.dom.MethodDeclaration; +import org.eclipse.jdt.core.dom.SimpleName; +import org.eclipse.jdt.core.dom.TypeDeclaration; + + +/** + * Visits types declarations, creates absolute name solvers and then visits methods declarations of + * these types. For each method declaration creates and starts {@link BlockVisitor}. + */ +public class MethodsVisitor extends ASTVisitor { + /** Compilation unit. */ + private CompilationUnit unit; + + /** Solver for absolute JNDI names. */ + private AbsoluteNameSolver solver; + + /** + * Constructor. + * @param unit compilation unit. + */ + public MethodsVisitor(CompilationUnit unit) { + super(false); + this.unit = unit; + } + + /** + * Creates absolute names solver for this type declaration. + * @param declaration type declaration. + */ + public boolean visit(TypeDeclaration declaration) { + List superInterfaces = declaration.superInterfaceTypes(); + SimpleName className = declaration.getName(); + ITypeBinding bind = className.resolveTypeBinding(); + String qualifiedName = bind.getQualifiedName(); + try { + solver = new AbsoluteNameSolver(qualifiedName, superInterfaces, unit); + return true; + } catch (NameSolvingException e) { + Tool.getCurrent().getOutput().fatal(MethodsVisitor.class.getSimpleName(), "Internal error occured. " + e.getMessage()); + } + return false; + } + + /** + * Creates and starts {@link BlockVisitor} if method is not empty. + * @param methodDeclaration method declaration. + */ + public boolean visit(MethodDeclaration methodDeclaration) { + Block block = methodDeclaration.getBody(); + if (block != null) { + BlockVisitor blockVisitor = new BlockVisitor(unit, solver); + methodDeclaration.accept(blockVisitor); + //blockVisitor.visit(block); + } + return false; + } +} Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/MethodsVisitor.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/MethodsVisitor.java ------------------------------------------------------------------------------ svn:keywords = Date Author Id Revision HeadURL Propchange: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/MethodsVisitor.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/NameSolvingException.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/NameSolvingException.java?view=diff&rev=561821&r1=561820&r2=561821 ============================================================================== --- geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/NameSolvingException.java (original) +++ geronimo/sandbox/j2g/plugins/org.apache.geronimo.j2g.sources/src/org/apache/geronimo/j2g/sources/environment/NameSolvingException.java Wed Aug 1 08:05:12 2007 @@ -1,60 +1,60 @@ -/** - * 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 org.apache.geronimo.j2g.sources.environment; - -/** - * Exception that indicates exceptions occurs while AbsoluteNameSolver works. - */ -public class NameSolvingException extends Exception { - - /** Serial version UID */ - private static final long serialVersionUID = 1419666308972177554L; - - /** - * Constructor. - */ - public NameSolvingException() { - super(); - } - - /** - * Constructor. - * @param msg message. - */ - public NameSolvingException(String msg) { - super(msg); - } - - /** - * Constructor. - * @param cause cause. - */ - public NameSolvingException(Throwable cause) { - super(cause); - } - - /** - * Constructor. - * @param msg message. - * @param cause cause. - */ - public NameSolvingException(String msg, Throwable cause) { - super(msg, cause); - } - -} +/** + * 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 org.apache.geronimo.j2g.sources.environment; + +/** + * Exception that indicates exceptions occurs while AbsoluteNameSolver works. + */ +public class NameSolvingException extends Exception { + + /** Serial version UID */ + private static final long serialVersionUID = 1419666308972177554L; + + /** + * Constructor. + */ + public NameSolvingException() { + super(); + } + + /** + * Constructor. + * @param msg message. + */ + public NameSolvingException(String msg) { + super(msg); + } + + /** + * Constructor. + * @param cause cause. + */ + public NameSolvingException(Throwable cause) { + super(cause); + } + + /** + * Constructor. + * @param msg message. + * @param cause cause. + */ + public NameSolvingException(String msg, Throwable cause) { + super(msg, cause); + } + +}