Archived

This forum has been archived. Please start a new discussion on GitHub.

Automatically Generating an ObjectFactory

Before I dive into the post proper, I'd just like to extend my appreciation for all the support I've got from these forums so far. Benoit and marc, I have taken your advice and stipped down my application to the bare minimum.

I'm still stuck on streaming and am examining the demoj\Ice\invoke example.

One thing I do not understand is how the ObjectFactory methods were generated in the C.java class:
private static class __F extends Ice.LocalObjectImpl implements Ice.ObjectFactory
    {
	public Ice.Object
	create(String type)
	{
	    assert(type.equals(ice_staticId()));
	    return new C();
	}

    }
    private static Ice.ObjectFactory _factory = new __F();

    public static Ice.ObjectFactory
    ice_factory()
    {
	return _factory;
    }

My Slice definition is very simple:
module Streaming {
	class KodkodModel {
		void solve();
	};

	interface KodkodModelReceiver {
		void receiveKodkodModel(KodkodModel k);
	};
};

However my generated class does not have those ObjectFactory methods and it is the cause of this exception:
identity: kodkodmodelreceiverobject
facet:
operation: receiveKodkodModel
Ice.NoObjectFactoryException
    reason = "class sliced to Ice.Object, which is abstract"
    type = "::Streaming::KodkodModel"

Thanks!

Comments

  • mes
    mes California
    Hi,

    The Slice compilers can only generate object factories for concrete classes. Since your class defines an operation, it is considered abstract. The application is responsible for defining a concrete subclass that implements the operations. Since the Slice compiler has no way of knowing what the name of that subclass might be, it's impossible for the compiler to generate a factory. Therefore, you must also define a subclass of ObjectFactory and register it with the communicator. Take a look at the example in demo/Ice/value for more details.

    Take care,
    - Mark