diff options
author | gmendel | 2005-02-09 19:04:05 +0000 |
---|---|---|
committer | gmendel | 2005-02-09 19:04:05 +0000 |
commit | 912f2831e82aca732a26b218ed49890b88245be0 (patch) | |
tree | b3ee6ca3ae704018020d4ac9186bc92eda4bc967 /plugins | |
parent | daf0ac822d5823b3b40f0cacaab31c9ef7546044 (diff) | |
download | webtools.javaee-912f2831e82aca732a26b218ed49890b88245be0.tar.gz webtools.javaee-912f2831e82aca732a26b218ed49890b88245be0.tar.xz webtools.javaee-912f2831e82aca732a26b218ed49890b88245be0.zip |
84728 [perf] JavaMethodJDOMAdaptor.addParameters triggers massive reads of JRE's src.zip
Diffstat (limited to 'plugins')
5 files changed, 95 insertions, 14 deletions
diff --git a/plugins/org.eclipse.jem.workbench/workbench/org/eclipse/jem/internal/adapters/jdom/JavaMethodJDOMAdaptor.java b/plugins/org.eclipse.jem.workbench/workbench/org/eclipse/jem/internal/adapters/jdom/JavaMethodJDOMAdaptor.java index 2fb3ad118..221813beb 100644 --- a/plugins/org.eclipse.jem.workbench/workbench/org/eclipse/jem/internal/adapters/jdom/JavaMethodJDOMAdaptor.java +++ b/plugins/org.eclipse.jem.workbench/workbench/org/eclipse/jem/internal/adapters/jdom/JavaMethodJDOMAdaptor.java @@ -10,7 +10,7 @@ *******************************************************************************/ /* * $RCSfile: JavaMethodJDOMAdaptor.java,v $ - * $Revision: 1.8 $ $Date: 2005/02/08 23:20:27 $ + * $Revision: 1.9 $ $Date: 2005/02/09 19:04:05 $ */ package org.eclipse.jem.internal.adapters.jdom; @@ -89,11 +89,9 @@ public class JavaMethodJDOMAdaptor extends JDOMAdaptor implements IJavaMethodAda // name stays null and we carry on } } - - /** - * addParameters - reflect our parms - */ - protected void addParameters() { + + + protected String[] getParameterNames() { String[] parmNames = new String[0], parmTypeNames = getSourceMethod().getParameterTypes(); try { parmNames = getSourceMethod().getParameterNames(); @@ -106,11 +104,19 @@ public class JavaMethodJDOMAdaptor extends JDOMAdaptor implements IJavaMethodAda for (int i = 0; i < parmTypeNames.length; i++) { parmNames[i] = "arg" + i;//$NON-NLS-1$ } - } + } + return parmNames; + } + + /** + * addParameters - reflect our parms + */ + protected void addParameters() { + String[] parmTypeNames = getSourceMethod().getParameterTypes(); MethodImpl javaMethodTarget = (MethodImpl) getTarget(); List params = javaMethodTarget.getParametersGen(); - for (int i = 0; i < parmNames.length; i++) { - params.add(createJavaParameter(javaMethodTarget, parmNames[i], typeNameFromSignature(parmTypeNames[i]))); + for (int i = 0; i < parmTypeNames.length; i++) { + params.add(createJavaParameter(javaMethodTarget, null, typeNameFromSignature(parmTypeNames[i]))); } } @@ -272,6 +278,18 @@ public class JavaMethodJDOMAdaptor extends JDOMAdaptor implements IJavaMethodAda } return false; } + + public boolean reflectParamNamesIfNecessary() { + if (reflectValuesIfNecessary()) { + String [] paramNames = getParameterNames(); + List param = ((MethodImpl)getTarget()).getParameters(); + for (int i = 0; i < paramNames.length; i++) { + ((JavaParameter)param.get(i)).setName(paramNames[i]); + } + return true; + } + return false; + } /** * setModifiers - set the attribute values related to modifiers here */ diff --git a/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/IJavaMethodAdapter.java b/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/IJavaMethodAdapter.java index 99c01edc3..2d8a1c97f 100644 --- a/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/IJavaMethodAdapter.java +++ b/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/IJavaMethodAdapter.java @@ -10,7 +10,7 @@ *******************************************************************************/ /* * $RCSfile: IJavaMethodAdapter.java,v $ - * $Revision: 1.1 $ $Date: 2005/02/03 21:19:40 $ + * $Revision: 1.2 $ $Date: 2005/02/09 19:04:04 $ */ package org.eclipse.jem.internal.java.adapters; @@ -28,4 +28,12 @@ public interface IJavaMethodAdapter { * @since 1.0.0 */ public boolean reflectGeneratedIfNecessary(); + + /** + * Reflect the names of the method parameters if necessary. + * @return <code>true</code> if reflection occurred. + * + * @since 1.0.0 + */ + public boolean reflectParamNamesIfNecessary(); } diff --git a/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/JavaReflectionAdaptor.java b/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/JavaReflectionAdaptor.java index 81164ad8a..10ae526ef 100644 --- a/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/JavaReflectionAdaptor.java +++ b/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/JavaReflectionAdaptor.java @@ -11,7 +11,7 @@ package org.eclipse.jem.internal.java.adapters; /* * $RCSfile: JavaReflectionAdaptor.java,v $ - * $Revision: 1.9 $ $Date: 2005/02/04 23:11:33 $ + * $Revision: 1.10 $ $Date: 2005/02/09 19:04:04 $ */ import java.util.List; @@ -94,7 +94,8 @@ public JavaClass createJavaClassRef(String targetName) { */ public JavaParameter createJavaParameter(Method parentMethod, String parmName, String parmTypeName) { JavaParameter newParm = getJavaFactory().createJavaParameter(); - newParm.setName(parmName); + if (parmName!=null) + newParm.setName(parmName); // ((InternalEObject)newParm).eSetID(parentMethod.eID() + C_METHODID_PARMID_DELIMITER + parmName); String classRefString = parmTypeName; newParm.setEType(createJavaClassRef(classRefString)); diff --git a/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/jdk/JavaMethodJDKAdaptor.java b/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/jdk/JavaMethodJDKAdaptor.java index 9a8f5b547..2be991c3b 100644 --- a/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/jdk/JavaMethodJDKAdaptor.java +++ b/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/internal/java/adapters/jdk/JavaMethodJDKAdaptor.java @@ -11,7 +11,7 @@ package org.eclipse.jem.internal.java.adapters.jdk; /* * $RCSfile: JavaMethodJDKAdaptor.java,v $ - * $Revision: 1.5 $ $Date: 2005/02/03 21:19:40 $ + * $Revision: 1.6 $ $Date: 2005/02/09 19:04:04 $ */ import java.util.List; @@ -184,6 +184,10 @@ public class JavaMethodJDKAdaptor extends JDKAdaptor implements IJavaMethodAdapt return reflectValuesIfNecessary(); } + public boolean reflectParamNamesIfNecessary() { + return reflectValuesIfNecessary(); + } + /** * setModifiers - set the attribute values related to modifiers here */ diff --git a/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/java/impl/JavaParameterImpl.java b/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/java/impl/JavaParameterImpl.java index 956d37796..a54d0a4f4 100644 --- a/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/java/impl/JavaParameterImpl.java +++ b/plugins/org.eclipse.jem/mofjava/org/eclipse/jem/java/impl/JavaParameterImpl.java @@ -12,7 +12,7 @@ package org.eclipse.jem.java.impl; /* * $RCSfile: JavaParameterImpl.java,v $ - * $Revision: 1.4 $ $Date: 2004/08/27 15:33:17 $ + * $Revision: 1.5 $ $Date: 2005/02/09 19:04:04 $ */ import java.util.Collection; @@ -26,9 +26,12 @@ import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.ENotificationImpl; import org.eclipse.emf.ecore.impl.EParameterImpl; +import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.util.InternalEList; +import org.eclipse.jem.internal.java.adapters.IJavaMethodAdapter; +import org.eclipse.jem.internal.java.adapters.ReadAdaptor; import org.eclipse.jem.java.JavaHelpers; import org.eclipse.jem.java.JavaParameter; import org.eclipse.jem.java.JavaParameterKind; @@ -141,6 +144,53 @@ public class JavaParameterImpl extends EParameterImpl implements JavaParameter{ if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, JavaRefPackage.JAVA_PARAMETER__PARAMETER_KIND, oldParameterKind, parameterKind)); } + + /* + * This is not meant to be used outside of the reflection adapters. + */ + public synchronized ReadAdaptor getReadAdapter() { + return (ReadAdaptor) EcoreUtil.getRegisteredAdapter(eContainer(), ReadAdaptor.TYPE_KEY); + } + + private static final int REFLECTED_BASE = 0x1, REFLECTED_PARAM_NAME = 0x2; + + protected int reflectionStatus = REFLECTED_BASE; // At this time base reflection + // is performed at creation. + + protected void reflectParamName() { + // We only want the testing of the hasReflected and get readadapter to be sync(this) so that + // it is short and no deadlock possibility (this is because the the method reflection adapter may go + // back to the containing java class to get its reflection adapter, which would lock on itself. So + // we need to keep the sections that are sync(this) to not be deadlockable by not doing significant work + // during the sync. + ReadAdaptor readAdaptor = null; + synchronized (this) { + if ((reflectionStatus & REFLECTED_PARAM_NAME) == 0) { + readAdaptor = getReadAdapter(); + } + } + if (readAdaptor != null) { + boolean setReflected = ((IJavaMethodAdapter) readAdaptor).reflectParamNamesIfNecessary(); + synchronized (this) { + // Don't want to set it false. That is job of reflection adapter. Otherwise we could have a race. + if (setReflected) + reflectionStatus |= (REFLECTED_PARAM_NAME); // We can be certain base will be done by reflect generated if not already + // done. + } + } + } + + public String getName() { + reflectParamName(); + return super.getName(); + } + + public void setName(String name) { + super.setName(name); + synchronized (this) { + reflectionStatus |= (REFLECTED_PARAM_NAME); + } + } /** * @generated This field/method will be replaced during code generation. |