Return-Path: Delivered-To: apmail-geronimo-scm-archive@www.apache.org Received: (qmail 71215 invoked from network); 8 Oct 2007 18:51:31 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 8 Oct 2007 18:51:31 -0000 Received: (qmail 44783 invoked by uid 500); 8 Oct 2007 18:51:19 -0000 Delivered-To: apmail-geronimo-scm-archive@geronimo.apache.org Received: (qmail 44638 invoked by uid 500); 8 Oct 2007 18:51:18 -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 44627 invoked by uid 99); 8 Oct 2007 18:51:18 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 08 Oct 2007 11:51:18 -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; Mon, 08 Oct 2007 18:51:19 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 9DAD11A983E; Mon, 8 Oct 2007 11:50:59 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r582932 [2/3] - in /geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources: ./ META-INF/ schema/ src/ src/org/ src/org/apache/ src/org/apache/geronimo/ src/org/apache/geronimo/devtools/ src/org/apache/geronimo/devtools... Date: Mon, 08 Oct 2007 18:50:56 -0000 To: scm@geronimo.apache.org From: linsun@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20071008185059.9DAD11A983E@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/NodesVisitor.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/NodesVisitor.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/NodesVisitor.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/NodesVisitor.java Mon Oct 8 11:50:53 2007 @@ -0,0 +1,370 @@ +/** + * 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.devtools.j2g.sources.dependence; + + +import java.io.File; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import org.apache.geronimo.devtools.j2g.common.FatalToolException; +import org.apache.geronimo.devtools.j2g.common.IOutput; +import org.apache.geronimo.devtools.j2g.common.Tool; +import org.apache.geronimo.devtools.j2g.common.ToolConstants; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.dom.ASTVisitor; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.Expression; +import org.eclipse.jdt.core.dom.IBinding; +import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.core.dom.ImportDeclaration; +import org.eclipse.jdt.core.dom.MethodDeclaration; +import org.eclipse.jdt.core.dom.MethodInvocation; +import org.eclipse.jdt.core.dom.Name; +import org.eclipse.jdt.core.dom.QualifiedName; +import org.eclipse.jdt.core.dom.QualifiedType; +import org.eclipse.jdt.core.dom.SimpleName; +import org.eclipse.jdt.core.dom.SimpleType; +import org.eclipse.jdt.core.dom.SingleVariableDeclaration; +import org.eclipse.jdt.core.dom.Type; +import org.eclipse.jdt.core.dom.VariableDeclarationFragment; + + +/** + * Visitor for ASTNode. Finds types dependencies and reports to tool output. + */ +public class NodesVisitor extends ASTVisitor { + /** + * Tool output. + */ + private IOutput out; + + /** + * Current compilation unit. + */ + private CompilationUnit unit; + + /** + * Set of declared variables. + */ + private Set vars; + + /** + * Set of already picked libraries. + */ + private Set linkedLibs; + + /** + * Set of declared classes in imports. + */ + private Set imports; + + /** + * + */ + + private boolean wrongApiUsing; + + /** + * Constructor. + * + * @param unit + * compilation unit which will be visited. + * @param out + * @param visitDocTypes + */ + public NodesVisitor(CompilationUnit unit) { + super(false); + this.out = Tool.getCurrent().getOutput(); + this.unit = unit; + vars = new HashSet(); + linkedLibs = new HashSet(); + imports = new HashSet(); + wrongApiUsing = false; + + List compUnitList = unit.imports(); + Iterator listIter = compUnitList.iterator(); + while (listIter.hasNext()) { + ImportDeclaration impDec = (ImportDeclaration)listIter.next(); + if (impDec.getName().isQualifiedName()) { + QualifiedName qualifiedName = (QualifiedName) impDec.getName(); + String className = qualifiedName.getName().getIdentifier(); + imports.add(className); + } + else { + SimpleName simpleName = (SimpleName) impDec.getName(); + imports.add(simpleName.getIdentifier()); + } + } + } + + /** + * Solves binding and if it's corressponds to Geronimo repository library + * warns about it. + * + * @param binding + * @throws FatalToolException + */ + private void solveBinding(IBinding binding, String name) { + if (binding instanceof ITypeBinding) { + try { + String linkedJarName = binding.getJavaElement().getPath().toFile().getName(); + if (linkedJarName.startsWith(ToolConstants.GERONIMO_REP)) { + File lib = binding.getJavaElement().getUnderlyingResource().getRawLocation().toFile(); + String artifactName = getGeronimoArtifactName(lib); + if (!linkedLibs.contains(lib.getName()) && !DependenceJavaMigration.getDefaultLibs().contains(artifactName)) { + out.warn(NodesVisitor.class.getSimpleName(), "You should add a '" + artifactName + "' dependency."); + linkedLibs.add(lib.getName()); + } + } + } catch (JavaModelException e) { + out.fatal(NodesVisitor.class.getSimpleName(), "Cannot get access to library for resolve name'" + name + "'."); + } + } + } + + /** + * Visits {@link ImportDeclaration} and trying to resolve binding. + */ + public boolean visit(ImportDeclaration importDeclaration) { + if (importDeclaration.resolveBinding() != null) { + String name = importDeclaration.getName().getFullyQualifiedName(); + solveBinding(importDeclaration.resolveBinding(), name); + } + else { + printImportError(importDeclaration.getName().getFullyQualifiedName(), importDeclaration.getStartPosition()); + if (importDeclaration.getName().isQualifiedName()) { + QualifiedName qualifiedName = (QualifiedName) importDeclaration.getName(); + String className = qualifiedName.getName().getIdentifier(); + imports.add(className); + } + else { + SimpleName simpleName = (SimpleName) importDeclaration.getName(); + imports.add(simpleName.getIdentifier()); + } + } + return false; + } + + /** + * Visits {@link QualifiedType} and trying to resolve binding. + */ + public boolean visit(QualifiedType qualifiedType) { + if (qualifiedType.resolveBinding() != null) { + String name = qualifiedType.getName().getFullyQualifiedName(); + solveBinding(qualifiedType.resolveBinding(), name); + return true; + } + else { + Type qualifier = qualifiedType.getQualifier(); + if (qualifier instanceof QualifiedType) { + if (visit((QualifiedType) qualifier)) { + printTypeError(qualifiedType.getName().getFullyQualifiedName(), qualifiedType.getStartPosition()); + } + } + else { + if (visit((SimpleType) qualifier)) { + printTypeError(qualifiedType.getName().getFullyQualifiedName(), qualifiedType.getStartPosition()); + } + } + } + return false; + } + + /** + * Visits {@link SimpleType} and trying to resolve binding. + */ + public boolean visit(SimpleType simpleType) { + if (simpleType.resolveBinding() != null) { + String name = simpleType.getName().getFullyQualifiedName(); + solveBinding(simpleType.resolveBinding(), name ); + } + else { + printTypeError(simpleType.getName().getFullyQualifiedName(), simpleType.getStartPosition()); + } + return false; + } + + /** + * Visits {@link QualifiedName} and trying to resolve binding. + */ + public boolean visit(QualifiedName qualifiedName) { + if (qualifiedName.resolveBinding() != null) { + String name = qualifiedName.getFullyQualifiedName(); + solveBinding(qualifiedName.resolveBinding(), name); + return true; + } + else { + Name qualifiedPart = qualifiedName.getQualifier(); + if (qualifiedPart instanceof QualifiedName) { + if (visit((QualifiedName) qualifiedPart)) { + printTypeError(qualifiedName.getFullyQualifiedName(), qualifiedName.getStartPosition()); + } + return false; + } + else { + if (qualifiedPart.resolveBinding() != null) { + printTypeError(qualifiedName.getFullyQualifiedName(), qualifiedName.getStartPosition()); + } + else { + if (!isDeclaredVar(qualifiedPart.toString())) { + printTypeError(qualifiedPart.getFullyQualifiedName(), qualifiedPart.getStartPosition()); + } + } + } + } + return false; + } + + /** + * Visits {@link MethodDeclaration} and trying to resolve binding. + */ + public boolean visit(MethodDeclaration method) { + List names = method.thrownExceptions(); + if (names != null) { + Iterator iter = names.iterator(); + while (iter.hasNext()) { + Name name = (Name) iter.next(); + if (name.resolveBinding() != null) { + String nameStr = name.getFullyQualifiedName(); + solveBinding(name.resolveBinding(), nameStr); + } + else { + printTypeError(name.getFullyQualifiedName(), name.getStartPosition()); + } + } + } + return true; + } + + /** + * Visits {@link MethodInvocation} and trying to resolve binding. + */ + public boolean visit(MethodInvocation methodInvocation) { + Expression expr = methodInvocation.getExpression(); + if (expr == null) { + if (methodInvocation.resolveMethodBinding() == null) { + printTypeError(methodInvocation.getName().getFullyQualifiedName(), methodInvocation.getStartPosition()); + } + } + else { + if (expr.resolveTypeBinding() != null) { + String name = expr.toString(); + solveBinding(expr.resolveTypeBinding(), name); + } + else { + if (expr instanceof MethodInvocation) { + visit((MethodInvocation) expr); + } + else if (expr instanceof QualifiedName) { + visit((QualifiedName) expr); + } + else if (expr instanceof SimpleName) { + if (!isDeclaredVar(expr.toString())) { + SimpleName simpleName = (SimpleName) expr; + printTypeError(simpleName.getFullyQualifiedName(), expr.getStartPosition()); + } + } + } + } + return true; + } + + /** + * Visits {@link SingleVariableDeclaration} and adds variable name to the + * list. + */ + public boolean visit(SingleVariableDeclaration declaration) { + vars.add(declaration.getName().toString()); + return true; + } + + /** + * Visits {@link VariableDeclarationFragment} and adds variable name to the + * list. + */ + public boolean visit(VariableDeclarationFragment declaration) { + vars.add(declaration.getName().toString()); + return true; + } + + /** + * @param name + * simple name. + * @return true if it is declared variable and + * false if not. + */ + private boolean isDeclaredVar(String name) { + return vars.contains(name); + } + + /** + * Prints error about not resolved name. + * + * @param name + * not resolved name. + * @param position + * start position in source file. + */ + private void printTypeError(String name, int position) { + if (!imports.contains(name)) { + out.error(NodesVisitor.class.getSimpleName(), "The name '" + name + "' cannot be resolved.", unit.getLineNumber(position), unit.getColumnNumber(position)); + wrongApiUsing = true; + } + } + + /** + * Prints error about not resolved import. + * + * @param name + * import name. + * @param position + * start position in source file. + */ + private void printImportError(String name, int position) { + wrongApiUsing = true; + out.error(NodesVisitor.class.getSimpleName(), "The import '" + name + "' cannot be resolved.", unit.getLineNumber(position), unit.getColumnNumber(position)); + } + + /** + * Constructs Geronimo artifact name from repository library file. + * + * @param libFullName + * full path to the repository library. + * @return Geronimo artifact name. + */ + private String getGeronimoArtifactName(File libFullName) { + String fullName = libFullName.getAbsolutePath(); + String geronimoRep = ToolConstants.GERONIMO_REPOSITORY_FOLDER + File.separator; + String name = fullName.substring(fullName.lastIndexOf(geronimoRep) + geronimoRep.length()); + name = name.substring(0, name.indexOf(libFullName.getName())); + name = name.replace(File.separatorChar, ToolConstants.GERONIMO_SEPARATOR_CHAR); + String extension = fullName.substring(fullName.lastIndexOf('.') + 1); + return name + extension; + } + + /** + * @return true if source uses proprietary api. + */ + public boolean isSourceValid(){ + return !wrongApiUsing; + } + +} Propchange: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/NodesVisitor.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/Anybody.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/Anybody.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/Anybody.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/Anybody.java Mon Oct 8 11:50:53 2007 @@ -0,0 +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. + */ +/* + * Auto-generated by J2G Migration. + */ +package org.apache.geronimo.devtools.j2g.sources.dependence.compatibility; + +import java.security.Principal; + +public class Anybody + implements Comparable, Principal +{ + + public Anybody() + { + } + + public int hashCode() + { + return ANYBODY.hashCode(); + } + + public String getName() + { + return ANYBODY; + } + + public String toString() + { + return ANYBODY; + } + + public boolean equals(Object another) + { + return true; + } + + public int compareTo(Object o) + { + return 0; + } + + public static final String ANYBODY = ""; + public static final Anybody ANYBODY_PRINCIPAL = new Anybody(); + +} \ No newline at end of file Propchange: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/Anybody.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/DigestCallback.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/DigestCallback.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/DigestCallback.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/DigestCallback.java Mon Oct 8 11:50:53 2007 @@ -0,0 +1,32 @@ +/** + * 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. + */ +/* + * Auto-generated by J2G Migration. + */ +package org.apache.geronimo.devtools.j2g.sources.dependence.compatibility; + +import java.security.MessageDigest; +import java.util.Map; + +public interface DigestCallback { + + public abstract void init(Map map); + + public abstract void preDigest(MessageDigest digest); + + public abstract void postDigest(MessageDigest digest); +} Propchange: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/DigestCallback.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/GeronimoLoginModule.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/GeronimoLoginModule.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/GeronimoLoginModule.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/GeronimoLoginModule.java Mon Oct 8 11:50:53 2007 @@ -0,0 +1,352 @@ +/** + * 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. + */ +/* + * Auto-generated by J2G Migration. + */ +package org.apache.geronimo.devtools.j2g.sources.dependence.compatibility; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.security.Principal; +import java.security.acl.Group; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import javax.security.auth.Subject; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.NameCallback; +import javax.security.auth.callback.PasswordCallback; +import javax.security.auth.callback.UnsupportedCallbackException; +import javax.security.auth.login.FailedLoginException; +import javax.security.auth.login.LoginException; +import javax.security.auth.spi.LoginModule; + +import org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal; +import org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal; + +public abstract class GeronimoLoginModule implements LoginModule { + + protected Subject subject; + + protected CallbackHandler callbackHandler; + + protected Map sharedState; + + protected Map options; + + protected boolean useFirstPass; + + protected boolean loginOk; + + protected String principalClassName; + + protected Principal unauthenticatedIdentity; + + private Principal identity; + + private char passport[]; + + private String algorithm; + + private String charset; + + private String encoding; + + private boolean ignorePasswordCase; + + protected final static int USERNAME_POS = 0; + + protected final static int PASSWORD_POS = 1; + + public GeronimoLoginModule() { + algorithm = null; + charset = null; + encoding = null; + } + + public boolean abort() throws LoginException { + return true; + } + + public boolean commit() throws LoginException { + if (!loginOk) { + return false; + } + Set heads = subject.getPrincipals(); + Principal identity = getIdentity(); + heads.add(identity); + Group roleSets[] = getRoleSets(); + for (int i = 0; i < roleSets.length; i++) { + Group group = roleSets[i]; + String name = group.getName(); + Group subjectGroup = createGroup(name, heads); + Principal role; + Enumeration members = group.members(); + while (members.hasMoreElements()) { + role = (Principal) members.nextElement(); + subjectGroup.addMember(role); + if(name.equals("Roles")){ + heads.add(new GeronimoGroupPrincipal(role.getName())); + } + } + } + return true; + } + + protected Principal getIdentity() { + return identity; + } + + public void initialize(Subject subject, CallbackHandler callbackHandler, + Map sharedState, Map options) { + this.subject = subject; + this.callbackHandler = callbackHandler; + this.sharedState = sharedState; + this.options = options; + String passwordStacking = (String) options.get("password-stacking"); + if (passwordStacking != null + && passwordStacking.equalsIgnoreCase("useFirstPass")) { + useFirstPass = true; + } + principalClassName = (String) options.get("principalClass"); + String name = (String) options.get("unauthenticatedIdentity"); + if (name != null) { + try { + unauthenticatedIdentity = createIdentity(name); + } catch (Exception e) { + } + } + algorithm = (String) options.get("hashAlgorithm"); + if (algorithm != null) { + encoding = (String) options.get("hashEncoding"); + if (encoding == null) { + encoding = "BASE64"; + } + charset = (String) options.get("hashCharset"); + } + String flag = (String) options.get("ignorePasswordCase"); + ignorePasswordCase = Boolean.valueOf(flag).booleanValue(); + } + + public boolean login() throws LoginException { + loginOk = false; + if (useFirstPass) { + Object identity = sharedState.get("javax.security.auth.login.name"); + Object credential = sharedState + .get("javax.security.auth.login.password"); + if (identity != null && credential != null) { + loginOk = true; + } + } + if (loginOk) { + Object username = sharedState.get("javax.security.auth.login.name"); + if (username instanceof Principal) { + identity = (Principal) username; + } else { + try { + identity = createIdentity(username.toString()); + } catch (Exception e) { + throw new LoginException("Failed to create principal: " + + e.getMessage()); + } + } + Object password = sharedState + .get("javax.security.auth.login.password"); + + if (password != null) { + if (password instanceof char[]) { + passport = (char[]) password; + } else { + passport = password.toString().toCharArray(); + } + } + return true; + } + loginOk = false; + + String username = null; + String password = null; + + String[] usernameAndPassword = getUsernameAndPassword(); + + username = usernameAndPassword[USERNAME_POS]; + password = usernameAndPassword[PASSWORD_POS]; + if (username == null && password == null) { + identity = unauthenticatedIdentity; + } + if (identity == null) { + try { + identity = createIdentity(username); + } catch (Exception e) { + throw new LoginException("Failed to create principal: " + + e.getMessage()); + } + if (algorithm != null) { + password = createPasswordHash(username, password); + } + String expectedPassword = getUsersPassword(); + if (!validatePassword(password, expectedPassword)) { + throw new FailedLoginException( + "Password Incorrect/Password Required"); + } + } + if (getUseFirstPass()) { + sharedState.put("javax.security.auth.login.name", username); + sharedState.put("javax.security.auth.login.password", passport); + } + loginOk = true; + return loginOk; + } + + protected String[] getUsernameAndPassword() throws LoginException { + String usernamePassword[] = { null, null }; + if (callbackHandler == null) { + throw new LoginException( + "Error occurs: there are no CallbackHandler available to get information about authentication"); + } + String username = null; + String password = null; + try { + Callback callbacks[] = { new NameCallback("Username: "), new PasswordCallback("Password: ", false) }; + callbackHandler.handle(callbacks); + NameCallback nameCallback = (NameCallback) callbacks[0]; + PasswordCallback passwordCallback = (PasswordCallback) callbacks[1]; + username = nameCallback.getName(); + char helperPassword[] = passwordCallback.getPassword(); + if (helperPassword != null) { + passport = new char[helperPassword.length]; + System.arraycopy(helperPassword, 0, passport, 0, + helperPassword.length); + passwordCallback.clearPassword(); + password = new String(passport); + } + } catch (IOException ioe) { + throw new LoginException(ioe.toString()); + } catch (UnsupportedCallbackException uce) { + throw new LoginException("CallbackHandler does not support: " + + uce.getCallback()); + } + usernamePassword[USERNAME_POS] = username; + usernamePassword[PASSWORD_POS] = password; + return usernamePassword; + } + + protected boolean validatePassword(String inputPassword, + String expectedPassword) { + if (inputPassword == null || expectedPassword == null) { + return false; + } + return ignorePasswordCase ? inputPassword + .equalsIgnoreCase(expectedPassword) : inputPassword + .equals(expectedPassword); + } + + protected String createPasswordHash(String username, String password) { + DigestCallback callback = null; + String callbackClassName = (String) options.get("digestCallback"); + if (callbackClassName != null) { + try { + Class callbackClass = loadSomeClass(callbackClassName); + callback = (DigestCallback) callbackClass.newInstance(); + } catch (Exception e) { + SecurityException securityExeption = new SecurityException( + "Cannot load DigestCallback"); + securityExeption.initCause(e); + throw securityExeption; + } + HashMap optionsMap = new HashMap(options); + optionsMap.put("javax.security.auth.login.name", username); + optionsMap.put("javax.security.auth.login.password", password); + callback.init(optionsMap); + } + + return PasswordHasher.calculateHash(algorithm, encoding, charset, + username, password, callback); + } + + protected boolean getUseFirstPass() { + return useFirstPass; + } + + protected Principal getUnauthenticatedIdentity() { + return unauthenticatedIdentity; + } + + protected Object getCredentials() { + return passport; + } + + public boolean logout() throws LoginException { + Principal identity = getIdentity(); + Set principals = subject.getPrincipals(); + principals.remove(identity); + return true; + } + + protected Principal createIdentity(String username) throws Exception { + Principal principal = null; + if (principalClassName != null) { + Class loadedClass = loadSomeClass(principalClassName); + Class signatures[] = { java.lang.String.class }; + Constructor constructorInstance = loadedClass + .getConstructor(signatures); + Object argumentsForConstructor[] = { username }; + principal = (Principal) constructorInstance + .newInstance(argumentsForConstructor); + } else { + principal = new GeronimoUserPrincipal(username); + } + return principal; + } + + private Class loadSomeClass(String classname) throws ClassNotFoundException { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + return loader.loadClass(classname); + } + + protected String getUsername() { + return (getIdentity() != null) ? getIdentity().getName() : null; + } + + protected Group createGroup(String name, Set principals) { + Group roles = null; + Iterator principalsIter = principals.iterator(); + while (principalsIter.hasNext()) { + Object next = principalsIter.next(); + if (next instanceof Group) { + Group nextGroup = (Group) next; + if (nextGroup.getName().equals(name)) { + roles = nextGroup; + break; + } + } + } + if (roles == null) { + roles = new GeronimoSimpleGroup(name); + principals.add(roles); + } + return roles; + } + + protected abstract String getUsersPassword() throws LoginException; + + protected abstract Group[] getRoleSets() throws LoginException; +} \ No newline at end of file Propchange: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/GeronimoLoginModule.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/GeronimoSimpleGroup.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/GeronimoSimpleGroup.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/GeronimoSimpleGroup.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/GeronimoSimpleGroup.java Mon Oct 8 11:50:53 2007 @@ -0,0 +1,97 @@ +/** + * 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. + */ + /* + * Auto-generated by J2G Migration. + */ +package org.apache.geronimo.devtools.j2g.sources.dependence.compatibility; + +import java.security.Principal; +import java.security.acl.Group; +import java.util.Collection; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Iterator; + +import org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal; + +public class GeronimoSimpleGroup extends GeronimoGroupPrincipal implements Group { + + /** + * Serial ID. + */ + private static final long serialVersionUID = 4220122854158936883L; + + private HashMap members; + + public GeronimoSimpleGroup(String name) { + super(name); + members = new HashMap(3); + } + + public boolean addMember(Principal user) { + boolean isMember = members.containsKey(user); + if (!isMember) { + members.put(user, user); + } + return !isMember; + } + + public boolean isMember(Principal member) { + boolean isMember = members.containsKey(member); + if (!isMember) { + isMember = member instanceof Anybody; + if (!isMember && (member instanceof Nobody)) { + return false; + } + } + + if (!isMember) { + Collection values = members.values(); + Iterator iter = values.iterator(); + do { + if (isMember || !iter.hasNext()) { + break; + } + Object next = iter.next(); + if (next instanceof Group) { + Group group = (Group) next; + isMember = group.isMember(member); + } + } while (true); + } + return isMember; + } + + public Enumeration members() { + return Collections.enumeration(members.values()); + } + + public boolean removeMember(Principal user) { + return (members.remove(user) != null); + } + + public String toString() { + String tmp = new String(getName()); + tmp.concat("(MEMBERS:"); + for (Iterator iter = members.keySet().iterator(); iter.hasNext(); tmp.concat(",")) { + tmp.concat(iter.next().toString()); + } + tmp.concat(")"); + return tmp.toString(); + } +} Propchange: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/GeronimoSimpleGroup.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/Nobody.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/Nobody.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/Nobody.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/Nobody.java Mon Oct 8 11:50:53 2007 @@ -0,0 +1,51 @@ +/** + * 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. + */ + /* + * Auto-generated by J2G Migration. + */ +package org.apache.geronimo.devtools.j2g.sources.dependence.compatibility; + +import java.security.Principal; + +public class Nobody implements Comparable, Principal { + public static final String NOBODY = ""; + + public static final Nobody NOBODY_PRINCIPAL = new Nobody(); + + public Nobody() { + } + + public int hashCode() { + return NOBODY.hashCode(); + } + + public String getName() { + return NOBODY; + } + + public String toString() { + return NOBODY; + } + + public boolean equals(Object another) { + return false; + } + + public int compareTo(Object o) { + return 1; + } +} \ No newline at end of file Propchange: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/Nobody.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/PasswordHasher.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/PasswordHasher.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/PasswordHasher.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/PasswordHasher.java Mon Oct 8 11:50:53 2007 @@ -0,0 +1,103 @@ +/** + * 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. + */ + /* + * Auto-generated by J2G Migration. + */ +package org.apache.geronimo.devtools.j2g.sources.dependence.compatibility; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; + +import org.apache.geronimo.util.encoders.Base64Encoder; + +public class PasswordHasher { + + private final static String HEX_ENC = "HEX"; + private final static String ISO_ENC = "ISO-8859-1"; + private final static String BASE_64_ENC = "BASE64"; + + public static String calculateHash(String algorithm, String encoding, String charset, String username, String password, DigestCallback callback) { + String passwordHash = null; + byte passBytes[]; + try { + if (charset == null) { + passBytes = password.getBytes(); + } + else { + passBytes = password.getBytes(charset); + } + } catch (UnsupportedEncodingException uee) { + passBytes = password.getBytes(); + } + try { + MessageDigest mesDigest = MessageDigest.getInstance(algorithm); + if (callback != null) { + callback.preDigest(mesDigest); + } + mesDigest.update(passBytes); + if (callback != null) { + callback.postDigest(mesDigest); + } + byte hash[] = mesDigest.digest(); + if (encoding.equalsIgnoreCase(HEX_ENC)) { + passwordHash = base16Encoding(hash); + } else if (encoding.equalsIgnoreCase(BASE_64_ENC)) { + passwordHash = base64Encoding(hash); + } + } catch (Exception e) {} + return passwordHash; + } + + private static String base16Encoding(byte encodedChain[]) { + StringBuffer buffer = new StringBuffer(encodedChain.length * 2); + for (int i = 0; i < encodedChain.length; i++) { + byte nextByte = encodedChain[i]; + char nextChar = (char) (nextByte >> 4 & 0xf); + if (nextChar > '\t') { + nextChar = (char) ((nextChar - 10) + 97); + } + else { + nextChar += '0'; + } + buffer.append(nextChar); + nextChar = (char) (nextByte & 0xf); + if (nextChar > '\t') { + nextChar = (char) ((nextChar - 10) + 97); + } + else { + nextChar += '0'; + } + buffer.append(nextChar); + } + return buffer.toString(); + } + + private static String base64Encoding(byte bytes[]) { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + Base64Encoder encoder = new Base64Encoder(); + try { + encoder.encode(bytes, 0, bytes.length, out); + } catch (IOException e) {} + String result = null; + try { + result = out.toString(ISO_ENC); + } catch (UnsupportedEncodingException e) {} + return result; + } +} Propchange: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/dependence/compatibility/PasswordHasher.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/AbsoluteNameSolver.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/AbsoluteNameSolver.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/AbsoluteNameSolver.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/AbsoluteNameSolver.java Mon Oct 8 11:50:53 2007 @@ -0,0 +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.devtools.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.devtools.j2g.common.IOutput; +import org.apache.geronimo.devtools.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.devtools.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.devtools.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.devtools.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/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/AbsoluteNameSolver.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/BlockVisitor.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/BlockVisitor.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/BlockVisitor.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/BlockVisitor.java Mon Oct 8 11:50:53 2007 @@ -0,0 +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.devtools.j2g.sources.environment; + +import java.io.File; +import java.util.HashMap; +import java.util.List; + +import org.apache.geronimo.devtools.j2g.common.FatalToolException; +import org.apache.geronimo.devtools.j2g.common.IOutput; +import org.apache.geronimo.devtools.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/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/BlockVisitor.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/EjbEnvJavaMigration.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/EjbEnvJavaMigration.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/EjbEnvJavaMigration.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/EjbEnvJavaMigration.java Mon Oct 8 11:50:53 2007 @@ -0,0 +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.devtools.j2g.sources.environment; + +import org.apache.geronimo.devtools.j2g.common.IJavaMigration; +import org.apache.geronimo.devtools.j2g.common.IOutput; +import org.apache.geronimo.devtools.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/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/EjbEnvJavaMigration.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/MethodsVisitor.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/MethodsVisitor.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/MethodsVisitor.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/MethodsVisitor.java Mon Oct 8 11:50:53 2007 @@ -0,0 +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.devtools.j2g.sources.environment; + +import java.util.List; + +import org.apache.geronimo.devtools.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/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/MethodsVisitor.java ------------------------------------------------------------------------------ svn:eol-style = native Added: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/NameSolvingException.java URL: http://svn.apache.org/viewvc/geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/NameSolvingException.java?rev=582932&view=auto ============================================================================== --- geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/NameSolvingException.java (added) +++ geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/NameSolvingException.java Mon Oct 8 11:50:53 2007 @@ -0,0 +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.devtools.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); + } + +} Propchange: geronimo/devtools/j2g/trunk/plugins/org.apache.geronimo.devtools.j2g.sources/src/org/apache/geronimo/devtools/j2g/sources/environment/NameSolvingException.java ------------------------------------------------------------------------------ svn:eol-style = native