From javatestcase at yahoo.com Fri Oct 23 20:14:31 2009 Content-Type: multipart/mixed; boundary="===============4097937748889651752==" MIME-Version: 1.0 From: Bill Tarr To: rules-users at lists.jboss.org Subject: Re: [rules-users] [droolsflow] - one way to use Hibernate mapping with JPAVariablePersister Date: Fri, 23 Oct 2009 17:14:30 -0700 Message-ID: <463447.27253.qm@web45915.mail.sp1.yahoo.com> In-Reply-To: efac615a0910231618q3631bb12l44fb571e489e541e@mail.gmail.com --===============4097937748889651752== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable I'm not sure this should be comitted to the trunk. Users=C2=A0can't use this code as is, because: 1. Manual/Automatic flush = =C2=A0=C2=A0 - they'd need to implement flush() and persist() if they have = manual flush set up. 2. HibUtil = =C2=A0=C2=A0 - is a system specific implementation used to manage SessionFa= ctory and Sessions =C2=A0=C2=A0 - systems using Hibernate will already have some version of th= is they will need to leverage so this is more of a template.=C2=A0 = In fact, it won't compile without a HibUtil, so that's another problem for = adding it to the trunk... A test case in examples would let us create a simple HibUtil and hibernate.= cfg.xml. The test case could create a H2 DB and the tables needed... ________________________________ From: Mauricio Salatino To: Rules Users List Sent: Fri, October 23, 2009 4:18:16 PM Subject: Re: [rules-users] [droolsflow] - one way to use Hibernate mapping = with JPAVariablePersister nice.. do you mind if I commit it to the trunk? can you create some unit testing too? On Fri, Oct 23, 2009 at 3:27 PM, Bill Tarr wrote: Here is an alternate version of JPAVariablePersister for people who are alr= eady using Hibernate xml=C2=A0mapping files.=C2=A0 > >This implementation has some downsides, but it seems to be working for now. > >I am going to keep using JPA to manage all the Drools Flow tables. > >My domain object persistence will be managed by Hibernate Session.=C2=A0 > >We are also currently using automatic flush (so no code to persist domain = objects in this class) > >Obviously you need to use your own version of HibUtil. > >import java.util.logging.Level; >import java.util.logging.Logger; >import org.drools.persistence.processinstance.variabletypes.JPAPersistedVa= riable; >import org.drools.persistence.processinstance.variabletypes.VariableInstan= ceInfo; >import org.drools.persistence.processinstance.persisters.VariablePersister; >import org.drools.runtime.Environment; >import org.hibernate.Session; >import HibUtil; >/** >=C2=A0* Variation on Drools JPA Variable Persister. >=C2=A0* org.drools.persistence.processinstance.persisters.JPAVariablePersi= ster >=C2=A0* for using variables persisted by Hibernate, while still using JPA = to >=C2=A0* persist DroolsFlow data. >=C2=A0* >=C2=A0* @author Kris Verla= enen >=C2=A0* @author salaboy >=C2=A0*/ >public class JPAVariablePersisterHibernate implements VariablePersister { >=C2=A0public VariableInstanceInfo persistExternalVariable(String name, Obj= ect o, >=C2=A0=C2=A0=C2=A0VariableInstanceInfo oldValue, Environment env) { >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 if(o =3D=3D null || (oldValue !=3D null && oldValue.getP= ersister().equals(""))){ >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return null; >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 } >=C2=A0=C2=A0try { >=C2=A0=C2=A0=C2=A0JPAPersistedVariable result =3D null; >=C2=A0=C2=A0=C2=A0if (oldValue instanceof JPAPersistedVariable) { >=C2=A0=C2=A0=C2=A0=C2=A0result =3D (JPAPersistedVariable) oldValue; >=C2=A0=C2=A0=C2=A0} >=C2=A0=C2=A0=C2=A0if (result =3D=3D null) { >=C2=A0=C2=A0=C2=A0=C2=A0result =3D new JPAPersistedVariable(); >=C2=A0=C2=A0=C2=A0} >=C2=A0=C2=A0=C2=A0Long idValue =3D geHibIdValue(o); >=C2=A0=C2=A0=C2=A0result.setPersister(this.getClass().getName()); >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 result.= setName(name); >=C2=A0=C2=A0=C2=A0result.setEntityId(idValue); >=C2=A0=C2=A0=C2=A0result.setEntity(o); >=C2=A0=C2=A0=C2=A0result.setEntityClass(o.getClass().getCanonicalName()); >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return = result; >=C2=A0=C2=A0} catch (Throwable t) { >=C2=A0=C2=A0=C2=A0Logger.getLogger(JPAVariablePersisterHibernate.class.get= Name()) >=C2=A0=C2=A0=C2=A0=C2=A0.log(Level.SEVERE, null, t); >=C2=A0=C2=A0=C2=A0throw new RuntimeException("Could not persist external v= ariable", t); >=C2=A0=C2=A0} >=C2=A0} >=C2=A0public Object getExternalPersistedVariable( >=C2=A0=C2=A0=C2=A0VariableInstanceInfo variableInstanceInfo, Environment e= nv) { >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 if(((JPAPersistedVariable) vari= ableInstanceInfo) =3D=3D null || ((JPAPersistedVariable) variableInstanceIn= fo).getEntityId() =3D=3D null){ >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return = null; >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 } >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 System.out.println("Restoring J= PAPersistedVariable id=3D" + ((JPAPersistedVariable) variableInstanceInfo).= getId() + " entityId=3D" + ((JPAPersistedVariable) variableInstanceInfo).ge= tEntityId() + " class=3D" + ((JPAPersistedVariable) variableInstanceInfo).g= etEntityClass() + " value=3D" + ((JPAPersistedVariable) variableInstanceInf= o).getEntity()); >=C2=A0=C2=A0String varType =3D ((JPAPersistedVariable) variableInstanceInf= o).getEntityClass(); >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Object obj =3D HibUtil.getCurre= ntSession().get(varType, ((JPAPersistedVariable) variableInstanceInfo).getE= ntityId()); >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 HibUtil.closeCurrentSession(); >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return obj; >=C2=A0} >/** >=C2=A0* Hibernate lookup to get ID column. >=C2=A0* @param o Dto to look up. >=C2=A0* @return Long id. >=C2=A0*/ >=C2=A0private Long geHibIdValue(Object o)=C2=A0 { >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 Session session =3D HibUtil.get= CurrentSession(); >=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return (Long) session.getIdenti= fier(o); >=C2=A0} >}=C2=A0 > > > > >_______________________________________________ >rules-users mailing list >rules-users(a)lists.jboss.org >https://lists.jboss.org/mailman/listinfo/rules-users > -- = - http://salaboy.wordpress.com - http://www.jbug.com.ar - Salatino "Salaboy" Mauricio - =20 --===============4097937748889651752== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWw+PGhlYWQ+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48IS0tIERJViB7bWFyZ2luOjBweDt9 IC0tPjwvc3R5bGU+PC9oZWFkPjxib2R5PjxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OmFyaWFsLCBo ZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHQiPjxESVY+SSdtIG5vdCBzdXJlIHRo aXMgc2hvdWxkIGJlIGNvbWl0dGVkIHRvIHRoZSB0cnVuay48L0RJVj4KPERJVj4mbmJzcDs8L0RJ Vj4KPERJVj5Vc2VycyZuYnNwO2Nhbid0IHVzZSB0aGlzIGNvZGUgYXMgaXMsIGJlY2F1c2U6PC9E SVY+CjxESVY+Jm5ic3A7PC9ESVY+CjxESVY+MS4gTWFudWFsL0F1dG9tYXRpYyBmbHVzaCA8L0RJ Vj4KPERJVj4mbmJzcDsmbmJzcDsgLSB0aGV5J2QgbmVlZCB0byBpbXBsZW1lbnQgZmx1c2goKSBh bmQgcGVyc2lzdCgpIGlmIHRoZXkgaGF2ZSBtYW51YWwgZmx1c2ggc2V0IHVwLjwvRElWPgo8RElW PjIuIEhpYlV0aWwgPC9ESVY+CjxESVY+Jm5ic3A7Jm5ic3A7IC0gaXMgYSBzeXN0ZW0gc3BlY2lm aWMgaW1wbGVtZW50YXRpb24gdXNlZCB0byBtYW5hZ2UgU2Vzc2lvbkZhY3RvcnkgYW5kIFNlc3Np b25zPC9ESVY+CjxESVY+Jm5ic3A7Jm5ic3A7IC0gc3lzdGVtcyB1c2luZyBIaWJlcm5hdGUgd2ls bCBhbHJlYWR5IGhhdmUgc29tZSB2ZXJzaW9uIG9mIHRoaXMgdGhleSB3aWxsIG5lZWQgdG8gbGV2 ZXJhZ2U8L0RJVj4KPERJVj4mbmJzcDs8L0RJVj4KPERJVj5zbyB0aGlzIGlzIG1vcmUgb2YgYSB0 ZW1wbGF0ZS4mbmJzcDsgPC9ESVY+CjxESVY+Jm5ic3A7PC9ESVY+CjxESVY+SW4gZmFjdCwgaXQg d29uJ3QgY29tcGlsZSB3aXRob3V0IGEgSGliVXRpbCwgc28gdGhhdCdzIGFub3RoZXIgcHJvYmxl bSBmb3IgYWRkaW5nIGl0IHRvIHRoZSB0cnVuay4uLjwvRElWPgo8RElWPiZuYnNwOzwvRElWPgo8 RElWPkEgdGVzdCBjYXNlIGluIGV4YW1wbGVzIHdvdWxkIGxldCB1cyBjcmVhdGUgYSBzaW1wbGUg SGliVXRpbCBhbmQgaGliZXJuYXRlLmNmZy54bWwuPC9ESVY+CjxESVY+PEJSPlRoZSB0ZXN0IGNh c2UgY291bGQgY3JlYXRlIGEgSDIgREIgYW5kIHRoZSB0YWJsZXMgbmVlZGVkLi4uPC9ESVY+CjxE SVY+Jm5ic3A7PC9ESVY+CjxESVYgc3R5bGU9IkZPTlQtRkFNSUxZOiBhcmlhbCwgaGVsdmV0aWNh LCBzYW5zLXNlcmlmOyBGT05ULVNJWkU6IDEycHQiPjxCUj4KPERJViBzdHlsZT0iRk9OVC1GQU1J TFk6IHRpbWVzIG5ldyByb21hbiwgbmV3IHlvcmssIHRpbWVzLCBzZXJpZjsgRk9OVC1TSVpFOiAx MnB0Ij48Rk9OVCBzaXplPTIgZmFjZT1UYWhvbWE+CjxIUiBTSVpFPTE+CjxCPjxTUEFOIHN0eWxl PSJGT05ULVdFSUdIVDogYm9sZCI+RnJvbTo8L1NQQU4+PC9CPiBNYXVyaWNpbyBTYWxhdGlubyAm bHQ7c2FsYWJveUBnbWFpbC5jb20mZ3Q7PEJSPjxCPjxTUEFOIHN0eWxlPSJGT05ULVdFSUdIVDog Ym9sZCI+VG86PC9TUEFOPjwvQj4gUnVsZXMgVXNlcnMgTGlzdCAmbHQ7cnVsZXMtdXNlcnNAbGlz dHMuamJvc3Mub3JnJmd0OzxCUj48Qj48U1BBTiBzdHlsZT0iRk9OVC1XRUlHSFQ6IGJvbGQiPlNl bnQ6PC9TUEFOPjwvQj4gRnJpLCBPY3RvYmVyIDIzLCAyMDA5IDQ6MTg6MTYgUE08QlI+PEI+PFNQ QU4gc3R5bGU9IkZPTlQtV0VJR0hUOiBib2xkIj5TdWJqZWN0OjwvU1BBTj48L0I+IFJlOiBbcnVs ZXMtdXNlcnNdIFtkcm9vbHNmbG93XSAtIG9uZSB3YXkgdG8gdXNlIEhpYmVybmF0ZSBtYXBwaW5n IHdpdGggSlBBVmFyaWFibGVQZXJzaXN0ZXI8QlI+PC9GT05UPjxCUj5uaWNlLi4gZG8geW91IG1p bmQgaWYgSSBjb21taXQgaXQgdG8gdGhlIHRydW5rPzxCUj5jYW4geW91IGNyZWF0ZSBzb21lIHVu aXQgdGVzdGluZyB0b28/PEJSPjxCUj48QlI+CjxESVYgY2xhc3M9Z21haWxfcXVvdGU+T24gRnJp LCBPY3QgMjMsIDIwMDkgYXQgMzoyNyBQTSwgQmlsbCBUYXJyIDxTUEFOIGRpcj1sdHI+Jmx0OzxB IGhyZWY9Im1haWx0bzpqYXZhdGVzdGNhc2VAeWFob28uY29tIiByZWw9bm9mb2xsb3cgdGFyZ2V0 PV9ibGFuayB5bWFpbHRvPSJtYWlsdG86amF2YXRlc3RjYXNlQHlhaG9vLmNvbSI+amF2YXRlc3Rj YXNlQHlhaG9vLmNvbTwvQT4mZ3Q7PC9TUEFOPiB3cm90ZTo8QlI+CjxCTE9DS1FVT1RFIHN0eWxl PSJCT1JERVItTEVGVDogcmdiKDIwNCwyMDQsMjA0KSAxcHggc29saWQ7IE1BUkdJTjogMHB0IDBw dCAwcHQgMC44ZXg7IFBBRERJTkctTEVGVDogMWV4IiBjbGFzcz1nbWFpbF9xdW90ZT5IZXJlIGlz IGFuIGFsdGVybmF0ZSB2ZXJzaW9uIG9mIEpQQVZhcmlhYmxlUGVyc2lzdGVyIGZvciBwZW9wbGUg d2hvIGFyZSBhbHJlYWR5IHVzaW5nIEhpYmVybmF0ZSB4bWwmbmJzcDttYXBwaW5nIGZpbGVzLiZu YnNwOzxCUj48QlI+VGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgc29tZSBkb3duc2lkZXMsIGJ1dCBp dCBzZWVtcyB0byBiZSB3b3JraW5nIGZvciBub3cuPEJSPjxCUj5JIGFtIGdvaW5nIHRvIGtlZXAg dXNpbmcgSlBBIHRvIG1hbmFnZSBhbGwgdGhlIERyb29scyBGbG93IHRhYmxlcy48QlI+PEJSPk15 IGRvbWFpbiBvYmplY3QgcGVyc2lzdGVuY2Ugd2lsbCBiZSBtYW5hZ2VkIGJ5IEhpYmVybmF0ZSBT ZXNzaW9uLiZuYnNwOzxCUj48QlI+V2UgYXJlIGFsc28gY3VycmVudGx5IHVzaW5nIGF1dG9tYXRp YyBmbHVzaCAoc28gbm8gY29kZSB0byBwZXJzaXN0IGRvbWFpbiBvYmplY3RzIGluIHRoaXMgY2xh c3MpPEJSPjxCUj5PYnZpb3VzbHkgeW91IG5lZWQgdG8gdXNlIHlvdXIgb3duIHZlcnNpb24gb2Yg SGliVXRpbC48QlI+PEJSPmltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDs8QlI+aW1wb3J0 IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjs8QlI+aW1wb3J0IG9yZy5kcm9vbHMucGVyc2lzdGVu Y2UucHJvY2Vzc2luc3RhbmNlLnZhcmlhYmxldHlwZXMuSlBBUGVyc2lzdGVkVmFyaWFibGU7PEJS PmltcG9ydCBvcmcuZHJvb2xzLnBlcnNpc3RlbmNlLnByb2Nlc3NpbnN0YW5jZS52YXJpYWJsZXR5 cGVzLlZhcmlhYmxlSW5zdGFuY2VJbmZvOzxCUj5pbXBvcnQKIG9yZy5kcm9vbHMucGVyc2lzdGVu Y2UucHJvY2Vzc2luc3RhbmNlLnBlcnNpc3RlcnMuVmFyaWFibGVQZXJzaXN0ZXI7PEJSPmltcG9y dCBvcmcuZHJvb2xzLnJ1bnRpbWUuRW52aXJvbm1lbnQ7PEJSPmltcG9ydCBvcmcuaGliZXJuYXRl LlNlc3Npb247PEJSPmltcG9ydCBIaWJVdGlsOzxCUj4vKio8QlI+Jm5ic3A7KiBWYXJpYXRpb24g b24gRHJvb2xzIEpQQSBWYXJpYWJsZSBQZXJzaXN0ZXIuPEJSPiZuYnNwOyogb3JnLmRyb29scy5w ZXJzaXN0ZW5jZS5wcm9jZXNzaW5zdGFuY2UucGVyc2lzdGVycy5KUEFWYXJpYWJsZVBlcnNpc3Rl cjxCUj4mbmJzcDsqIGZvciB1c2luZyB2YXJpYWJsZXMgcGVyc2lzdGVkIGJ5IEhpYmVybmF0ZSwg d2hpbGUgc3RpbGwgdXNpbmcgSlBBIHRvPEJSPiZuYnNwOyogcGVyc2lzdCBEcm9vbHNGbG93IGRh dGEuPEJSPiZuYnNwOyo8QlI+Jm5ic3A7KiBAYXV0aG9yICZsdDthIGhyZWY9Im1haWx0bzo8QSBo cmVmPSJtYWlsdG86a3Jpc192ZXJsYWVuZW5AaG90bWFpbC5jb20iIHJlbD1ub2ZvbGxvdyB0YXJn ZXQ9X2JsYW5rIHltYWlsdG89Im1haWx0bzprcmlzX3ZlcmxhZW5lbkBob3RtYWlsLmNvbSI+a3Jp c192ZXJsYWVuZW5AaG90bWFpbC5jb208L0E+IiZndDtLcmlzIFZlcmxhZW5lbiZsdDsvYSZndDs8 QlI+Jm5ic3A7KiBAYXV0aG9yIHNhbGFib3k8QlI+Jm5ic3A7Ki88QlI+cHVibGljIGNsYXNzIEpQ QVZhcmlhYmxlUGVyc2lzdGVySGliZXJuYXRlIGltcGxlbWVudHMgVmFyaWFibGVQZXJzaXN0ZXIg ezxCUj4mbmJzcDtwdWJsaWMgVmFyaWFibGVJbnN0YW5jZUluZm8gcGVyc2lzdEV4dGVybmFsVmFy aWFibGUoU3RyaW5nIG5hbWUsIE9iamVjdCBvLDxCUj4mbmJzcDsmbmJzcDsmbmJzcDtWYXJpYWJs ZUluc3RhbmNlSW5mbyBvbGRWYWx1ZSwgRW52aXJvbm1lbnQgZW52KQogezxCUj4mbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgaWYobyA9PSBudWxsIHx8IChvbGRWYWx1ZSAhPSBudWxs ICZhbXA7JmFtcDsgb2xkVmFsdWUuZ2V0UGVyc2lzdGVyKCkuZXF1YWxzKCIiKSkpezxCUj4mbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcmV0 dXJuIG51bGw7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PEJSPiZuYnNw OyZuYnNwO3RyeSB7PEJSPiZuYnNwOyZuYnNwOyZuYnNwO0pQQVBlcnNpc3RlZFZhcmlhYmxlIHJl c3VsdCA9IG51bGw7PEJSPiZuYnNwOyZuYnNwOyZuYnNwO2lmIChvbGRWYWx1ZSBpbnN0YW5jZW9m IEpQQVBlcnNpc3RlZFZhcmlhYmxlKSB7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3Jlc3Vs dCA9IChKUEFQZXJzaXN0ZWRWYXJpYWJsZSkgb2xkVmFsdWU7PEJSPiZuYnNwOyZuYnNwOyZuYnNw O308QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7aWYgKHJlc3VsdCA9PSBudWxsKSB7PEJSPiZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwO3Jlc3VsdCA9IG5ldyBKUEFQZXJzaXN0ZWRWYXJpYWJsZSgpOzxCUj4m bmJzcDsmbmJzcDsmbmJzcDt9PEJSPiZuYnNwOyZuYnNwOyZuYnNwO0xvbmcgaWRWYWx1ZSA9IGdl SGliSWRWYWx1ZShvKTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7cmVzdWx0LnNldFBlcnNpc3Rlcih0 aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CiByZXN1bHQuc2V0TmFtZShu YW1lKTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7cmVzdWx0LnNldEVudGl0eUlkKGlkVmFsdWUpOzxC Uj4mbmJzcDsmbmJzcDsmbmJzcDtyZXN1bHQuc2V0RW50aXR5KG8pOzxCUj4mbmJzcDsmbmJzcDsm bmJzcDtyZXN1bHQuc2V0RW50aXR5Q2xhc3Moby5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUo KSk7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyByZXR1cm4gcmVzdWx0OzxCUj4mbmJzcDsmbmJzcDt9IGNhdGNoIChU aHJvd2FibGUgdCkgezxCUj4mbmJzcDsmbmJzcDsmbmJzcDtMb2dnZXIuZ2V0TG9nZ2VyKEpQQVZh cmlhYmxlUGVyc2lzdGVySGliZXJuYXRlLmNsYXNzLmdldE5hbWUoKSk8QlI+Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7LmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIHQpOzxCUj4mbmJzcDsmbmJzcDsm bmJzcDt0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHBlcnNpc3QgZXh0ZXJu YWwgdmFyaWFibGUiLCB0KTs8QlI+Jm5ic3A7Jm5ic3A7fTxCUj4mbmJzcDt9PEJSPiZuYnNwO3B1 YmxpYyBPYmplY3QgZ2V0RXh0ZXJuYWxQZXJzaXN0ZWRWYXJpYWJsZSg8QlI+Jm5ic3A7Jm5ic3A7 Jm5ic3A7VmFyaWFibGVJbnN0YW5jZUluZm8gdmFyaWFibGVJbnN0YW5jZUluZm8sIEVudmlyb25t ZW50IGVudikgezxCUj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsg aWYoKChKUEFQZXJzaXN0ZWRWYXJpYWJsZSkgdmFyaWFibGVJbnN0YW5jZUluZm8pID09IG51bGwg fHwgKChKUEFQZXJzaXN0ZWRWYXJpYWJsZSkgdmFyaWFibGVJbnN0YW5jZUluZm8pLmdldEVudGl0 eUlkKCkgPT0gbnVsbCl7PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyByZXR1cm4KIG51bGw7PEJSPiZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyB9PEJSPiZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3RvcmluZyBKUEFQ ZXJzaXN0ZWRWYXJpYWJsZSBpZD0iICsgKChKUEFQZXJzaXN0ZWRWYXJpYWJsZSkgdmFyaWFibGVJ bnN0YW5jZUluZm8pLmdldElkKCkgKyAiIGVudGl0eUlkPSIgKyAoKEpQQVBlcnNpc3RlZFZhcmlh YmxlKSB2YXJpYWJsZUluc3RhbmNlSW5mbykuZ2V0RW50aXR5SWQoKSArICIgY2xhc3M9IiArICgo SlBBUGVyc2lzdGVkVmFyaWFibGUpIHZhcmlhYmxlSW5zdGFuY2VJbmZvKS5nZXRFbnRpdHlDbGFz cygpICsgIiB2YWx1ZT0iICsgKChKUEFQZXJzaXN0ZWRWYXJpYWJsZSkgdmFyaWFibGVJbnN0YW5j ZUluZm8pLmdldEVudGl0eSgpKTs8QlI+Jm5ic3A7Jm5ic3A7U3RyaW5nIHZhclR5cGUgPSAoKEpQ QVBlcnNpc3RlZFZhcmlhYmxlKSB2YXJpYWJsZUluc3RhbmNlSW5mbykuZ2V0RW50aXR5Q2xhc3Mo KTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PEJSPiZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBPYmplY3Qgb2JqID0gSGliVXRp bC5nZXRDdXJyZW50U2Vzc2lvbigpLmdldCh2YXJUeXBlLCAoKEpQQVBlcnNpc3RlZFZhcmlhYmxl KSB2YXJpYWJsZUluc3RhbmNlSW5mbykuZ2V0RW50aXR5SWQoKSk7PEJSPiZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBIaWJVdGlsLmNsb3NlQ3VycmVudFNlc3Npb24o KTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJldHVybiBv Ymo7PEJSPiZuYnNwO308QlI+LyoqPEJSPiZuYnNwOyogSGliZXJuYXRlIGxvb2t1cCB0byBnZXQg SUQgY29sdW1uLjxCUj4mbmJzcDsqIEBwYXJhbSBvIER0bwogdG8gbG9vayB1cC48QlI+Jm5ic3A7 KiBAcmV0dXJuIExvbmcgaWQuPEJSPiZuYnNwOyovPEJSPiZuYnNwO3ByaXZhdGUgTG9uZyBnZUhp YklkVmFsdWUoT2JqZWN0IG8pJm5ic3A7IHs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7IFNlc3Npb24gc2Vzc2lvbiA9IEhpYlV0aWwuZ2V0Q3VycmVudFNlc3Np b24oKTs8QlI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHJldHVy biAoTG9uZykgc2Vzc2lvbi5nZXRJZGVudGlmaWVyKG8pOzxCUj4mbmJzcDt9PEJSPn0mbmJzcDs8 QlI+PEJSPjxCUj48QlI+PEJSPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fPEJSPnJ1bGVzLXVzZXJzIG1haWxpbmcgbGlzdDxCUj48QSBocmVmPSJtYWlsdG86 cnVsZXMtdXNlcnNAbGlzdHMuamJvc3Mub3JnIiByZWw9bm9mb2xsb3cgdGFyZ2V0PV9ibGFuayB5 bWFpbHRvPSJtYWlsdG86cnVsZXMtdXNlcnNAbGlzdHMuamJvc3Mub3JnIj5ydWxlcy11c2Vyc0Bs aXN0cy5qYm9zcy5vcmc8L0E+PEJSPjxBIGhyZWY9Imh0dHBzOi8vbGlzdHMuamJvc3Mub3JnL21h aWxtYW4vbGlzdGluZm8vcnVsZXMtdXNlcnMiIHJlbD1ub2ZvbGxvdyB0YXJnZXQ9X2JsYW5rPmh0 dHBzOi8vbGlzdHMuamJvc3Mub3JnL21haWxtYW4vbGlzdGluZm8vcnVsZXMtdXNlcnM8L0E+PEJS PjwvQkxPQ0tRVU9URT48L0RJVj48QlI+PEJSIGNsZWFyPWFsbD48QlI+LS0gPEJSPi0gaHR0cDov L3NhbGFib3kud29yZHByZXNzLmNvbTxCUj4tIGh0dHA6Ly93d3cuamJ1Zy5jb20uYXI8QlI+LSBT YWxhdGlubyAiU2FsYWJveSIgTWF1cmljaW8gLTxCUj48L0RJVj48L0RJVj48L2Rpdj48YnI+Cgog ICAgICA8L2JvZHk+PC9odG1sPg== --===============4097937748889651752==--