Is an extension with multiple services implemented in different classes possible?

I have made an extension with multiple services implemented in one java class, but when I tried to implement the same services in two classes I got it wrong. I get the error message:

“No factory object for org.libreoffice.example.comp.ProtocolHandlerImpl”

So my question is:
Is it possible to write an add-extension with two or more services implemented in two classes?
The code for the class with the registry information looks like:

public final class StarterProjectImpl extends WeakBase
implements com.sun.star.lang.XServiceInfo,
          com.sun.star.task.XJobExecutor
{
private static final Logger LOGGER = Logger.getLogger(StarterProjectImpl.class.getName());
private final XComponentContext m_xContext;
private static final String m_implementationName = StarterProjectImpl.class.getName();
private static final String[] m_serviceNames = {
    "org.libreoffice.example.StarterProject" };


public StarterProjectImpl( XComponentContext context )
{
    m_xContext = context;
};

public static XSingleComponentFactory __getComponentFactory( String sImplementationName ) {
    XSingleComponentFactory xFactory = null;
    LOGGER.log(Level.SEVERE, sImplementationName);
    if ( sImplementationName.equals( m_implementationName ) )
        xFactory = Factory.createComponentFactory(StarterProjectImpl.class, m_serviceNames);
    else if ( sImplementationName.equals( ProtocolHandlerImpl.class.getName() ))
    	xFactory = Factory.createComponentFactory(ProtocolHandlerImpl.class,  ProtocolHandlerImpl.getServiceNames());

    return xFactory;
}

public static boolean __writeRegistryServiceInfo( XRegistryKey xRegistryKey ) {
    boolean a=Factory.writeRegistryServiceInfo(m_implementationName,
                                            m_serviceNames,
                                            xRegistryKey);
    boolean b=Factory.writeRegistryServiceInfo(ProtocolHandlerImpl.class.getName(),
    		ProtocolHandlerImpl.getServiceNames(),
            xRegistryKey);
    String x=ProtocolHandlerImpl.getServiceNames()[0]+" "+Boolean.toString(b);
    LOGGER.log(Level.SEVERE, x);
    return a && b;
}
// com.sun.star.lang.XServiceInfo:
public String getImplementationName() {
     return m_implementationName;
}

public boolean supportsService( String sService ) {
    int len = m_serviceNames.length;

    for( int i=0; i < len; i++) {
        if (sService.equals(m_serviceNames[i]))
            return true;
    }
    return false;
}

public String[] getSupportedServiceNames() {
    return m_serviceNames;
}

// com.sun.star.task.XJobExecutor:
public void trigger(String action)
{
	switch (action) {
	case "actionOne":
		ActionOneDialog actionOneDialog = new ActionOneDialog(m_xContext);
		actionOneDialog.show();
		break;
	default:
		DialogHelper.showErrorMessage(m_xContext, null, "Unknown action: " + action);
	}
    
}
}

Did you add the class to RegistrationHandler.classes? According to https://github.com/smehrbrodt/libreoffice-starter-extension/blob/master/source/org/libreoffice/example/comp/RegistrationHandler.java: “This method calls all the methods of the same name from the classes listed in the RegistrationHandler.classes file.”

Also, your code doesn’t look right. __getComponentFactory() returns a single argument but you initialize it twice, destroying the first one. It looks like you need to rethink the design of your classes.

Yes I use LOEclipse and that generates automatical RegistrationHandler.classes. In my case with the content: org.libreoffice.example.comp.StarterProjectImpl

Okay, forget the second part of my earlier comment. So the class StarterProjectImpl has a method called __getComponentFactory() that can potentially return something other than type StarterProjectImpl.class? I’m not exactly sure what the problem is but it doesn’t look like a good idea. Surely the class should return its own type, not some other unexpected type.

Is this the line where the error occurs: xFactory = Factory.createComponentFactory(ProtocolHandlerImpl.class, ProtocolHandlerImpl.getServiceNames());?

It seems like the problem may be caused by ProtocolHandlerImpl.java missing something, so you should probably edit your question to show that code as well.

__getComponentFactory() as you can see has conditional statements which mean that xFactory is only assigned once. Furthermore __getComponentFactory() is never called with simplementationName=…ProtocolHandlerImpl and that might be the fault. I can see that in my logfile.
Above m_implementationName =StarterProjectImpl.class.getName() and that is also the only value simplementationName ever gets.

If interests I will add more code but the service ProtocolHandlerImpl provides work in LO if the oxt file is added by unopkg (That is what LOEclipse does). So I think that ProtocolHandlerImpl is the problem. However, I think I have seen a statement on the Internet that all service interfaces have to be implemented in one class only for extensions at the moment. I am just not sure.