Hi Scott, Service Managed Factory is the other way around: you start from the cfg file, then the service is created. The content of the file can be default or whatever, it doesn't matter.
Basically, you would have: etc/org.scott.foo-one.cfg etc/org.scott.foo-two.cfg etc/org.scott.foo-three.cfg with the corresponding service for each cfg file. If you create etc/org.scott.foo-four.cfg, then, automatically, you will have a new corresponding service created. For instance, it's what we are using in Decanter for the JMX collector: you can create a new JMX collector "on the fly", just adding a new etc/org.apache.karaf.decanter.collector.jmx-foobar.cfg file. Regards JB On 02/23/2018 04:47 AM, Leschke, Scott wrote: > Thanks JB, > > Initially, the .cfg would be populated almost entirely with the defaults the > service receives using a configuration type so the idea is that the service > creation needs to come first so that the service can be used to get the > values to write the .cfg. > > Is there a way to get those value without actually having a service instance > or hard-coding them? > > Scott > > -----Original Message----- > From: Jean-Baptiste Onofré [mailto:[email protected]] > Sent: Thursday, February 22, 2018 9:38 PM > To: [email protected] > Subject: Re: On another topic: Creating services programatically again > > Hi Scott, > > why don't use a managed service factory ? > > It would automatically create a service based on a cfg. So for your user, he > creates the cfg file, and then, automatically, the corresponding service is > created. > > Thoughts ? > > Regards > JB > > On 02/22/2018 09:18 PM, Leschke, Scott wrote: >> As I mentioned a few weeks ago, I'm trying to create a service >> instance programmatically and write the associated .cfg file for it. >> Based on feedback I got, I create the following method. >> >> >> >> The goal is to create the service instance and then get its >> configuration which at this point will mostly be the defaults that it >> receives in its configuration type (hence my previous post). It >> /appears/ to work, except what is really happening is that I get two >> services. One is created by createFactoryConfguration call and the >> other by Felix FileInstall after the .cfg file is written. >> >> >> >> Actually I'm a bit surprised that placeholder .cfg file isn't created >> if property /felix.fileinstall.filename/is defined, as I think that >> would solve this problem, but perhaps there's another way? >> >> >> >> Thoughts? >> >> * * >> >> * * >> >> *private**void* createConfig(String cpid, String dir, String name, >> Map<String,Object> props) >> >> *throws* Exception >> >> { >> >> Configuration conf = >> parent.cfgAdmin.createFactoryConfiguration(cpid, "?"); >> >> >> >> dir = (dir.endsWith("/") ? dir : dir + '/'); >> >> name = name.replaceAll(" ", "_").toLowerCase(); >> >> File cfg = *new* File(dir + cpid + '-' + name + ".cfg"); >> >> >> >> Dictionary<String,Object> confProps = toDictionary(props); >> >> confProps.put("felix.fileinstall.filename", >> cfg.toURI().toString()); >> >> >> >> *try* >> >> { >> >> conf.update(confProps); >> >> >> >> // Get the properties for the new service object >> >> props = getProps(conf.getPid()); >> >> >> >> // Create .cfg file with initial property set >> >> ITemplate tmp = parent.templateMgr.getTemplate( >> configTemplates.get(cpid) ); >> >> tmp.bind("cfg", props); >> >> >> >> *try* (FileLineWriter w = *new* FileLineWriter(cfg)) >> >> { >> >> w.putLine(tmp.render()); >> >> } >> >> } >> >> *catch* (Exception e) >> >> { >> >> cfg.delete(); >> >> conf.delete(); >> >> *throw* e; >> >> } >> >> } >> >> >> > > -- > Jean-Baptiste Onofré > [email protected] > http://blog.nanthrax.net > Talend - http://www.talend.com > -- Jean-Baptiste Onofré [email protected] http://blog.nanthrax.net Talend - http://www.talend.com
