• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: Eclipse Woes
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Eclipse Woes


  • Subject: Re: Eclipse Woes
  • From: Lachlan Deck <email@hidden>
  • Date: Wed, 21 Nov 2007 07:05:09 +1100

On 21/11/2007, at 5:57 AM, Fred Shurtleff wrote:

I am having a number of problems with Eclipse not being able to find Variables/Components/Methods, etc sporadically over several projects, and wanted see if others have run into this issue.

Have you tried Project > Clean... 'all'?

For example, one page throws up a dialogue window - 'Buggy key in WoComponent' > Reason: This WOComponent does not have an instance variable of the name testObject or _testObject, nor a method named.... (It also gives a the same message in the console window) But the component java file does in fact contain this var.

I assume testObject is public? Are any child components also trying to reference testObject?

Another example, I have a link with an action class & directActionName binding (DirectAction & Page1Action), and Eclipse reports:
Error: java.lang.NoSuchMethodException: com.webobjects.appserver.WODirectAction.page1Action()
But this action is in fact in the DirectAction class.

Yeah this is a problem with the normal Direct action request handler's class resolving being a bit dumb. It doesn't resolve DirectAction to your.apps.DirectAction class... and so defaults to com.webobjects.appserver.WODirectAction which is your superclass.


The solution for this involves assisting WO in finding /your/ direct action classes by adjusting the request path when needed... similar to how I offered a fix for finding the session class you mentioned below which Keiran had reposted...

So, the way I've gone around this one is to subclass com.webobjects.appserver._private.WODirectActionRequestHandler (or er.extensions.ERXDirectActionRequestHandler... either will do) so now AnyActionClass.withSomeAction resolves to your.app.AnyActionClass etc. Not sure how others are solving this, but this works reliably and is in production apps if that helps.

(perhaps some of this is a candidate for being pushed down into ERXDirectActionRequestHandler)

/**
* In app constructor do:
* <code>
* registerRequestHandler( new ISHDirectActionRequestHandler(), directActionRequestHandlerKey() );
* setDefaultRequestHandler( requestHandlerForKey ( directActionRequestHandlerKey() ) ); // optional
* </code>
*
* @author ldeck
*/
public class ISHDirectActionRequestHandler extends ERXDirectActionRequestHandler
{


/**
*@param path -
* the request path
*@return full package direct action class name and direct action.
*/
public static NSArray getDirectActionClassAndNameForPath( NSArray path )
{
NSMutableArray adjustedPath;
String actionClassName;

adjustedPath = path == null ? new NSMutableArray() : path.mutableClone();
actionClassName = adjustedPath.count() > 0 ? ( String ) adjustedPath.objectAtIndex( 0 ) : "";

// 1. Do we have a legit actionClass already?
if ( actionClassName.length() > 0 && Character.isUpperCase ( actionClassName.charAt( 0 ) ) )
{
if ( adjustedPath.count() == 1 )
adjustedPath.addObject( "default" );
}
else if ( "".equals( actionClassName ) )
{
actionClassName = "DirectAction";
if ( adjustedPath.count() == 0 )
adjustedPath.addObject( actionClassName );
else
adjustedPath.replaceObjectAtIndex( actionClassName, 0 );

if ( adjustedPath.count() == 1 )
adjustedPath.addObject( "default" );
}
else if ( "null".equals( actionClassName ) )
{
actionClassName = "DirectAction";
adjustedPath.replaceObjectAtIndex( actionClassName, 0 );
if ( adjustedPath.count() == 1 )
adjustedPath.addObject( "default" );
}
else if ( path.count() == 1 && !modRewriteEnabled() )
{
actionClassName = "DirectAction";
adjustedPath.insertObjectAtIndex( actionClassName, 0 );
}
else
{
// Snipping custom mod-unrewrite compatibility as this
// involves extended action paths that rely on app logic.
// Come back to me if you want this.
// e.g., could be achieved by creating ERXApplication.erxApplication()._unrewriteURL( ... );
}


// finally, adjust package of direct action class to your app's package
if ( actionClassName.indexOf( '.' ) < 0 && Character.isUpperCase ( actionClassName.charAt( 0 ) ) )
{
String pkg = WOApplication.application().getClass().getPackage ().getName();
adjustedPath.replaceObjectAtIndex( pkg + "." + actionClassName, 0 );
}
return adjustedPath;
}

/**
*@param path -
* the request path
*@return an array of user friendly action class and action names. i.e., without the package.
*/
public static NSArray getUserActionClassAndNameForPath( NSArray path )
{
NSMutableArray fixed = getDirectActionClassAndNameForPath ( path ).mutableClone();
if ( fixed.count() > 0 )
{
String actionClass = ( String )fixed.objectAtIndex( 0 );
int index = actionClass.lastIndexOf( '.' );
if ( index >= 0 )
{
actionClass = actionClass.substring( index + 1 );
fixed.replaceObjectAtIndex( actionClass, 0 );
}
}
// mod-unwrite snippet follows... (optional)
if ( fixed.count() > 1 )
{
String userActionPath = fixed.removeObjectAtIndex( 1 ).toString ().replaceAll( "\\s", "+" );
fixed.addObjectsFromArray( NSArray.componentsSeparatedByString ( userActionPath, ModUnwriteDelimiter ) );
}
return fixed;
}


	public ISHDirectActionRequestHandler()
	{
		super();
	}

public ISHDirectActionRequestHandler( String actionClassName, String defaultActionName, boolean shouldAddToStatistics )
{
super( actionClassName, defaultActionName, shouldAddToStatistics );
}


/**
*Overrides super to adjust the direct action class name to the full class name.
*
*@see com.webobjects.appserver._private.WOActionRequestHandler#getRequestActio nClassAndNameForPath(com.webobjects.foundation.NSArray)
*/
public Object[] getRequestActionClassAndNameForPath( NSArray path )
{
NSArray fixedPath = getDirectActionClassAndNameForPath( path );
return super.getRequestActionClassAndNameForPath( fixedPath );
}
}


These errors are a real 'show stopper'- how do you proceed from here?

A while back I ran into a similar problem where the project could not find a variable in the session class(that was in fact there), and Keiran K offered a snippet of code to use the project's session class. But now this problem seems to have plagued other places in the project.

Right. The above is a similar problem where WO doesn't find your classes (now that everyone's using packages these days)... but a little oil, and it's fixed :-)


with regards,
--

Lachlan Deck



_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden


  • Follow-Ups:
    • Re: Eclipse Woes
      • From: Fred Shurtleff <email@hidden>
References: 
 >Eclipse Woes (From: Fred Shurtleff <email@hidden>)

  • Prev by Date: Eclipse Woes
  • Next by Date: Re: Eclipse Woes
  • Previous by thread: Eclipse Woes
  • Next by thread: Re: Eclipse Woes
  • Index(es):
    • Date
    • Thread