blob: 38f475864e78cd1f9cdbb213e76998b1d16fd3a0 [file] [log] [blame]
<HTML><HEAD><META CONTENT="text/html; charset=UTF-8" HTTP-EQUIV="Content-Type"/><TITLE>EMMA Coverage Report</TITLE><STYLE TYPE="text/css"> TABLE,TD,TH {border-style:solid; border-color:black;} TD,TH {background:white;margin:0;line-height:100%;padding-left:0.5em;padding-right:0.5em;} TD {border-width:0 1px 0 0;} TH {border-width:1px 1px 1px 0;} TR TD.h {color:red;} TABLE {border-spacing:0; border-collapse:collapse;border-width:0 0 1px 1px;} P,H1,H2,H3,TH {font-family:verdana,arial,sans-serif;font-size:10pt;} TD {font-family:courier,monospace;font-size:10pt;} TABLE.hdft {border-spacing:0;border-collapse:collapse;border-style:none;} TABLE.hdft TH,TABLE.hdft TD {border-style:none;line-height:normal;} TABLE.hdft TH.tl,TABLE.hdft TD.tl {background:#6699CC;color:white;} TABLE.hdft TD.nv {background:#6633DD;color:white;} .nv A:link {color:white;} .nv A:visited {color:white;} .nv A:active {color:yellow;} TABLE.hdft A:link {color:white;} TABLE.hdft A:visited {color:white;} TABLE.hdft A:active {color:yellow;} .in {color:#356085;} TABLE.s TD {padding-left:0.25em;padding-right:0.25em;} TABLE.s TD.l {padding-left:0.25em;padding-right:0.25em;text-align:right;background:#F0F0F0;} TABLE.s TR.z TD {background:#FF9999;} TABLE.s TR.p TD {background:#FFFF88;} TABLE.s TR.c TD {background:#CCFFCC;} A:link {color:#0000EE;text-decoration:none;} A:visited {color:#0000EE;text-decoration:none;} A:hover {color:#0000EE;text-decoration:underline;} TABLE.cn {border-width:0 0 1px 0;} TABLE.s {border-width:1px 0 1px 1px;} TD.h {color:red;border-width:0 1px 0 0;} TD.f {border-width:0 1px 0 1px;} TD.hf {color:red;border-width:0 1px 0 1px;} TH.f {border-width:1px 1px 1px 1px;} TR.cis TD {background:#F0F0F0;} TR.cis TD {border-width:1px 1px 1px 0;} TR.cis TD.h {color:red;border-width:1px 1px 1px 0;} TR.cis TD.f {border-width:1px 1px 1px 1px;} TR.cis TD.hf {color:red;border-width:1px 1px 1px 1px;} TD.b {border-style:none;background:transparent;line-height:50%;} TD.bt {border-width:1px 0 0 0;background:transparent;line-height:50%;} TR.o TD {background:#F0F0F0;}TABLE.it {border-style:none;}TABLE.it TD,TABLE.it TH {border-style:none;}</STYLE></HEAD><BODY><TABLE CLASS="hdft" CELLSPACING="0" WIDTH="100%"><TR><TH CLASS="tl"><A HREF="http://www.eclemma.org/">EMMA</A> Coverage Report (generated Fri Feb 20 18:44:54 GMT 2009)</TH></TR><TR><TD CLASS="nv">[<A HREF="../xslUnitTestCoverage.html">all classes</A>][<A HREF="96.html">org.eclipse.wst.sse.core.internal.model</A>]</TD></TR></TABLE><H2>COVERAGE SUMMARY FOR SOURCE FILE [<SPAN CLASS="in">ModelManagerImpl.java</SPAN>]</H2><TABLE CELLSPACING="0" WIDTH="100%"><TR><TH>name</TH><TH>class, %</TH><TH>method, %</TH><TH>block, %</TH><TH>line, %</TH></TR><TR><TD>ModelManagerImpl.java</TD><TD>100% (3/3)</TD><TD CLASS="h">33%  (32/97)</TD><TD CLASS="h">26%  (880/3405)</TD><TD CLASS="h">27%  (240.6/893)</TD></TR></TABLE><H3>COVERAGE BREAKDOWN BY CLASS AND METHOD</H3><TABLE CLASS="cn" CELLSPACING="0" WIDTH="100%"><TR><TH CLASS="f">name</TH><TH>class, %</TH><TH>method, %</TH><TH>block, %</TH><TH>line, %</TH></TR><TR><TD CLASS="b"> </TD><TD CLASS="b"> </TD><TD CLASS="b"> </TD><TD CLASS="b"> </TD><TD CLASS="b"> </TD></TR><TR CLASS="cis"><TD CLASS="f">class <A HREF="#0">ModelManagerImpl</A></TD><TD>100% (1/1)</TD><TD CLASS="h">30%  (28/93)</TD><TD CLASS="h">25%  (845/3369)</TD><TD CLASS="h">26%  (225.6/877)</TD></TR><TR><TD CLASS="f"><A HREF="#1">_commonCreateModel (IFile, String, IModelHandler, URIResolver, ModelManagerIm...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/108)</TD><TD CLASS="h">0%   (0/28)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2">_commonCreateModel (InputStream, String, IModelHandler, URIResolver, ModelMan...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/103)</TD><TD CLASS="h">0%   (0/28)</TD></TR><TR><TD CLASS="f"><A HREF="#3">_commonCreateModel (String, IModelHandler, URIResolver): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/31)</TD><TD CLASS="h">0%   (0/11)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4">_commonGetModel (IFile, ModelManagerImpl$ReadEditType, EncodingRule): IStruct...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/30)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR><TD CLASS="f"><A HREF="#5">_doCommonCreateModel (IFile, String, IModelHandler, URIResolver, ModelManager...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/83)</TD><TD CLASS="h">0%   (0/25)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#6">_doCommonCreateModel (InputStream, String, IModelHandler, URIResolver, ModelM...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/106)</TD><TD CLASS="h">0%   (0/26)</TD></TR><TR><TD CLASS="f"><A HREF="#7">_getModelFor (IStructuredDocument, ModelManagerImpl$ReadEditType): IStructure...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/125)</TD><TD CLASS="h">0%   (0/29)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#8">addFactories (IStructuredModel, IModelHandler): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/17)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR><TD CLASS="f"><A HREF="#9">addFactories (IStructuredModel, List): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/26)</TD><TD CLASS="h">0%   (0/9)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#a">calculateType (String, InputStream): IModelHandler</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/10)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#b">convertLineDelimiters (IDocument, IFile): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/105)</TD><TD CLASS="h">0%   (0/26)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#c">copy (IStructuredModel, String): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/40)</TD><TD CLASS="h">0%   (0/12)</TD></TR><TR><TD CLASS="f"><A HREF="#d">copyModelForEdit (String, String): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/109)</TD><TD CLASS="h">0%   (0/28)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#e">createNewInstance (IStructuredModel): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/37)</TD><TD CLASS="h">0%   (0/12)</TD></TR><TR><TD CLASS="f"><A HREF="#f">createNewStructuredDocumentFor (IFile): IStructuredDocument</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/25)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#10">createStructuredDocumentFor (IFile): IStructuredDocument</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/26)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR><TD CLASS="f"><A HREF="#11">createStructuredDocumentFor (String): IStructuredDocument</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/29)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#12">createStructuredDocumentFor (String, InputStream, URIResolver): IStructuredDo...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/34)</TD><TD CLASS="h">0%   (0/11)</TD></TR><TR><TD CLASS="f"><A HREF="#13">createStructuredDocumentFor (String, InputStream, URIResolver, String): IStru...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/13)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#14">createStructuredDocumentFor (String, String, URIResolver): IStructuredDocument</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/37)</TD><TD CLASS="h">0%   (0/9)</TD></TR><TR><TD CLASS="f"><A HREF="#15">createUnManagedEmptyModelFor (IFile): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/29)</TD><TD CLASS="h">0%   (0/9)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#16">createUnManagedStructuredModelFor (IFile): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/23)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR><TD CLASS="f"><A HREF="#17">createUnManagedStructuredModelFor (String): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#18">createUnManagedStructuredModelFor (String, URIResolver): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/24)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR><TD CLASS="f"><A HREF="#19">getExistingModelForEdit (IDocument): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/56)</TD><TD CLASS="h">0%   (0/15)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1a">getExistingModelForEdit (IFile): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/13)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#1b">getExistingModelForEdit (Object): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/74)</TD><TD CLASS="h">0%   (0/21)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1c">getExistingModelIds (): Enumeration</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/25)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR><TD CLASS="f"><A HREF="#1d">getFileFor (IStructuredModel): IFile</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/34)</TD><TD CLASS="h">0%   (0/11)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1e">getModelForEdit (IFile, EncodingRule): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/10)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#1f">getModelForEdit (IFile, String, String): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#20">getModelForEdit (IStructuredDocument): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/6)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#21">getModelForEdit (Object, InputStream, URIResolver): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/13)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#22">getModelForEdit (Object, Object, String, String, InputStream, URIResolver): I...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/13)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#23">getModelForEdit (String, InputStream, URIResolver): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/36)</TD><TD CLASS="h">0%   (0/9)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#24">getModelForRead (IFile, EncodingRule): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/10)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#25">getModelForRead (IFile, String, String): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#26">getModelForRead (IStructuredDocument): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/6)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#27">getModelForRead (Object, InputStream, URIResolver): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/13)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#28">getModelForRead (Object, Object, String, String, InputStream, URIResolver): I...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/13)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#29">getModelForRead (String, InputStream, URIResolver): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/23)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2a">getNewModelForRead (IFile, boolean): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/35)</TD><TD CLASS="h">0%   (0/9)</TD></TR><TR><TD CLASS="f"><A HREF="#2b">getReferenceCount (Object): int</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/45)</TD><TD CLASS="h">0%   (0/12)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2c">getReferenceCountForEdit (Object): int</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/39)</TD><TD CLASS="h">0%   (0/11)</TD></TR><TR><TD CLASS="f"><A HREF="#2d">getReferenceCountForRead (Object): int</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/42)</TD><TD CLASS="h">0%   (0/12)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2e">handleConvertLineDelimiters (IStructuredDocument, IFile, EncodingRule, Encodi...</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/9)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#2f">handleProgramError (Throwable): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/4)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#30">isSharedForEdit (Object): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/48)</TD><TD CLASS="h">0%   (0/13)</TD></TR><TR><TD CLASS="f"><A HREF="#31">isSharedForRead (Object): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/51)</TD><TD CLASS="h">0%   (0/14)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#32">isStateChanging (): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/2)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#33">moveModel (Object, Object): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/29)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#34">readInputStream (InputStream, String): String</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/32)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR><TD CLASS="f"><A HREF="#35">readInputStream (InputStreamReader): String</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/29)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#36">reinitialize (IStructuredModel): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/12)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#37">reloadModel (Object, InputStream): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/23)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#38">revertModel (Object, ModelManagerImpl$SharedObject): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/8)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#39">saveModel (IFile, String, EncodingRule): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/84)</TD><TD CLASS="h">0%   (0/22)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#3a">saveModel (String, EncodingRule): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/71)</TD><TD CLASS="h">0%   (0/18)</TD></TR><TR><TD CLASS="f"><A HREF="#3b">saveModel (String, OutputStream, EncodingRule): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/78)</TD><TD CLASS="h">0%   (0/18)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#3c">saveStructuredDocument (IStructuredDocument, IFile): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/6)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#3d">saveStructuredDocument (IStructuredDocument, IFile, EncodingRule): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/86)</TD><TD CLASS="h">0%   (0/19)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#3e">signalPostLifeCycleListenerRevert (IStructuredModel): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/13)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#3f">signalPreLifeCycleListenerRevert (IStructuredModel): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/13)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#40">trace (String, Object): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/16)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#41">trace (String, Object, int): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/20)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#42">_incrCount (ModelManagerImpl$SharedObject, ModelManagerImpl$ReadEditType): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">51%  (25/49)</TD><TD CLASS="h">53%  (4.8/9)</TD></TR><TR><TD CLASS="f"><A HREF="#43">discardModel (Object, ModelManagerImpl$SharedObject): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">52%  (22/42)</TD><TD>88%  (7/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#44">releaseFromEdit (Object): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">63%  (69/109)</TD><TD CLASS="h">71%  (16.3/23)</TD></TR><TR><TD CLASS="f"><A HREF="#45">_doCommonGetModel (IFile, String, ModelManagerImpl$SharedObject, ModelManager...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">68%  (34/50)</TD><TD CLASS="h">72%  (10.9/15)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#46">releaseFromEdit (IStructuredModel): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">79%  (15/19)</TD><TD>80%  (4/5)</TD></TR><TR><TD CLASS="f"><A HREF="#47">releaseFromRead (IStructuredModel): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">79%  (15/19)</TD><TD>80%  (4/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#48">calculateURIResolver (IFile): URIResolver</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>80%  (36/45)</TD><TD>88%  (8.8/10)</TD></TR><TR><TD CLASS="f"><A HREF="#49">_commonNewModel (IFile, boolean): ModelManagerImpl$SharedObject</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>80%  (57/71)</TD><TD>86%  (16.4/19)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4a">_initCount (ModelManagerImpl$SharedObject, ModelManagerImpl$ReadEditType): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>84%  (36/43)</TD><TD>86%  (7.8/9)</TD></TR><TR><TD CLASS="f"><A HREF="#4b">_commonGetModel (IFile, String, IModelHandler, URIResolver, ModelManagerImpl$...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>84%  (83/99)</TD><TD>83%  (22.5/27)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4c">releaseFromRead (Object): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>88%  (59/67)</TD><TD>93%  (14.9/16)</TD></TR><TR><TD CLASS="f"><A HREF="#4d">getNewModelForEdit (IFile, boolean): IStructuredModel</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>88%  (23/26)</TD><TD>98%  (5.8/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4e">getExistingModel (Object): IStructuredModel</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>89%  (24/27)</TD><TD>89%  (8/9)</TD></TR><TR><TD CLASS="f"><A HREF="#4f">getExistingModelForRead (Object): IStructuredModel</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>89%  (56/63)</TD><TD>94%  (18/19)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#50">_decrCount (ModelManagerImpl$SharedObject, ModelManagerImpl$ReadEditType): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>90%  (35/39)</TD><TD>88%  (7/8)</TD></TR><TR><TD CLASS="f"><A HREF="#51">isIdInUse (String): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>92%  (23/25)</TD><TD>96%  (6.7/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#52">isShared (Object): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>94%  (51/54)</TD><TD>99%  (13.9/14)</TD></TR><TR><TD CLASS="f"><A HREF="#53">getExistingModelForRead (IDocument): IStructuredModel</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>95%  (53/56)</TD><TD>93%  (14/15)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#54">ModelManagerImpl (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (27/27)</TD><TD>100% (7/7)</TD></TR><TR><TD CLASS="f"><A HREF="#55">_commonGetModel (IFile, ModelManagerImpl$ReadEditType, String, String): IStru...</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (24/24)</TD><TD>100% (5/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#56">calculateId (IFile): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (1/1)</TD></TR><TR><TD CLASS="f"><A HREF="#57">calculateType (IFile): IModelHandler</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (9/9)</TD><TD>100% (3/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#58">cleanupDiscardedModel (IStructuredModel): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (13/13)</TD><TD>100% (5/5)</TD></TR><TR><TD CLASS="f"><A HREF="#59">getExistingModelForRead (IFile): IStructuredModel</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (13/13)</TD><TD>100% (4/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#0">getInstance (): IModelManager</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (8/8)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="f"><A HREF="#5b">getModelForEdit (IFile): IStructuredModel</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#5c">getModelForRead (IFile): IStructuredModel</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#5d">getModelHandlerRegistry (): ModelHandlerRegistry</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (9/9)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD></TR><TR CLASS="cis"><TD CLASS="f">class <A HREF="#5e">ModelManagerImpl$SharedObject</A></TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>97%  (32/33)</TD><TD>93%  (13/14)</TD></TR><TR><TD CLASS="f"><A HREF="#5f">waitForLoadAttempt (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>89%  (8/9)</TD><TD CLASS="h">75%  (3/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#5e">ModelManagerImpl$SharedObject (IStructuredModel): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (18/18)</TD><TD>100% (7/7)</TD></TR><TR><TD CLASS="f"><A HREF="#61">setLoaded (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (6/6)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD><TD CLASS="bt"> </TD></TR><TR CLASS="cis"><TD CLASS="f">class <A HREF="#62">ModelManagerImpl$ReadEditType</A></TD><TD>100% (1/1)</TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#62">ModelManagerImpl$ReadEditType (String): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (2/2)</TD></TR></TABLE><P></P><TABLE CLASS="s" CELLSPACING="0" WIDTH="100%"><TR><TD CLASS="l">1</TD><TD>/*******************************************************************************</TD></TR><TR><TD CLASS="l">2</TD><TD> * Copyright (c) 2001, 2009 IBM Corporation and others.</TD></TR><TR><TD CLASS="l">3</TD><TD> * All rights reserved. This program and the accompanying materials</TD></TR><TR><TD CLASS="l">4</TD><TD> * are made available under the terms of the Eclipse Public License v1.0</TD></TR><TR><TD CLASS="l">5</TD><TD> * which accompanies this distribution, and is available at</TD></TR><TR><TD CLASS="l">6</TD><TD> * http://www.eclipse.org/legal/epl-v10.html</TD></TR><TR><TD CLASS="l">7</TD><TD> *</TD></TR><TR><TD CLASS="l">8</TD><TD> * Contributors:</TD></TR><TR><TD CLASS="l">9</TD><TD> *     IBM Corporation - initial API and implementation</TD></TR><TR><TD CLASS="l">10</TD><TD> *     Jens Lukowski/Innoopract - initial renaming/restructuring</TD></TR><TR><TD CLASS="l">11</TD><TD> *     </TD></TR><TR><TD CLASS="l">12</TD><TD> *******************************************************************************/</TD></TR><TR><TD CLASS="l">13</TD><TD>package org.eclipse.wst.sse.core.internal.model;</TD></TR><TR><TD CLASS="l">14</TD><TD> </TD></TR><TR><TD CLASS="l">15</TD><TD>import java.io.ByteArrayInputStream;</TD></TR><TR><TD CLASS="l">16</TD><TD>import java.io.ByteArrayOutputStream;</TD></TR><TR><TD CLASS="l">17</TD><TD>import java.io.FileNotFoundException;</TD></TR><TR><TD CLASS="l">18</TD><TD>import java.io.IOException;</TD></TR><TR><TD CLASS="l">19</TD><TD>import java.io.InputStream;</TD></TR><TR><TD CLASS="l">20</TD><TD>import java.io.InputStreamReader;</TD></TR><TR><TD CLASS="l">21</TD><TD>import java.io.OutputStream;</TD></TR><TR><TD CLASS="l">22</TD><TD>import java.io.Reader;</TD></TR><TR><TD CLASS="l">23</TD><TD>import java.io.UnsupportedEncodingException;</TD></TR><TR><TD CLASS="l">24</TD><TD>import java.util.Enumeration;</TD></TR><TR><TD CLASS="l">25</TD><TD>import java.util.HashMap;</TD></TR><TR><TD CLASS="l">26</TD><TD>import java.util.HashSet;</TD></TR><TR><TD CLASS="l">27</TD><TD>import java.util.Iterator;</TD></TR><TR><TD CLASS="l">28</TD><TD>import java.util.List;</TD></TR><TR><TD CLASS="l">29</TD><TD>import java.util.Map;</TD></TR><TR><TD CLASS="l">30</TD><TD>import java.util.Set;</TD></TR><TR><TD CLASS="l">31</TD><TD>import java.util.Vector;</TD></TR><TR><TD CLASS="l">32</TD><TD> </TD></TR><TR><TD CLASS="l">33</TD><TD>import org.eclipse.core.filebuffers.FileBuffers;</TD></TR><TR><TD CLASS="l">34</TD><TD>import org.eclipse.core.filebuffers.ITextFileBuffer;</TD></TR><TR><TD CLASS="l">35</TD><TD>import org.eclipse.core.resources.IFile;</TD></TR><TR><TD CLASS="l">36</TD><TD>import org.eclipse.core.resources.IProject;</TD></TR><TR><TD CLASS="l">37</TD><TD>import org.eclipse.core.resources.IWorkspaceRoot;</TD></TR><TR><TD CLASS="l">38</TD><TD>import org.eclipse.core.resources.ResourcesPlugin;</TD></TR><TR><TD CLASS="l">39</TD><TD>import org.eclipse.core.runtime.CoreException;</TD></TR><TR><TD CLASS="l">40</TD><TD>import org.eclipse.core.runtime.IPath;</TD></TR><TR><TD CLASS="l">41</TD><TD>import org.eclipse.core.runtime.IStatus;</TD></TR><TR><TD CLASS="l">42</TD><TD>import org.eclipse.core.runtime.NullProgressMonitor;</TD></TR><TR><TD CLASS="l">43</TD><TD>import org.eclipse.core.runtime.Path;</TD></TR><TR><TD CLASS="l">44</TD><TD>import org.eclipse.core.runtime.Platform;</TD></TR><TR><TD CLASS="l">45</TD><TD>import org.eclipse.core.runtime.QualifiedName;</TD></TR><TR><TD CLASS="l">46</TD><TD>import org.eclipse.core.runtime.Status;</TD></TR><TR><TD CLASS="l">47</TD><TD>import org.eclipse.core.runtime.content.IContentDescription;</TD></TR><TR><TD CLASS="l">48</TD><TD>import org.eclipse.core.runtime.jobs.ILock;</TD></TR><TR><TD CLASS="l">49</TD><TD>import org.eclipse.core.runtime.jobs.Job;</TD></TR><TR><TD CLASS="l">50</TD><TD>import org.eclipse.jface.text.BadLocationException;</TD></TR><TR><TD CLASS="l">51</TD><TD>import org.eclipse.jface.text.IDocument;</TD></TR><TR><TD CLASS="l">52</TD><TD>import org.eclipse.jface.text.IRegion;</TD></TR><TR><TD CLASS="l">53</TD><TD>import org.eclipse.text.edits.MultiTextEdit;</TD></TR><TR><TD CLASS="l">54</TD><TD>import org.eclipse.text.edits.ReplaceEdit;</TD></TR><TR><TD CLASS="l">55</TD><TD>import org.eclipse.text.edits.TextEdit;</TD></TR><TR><TD CLASS="l">56</TD><TD>import org.eclipse.wst.sse.core.internal.FileBufferModelManager;</TD></TR><TR><TD CLASS="l">57</TD><TD>import org.eclipse.wst.sse.core.internal.Logger;</TD></TR><TR><TD CLASS="l">58</TD><TD>import org.eclipse.wst.sse.core.internal.NullMemento;</TD></TR><TR><TD CLASS="l">59</TD><TD>import org.eclipse.wst.sse.core.internal.SSECoreMessages;</TD></TR><TR><TD CLASS="l">60</TD><TD>import org.eclipse.wst.sse.core.internal.SSECorePlugin;</TD></TR><TR><TD CLASS="l">61</TD><TD>import org.eclipse.wst.sse.core.internal.document.DocumentReader;</TD></TR><TR><TD CLASS="l">62</TD><TD>import org.eclipse.wst.sse.core.internal.document.IDocumentLoader;</TD></TR><TR><TD CLASS="l">63</TD><TD>import org.eclipse.wst.sse.core.internal.encoding.CodedIO;</TD></TR><TR><TD CLASS="l">64</TD><TD>import org.eclipse.wst.sse.core.internal.encoding.CodedStreamCreator;</TD></TR><TR><TD CLASS="l">65</TD><TD>import org.eclipse.wst.sse.core.internal.encoding.CommonEncodingPreferenceNames;</TD></TR><TR><TD CLASS="l">66</TD><TD>import org.eclipse.wst.sse.core.internal.encoding.ContentBasedPreferenceGateway;</TD></TR><TR><TD CLASS="l">67</TD><TD>import org.eclipse.wst.sse.core.internal.encoding.EncodingMemento;</TD></TR><TR><TD CLASS="l">68</TD><TD>import org.eclipse.wst.sse.core.internal.encoding.EncodingRule;</TD></TR><TR><TD CLASS="l">69</TD><TD>import org.eclipse.wst.sse.core.internal.exceptions.MalformedOutputExceptionWithDetail;</TD></TR><TR><TD CLASS="l">70</TD><TD>import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;</TD></TR><TR><TD CLASS="l">71</TD><TD>import org.eclipse.wst.sse.core.internal.modelhandler.ModelHandlerRegistry;</TD></TR><TR><TD CLASS="l">72</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.IModelLoader;</TD></TR><TR><TD CLASS="l">73</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.IModelManager;</TD></TR><TR><TD CLASS="l">74</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;</TD></TR><TR><TD CLASS="l">75</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;</TD></TR><TR><TD CLASS="l">76</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.document.IEncodedDocument;</TD></TR><TR><TD CLASS="l">77</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceAlreadyExists;</TD></TR><TR><TD CLASS="l">78</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceInUse;</TD></TR><TR><TD CLASS="l">79</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;</TD></TR><TR><TD CLASS="l">80</TD><TD>import org.eclipse.wst.sse.core.internal.util.Assert;</TD></TR><TR><TD CLASS="l">81</TD><TD>import org.eclipse.wst.sse.core.internal.util.ProjectResolver;</TD></TR><TR><TD CLASS="l">82</TD><TD>import org.eclipse.wst.sse.core.internal.util.URIResolver;</TD></TR><TR><TD CLASS="l">83</TD><TD>import org.eclipse.wst.sse.core.internal.util.Utilities;</TD></TR><TR><TD CLASS="l">84</TD><TD> </TD></TR><TR><TD CLASS="l">85</TD><TD>/**</TD></TR><TR><TD CLASS="l">86</TD><TD> * Not intended to be subclassed, referenced or instantiated by clients.</TD></TR><TR><TD CLASS="l">87</TD><TD> * </TD></TR><TR><TD CLASS="l">88</TD><TD> * This class is responsible for creating, retrieving, and caching</TD></TR><TR><TD CLASS="l">89</TD><TD> * StructuredModels It retrieves the cached objects by an id which is</TD></TR><TR><TD CLASS="l">90</TD><TD> * typically a String representing the resources URI. Note: Its important that</TD></TR><TR><TD CLASS="l">91</TD><TD> * all clients that share a resource do so using &lt;b&gt;identical &lt;/b&gt;</TD></TR><TR><TD CLASS="l">92</TD><TD> * identifiers, or else different instances will be created and retrieved,</TD></TR><TR><TD CLASS="l">93</TD><TD> * even if they all technically point to the same resource on the file system.</TD></TR><TR><TD CLASS="l">94</TD><TD> * This class also provides a convenient place to register Model Loaders and</TD></TR><TR><TD CLASS="l">95</TD><TD> * Dumpers based on 'type'.</TD></TR><TR><TD CLASS="l"><A NAME="62">96</A></TD><TD> */</TD></TR><TR><TD CLASS="l">97</TD><TD>public class ModelManagerImpl implements IModelManager {</TD></TR><TR><TD CLASS="l">98</TD><TD> </TD></TR><TR><TD CLASS="l">99</TD><TD>        static class ReadEditType {</TD></TR><TR CLASS="c"><TD CLASS="l">100</TD><TD>                ReadEditType(String type) {</TD></TR><TR CLASS="c"><TD CLASS="l">101</TD><TD>                }</TD></TR><TR><TD CLASS="l">102</TD><TD>        }</TD></TR><TR><TD CLASS="l">103</TD><TD> </TD></TR><TR><TD CLASS="l">104</TD><TD>        /**</TD></TR><TR><TD CLASS="l">105</TD><TD>         * A Data class to track our shared objects</TD></TR><TR><TD CLASS="l">106</TD><TD>         */</TD></TR><TR><TD CLASS="l">107</TD><TD>         static class SharedObject {</TD></TR><TR><TD CLASS="l">108</TD><TD>                int referenceCountForEdit;</TD></TR><TR><TD CLASS="l">109</TD><TD>                int referenceCountForRead;</TD></TR><TR><TD CLASS="l"><A NAME="5e">110</A></TD><TD>                IStructuredModel theSharedModel;</TD></TR><TR CLASS="c"><TD CLASS="l">111</TD><TD>                boolean initializing = true;</TD></TR><TR CLASS="c"><TD CLASS="l">112</TD><TD>                boolean doWait = true;</TD></TR><TR><TD CLASS="l">113</TD><TD>                </TD></TR><TR CLASS="c"><TD CLASS="l">114</TD><TD>                SharedObject(IStructuredModel sharedModel) {</TD></TR><TR CLASS="c"><TD CLASS="l">115</TD><TD>                        theSharedModel = sharedModel;</TD></TR><TR CLASS="c"><TD CLASS="l">116</TD><TD>                        referenceCountForRead = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">117</TD><TD>                        referenceCountForEdit = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">118</TD><TD>                }</TD></TR><TR><TD CLASS="l">119</TD><TD>                </TD></TR><TR><TD CLASS="l">120</TD><TD>                /**</TD></TR><TR><TD CLASS="l">121</TD><TD>                 * Waits until this shared object has been attempted to be loaded. </TD></TR><TR><TD CLASS="l">122</TD><TD>                 * The load is &#34;attempted&#34; because not all loads result in a model. </TD></TR><TR><TD CLASS="l"><A NAME="5f">123</A></TD><TD>                 * However, upon leaving this method, theShareModel variable</TD></TR><TR><TD CLASS="l">124</TD><TD>                 * is up-to-date.</TD></TR><TR><TD CLASS="l">125</TD><TD>                 */</TD></TR><TR><TD CLASS="l">126</TD><TD>                public synchronized void waitForLoadAttempt() {</TD></TR><TR CLASS="c"><TD CLASS="l">127</TD><TD>                        while(initializing) {</TD></TR><TR><TD CLASS="l">128</TD><TD>                                try {</TD></TR><TR CLASS="c"><TD CLASS="l">129</TD><TD>                                        wait();</TD></TR><TR><TD CLASS="l">130</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">131</TD><TD>                                catch (InterruptedException e) {</TD></TR><TR><TD CLASS="l">132</TD><TD>                                        // ignore interruption!</TD></TR><TR><TD CLASS="l">133</TD><TD>                                }</TD></TR><TR><TD CLASS="l">134</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">135</TD><TD>                }</TD></TR><TR><TD CLASS="l">136</TD><TD>                </TD></TR><TR><TD CLASS="l">137</TD><TD>                /**</TD></TR><TR><TD CLASS="l">138</TD><TD>                 * Flags this model as loaded. All waiting methods on </TD></TR><TR><TD CLASS="l"><A NAME="61">139</A></TD><TD>                 * {@link #waitForLoadAttempt()} will proceed after this </TD></TR><TR><TD CLASS="l">140</TD><TD>                 * method returns. </TD></TR><TR><TD CLASS="l">141</TD><TD>                 */</TD></TR><TR><TD CLASS="l">142</TD><TD>                public synchronized void setLoaded() {</TD></TR><TR CLASS="c"><TD CLASS="l">143</TD><TD>                        initializing = false;</TD></TR><TR CLASS="c"><TD CLASS="l">144</TD><TD>                        notifyAll();</TD></TR><TR CLASS="c"><TD CLASS="l">145</TD><TD>                }</TD></TR><TR><TD CLASS="l">146</TD><TD>        }</TD></TR><TR><TD CLASS="l">147</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">148</TD><TD>        private Exception debugException = null;</TD></TR><TR><TD CLASS="l">149</TD><TD> </TD></TR><TR><TD CLASS="l">150</TD><TD>        /**</TD></TR><TR><TD CLASS="l">151</TD><TD>         * Our singleton instance</TD></TR><TR><TD CLASS="l">152</TD><TD>         */</TD></TR><TR><TD CLASS="l">153</TD><TD>        private static ModelManagerImpl instance;</TD></TR><TR><TD CLASS="l">154</TD><TD>        private final static int READ_BUFFER_SIZE = 4096;</TD></TR><TR><TD CLASS="l">155</TD><TD> </TD></TR><TR><TD CLASS="l">156</TD><TD>        /**</TD></TR><TR><TD CLASS="l">157</TD><TD>         * Not to be called by clients, will be made restricted access.</TD></TR><TR><TD CLASS="l">158</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="0">159</A></TD><TD>         * @return</TD></TR><TR><TD CLASS="l">160</TD><TD>         */</TD></TR><TR><TD CLASS="l">161</TD><TD>        public synchronized static IModelManager getInstance() {</TD></TR><TR><TD CLASS="l">162</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">163</TD><TD>                if (instance == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">164</TD><TD>                        instance = new ModelManagerImpl();</TD></TR><TR><TD CLASS="l">165</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">166</TD><TD>                return instance;</TD></TR><TR><TD CLASS="l">167</TD><TD>        }</TD></TR><TR><TD CLASS="l">168</TD><TD> </TD></TR><TR><TD CLASS="l">169</TD><TD>        /**</TD></TR><TR><TD CLASS="l">170</TD><TD>         * Our cache of managed objects</TD></TR><TR><TD CLASS="l">171</TD><TD>         */</TD></TR><TR><TD CLASS="l">172</TD><TD>        private Map fManagedObjects;</TD></TR><TR><TD CLASS="l">173</TD><TD> </TD></TR><TR><TD CLASS="l">174</TD><TD>        private ModelHandlerRegistry fModelHandlerRegistry;</TD></TR><TR CLASS="c"><TD CLASS="l">175</TD><TD>        private final ReadEditType READ = new ReadEditType(&#34;read&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">176</TD><TD>        private final ReadEditType EDIT = new ReadEditType(&#34;edit&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">177</TD><TD>        </TD></TR><TR CLASS="c"><TD CLASS="l">178</TD><TD>        private final ILock SYNC = Job.getJobManager().newLock();</TD></TR><TR><TD CLASS="l">179</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="54">180</A></TD><TD>         * Intentionally default access only.</TD></TR><TR><TD CLASS="l">181</TD><TD>         * </TD></TR><TR><TD CLASS="l">182</TD><TD>         */</TD></TR><TR><TD CLASS="l">183</TD><TD>        ModelManagerImpl() {</TD></TR><TR CLASS="c"><TD CLASS="l">184</TD><TD>                super();</TD></TR><TR CLASS="c"><TD CLASS="l">185</TD><TD>                fManagedObjects = new HashMap();</TD></TR><TR><TD CLASS="l">186</TD><TD>                // To prevent deadlocks:  always acquire multiple locks in this order: SYNC, sharedObject. </TD></TR><TR><TD CLASS="l">187</TD><TD>                // DO NOT acquire a SYNC within a sharedObject lock, unless you already own the SYNC lock</TD></TR><TR><TD CLASS="l"><A NAME="1">188</A></TD><TD>                // Tip: Try to hold the smallest number of locks you can</TD></TR><TR CLASS="c"><TD CLASS="l">189</TD><TD>        }</TD></TR><TR><TD CLASS="l">190</TD><TD> </TD></TR><TR><TD CLASS="l">191</TD><TD>        private IStructuredModel _commonCreateModel(IFile file, String id, IModelHandler handler, URIResolver resolver, ReadEditType rwType, EncodingRule encodingRule) throws IOException,CoreException {</TD></TR><TR CLASS="z"><TD CLASS="l">192</TD><TD>                SharedObject sharedObject = null;</TD></TR><TR><TD CLASS="l">193</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">194</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">195</TD><TD>                sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">196</TD><TD>                SYNC.release();</TD></TR><TR><TD CLASS="l">197</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">198</TD><TD>                while(true) {</TD></TR><TR CLASS="z"><TD CLASS="l">199</TD><TD>                        if (sharedObject!=null) {</TD></TR><TR CLASS="z"><TD CLASS="l">200</TD><TD>                                sharedObject.waitForLoadAttempt();</TD></TR><TR><TD CLASS="l">201</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">202</TD><TD>                        SYNC.acquire();</TD></TR><TR><TD CLASS="l">203</TD><TD>                        // we know this object's model has passed the load, however, we don't know </TD></TR><TR><TD CLASS="l">204</TD><TD>                        // it's reference count status. It might have already been disposed. Or it could have </TD></TR><TR><TD CLASS="l">205</TD><TD>                        // been disposed and a concurrent thread has already begun loading it, in which case</TD></TR><TR><TD CLASS="l">206</TD><TD>                        // we should use the sharedobject they are loading. </TD></TR><TR><TD CLASS="l">207</TD><TD>                        // NOTE: This pattern is applied 3 times in this class, but only doc'd once. The logic is </TD></TR><TR><TD CLASS="l">208</TD><TD>                        // exactly the same. </TD></TR><TR CLASS="z"><TD CLASS="l">209</TD><TD>                        SharedObject testObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">210</TD><TD>                        if (testObject==null) {</TD></TR><TR><TD CLASS="l">211</TD><TD>                                // null means it's been disposed, we need to do the work to reload it.</TD></TR><TR CLASS="z"><TD CLASS="l">212</TD><TD>                                sharedObject = new SharedObject(null);</TD></TR><TR CLASS="z"><TD CLASS="l">213</TD><TD>                                fManagedObjects.put(id, sharedObject);</TD></TR><TR CLASS="z"><TD CLASS="l">214</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">215</TD><TD>                                _doCommonCreateModel(file, id, handler, resolver, rwType, encodingRule,</TD></TR><TR CLASS="z"><TD CLASS="l">216</TD><TD>                                                sharedObject);</TD></TR><TR CLASS="z"><TD CLASS="l">217</TD><TD>                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">218</TD><TD>                        } else if (sharedObject == testObject) {</TD></TR><TR><TD CLASS="l">219</TD><TD>                                // if nothing happened, just increment the could and return the shared model</TD></TR><TR CLASS="z"><TD CLASS="l">220</TD><TD>                                synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">221</TD><TD>                                        if (sharedObject.theSharedModel!=null) {</TD></TR><TR CLASS="z"><TD CLASS="l">222</TD><TD>                                                _incrCount(sharedObject, rwType);</TD></TR><TR><TD CLASS="l">223</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">224</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">225</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">226</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">227</TD><TD>                        } else {</TD></TR><TR><TD CLASS="l">228</TD><TD>                                // sharedObject != testObject which means the object we were waiting on has been disposed</TD></TR><TR><TD CLASS="l">229</TD><TD>                                // a replacement has already been placed in the managedObjects table. Through away our</TD></TR><TR><TD CLASS="l">230</TD><TD>                                // stale sharedObject and continue on with the one we got from the queue. Note: We don't know its</TD></TR><TR><TD CLASS="l">231</TD><TD>                                // state, so continue the waitForLoad-check loop. </TD></TR><TR CLASS="z"><TD CLASS="l">232</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">233</TD><TD>                                sharedObject = testObject;</TD></TR><TR><TD CLASS="l">234</TD><TD>                        }</TD></TR><TR><TD CLASS="l">235</TD><TD>                }</TD></TR><TR><TD CLASS="l">236</TD><TD>                </TD></TR><TR><TD CLASS="l">237</TD><TD>                // we expect to always return something</TD></TR><TR CLASS="z"><TD CLASS="l">238</TD><TD>                if (sharedObject == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">239</TD><TD>                        debugException = new Exception(&#34;instance only for stack trace&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">240</TD><TD>                        Logger.logException(&#34;Program Error: no model recorded for id &#34; + id, debugException); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">241</TD><TD>                }</TD></TR><TR><TD CLASS="l">242</TD><TD>                </TD></TR><TR><TD CLASS="l">243</TD><TD>                // note: clients must call release for each time they call get.</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="50">244</A></TD><TD>                return sharedObject==null ? null : sharedObject.theSharedModel;</TD></TR><TR><TD CLASS="l">245</TD><TD>        }</TD></TR><TR><TD CLASS="l">246</TD><TD> </TD></TR><TR><TD CLASS="l">247</TD><TD>        private void _decrCount(SharedObject sharedObject, ReadEditType type) {</TD></TR><TR CLASS="c"><TD CLASS="l">248</TD><TD>                if (type == READ) {</TD></TR><TR CLASS="c"><TD CLASS="l">249</TD><TD>                        sharedObject.referenceCountForRead--;</TD></TR><TR CLASS="c"><TD CLASS="l">250</TD><TD>                        FileBufferModelManager.getInstance().disconnect(sharedObject.theSharedModel.getStructuredDocument());</TD></TR><TR><TD CLASS="l">251</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">252</TD><TD>                else if (type == EDIT) {</TD></TR><TR CLASS="c"><TD CLASS="l">253</TD><TD>                        sharedObject.referenceCountForEdit--;</TD></TR><TR CLASS="c"><TD CLASS="l">254</TD><TD>                        FileBufferModelManager.getInstance().disconnect(sharedObject.theSharedModel.getStructuredDocument());</TD></TR><TR><TD CLASS="l">255</TD><TD>                }</TD></TR><TR><TD CLASS="l">256</TD><TD>                else</TD></TR><TR CLASS="z"><TD CLASS="l">257</TD><TD>                        throw new IllegalArgumentException();</TD></TR><TR CLASS="c"><TD CLASS="l">258</TD><TD>        }</TD></TR><TR><TD CLASS="l">259</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="5">260</A></TD><TD>        private void _doCommonCreateModel(IFile file, String id, IModelHandler handler,</TD></TR><TR><TD CLASS="l">261</TD><TD>                        URIResolver resolver, ReadEditType rwType, EncodingRule encodingRule,</TD></TR><TR><TD CLASS="l">262</TD><TD>                        SharedObject sharedObject) throws CoreException, IOException {</TD></TR><TR><TD CLASS="l">263</TD><TD>                // XXX: Does not integrate with FileBuffers</TD></TR><TR CLASS="z"><TD CLASS="l">264</TD><TD>                boolean doRemove = false;</TD></TR><TR CLASS="z"><TD CLASS="l">265</TD><TD>                synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">266</TD><TD>                        InputStream inputStream = null;</TD></TR><TR CLASS="z"><TD CLASS="l">267</TD><TD>                        IStructuredModel model = null;</TD></TR><TR><TD CLASS="l">268</TD><TD>                        try {</TD></TR><TR CLASS="z"><TD CLASS="l">269</TD><TD>                                model = _commonCreateModel(id, handler, resolver);</TD></TR><TR CLASS="z"><TD CLASS="l">270</TD><TD>                                IModelLoader loader = handler.getModelLoader();</TD></TR><TR CLASS="z"><TD CLASS="l">271</TD><TD>                                inputStream = Utilities.getMarkSupportedStream(file.getContents(true));</TD></TR><TR CLASS="z"><TD CLASS="l">272</TD><TD>                                loader.load(Utilities.getMarkSupportedStream(inputStream), model, encodingRule);</TD></TR><TR><TD CLASS="l">273</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">274</TD><TD>                        catch (ResourceInUse e) {</TD></TR><TR><TD CLASS="l">275</TD><TD>                                // impossible, since we've already found</TD></TR><TR CLASS="z"><TD CLASS="l">276</TD><TD>                                handleProgramError(e);</TD></TR><TR CLASS="z"><TD CLASS="l">277</TD><TD>                        } finally {</TD></TR><TR CLASS="z"><TD CLASS="l">278</TD><TD>                                if (inputStream!=null) {</TD></TR><TR><TD CLASS="l">279</TD><TD>                                        try { </TD></TR><TR CLASS="z"><TD CLASS="l">280</TD><TD>                                                inputStream.close();</TD></TR><TR CLASS="z"><TD CLASS="l">281</TD><TD>                                        } catch(IOException e) {</TD></TR><TR><TD CLASS="l">282</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">283</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">284</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">285</TD><TD>                        if (model != null) {</TD></TR><TR><TD CLASS="l">286</TD><TD>                                // add to our cache</TD></TR><TR CLASS="z"><TD CLASS="l">287</TD><TD>                                sharedObject.theSharedModel=model;</TD></TR><TR CLASS="z"><TD CLASS="l">288</TD><TD>                                _initCount(sharedObject, rwType);</TD></TR><TR><TD CLASS="l">289</TD><TD>                        } else {</TD></TR><TR CLASS="z"><TD CLASS="l">290</TD><TD>                                doRemove = true;</TD></TR><TR><TD CLASS="l">291</TD><TD>                        }</TD></TR><TR><TD CLASS="l">292</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">293</TD><TD>                if (doRemove) {</TD></TR><TR CLASS="z"><TD CLASS="l">294</TD><TD>                        SYNC.acquire();        </TD></TR><TR CLASS="z"><TD CLASS="l">295</TD><TD>                        fManagedObjects.remove(id);        </TD></TR><TR CLASS="z"><TD CLASS="l">296</TD><TD>                        SYNC.release();</TD></TR><TR><TD CLASS="l">297</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">298</TD><TD>                sharedObject.setLoaded();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="2">299</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">300</TD><TD> </TD></TR><TR><TD CLASS="l">301</TD><TD>        private IStructuredModel _commonCreateModel(InputStream inputStream, String id, IModelHandler handler, URIResolver resolver, ReadEditType rwType, String encoding, String lineDelimiter) throws IOException {</TD></TR><TR><TD CLASS="l">302</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">303</TD><TD>                if (id == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">304</TD><TD>                        throw new IllegalArgumentException(&#34;Program Error: id may not be null&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">305</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">306</TD><TD>                SharedObject sharedObject = null;</TD></TR><TR><TD CLASS="l">307</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">308</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">309</TD><TD>                sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">310</TD><TD>                SYNC.release();</TD></TR><TR><TD CLASS="l">311</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">312</TD><TD>                while(true) {</TD></TR><TR CLASS="z"><TD CLASS="l">313</TD><TD>                        if (sharedObject!=null) {</TD></TR><TR CLASS="z"><TD CLASS="l">314</TD><TD>                                sharedObject.waitForLoadAttempt();</TD></TR><TR><TD CLASS="l">315</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">316</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">317</TD><TD>                        SharedObject testObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">318</TD><TD>                        if (testObject==null) {</TD></TR><TR><TD CLASS="l">319</TD><TD>                                // it was removed ,so lets create it</TD></TR><TR CLASS="z"><TD CLASS="l">320</TD><TD>                                sharedObject = new SharedObject(null);</TD></TR><TR CLASS="z"><TD CLASS="l">321</TD><TD>                                fManagedObjects.put(id, sharedObject);</TD></TR><TR CLASS="z"><TD CLASS="l">322</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">323</TD><TD>                                _doCommonCreateModel(inputStream, id, handler, resolver, rwType,</TD></TR><TR CLASS="z"><TD CLASS="l">324</TD><TD>                                                encoding, lineDelimiter, sharedObject);</TD></TR><TR CLASS="z"><TD CLASS="l">325</TD><TD>                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">326</TD><TD>                        } else if (sharedObject == testObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">327</TD><TD>                                synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">328</TD><TD>                                        if (sharedObject.theSharedModel!=null) {</TD></TR><TR CLASS="z"><TD CLASS="l">329</TD><TD>                                                _incrCount(sharedObject, rwType);</TD></TR><TR><TD CLASS="l">330</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">331</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">332</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">333</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">334</TD><TD>                        } else {</TD></TR><TR CLASS="z"><TD CLASS="l">335</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">336</TD><TD>                                sharedObject = testObject;</TD></TR><TR><TD CLASS="l">337</TD><TD>                        }</TD></TR><TR><TD CLASS="l">338</TD><TD>                }</TD></TR><TR><TD CLASS="l">339</TD><TD>                </TD></TR><TR><TD CLASS="l">340</TD><TD>                // we expect to always return something</TD></TR><TR CLASS="z"><TD CLASS="l">341</TD><TD>                Assert.isNotNull(sharedObject, &#34;Program Error: no model recorded for id &#34; + id); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">342</TD><TD>                // note: clients must call release for each time they call get.</TD></TR><TR CLASS="z"><TD CLASS="l">343</TD><TD>                return sharedObject.theSharedModel;</TD></TR><TR><TD CLASS="l">344</TD><TD>        </TD></TR><TR><TD CLASS="l">345</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="6">346</A></TD><TD> </TD></TR><TR><TD CLASS="l">347</TD><TD>        private void _doCommonCreateModel(InputStream inputStream, String id, IModelHandler handler,</TD></TR><TR><TD CLASS="l">348</TD><TD>                        URIResolver resolver, ReadEditType rwType, String encoding, String lineDelimiter,</TD></TR><TR><TD CLASS="l">349</TD><TD>                        SharedObject sharedObject) throws IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">350</TD><TD>                boolean doRemove = false;</TD></TR><TR CLASS="z"><TD CLASS="l">351</TD><TD>                synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">352</TD><TD>                        IStructuredModel model = null;</TD></TR><TR><TD CLASS="l">353</TD><TD>                        try {</TD></TR><TR CLASS="z"><TD CLASS="l">354</TD><TD>                                model = _commonCreateModel(id, handler, resolver);</TD></TR><TR CLASS="z"><TD CLASS="l">355</TD><TD>                                IModelLoader loader = handler.getModelLoader();</TD></TR><TR CLASS="z"><TD CLASS="l">356</TD><TD>                                if (inputStream == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">357</TD><TD>                                        Logger.log(Logger.WARNING, &#34;model was requested for id &#34; + id + &#34; without a content InputStream&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">358</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">359</TD><TD>                                loader.load(id, Utilities.getMarkSupportedStream(inputStream), model, encoding, lineDelimiter);</TD></TR><TR><TD CLASS="l">360</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">361</TD><TD>                        catch (ResourceInUse e) {</TD></TR><TR><TD CLASS="l">362</TD><TD>                                // impossible, since we've already found</TD></TR><TR CLASS="z"><TD CLASS="l">363</TD><TD>                                handleProgramError(e);</TD></TR><TR><TD CLASS="l">364</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">365</TD><TD>                        if (model != null) {</TD></TR><TR><TD CLASS="l">366</TD><TD>                                /**</TD></TR><TR><TD CLASS="l">367</TD><TD>                                 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=264228</TD></TR><TR><TD CLASS="l">368</TD><TD>                                 * </TD></TR><TR><TD CLASS="l">369</TD><TD>                                 * Ensure that the content type identifier field of the model</TD></TR><TR><TD CLASS="l">370</TD><TD>                                 * is properly set. This is normally handled by the</TD></TR><TR><TD CLASS="l">371</TD><TD>                                 * FileBufferModelManager when working with files as it knows</TD></TR><TR><TD CLASS="l">372</TD><TD>                                 * the content type in advance; here is where we handle it for</TD></TR><TR><TD CLASS="l">373</TD><TD>                                 * streams.</TD></TR><TR><TD CLASS="l">374</TD><TD>                                 */</TD></TR><TR CLASS="z"><TD CLASS="l">375</TD><TD>                                if (model instanceof AbstractStructuredModel) {</TD></TR><TR CLASS="z"><TD CLASS="l">376</TD><TD>                                        DocumentReader reader = new DocumentReader(model.getStructuredDocument());</TD></TR><TR CLASS="z"><TD CLASS="l">377</TD><TD>                                        IContentDescription description = Platform.getContentTypeManager().getDescriptionFor(reader, id, new QualifiedName[0]);</TD></TR><TR CLASS="z"><TD CLASS="l">378</TD><TD>                                        reader.close();</TD></TR><TR CLASS="z"><TD CLASS="l">379</TD><TD>                                        if (description != null &amp;&amp; description.getContentType() != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">380</TD><TD>                                                ((AbstractStructuredModel) model).setContentTypeIdentifier(description.getContentType().getId());</TD></TR><TR><TD CLASS="l">381</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">382</TD><TD>                                }</TD></TR><TR><TD CLASS="l">383</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">384</TD><TD>                                sharedObject.theSharedModel = model;</TD></TR><TR CLASS="z"><TD CLASS="l">385</TD><TD>                                _initCount(sharedObject, rwType);</TD></TR><TR><TD CLASS="l">386</TD><TD>                        } else {</TD></TR><TR CLASS="z"><TD CLASS="l">387</TD><TD>                                doRemove = true;</TD></TR><TR><TD CLASS="l">388</TD><TD>                        }</TD></TR><TR><TD CLASS="l">389</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">390</TD><TD>                if (doRemove) {</TD></TR><TR CLASS="z"><TD CLASS="l">391</TD><TD>                        SYNC.acquire();</TD></TR><TR><TD CLASS="l">392</TD><TD>                        // remove it if we didn't get one back</TD></TR><TR CLASS="z"><TD CLASS="l">393</TD><TD>                        fManagedObjects.remove(id);</TD></TR><TR CLASS="z"><TD CLASS="l">394</TD><TD>                        SYNC.release();</TD></TR><TR><TD CLASS="l">395</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">396</TD><TD>                sharedObject.setLoaded();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="3">397</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">398</TD><TD> </TD></TR><TR><TD CLASS="l">399</TD><TD>        private IStructuredModel _commonCreateModel(String id, IModelHandler handler, URIResolver resolver) throws ResourceInUse {</TD></TR><TR><TD CLASS="l">400</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">401</TD><TD>                IModelLoader loader = handler.getModelLoader();</TD></TR><TR CLASS="z"><TD CLASS="l">402</TD><TD>                IStructuredModel result = loader.createModel();</TD></TR><TR><TD CLASS="l">403</TD><TD>                // in the past, id was null for &#34;unmanaged&#34; case, so we won't</TD></TR><TR><TD CLASS="l">404</TD><TD>                // try and set it</TD></TR><TR CLASS="z"><TD CLASS="l">405</TD><TD>                if (id != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">406</TD><TD>                        result.setId(id);</TD></TR><TR><TD CLASS="l">407</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">408</TD><TD>                result.setModelHandler(handler);</TD></TR><TR CLASS="z"><TD CLASS="l">409</TD><TD>                result.setResolver(resolver);</TD></TR><TR><TD CLASS="l">410</TD><TD>                // some obvious redunancy here that maybe could be improved</TD></TR><TR><TD CLASS="l">411</TD><TD>                // in future, but is necessary for now</TD></TR><TR CLASS="z"><TD CLASS="l">412</TD><TD>                result.setBaseLocation(id);</TD></TR><TR CLASS="z"><TD CLASS="l">413</TD><TD>                if (resolver != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">414</TD><TD>                        resolver.setFileBaseLocation(id);</TD></TR><TR><TD CLASS="l">415</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">416</TD><TD>                addFactories(result, handler);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="4">417</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">418</TD><TD>        }</TD></TR><TR><TD CLASS="l">419</TD><TD> </TD></TR><TR><TD CLASS="l">420</TD><TD>        private IStructuredModel _commonGetModel(IFile iFile, ReadEditType rwType, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR CLASS="z"><TD CLASS="l">421</TD><TD>                IStructuredModel model = null;</TD></TR><TR><TD CLASS="l">422</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">423</TD><TD>                if (iFile != null &amp;&amp; iFile.exists()) {</TD></TR><TR CLASS="z"><TD CLASS="l">424</TD><TD>                        String id = calculateId(iFile);</TD></TR><TR CLASS="z"><TD CLASS="l">425</TD><TD>                        IModelHandler handler = calculateType(iFile);</TD></TR><TR CLASS="z"><TD CLASS="l">426</TD><TD>                        URIResolver resolver = calculateURIResolver(iFile);</TD></TR><TR CLASS="z"><TD CLASS="l">427</TD><TD>                        model = _commonCreateModel(iFile, id, handler, resolver, rwType, encodingRule);</TD></TR><TR><TD CLASS="l">428</TD><TD>                }</TD></TR><TR><TD CLASS="l">429</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="55">430</A></TD><TD>                return model;</TD></TR><TR><TD CLASS="l">431</TD><TD>        }</TD></TR><TR><TD CLASS="l">432</TD><TD> </TD></TR><TR><TD CLASS="l">433</TD><TD>        private IStructuredModel _commonGetModel(IFile iFile, ReadEditType rwType, String encoding, String lineDelimiter) throws UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR CLASS="c"><TD CLASS="l">434</TD><TD>                String id = calculateId(iFile);</TD></TR><TR CLASS="c"><TD CLASS="l">435</TD><TD>                IModelHandler handler = calculateType(iFile);</TD></TR><TR CLASS="c"><TD CLASS="l">436</TD><TD>                URIResolver resolver = calculateURIResolver(iFile);</TD></TR><TR CLASS="c"><TD CLASS="l">437</TD><TD>                IStructuredModel model = _commonGetModel(iFile, id, handler, resolver, rwType, encoding, lineDelimiter);</TD></TR><TR><TD CLASS="l">438</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="4b">439</A></TD><TD>                return model;</TD></TR><TR><TD CLASS="l">440</TD><TD>        }</TD></TR><TR><TD CLASS="l">441</TD><TD> </TD></TR><TR><TD CLASS="l">442</TD><TD>        private IStructuredModel _commonGetModel(IFile file, String id, IModelHandler handler, URIResolver resolver, ReadEditType rwType, String encoding, String lineDelimiter) throws IOException, CoreException {</TD></TR><TR CLASS="c"><TD CLASS="l">443</TD><TD>                if (id == null)</TD></TR><TR CLASS="z"><TD CLASS="l">444</TD><TD>                        throw new IllegalArgumentException(&#34;Program Error: id may not be null&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">445</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">446</TD><TD>                SharedObject sharedObject = null;</TD></TR><TR CLASS="c"><TD CLASS="l">447</TD><TD>                if (file != null &amp;&amp; file.exists()) {</TD></TR><TR CLASS="c"><TD CLASS="l">448</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="c"><TD CLASS="l">449</TD><TD>                        sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="c"><TD CLASS="l">450</TD><TD>                        SYNC.release();</TD></TR><TR><TD CLASS="l">451</TD><TD>                        </TD></TR><TR CLASS="z"><TD CLASS="l">452</TD><TD>                        while(true) {</TD></TR><TR CLASS="c"><TD CLASS="l">453</TD><TD>                                if (sharedObject!=null) {</TD></TR><TR CLASS="c"><TD CLASS="l">454</TD><TD>                                        sharedObject.waitForLoadAttempt();</TD></TR><TR><TD CLASS="l">455</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">456</TD><TD>                                SYNC.acquire();</TD></TR><TR CLASS="c"><TD CLASS="l">457</TD><TD>                                SharedObject testObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="c"><TD CLASS="l">458</TD><TD>                                if (testObject==null) {</TD></TR><TR><TD CLASS="l">459</TD><TD>                                        // it was removed ,so lets create it</TD></TR><TR CLASS="c"><TD CLASS="l">460</TD><TD>                                        sharedObject = new SharedObject(null);</TD></TR><TR CLASS="c"><TD CLASS="l">461</TD><TD>                                        fManagedObjects.put(id, sharedObject);</TD></TR><TR><TD CLASS="l">462</TD><TD>                                        </TD></TR><TR CLASS="c"><TD CLASS="l">463</TD><TD>                                        SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">464</TD><TD>                                        _doCommonGetModel(file, id, sharedObject,rwType);</TD></TR><TR CLASS="c"><TD CLASS="l">465</TD><TD>                                        break;</TD></TR><TR CLASS="c"><TD CLASS="l">466</TD><TD>                                } else if (sharedObject == testObject) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="77% line coverage (10 out of 13 instructions)">467</TD><TD TITLE="77% line coverage (10 out of 13 instructions)">                                        synchronized(sharedObject) {</TD></TR><TR CLASS="c"><TD CLASS="l">468</TD><TD>                                                if (sharedObject.theSharedModel!=null) {</TD></TR><TR CLASS="c"><TD CLASS="l">469</TD><TD>                                                        _incrCount(sharedObject, rwType);</TD></TR><TR><TD CLASS="l">470</TD><TD>                                                }</TD></TR><TR><TD CLASS="l">471</TD><TD>                                        }</TD></TR><TR CLASS="c"><TD CLASS="l">472</TD><TD>                                        SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">473</TD><TD>                                        break;</TD></TR><TR><TD CLASS="l">474</TD><TD>                                } else {</TD></TR><TR><TD CLASS="l">475</TD><TD>                                        // we got a different object than what we were expecting</TD></TR><TR CLASS="z"><TD CLASS="l">476</TD><TD>                                        SYNC.release();</TD></TR><TR><TD CLASS="l">477</TD><TD>                                        // two threads were interested in models for the same id. </TD></TR><TR><TD CLASS="l">478</TD><TD>                                        // The other thread one, so lets back off and try again. </TD></TR><TR CLASS="z"><TD CLASS="l">479</TD><TD>                                        sharedObject = testObject; </TD></TR><TR><TD CLASS="l">480</TD><TD>                                }</TD></TR><TR><TD CLASS="l">481</TD><TD>                        }</TD></TR><TR><TD CLASS="l">482</TD><TD>                }</TD></TR><TR><TD CLASS="l">483</TD><TD>                </TD></TR><TR><TD CLASS="l">484</TD><TD>                // if we don't know how to create a model</TD></TR><TR><TD CLASS="l">485</TD><TD>                // for this type of file, return null</TD></TR><TR><TD CLASS="l">486</TD><TD>        </TD></TR><TR><TD CLASS="l">487</TD><TD>                // note: clients must call release for each time they call</TD></TR><TR><TD CLASS="l">488</TD><TD>                // get.</TD></TR><TR><TD CLASS="l">489</TD><TD>                        </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="71% line coverage (5 out of 7 instructions)"><A NAME="45">490</A></TD><TD TITLE="71% line coverage (5 out of 7 instructions)">                return sharedObject==null ? null : sharedObject.theSharedModel;</TD></TR><TR><TD CLASS="l">491</TD><TD>        }</TD></TR><TR><TD CLASS="l">492</TD><TD> </TD></TR><TR><TD CLASS="l">493</TD><TD>        private void _doCommonGetModel(IFile file, String id, SharedObject sharedObject,ReadEditType rwType) {</TD></TR><TR CLASS="c"><TD CLASS="l">494</TD><TD>                boolean doRemove = false;</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="88% line coverage (21 out of 24 instructions)">495</TD><TD TITLE="88% line coverage (21 out of 24 instructions)">                synchronized(sharedObject) {</TD></TR><TR CLASS="c"><TD CLASS="l">496</TD><TD>                        sharedObject.doWait=false;</TD></TR><TR CLASS="c"><TD CLASS="l">497</TD><TD>                        IStructuredModel model = FileBufferModelManager.getInstance().getModel(file);</TD></TR><TR CLASS="c"><TD CLASS="l">498</TD><TD>                        sharedObject.doWait=true;</TD></TR><TR CLASS="c"><TD CLASS="l">499</TD><TD>                        if (model != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">500</TD><TD>                                sharedObject.theSharedModel=model;</TD></TR><TR CLASS="c"><TD CLASS="l">501</TD><TD>                                _initCount(sharedObject, rwType);</TD></TR><TR><TD CLASS="l">502</TD><TD>                        } else {</TD></TR><TR CLASS="z"><TD CLASS="l">503</TD><TD>                                doRemove = true;</TD></TR><TR><TD CLASS="l">504</TD><TD>                        }</TD></TR><TR><TD CLASS="l">505</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">506</TD><TD>                if (doRemove) {</TD></TR><TR CLASS="z"><TD CLASS="l">507</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">508</TD><TD>                        fManagedObjects.remove(id);</TD></TR><TR CLASS="z"><TD CLASS="l">509</TD><TD>                        SYNC.release();</TD></TR><TR><TD CLASS="l">510</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="49">511</A></TD><TD>                sharedObject.setLoaded();</TD></TR><TR CLASS="c"><TD CLASS="l">512</TD><TD>        }</TD></TR><TR><TD CLASS="l">513</TD><TD> </TD></TR><TR><TD CLASS="l">514</TD><TD>        private SharedObject _commonNewModel(IFile iFile, boolean force) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException {</TD></TR><TR CLASS="c"><TD CLASS="l">515</TD><TD>                IStructuredModel aSharedModel = null;</TD></TR><TR><TD CLASS="l">516</TD><TD>                // First, check if resource already exists on file system.</TD></TR><TR><TD CLASS="l">517</TD><TD>                // if is does, then throw Resource in Use iff force==false</TD></TR><TR><TD CLASS="l">518</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">519</TD><TD>                if (iFile.exists() &amp;&amp; !force) {</TD></TR><TR CLASS="z"><TD CLASS="l">520</TD><TD>                        throw new ResourceAlreadyExists();</TD></TR><TR><TD CLASS="l">521</TD><TD>                }</TD></TR><TR><TD CLASS="l">522</TD><TD>                </TD></TR><TR CLASS="c"><TD CLASS="l">523</TD><TD>                SharedObject sharedObject = null;</TD></TR><TR CLASS="c"><TD CLASS="l">524</TD><TD>                String id = calculateId(iFile);</TD></TR><TR><TD CLASS="l">525</TD><TD>                try {</TD></TR><TR CLASS="c"><TD CLASS="l">526</TD><TD>                        SYNC.acquire();</TD></TR><TR><TD CLASS="l">527</TD><TD>                </TD></TR><TR CLASS="c"><TD CLASS="l">528</TD><TD>                         sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR><TD CLASS="l">529</TD><TD>        </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="89% line coverage (17 out of 19 instructions)">530</TD><TD TITLE="89% line coverage (17 out of 19 instructions)">                        if (sharedObject != null &amp;&amp; !force) {</TD></TR><TR><TD CLASS="l">531</TD><TD>                                // if in cache already, and force is not true, then this is an</TD></TR><TR><TD CLASS="l">532</TD><TD>                                // error</TD></TR><TR><TD CLASS="l">533</TD><TD>                                // in call</TD></TR><TR CLASS="z"><TD CLASS="l">534</TD><TD>                                throw new ResourceInUse();</TD></TR><TR><TD CLASS="l">535</TD><TD>                        }</TD></TR><TR><TD CLASS="l">536</TD><TD>                        </TD></TR><TR CLASS="c"><TD CLASS="l">537</TD><TD>                        sharedObject = new SharedObject(null);</TD></TR><TR CLASS="c"><TD CLASS="l">538</TD><TD>                        fManagedObjects.put(id, sharedObject);</TD></TR><TR><TD CLASS="l">539</TD><TD>                        </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="71% line coverage (5 out of 7 instructions)">540</TD><TD TITLE="71% line coverage (5 out of 7 instructions)">                } finally {</TD></TR><TR CLASS="c"><TD CLASS="l">541</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="75% line coverage (6 out of 8 instructions)">542</TD><TD TITLE="75% line coverage (6 out of 8 instructions)">                }</TD></TR><TR><TD CLASS="l">543</TD><TD>                </TD></TR><TR><TD CLASS="l">544</TD><TD>                // if we get to here without above exceptions, then all is ok</TD></TR><TR><TD CLASS="l">545</TD><TD>                // to get model like normal, but set 'new' attribute (where the</TD></TR><TR><TD CLASS="l">546</TD><TD>                // 'new' attribute means this is a model without a corresponding</TD></TR><TR><TD CLASS="l">547</TD><TD>                // underlying resource.</TD></TR><TR CLASS="c"><TD CLASS="l">548</TD><TD>                aSharedModel = FileBufferModelManager.getInstance().getModel(iFile);</TD></TR><TR CLASS="c"><TD CLASS="l">549</TD><TD>                aSharedModel.setNewState(true);</TD></TR><TR><TD CLASS="l">550</TD><TD>                </TD></TR><TR CLASS="c"><TD CLASS="l">551</TD><TD>                sharedObject.theSharedModel=aSharedModel;</TD></TR><TR><TD CLASS="l">552</TD><TD>                // when resource is provided, we can set</TD></TR><TR><TD CLASS="l">553</TD><TD>                // synchronization stamp ... otherwise client should</TD></TR><TR><TD CLASS="l">554</TD><TD>                // Note: one client which does this is FileModelProvider.</TD></TR><TR CLASS="c"><TD CLASS="l">555</TD><TD>                aSharedModel.resetSynchronizationStamp(iFile);</TD></TR><TR CLASS="c"><TD CLASS="l">556</TD><TD>                return sharedObject;</TD></TR><TR><TD CLASS="l"><A NAME="7">557</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">558</TD><TD> </TD></TR><TR><TD CLASS="l">559</TD><TD>        public IStructuredModel _getModelFor(IStructuredDocument document, ReadEditType accessType) {</TD></TR><TR><TD CLASS="l">560</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">561</TD><TD>                String id = FileBufferModelManager.getInstance().calculateId(document);</TD></TR><TR CLASS="z"><TD CLASS="l">562</TD><TD>                Assert.isNotNull(id, &#34;unknown IStructuredDocument &#34; + document); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">563</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">564</TD><TD>                SharedObject sharedObject = null;</TD></TR><TR CLASS="z"><TD CLASS="l">565</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">566</TD><TD>                sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">567</TD><TD>                SYNC.release();</TD></TR><TR><TD CLASS="l">568</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">569</TD><TD>                while(true) {</TD></TR><TR CLASS="z"><TD CLASS="l">570</TD><TD>                        if (sharedObject!=null) {</TD></TR><TR CLASS="z"><TD CLASS="l">571</TD><TD>                                sharedObject.waitForLoadAttempt();</TD></TR><TR><TD CLASS="l">572</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">573</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">574</TD><TD>                        SharedObject testObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">575</TD><TD>                        if (testObject==null) {</TD></TR><TR CLASS="z"><TD CLASS="l">576</TD><TD>                                sharedObject = new SharedObject(null);</TD></TR><TR CLASS="z"><TD CLASS="l">577</TD><TD>                                fManagedObjects.put(id, sharedObject);</TD></TR><TR CLASS="z"><TD CLASS="l">578</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">579</TD><TD>                                synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">580</TD><TD>                                        sharedObject.theSharedModel = FileBufferModelManager.getInstance().getModel(document);</TD></TR><TR CLASS="z"><TD CLASS="l">581</TD><TD>                                        _initCount(sharedObject, accessType);</TD></TR><TR CLASS="z"><TD CLASS="l">582</TD><TD>                                        sharedObject.setLoaded();</TD></TR><TR><TD CLASS="l">583</TD><TD>                                }</TD></TR><TR><TD CLASS="l">584</TD><TD>                                break;</TD></TR><TR CLASS="z"><TD CLASS="l">585</TD><TD>                        } else if (sharedObject == testObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">586</TD><TD>                                synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">587</TD><TD>                                        Assert.isTrue(sharedObject.referenceCountForEdit + sharedObject.referenceCountForRead &gt; 0);</TD></TR><TR CLASS="z"><TD CLASS="l">588</TD><TD>                                        if (sharedObject.theSharedModel!=null) {</TD></TR><TR CLASS="z"><TD CLASS="l">589</TD><TD>                                                _incrCount(sharedObject, accessType);</TD></TR><TR><TD CLASS="l">590</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">591</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">592</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">593</TD><TD>                                break;</TD></TR><TR><TD CLASS="l">594</TD><TD>                        } else {</TD></TR><TR CLASS="z"><TD CLASS="l">595</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">596</TD><TD>                                sharedObject = testObject;</TD></TR><TR><TD CLASS="l">597</TD><TD>                        }</TD></TR><TR><TD CLASS="l">598</TD><TD>                }</TD></TR><TR><TD CLASS="l">599</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="42">600</A></TD><TD>                return sharedObject==null ? null : sharedObject.theSharedModel;</TD></TR><TR><TD CLASS="l">601</TD><TD>        }</TD></TR><TR><TD CLASS="l">602</TD><TD> </TD></TR><TR><TD CLASS="l">603</TD><TD>        private void _incrCount(SharedObject sharedObject, ReadEditType type) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="79% line coverage (11 out of 14 instructions)">604</TD><TD TITLE="79% line coverage (11 out of 14 instructions)">                synchronized(sharedObject) {</TD></TR><TR CLASS="c"><TD CLASS="l">605</TD><TD>                        if (type == READ) {</TD></TR><TR CLASS="c"><TD CLASS="l">606</TD><TD>                                sharedObject.referenceCountForRead++;</TD></TR><TR CLASS="c"><TD CLASS="l">607</TD><TD>                                FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());</TD></TR><TR><TD CLASS="l">608</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">609</TD><TD>                        else if (type == EDIT) {</TD></TR><TR CLASS="z"><TD CLASS="l">610</TD><TD>                                sharedObject.referenceCountForEdit++;</TD></TR><TR CLASS="z"><TD CLASS="l">611</TD><TD>                                FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());</TD></TR><TR><TD CLASS="l">612</TD><TD>                        }</TD></TR><TR><TD CLASS="l">613</TD><TD>                        else</TD></TR><TR CLASS="z"><TD CLASS="l">614</TD><TD>                                throw new IllegalArgumentException();</TD></TR><TR><TD CLASS="l"><A NAME="4a">615</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">616</TD><TD>        }</TD></TR><TR><TD CLASS="l">617</TD><TD> </TD></TR><TR><TD CLASS="l">618</TD><TD>        private void _initCount(SharedObject sharedObject, ReadEditType type) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="79% line coverage (11 out of 14 instructions)">619</TD><TD TITLE="79% line coverage (11 out of 14 instructions)">                synchronized(sharedObject) {</TD></TR><TR CLASS="c"><TD CLASS="l">620</TD><TD>                        if (type == READ) {</TD></TR><TR CLASS="c"><TD CLASS="l">621</TD><TD>                                FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());</TD></TR><TR CLASS="c"><TD CLASS="l">622</TD><TD>                                sharedObject.referenceCountForRead = 1;</TD></TR><TR><TD CLASS="l">623</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">624</TD><TD>                        else if (type == EDIT) {</TD></TR><TR CLASS="c"><TD CLASS="l">625</TD><TD>                                FileBufferModelManager.getInstance().connect(sharedObject.theSharedModel.getStructuredDocument());</TD></TR><TR CLASS="c"><TD CLASS="l">626</TD><TD>                                sharedObject.referenceCountForEdit = 1;</TD></TR><TR><TD CLASS="l">627</TD><TD>                        }</TD></TR><TR><TD CLASS="l">628</TD><TD>                        else</TD></TR><TR CLASS="z"><TD CLASS="l">629</TD><TD>                                throw new IllegalArgumentException();</TD></TR><TR><TD CLASS="l"><A NAME="8">630</A></TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">631</TD><TD>        }</TD></TR><TR><TD CLASS="l">632</TD><TD> </TD></TR><TR><TD CLASS="l">633</TD><TD>        private void addFactories(IStructuredModel model, IModelHandler handler) {</TD></TR><TR CLASS="z"><TD CLASS="l">634</TD><TD>                Assert.isNotNull(model, &#34;model can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">635</TD><TD>                FactoryRegistry registry = model.getFactoryRegistry();</TD></TR><TR CLASS="z"><TD CLASS="l">636</TD><TD>                Assert.isNotNull(registry, &#34;Factory Registry can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">637</TD><TD>                List factoryList = handler.getAdapterFactories();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="9">638</A></TD><TD>                addFactories(model, factoryList);</TD></TR><TR CLASS="z"><TD CLASS="l">639</TD><TD>        }</TD></TR><TR><TD CLASS="l">640</TD><TD> </TD></TR><TR><TD CLASS="l">641</TD><TD>        private void addFactories(IStructuredModel model, List factoryList) {</TD></TR><TR CLASS="z"><TD CLASS="l">642</TD><TD>                Assert.isNotNull(model, &#34;model can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">643</TD><TD>                FactoryRegistry registry = model.getFactoryRegistry();</TD></TR><TR CLASS="z"><TD CLASS="l">644</TD><TD>                Assert.isNotNull(registry, &#34;Factory Registry can not be null&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">645</TD><TD>                // Note: we add all of them from handler, even if</TD></TR><TR><TD CLASS="l">646</TD><TD>                // already exists. May need to reconsider this.</TD></TR><TR CLASS="z"><TD CLASS="l">647</TD><TD>                if (factoryList != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">648</TD><TD>                        Iterator iterator = factoryList.iterator();</TD></TR><TR CLASS="z"><TD CLASS="l">649</TD><TD>                        while (iterator.hasNext()) {</TD></TR><TR CLASS="z"><TD CLASS="l">650</TD><TD>                                INodeAdapterFactory factory = (INodeAdapterFactory) iterator.next();</TD></TR><TR CLASS="z"><TD CLASS="l">651</TD><TD>                                registry.addFactory(factory);</TD></TR><TR><TD CLASS="l">652</TD><TD>                        }</TD></TR><TR><TD CLASS="l">653</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">654</TD><TD>        }</TD></TR><TR><TD CLASS="l">655</TD><TD> </TD></TR><TR><TD CLASS="l">656</TD><TD> </TD></TR><TR><TD CLASS="l">657</TD><TD>        /**</TD></TR><TR><TD CLASS="l">658</TD><TD>         * Calculate id provides a common way to determine the id from the input</TD></TR><TR><TD CLASS="l"><A NAME="56">659</A></TD><TD>         * ... needed to get and save the model. It is a simple class utility, but</TD></TR><TR><TD CLASS="l">660</TD><TD>         * is an instance method so can be accessed via interface.</TD></TR><TR><TD CLASS="l">661</TD><TD>         */</TD></TR><TR><TD CLASS="l">662</TD><TD>        public String calculateId(IFile file) {</TD></TR><TR CLASS="c"><TD CLASS="l">663</TD><TD>                return FileBufferModelManager.getInstance().calculateId(file);</TD></TR><TR><TD CLASS="l">664</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="57">665</A></TD><TD> </TD></TR><TR><TD CLASS="l">666</TD><TD>        private IModelHandler calculateType(IFile iFile) throws CoreException {</TD></TR><TR><TD CLASS="l">667</TD><TD>                // IModelManager mm = ((ModelManagerPlugin)</TD></TR><TR><TD CLASS="l">668</TD><TD>                // Platform.getPlugin(ModelManagerPlugin.ID)).getModelManager();</TD></TR><TR CLASS="c"><TD CLASS="l">669</TD><TD>                ModelHandlerRegistry cr = getModelHandlerRegistry();</TD></TR><TR CLASS="c"><TD CLASS="l">670</TD><TD>                IModelHandler cd = cr.getHandlerFor(iFile);</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="a">671</A></TD><TD>                return cd;</TD></TR><TR><TD CLASS="l">672</TD><TD>        }</TD></TR><TR><TD CLASS="l">673</TD><TD> </TD></TR><TR><TD CLASS="l">674</TD><TD>        private IModelHandler calculateType(String filename, InputStream inputStream) throws IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">675</TD><TD>                ModelHandlerRegistry cr = getModelHandlerRegistry();</TD></TR><TR CLASS="z"><TD CLASS="l">676</TD><TD>                IModelHandler cd = cr.getHandlerFor(filename, inputStream);</TD></TR><TR CLASS="z"><TD CLASS="l">677</TD><TD>                return cd;</TD></TR><TR><TD CLASS="l">678</TD><TD>        }</TD></TR><TR><TD CLASS="l">679</TD><TD> </TD></TR><TR><TD CLASS="l">680</TD><TD>        /**</TD></TR><TR><TD CLASS="l">681</TD><TD>         * </TD></TR><TR><TD CLASS="l">682</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="48">683</A></TD><TD>        private URIResolver calculateURIResolver(IFile file) {</TD></TR><TR><TD CLASS="l">684</TD><TD>                // Note: see comment in plugin.xml for potentially</TD></TR><TR><TD CLASS="l">685</TD><TD>                // breaking change in behavior.</TD></TR><TR><TD CLASS="l">686</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">687</TD><TD>                IProject project = file.getProject();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="75% line coverage (18 out of 24 instructions)">688</TD><TD TITLE="75% line coverage (18 out of 24 instructions)">                URIResolver resolver = (URIResolver) project.getAdapter(URIResolver.class);</TD></TR><TR CLASS="c"><TD CLASS="l">689</TD><TD>                if (resolver == null)</TD></TR><TR CLASS="c"><TD CLASS="l">690</TD><TD>                        resolver = new ProjectResolver(project);</TD></TR><TR CLASS="c"><TD CLASS="l">691</TD><TD>                Object location = file.getLocation();</TD></TR><TR CLASS="c"><TD CLASS="l">692</TD><TD>                if (location == null)</TD></TR><TR CLASS="z"><TD CLASS="l">693</TD><TD>                        location = file.getLocationURI();</TD></TR><TR CLASS="c"><TD CLASS="l">694</TD><TD>                if (location != null)</TD></TR><TR CLASS="c"><TD CLASS="l">695</TD><TD>                        resolver.setFileBaseLocation(location.toString());</TD></TR><TR CLASS="c"><TD CLASS="l">696</TD><TD>                return resolver;</TD></TR><TR><TD CLASS="l">697</TD><TD>        }</TD></TR><TR><TD CLASS="l">698</TD><TD> </TD></TR><TR><TD CLASS="l">699</TD><TD>        /*</TD></TR><TR><TD CLASS="l">700</TD><TD>         * Note: This method appears in both ModelManagerImpl and JSEditor (with</TD></TR><TR><TD CLASS="l">701</TD><TD>         * just a minor difference). They should be kept the same.</TD></TR><TR><TD CLASS="l">702</TD><TD>         * </TD></TR><TR><TD CLASS="l">703</TD><TD>         * @deprecated - handled by platform</TD></TR><TR><TD CLASS="l"><A NAME="b">704</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">705</TD><TD>        private void convertLineDelimiters(IDocument document, IFile iFile) throws CoreException {</TD></TR><TR><TD CLASS="l">706</TD><TD>                // Note: calculateType(iFile) returns a default xml model handler if</TD></TR><TR><TD CLASS="l">707</TD><TD>                // content type is null.</TD></TR><TR CLASS="z"><TD CLASS="l">708</TD><TD>                String contentTypeId = calculateType(iFile).getAssociatedContentTypeId();</TD></TR><TR CLASS="z"><TD CLASS="l">709</TD><TD>                String endOfLineCode = ContentBasedPreferenceGateway.getPreferencesString(contentTypeId, CommonEncodingPreferenceNames.END_OF_LINE_CODE);</TD></TR><TR><TD CLASS="l">710</TD><TD>                // endOfLineCode == null means the content type does not support this</TD></TR><TR><TD CLASS="l">711</TD><TD>                // function (e.g. DTD)</TD></TR><TR><TD CLASS="l">712</TD><TD>                // endOfLineCode == &#34;&#34; means no translation</TD></TR><TR CLASS="z"><TD CLASS="l">713</TD><TD>                if (endOfLineCode != null &amp;&amp; endOfLineCode.length() &gt; 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">714</TD><TD>                        String lineDelimiterToUse = System.getProperty(&#34;line.separator&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">715</TD><TD>                        if (endOfLineCode.equals(CommonEncodingPreferenceNames.CR))</TD></TR><TR CLASS="z"><TD CLASS="l">716</TD><TD>                                lineDelimiterToUse = CommonEncodingPreferenceNames.STRING_CR;</TD></TR><TR CLASS="z"><TD CLASS="l">717</TD><TD>                        else if (endOfLineCode.equals(CommonEncodingPreferenceNames.LF))</TD></TR><TR CLASS="z"><TD CLASS="l">718</TD><TD>                                lineDelimiterToUse = CommonEncodingPreferenceNames.STRING_LF;</TD></TR><TR CLASS="z"><TD CLASS="l">719</TD><TD>                        else if (endOfLineCode.equals(CommonEncodingPreferenceNames.CRLF))</TD></TR><TR CLASS="z"><TD CLASS="l">720</TD><TD>                                lineDelimiterToUse = CommonEncodingPreferenceNames.STRING_CRLF;</TD></TR><TR><TD CLASS="l">721</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">722</TD><TD>                        TextEdit multiTextEdit = new MultiTextEdit();</TD></TR><TR CLASS="z"><TD CLASS="l">723</TD><TD>                        int lineCount = document.getNumberOfLines();</TD></TR><TR><TD CLASS="l">724</TD><TD>                        try {</TD></TR><TR CLASS="z"><TD CLASS="l">725</TD><TD>                                for (int i = 0; i &lt; lineCount; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">726</TD><TD>                                        IRegion lineInfo = document.getLineInformation(i);</TD></TR><TR CLASS="z"><TD CLASS="l">727</TD><TD>                                        int lineStartOffset = lineInfo.getOffset();</TD></TR><TR CLASS="z"><TD CLASS="l">728</TD><TD>                                        int lineLength = lineInfo.getLength();</TD></TR><TR CLASS="z"><TD CLASS="l">729</TD><TD>                                        int lineEndOffset = lineStartOffset + lineLength;</TD></TR><TR><TD CLASS="l">730</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">731</TD><TD>                                        if (i &lt; lineCount - 1) {</TD></TR><TR CLASS="z"><TD CLASS="l">732</TD><TD>                                                String currentLineDelimiter = document.getLineDelimiter(i);</TD></TR><TR CLASS="z"><TD CLASS="l">733</TD><TD>                                                if (currentLineDelimiter != null &amp;&amp; currentLineDelimiter.compareTo(lineDelimiterToUse) != 0)</TD></TR><TR CLASS="z"><TD CLASS="l">734</TD><TD>                                                        multiTextEdit.addChild(new ReplaceEdit(lineEndOffset, currentLineDelimiter.length(), lineDelimiterToUse));</TD></TR><TR><TD CLASS="l">735</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">736</TD><TD>                                }</TD></TR><TR><TD CLASS="l">737</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">738</TD><TD>                                if (multiTextEdit.getChildrenSize() &gt; 0)</TD></TR><TR CLASS="z"><TD CLASS="l">739</TD><TD>                                        multiTextEdit.apply(document);</TD></TR><TR><TD CLASS="l">740</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">741</TD><TD>                        catch (BadLocationException exception) {</TD></TR><TR><TD CLASS="l">742</TD><TD>                                // just adding generic runtime here, until whole method</TD></TR><TR><TD CLASS="l">743</TD><TD>                                // deleted.</TD></TR><TR CLASS="z"><TD CLASS="l">744</TD><TD>                                throw new RuntimeException(exception.getMessage());</TD></TR><TR><TD CLASS="l">745</TD><TD>                        }</TD></TR><TR><TD CLASS="l">746</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">747</TD><TD>        }</TD></TR><TR><TD CLASS="l">748</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="c">749</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">750</TD><TD>         * this used to be in loader, but has been moved here</TD></TR><TR><TD CLASS="l">751</TD><TD>         */</TD></TR><TR><TD CLASS="l">752</TD><TD>        private IStructuredModel copy(IStructuredModel model, String newId) throws ResourceInUse {</TD></TR><TR CLASS="z"><TD CLASS="l">753</TD><TD>                IStructuredModel newModel = null;</TD></TR><TR CLASS="z"><TD CLASS="l">754</TD><TD>                IStructuredModel oldModel = model;</TD></TR><TR CLASS="z"><TD CLASS="l">755</TD><TD>                IModelHandler modelHandler = oldModel.getModelHandler();</TD></TR><TR CLASS="z"><TD CLASS="l">756</TD><TD>                IModelLoader loader = modelHandler.getModelLoader();</TD></TR><TR><TD CLASS="l">757</TD><TD>                // newModel = loader.newModel();</TD></TR><TR CLASS="z"><TD CLASS="l">758</TD><TD>                newModel = loader.createModel(oldModel);</TD></TR><TR><TD CLASS="l">759</TD><TD>                // newId, oldModel.getResolver(), oldModel.getModelManager());</TD></TR><TR CLASS="z"><TD CLASS="l">760</TD><TD>                newModel.setModelHandler(modelHandler);</TD></TR><TR><TD CLASS="l">761</TD><TD>                // IStructuredDocument oldStructuredDocument =</TD></TR><TR><TD CLASS="l">762</TD><TD>                // oldModel.getStructuredDocument();</TD></TR><TR><TD CLASS="l">763</TD><TD>                // IStructuredDocument newStructuredDocument =</TD></TR><TR><TD CLASS="l">764</TD><TD>                // oldStructuredDocument.newInstance();</TD></TR><TR><TD CLASS="l">765</TD><TD>                // newModel.setStructuredDocument(newStructuredDocument);</TD></TR><TR CLASS="z"><TD CLASS="l">766</TD><TD>                newModel.setResolver(oldModel.getResolver());</TD></TR><TR CLASS="z"><TD CLASS="l">767</TD><TD>                newModel.setModelManager(oldModel.getModelManager());</TD></TR><TR><TD CLASS="l">768</TD><TD>                // duplicateFactoryRegistry(newModel, oldModel);</TD></TR><TR CLASS="z"><TD CLASS="l">769</TD><TD>                newModel.setId(newId);</TD></TR><TR><TD CLASS="l">770</TD><TD>                // set text of new one after all initialization is done</TD></TR><TR CLASS="z"><TD CLASS="l">771</TD><TD>                String contents = oldModel.getStructuredDocument().getText();</TD></TR><TR CLASS="z"><TD CLASS="l">772</TD><TD>                newModel.getStructuredDocument().setText(this, contents);</TD></TR><TR CLASS="z"><TD CLASS="l">773</TD><TD>                return newModel;</TD></TR><TR><TD CLASS="l">774</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="d">775</A></TD><TD> </TD></TR><TR><TD CLASS="l">776</TD><TD>        /**</TD></TR><TR><TD CLASS="l">777</TD><TD>         */</TD></TR><TR><TD CLASS="l">778</TD><TD>        public IStructuredModel copyModelForEdit(String oldId, String newId) throws ResourceInUse {</TD></TR><TR CLASS="z"><TD CLASS="l">779</TD><TD>                IStructuredModel newModel = null;</TD></TR><TR><TD CLASS="l">780</TD><TD>                // get the existing model associated with this id</TD></TR><TR CLASS="z"><TD CLASS="l">781</TD><TD>                IStructuredModel model = getExistingModel(oldId);</TD></TR><TR><TD CLASS="l">782</TD><TD>                // if it doesn't exist, ignore request (though this would normally</TD></TR><TR><TD CLASS="l">783</TD><TD>                // be a programming error.</TD></TR><TR CLASS="z"><TD CLASS="l">784</TD><TD>                if (model == null)</TD></TR><TR CLASS="z"><TD CLASS="l">785</TD><TD>                        return null;</TD></TR><TR CLASS="z"><TD CLASS="l">786</TD><TD>                SharedObject sharedObject = null;</TD></TR><TR><TD CLASS="l">787</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">788</TD><TD>                        SYNC.acquire();</TD></TR><TR><TD CLASS="l">789</TD><TD>                        // now be sure newModel does not exist</TD></TR><TR CLASS="z"><TD CLASS="l">790</TD><TD>                        sharedObject = (SharedObject) fManagedObjects.get(newId);</TD></TR><TR CLASS="z"><TD CLASS="l">791</TD><TD>                        if (sharedObject != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">792</TD><TD>                                throw new ResourceInUse();</TD></TR><TR><TD CLASS="l">793</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">794</TD><TD>                        sharedObject = new SharedObject(null);</TD></TR><TR CLASS="z"><TD CLASS="l">795</TD><TD>                        fManagedObjects.put(newId,sharedObject);</TD></TR><TR CLASS="z"><TD CLASS="l">796</TD><TD>                } finally {</TD></TR><TR CLASS="z"><TD CLASS="l">797</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">798</TD><TD>                }</TD></TR><TR><TD CLASS="l">799</TD><TD>                // get loader based on existing type (note the type assumption)</TD></TR><TR><TD CLASS="l">800</TD><TD>                // Object type = ((IStructuredModel) model).getType();</TD></TR><TR><TD CLASS="l">801</TD><TD>                // IModelHandler type = model.getModelHandler();</TD></TR><TR><TD CLASS="l">802</TD><TD>                // IModelLoader loader = (IModelLoader) getModelLoaders().get(type);</TD></TR><TR><TD CLASS="l">803</TD><TD>                // IModelLoader loader = (IModelLoader) getModelLoaders().get(type);</TD></TR><TR><TD CLASS="l">804</TD><TD>                // ask the loader to copy</TD></TR><TR CLASS="z"><TD CLASS="l">805</TD><TD>                synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">806</TD><TD>                        sharedObject.doWait = false;</TD></TR><TR CLASS="z"><TD CLASS="l">807</TD><TD>                        newModel = copy(model, newId);</TD></TR><TR CLASS="z"><TD CLASS="l">808</TD><TD>                        sharedObject.doWait = true;</TD></TR><TR><TD CLASS="l">809</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">810</TD><TD>                if (newModel != null) {</TD></TR><TR><TD CLASS="l">811</TD><TD>                        // add to our cache</TD></TR><TR CLASS="z"><TD CLASS="l">812</TD><TD>                        synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">813</TD><TD>                                sharedObject.theSharedModel=newModel;</TD></TR><TR CLASS="z"><TD CLASS="l">814</TD><TD>                                sharedObject.referenceCountForEdit = 1;</TD></TR><TR CLASS="z"><TD CLASS="l">815</TD><TD>                                trace(&#34;copied model&#34;, newId, sharedObject.referenceCountForEdit); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">816</TD><TD>                        }</TD></TR><TR><TD CLASS="l">817</TD><TD>                } else {</TD></TR><TR CLASS="z"><TD CLASS="l">818</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">819</TD><TD>                        fManagedObjects.remove(newId);</TD></TR><TR CLASS="z"><TD CLASS="l">820</TD><TD>                        SYNC.release();</TD></TR><TR><TD CLASS="l">821</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">822</TD><TD>                sharedObject.setLoaded();</TD></TR><TR CLASS="z"><TD CLASS="l">823</TD><TD>                return newModel;</TD></TR><TR><TD CLASS="l">824</TD><TD>        }</TD></TR><TR><TD CLASS="l">825</TD><TD> </TD></TR><TR><TD CLASS="l">826</TD><TD>        /**</TD></TR><TR><TD CLASS="l">827</TD><TD>         * Similar to clone, except the new instance has no content. Note: this</TD></TR><TR><TD CLASS="l"><A NAME="e">828</A></TD><TD>         * produces an unmanaged model, for temporary use. If a true shared model</TD></TR><TR><TD CLASS="l">829</TD><TD>         * is desired, use &#34;copy&#34;.</TD></TR><TR><TD CLASS="l">830</TD><TD>         */</TD></TR><TR><TD CLASS="l">831</TD><TD>        public IStructuredModel createNewInstance(IStructuredModel oldModel) throws IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">832</TD><TD>                IModelHandler handler = oldModel.getModelHandler();</TD></TR><TR CLASS="z"><TD CLASS="l">833</TD><TD>                IModelLoader loader = handler.getModelLoader();</TD></TR><TR CLASS="z"><TD CLASS="l">834</TD><TD>                IStructuredModel newModel = loader.createModel(oldModel);</TD></TR><TR CLASS="z"><TD CLASS="l">835</TD><TD>                newModel.setModelHandler(handler);</TD></TR><TR CLASS="z"><TD CLASS="l">836</TD><TD>                if (newModel instanceof AbstractStructuredModel) {</TD></TR><TR CLASS="z"><TD CLASS="l">837</TD><TD>                        ((AbstractStructuredModel) newModel).setContentTypeIdentifier(oldModel.getContentTypeIdentifier());</TD></TR><TR><TD CLASS="l">838</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">839</TD><TD>                URIResolver oldResolver = oldModel.getResolver();</TD></TR><TR CLASS="z"><TD CLASS="l">840</TD><TD>                newModel.setResolver(oldResolver);</TD></TR><TR><TD CLASS="l">841</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">842</TD><TD>                        newModel.setId(DUPLICATED_MODEL);</TD></TR><TR><TD CLASS="l">843</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">844</TD><TD>                catch (ResourceInUse e) {</TD></TR><TR><TD CLASS="l">845</TD><TD>                        // impossible, since this is an unmanaged model</TD></TR><TR><TD CLASS="l">846</TD><TD>                }</TD></TR><TR><TD CLASS="l">847</TD><TD>                // base location should be null, but we'll set to</TD></TR><TR><TD CLASS="l">848</TD><TD>                // null to be sure.</TD></TR><TR CLASS="z"><TD CLASS="l">849</TD><TD>                newModel.setBaseLocation(null);</TD></TR><TR CLASS="z"><TD CLASS="l">850</TD><TD>                return newModel;</TD></TR><TR><TD CLASS="l">851</TD><TD>        }</TD></TR><TR><TD CLASS="l">852</TD><TD> </TD></TR><TR><TD CLASS="l">853</TD><TD>        /**</TD></TR><TR><TD CLASS="l">854</TD><TD>         * Factory method, since a proper IStructuredDocument must have a proper</TD></TR><TR><TD CLASS="l">855</TD><TD>         * parser assigned. Note: its assume that IFile does not actually exist as</TD></TR><TR><TD CLASS="l">856</TD><TD>         * a resource yet. If it does, ResourceAlreadyExists exception is thrown.</TD></TR><TR><TD CLASS="l">857</TD><TD>         * If the resource does already exist, then createStructuredDocumentFor is</TD></TR><TR><TD CLASS="l">858</TD><TD>         * the right API to use.</TD></TR><TR><TD CLASS="l">859</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="f">860</A></TD><TD>         * @throws ResourceInUse</TD></TR><TR><TD CLASS="l">861</TD><TD>         * </TD></TR><TR><TD CLASS="l">862</TD><TD>         */</TD></TR><TR><TD CLASS="l">863</TD><TD>        public  IStructuredDocument createNewStructuredDocumentFor(IFile iFile) throws ResourceAlreadyExists, IOException, CoreException {</TD></TR><TR CLASS="z"><TD CLASS="l">864</TD><TD>                if (iFile.exists()) {</TD></TR><TR CLASS="z"><TD CLASS="l">865</TD><TD>                        throw new ResourceAlreadyExists(iFile.getFullPath().toOSString());</TD></TR><TR><TD CLASS="l">866</TD><TD>                }</TD></TR><TR><TD CLASS="l">867</TD><TD>                // Will reconsider in future version</TD></TR><TR><TD CLASS="l">868</TD><TD>                // String id = calculateId(iFile);</TD></TR><TR><TD CLASS="l">869</TD><TD>                // if (isResourceInUse(id)) {</TD></TR><TR><TD CLASS="l">870</TD><TD>                // throw new ResourceInUse(iFile.getFullPath().toOSString());</TD></TR><TR><TD CLASS="l">871</TD><TD>                // }</TD></TR><TR CLASS="z"><TD CLASS="l">872</TD><TD>                IDocumentLoader loader = null;</TD></TR><TR CLASS="z"><TD CLASS="l">873</TD><TD>                IModelHandler handler = calculateType(iFile);</TD></TR><TR CLASS="z"><TD CLASS="l">874</TD><TD>                loader = handler.getDocumentLoader();</TD></TR><TR><TD CLASS="l">875</TD><TD>                // for this API, &#34;createNew&#34; we assume the IFile does not exist yet</TD></TR><TR><TD CLASS="l">876</TD><TD>                // as checked above, so just create empty document.</TD></TR><TR CLASS="z"><TD CLASS="l">877</TD><TD>                IStructuredDocument result = (IStructuredDocument) loader.createNewStructuredDocument();</TD></TR><TR CLASS="z"><TD CLASS="l">878</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">879</TD><TD>        }</TD></TR><TR><TD CLASS="l">880</TD><TD> </TD></TR><TR><TD CLASS="l">881</TD><TD>        /**</TD></TR><TR><TD CLASS="l">882</TD><TD>         * Factory method, since a proper IStructuredDocument must have a proper</TD></TR><TR><TD CLASS="l">883</TD><TD>         * parser assigned. Note: clients should verify IFile exists before using</TD></TR><TR><TD CLASS="l">884</TD><TD>         * this method. If this IFile does not exist, then</TD></TR><TR><TD CLASS="l">885</TD><TD>         * createNewStructuredDocument is the correct API to use.</TD></TR><TR><TD CLASS="l"><A NAME="10">886</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">887</TD><TD>         * @throws ResourceInUse</TD></TR><TR><TD CLASS="l">888</TD><TD>         */</TD></TR><TR><TD CLASS="l">889</TD><TD>        public  IStructuredDocument createStructuredDocumentFor(IFile iFile) throws IOException, CoreException {</TD></TR><TR CLASS="z"><TD CLASS="l">890</TD><TD>                if (!iFile.exists()) {</TD></TR><TR CLASS="z"><TD CLASS="l">891</TD><TD>                        throw new FileNotFoundException(iFile.getFullPath().toOSString());</TD></TR><TR><TD CLASS="l">892</TD><TD>                }</TD></TR><TR><TD CLASS="l">893</TD><TD>                // Will reconsider in future version</TD></TR><TR><TD CLASS="l">894</TD><TD>                // String id = calculateId(iFile);</TD></TR><TR><TD CLASS="l">895</TD><TD>                // if (isResourceInUse(id)) {</TD></TR><TR><TD CLASS="l">896</TD><TD>                // throw new ResourceInUse(iFile.getFullPath().toOSString());</TD></TR><TR><TD CLASS="l">897</TD><TD>                // }</TD></TR><TR CLASS="z"><TD CLASS="l">898</TD><TD>                IDocumentLoader loader = null;</TD></TR><TR CLASS="z"><TD CLASS="l">899</TD><TD>                IModelHandler handler = calculateType(iFile);</TD></TR><TR CLASS="z"><TD CLASS="l">900</TD><TD>                loader = handler.getDocumentLoader();</TD></TR><TR CLASS="z"><TD CLASS="l">901</TD><TD>                IStructuredDocument result = (IStructuredDocument) loader.createNewStructuredDocument(iFile);</TD></TR><TR CLASS="z"><TD CLASS="l">902</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">903</TD><TD>        }</TD></TR><TR><TD CLASS="l">904</TD><TD> </TD></TR><TR><TD CLASS="l">905</TD><TD>        /**</TD></TR><TR><TD CLASS="l">906</TD><TD>         * Conveience method, since a proper IStructuredDocument must have a</TD></TR><TR><TD CLASS="l">907</TD><TD>         * proper parser assigned. It should only be used when an empty</TD></TR><TR><TD CLASS="l">908</TD><TD>         * structuredDocument is needed. Otherwise, use IFile form.</TD></TR><TR><TD CLASS="l">909</TD><TD>         * </TD></TR><TR><TD CLASS="l">910</TD><TD>         * @deprecated - TODO: to be removed by C4 do we really need this? I</TD></TR><TR><TD CLASS="l">911</TD><TD>         *             recommend to - use createStructuredDocumentFor(filename,</TD></TR><TR><TD CLASS="l">912</TD><TD>         *             null, null) - the filename does not need to represent a</TD></TR><TR><TD CLASS="l">913</TD><TD>         *             real - file, but can take for form of dummy.jsp, test.xml,</TD></TR><TR><TD CLASS="l">914</TD><TD>         *             etc. - That way we don't hard code the handler, but specify</TD></TR><TR><TD CLASS="l"><A NAME="11">915</A></TD><TD>         *             we - want the handler that &#34;goes with&#34; a certain type of -</TD></TR><TR><TD CLASS="l">916</TD><TD>         *             file.</TD></TR><TR><TD CLASS="l">917</TD><TD>         */</TD></TR><TR><TD CLASS="l">918</TD><TD>        public  IStructuredDocument createStructuredDocumentFor(String contentTypeId) {</TD></TR><TR CLASS="z"><TD CLASS="l">919</TD><TD>                IDocumentLoader loader = null;</TD></TR><TR CLASS="z"><TD CLASS="l">920</TD><TD>                ModelHandlerRegistry cr = getModelHandlerRegistry();</TD></TR><TR CLASS="z"><TD CLASS="l">921</TD><TD>                IModelHandler handler = cr.getHandlerForContentTypeId(contentTypeId);</TD></TR><TR CLASS="z"><TD CLASS="l">922</TD><TD>                if (handler == null)</TD></TR><TR CLASS="z"><TD CLASS="l">923</TD><TD>                        Logger.log(Logger.ERROR, &#34;Program error: no model handler found for &#34; + contentTypeId); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">924</TD><TD>                loader = handler.getDocumentLoader();</TD></TR><TR CLASS="z"><TD CLASS="l">925</TD><TD>                IStructuredDocument result = (IStructuredDocument) loader.createNewStructuredDocument();</TD></TR><TR CLASS="z"><TD CLASS="l">926</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">927</TD><TD>        }</TD></TR><TR><TD CLASS="l">928</TD><TD> </TD></TR><TR><TD CLASS="l">929</TD><TD>        /**</TD></TR><TR><TD CLASS="l">930</TD><TD>         * Conveience method, since a proper IStructuredDocument must have a</TD></TR><TR><TD CLASS="l">931</TD><TD>         * proper parser assigned.</TD></TR><TR><TD CLASS="l">932</TD><TD>         * </TD></TR><TR><TD CLASS="l">933</TD><TD>         * @deprecated -- - TODO: to be removed by C4 I marked as deprecated to</TD></TR><TR><TD CLASS="l">934</TD><TD>         *             discouage use of this method. It does not really work for</TD></TR><TR><TD CLASS="l">935</TD><TD>         *             JSP fragments, since JSP Fragments need an IFile to</TD></TR><TR><TD CLASS="l"><A NAME="12">936</A></TD><TD>         *             correctly look up the content settings. Use IFile form</TD></TR><TR><TD CLASS="l">937</TD><TD>         *             instead.</TD></TR><TR><TD CLASS="l">938</TD><TD>         */</TD></TR><TR><TD CLASS="l">939</TD><TD>        public IStructuredDocument createStructuredDocumentFor(String filename, InputStream inputStream, URIResolver resolver) throws IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">940</TD><TD>                IDocumentLoader loader = null;</TD></TR><TR CLASS="z"><TD CLASS="l">941</TD><TD>                InputStream istream = Utilities.getMarkSupportedStream(inputStream);</TD></TR><TR CLASS="z"><TD CLASS="l">942</TD><TD>                if (istream != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">943</TD><TD>                        istream.reset();</TD></TR><TR><TD CLASS="l">944</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">945</TD><TD>                IModelHandler handler = calculateType(filename, istream);</TD></TR><TR CLASS="z"><TD CLASS="l">946</TD><TD>                loader = handler.getDocumentLoader();</TD></TR><TR CLASS="z"><TD CLASS="l">947</TD><TD>                IStructuredDocument result = null;</TD></TR><TR CLASS="z"><TD CLASS="l">948</TD><TD>                if (inputStream == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">949</TD><TD>                        result = (IStructuredDocument) loader.createNewStructuredDocument();</TD></TR><TR><TD CLASS="l">950</TD><TD>                }</TD></TR><TR><TD CLASS="l">951</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">952</TD><TD>                        result = (IStructuredDocument) loader.createNewStructuredDocument(filename, istream);</TD></TR><TR><TD CLASS="l">953</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">954</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">955</TD><TD>        }</TD></TR><TR><TD CLASS="l">956</TD><TD> </TD></TR><TR><TD CLASS="l">957</TD><TD>        /**</TD></TR><TR><TD CLASS="l">958</TD><TD>         * Special case method. This method was created for the special case where</TD></TR><TR><TD CLASS="l">959</TD><TD>         * there is an encoding for input stream that should override all the</TD></TR><TR><TD CLASS="l">960</TD><TD>         * normal rules for encoding. For example, if there is an encoding</TD></TR><TR><TD CLASS="l">961</TD><TD>         * (charset) specified in HTTP response header, then that encoding is used</TD></TR><TR><TD CLASS="l">962</TD><TD>         * to translate the input stream to a string, but then the normal encoding</TD></TR><TR><TD CLASS="l">963</TD><TD>         * rules are ignored, so that the string is not translated twice (for</TD></TR><TR><TD CLASS="l">964</TD><TD>         * example, if its an HTML &#34;file&#34;, then even if it contains a charset in</TD></TR><TR><TD CLASS="l"><A NAME="13">965</A></TD><TD>         * meta tag, its ignored since its assumed its all correctly decoded by</TD></TR><TR><TD CLASS="l">966</TD><TD>         * the HTTP charset.</TD></TR><TR><TD CLASS="l">967</TD><TD>         */</TD></TR><TR><TD CLASS="l">968</TD><TD>        public  IStructuredDocument createStructuredDocumentFor(String filename, InputStream inputStream, URIResolver resolver, String encoding) throws IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">969</TD><TD>                String content = readInputStream(inputStream, encoding);</TD></TR><TR CLASS="z"><TD CLASS="l">970</TD><TD>                IStructuredDocument result = createStructuredDocumentFor(filename, content, resolver);</TD></TR><TR CLASS="z"><TD CLASS="l">971</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">972</TD><TD>        }</TD></TR><TR><TD CLASS="l">973</TD><TD> </TD></TR><TR><TD CLASS="l">974</TD><TD>        /**</TD></TR><TR><TD CLASS="l">975</TD><TD>         * Convenience method. This method can be used when the resource does not</TD></TR><TR><TD CLASS="l">976</TD><TD>         * really exist (e.g. when content is being created, but hasn't been</TD></TR><TR><TD CLASS="l">977</TD><TD>         * written to disk yet). Note that since the content is being provided as</TD></TR><TR><TD CLASS="l">978</TD><TD>         * a String, it is assumed to already be decoded correctly so no</TD></TR><TR><TD CLASS="l"><A NAME="14">979</A></TD><TD>         * transformation is done.</TD></TR><TR><TD CLASS="l">980</TD><TD>         */</TD></TR><TR><TD CLASS="l">981</TD><TD>        public  IStructuredDocument createStructuredDocumentFor(String filename, String content, URIResolver resolver) throws IOException {</TD></TR><TR><TD CLASS="l">982</TD><TD>                // TODO: avoid all these String instances</TD></TR><TR CLASS="z"><TD CLASS="l">983</TD><TD>                StringBuffer contentBuffer = new StringBuffer(content);</TD></TR><TR CLASS="z"><TD CLASS="l">984</TD><TD>                IDocumentLoader loader = null;</TD></TR><TR CLASS="z"><TD CLASS="l">985</TD><TD>                IModelHandler handler = calculateType(filename, null);</TD></TR><TR CLASS="z"><TD CLASS="l">986</TD><TD>                loader = handler.getDocumentLoader();</TD></TR><TR CLASS="z"><TD CLASS="l">987</TD><TD>                IStructuredDocument result = (IStructuredDocument) loader.createNewStructuredDocument();</TD></TR><TR CLASS="z"><TD CLASS="l">988</TD><TD>                StringBuffer convertedContent = loader.handleLineDelimiter(contentBuffer, result);</TD></TR><TR CLASS="z"><TD CLASS="l">989</TD><TD>                result.setEncodingMemento(new NullMemento());</TD></TR><TR CLASS="z"><TD CLASS="l">990</TD><TD>                result.setText(this, convertedContent.toString());</TD></TR><TR CLASS="z"><TD CLASS="l">991</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">992</TD><TD>        }</TD></TR><TR><TD CLASS="l">993</TD><TD> </TD></TR><TR><TD CLASS="l">994</TD><TD>        /**</TD></TR><TR><TD CLASS="l">995</TD><TD>         * @param iFile</TD></TR><TR><TD CLASS="l">996</TD><TD>         * @param result</TD></TR><TR><TD CLASS="l"><A NAME="15">997</A></TD><TD>         * @return</TD></TR><TR><TD CLASS="l">998</TD><TD>         * @throws CoreException</TD></TR><TR><TD CLASS="l">999</TD><TD>         */</TD></TR><TR><TD CLASS="l">1000</TD><TD>        private IStructuredModel createUnManagedEmptyModelFor(IFile iFile) throws CoreException {</TD></TR><TR CLASS="z"><TD CLASS="l">1001</TD><TD>                IStructuredModel result = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1002</TD><TD>                IModelHandler handler = calculateType(iFile);</TD></TR><TR CLASS="z"><TD CLASS="l">1003</TD><TD>                String id = calculateId(iFile);</TD></TR><TR CLASS="z"><TD CLASS="l">1004</TD><TD>                URIResolver resolver = calculateURIResolver(iFile);</TD></TR><TR><TD CLASS="l">1005</TD><TD> </TD></TR><TR><TD CLASS="l">1006</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1007</TD><TD>                        result = _commonCreateModel(id, handler, resolver);</TD></TR><TR><TD CLASS="l">1008</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1009</TD><TD>                catch (ResourceInUse e) {</TD></TR><TR><TD CLASS="l">1010</TD><TD>                        // impossible, since we're not sharing</TD></TR><TR><TD CLASS="l">1011</TD><TD>                        // (even if it really is in use ... we don't care)</TD></TR><TR><TD CLASS="l">1012</TD><TD>                        // this may need to be re-examined.</TD></TR><TR CLASS="z"><TD CLASS="l">1013</TD><TD>                        if (Logger.DEBUG_MODELMANAGER)</TD></TR><TR CLASS="z"><TD CLASS="l">1014</TD><TD>                                Logger.log(Logger.INFO, &#34;ModelMangerImpl::createUnManagedStructuredModelFor. Model unexpectedly in use.&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">1015</TD><TD>                }</TD></TR><TR><TD CLASS="l">1016</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1017</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1018</TD><TD>        }</TD></TR><TR><TD CLASS="l">1019</TD><TD> </TD></TR><TR><TD CLASS="l">1020</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="16">1021</A></TD><TD>         * Conveience method. It depends on the loaders newModel method to return</TD></TR><TR><TD CLASS="l">1022</TD><TD>         * an appropriate StrucuturedModel appropriately initialized.</TD></TR><TR><TD CLASS="l">1023</TD><TD>         */</TD></TR><TR><TD CLASS="l">1024</TD><TD>        public IStructuredModel createUnManagedStructuredModelFor(IFile iFile) throws IOException, CoreException {</TD></TR><TR CLASS="z"><TD CLASS="l">1025</TD><TD>                IStructuredModel result = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1026</TD><TD>                result = createUnManagedEmptyModelFor(iFile);</TD></TR><TR><TD CLASS="l">1027</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1028</TD><TD>                IDocumentLoader loader = result.getModelHandler().getDocumentLoader();</TD></TR><TR CLASS="z"><TD CLASS="l">1029</TD><TD>                IEncodedDocument document = loader.createNewStructuredDocument(iFile);</TD></TR><TR><TD CLASS="l">1030</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1031</TD><TD>                result.getStructuredDocument().setText(this, document.get());</TD></TR><TR><TD CLASS="l">1032</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1033</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1034</TD><TD>        }</TD></TR><TR><TD CLASS="l">1035</TD><TD> </TD></TR><TR><TD CLASS="l">1036</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="17">1037</A></TD><TD>         * Conveience method. It depends on the loaders newModel method to return</TD></TR><TR><TD CLASS="l">1038</TD><TD>         * an appropriate StrucuturedModel appropriately initialized.</TD></TR><TR><TD CLASS="l">1039</TD><TD>         */</TD></TR><TR><TD CLASS="l">1040</TD><TD>        public  IStructuredModel createUnManagedStructuredModelFor(String contentTypeId) {</TD></TR><TR CLASS="z"><TD CLASS="l">1041</TD><TD>                return createUnManagedStructuredModelFor(contentTypeId, null);</TD></TR><TR><TD CLASS="l">1042</TD><TD>        }</TD></TR><TR><TD CLASS="l">1043</TD><TD> </TD></TR><TR><TD CLASS="l">1044</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="18">1045</A></TD><TD>         * Conveience method. It depends on the loaders newModel method to return</TD></TR><TR><TD CLASS="l">1046</TD><TD>         * an appropriate StrucuturedModel appropriately initialized.</TD></TR><TR><TD CLASS="l">1047</TD><TD>         */</TD></TR><TR><TD CLASS="l">1048</TD><TD>        public  IStructuredModel createUnManagedStructuredModelFor(String contentTypeId, URIResolver resolver) {</TD></TR><TR CLASS="z"><TD CLASS="l">1049</TD><TD>                IStructuredModel result = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1050</TD><TD>                ModelHandlerRegistry cr = getModelHandlerRegistry();</TD></TR><TR CLASS="z"><TD CLASS="l">1051</TD><TD>                IModelHandler handler = cr.getHandlerForContentTypeId(contentTypeId);</TD></TR><TR><TD CLASS="l">1052</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1053</TD><TD>                        result = _commonCreateModel(UNMANAGED_MODEL, handler, resolver); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1054</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1055</TD><TD>                catch (ResourceInUse e) {</TD></TR><TR><TD CLASS="l">1056</TD><TD>                        // impossible, since we're not sharing</TD></TR><TR><TD CLASS="l">1057</TD><TD>                        // (even if it really is in use ... we don't care)</TD></TR><TR><TD CLASS="l">1058</TD><TD>                        // this may need to be re-examined.</TD></TR><TR CLASS="z"><TD CLASS="l">1059</TD><TD>                        if (Logger.DEBUG_MODELMANAGER)</TD></TR><TR CLASS="z"><TD CLASS="l">1060</TD><TD>                                Logger.log(Logger.INFO, &#34;ModelMangerImpl::createUnManagedStructuredModelFor. Model unexpectedly in use.&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">1061</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="4e">1062</A></TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1063</TD><TD>        }</TD></TR><TR><TD CLASS="l">1064</TD><TD> </TD></TR><TR><TD CLASS="l">1065</TD><TD>        private IStructuredModel getExistingModel(Object id) {</TD></TR><TR CLASS="c"><TD CLASS="l">1066</TD><TD>                IStructuredModel result = null;</TD></TR><TR><TD CLASS="l">1067</TD><TD>                </TD></TR><TR CLASS="c"><TD CLASS="l">1068</TD><TD>                SYNC.acquire();</TD></TR><TR><TD CLASS="l">1069</TD><TD>                /**</TD></TR><TR><TD CLASS="l">1070</TD><TD>                 * While a good check in theory, it's possible for an event fired to</TD></TR><TR><TD CLASS="l">1071</TD><TD>                 * cause a listener to access a method that calls this one.</TD></TR><TR><TD CLASS="l">1072</TD><TD>                 */</TD></TR><TR><TD CLASS="l">1073</TD><TD>                //Assert.isTrue(SYNC.getDepth()==1, &#34;depth not equal to 1&#34;);</TD></TR><TR><TD CLASS="l">1074</TD><TD>                // let's see if we already have it in our cache</TD></TR><TR CLASS="c"><TD CLASS="l">1075</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR><TD CLASS="l">1076</TD><TD>                // if not, then we'll simply return null</TD></TR><TR CLASS="c"><TD CLASS="l">1077</TD><TD>                if (sharedObject != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1078</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">1079</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR CLASS="c"><TD CLASS="l">1080</TD><TD>                        result = sharedObject.theSharedModel;</TD></TR><TR><TD CLASS="l">1081</TD><TD>                } else {</TD></TR><TR CLASS="z"><TD CLASS="l">1082</TD><TD>                        SYNC.release();</TD></TR><TR><TD CLASS="l">1083</TD><TD>                }</TD></TR><TR><TD CLASS="l">1084</TD><TD>                </TD></TR><TR CLASS="c"><TD CLASS="l">1085</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1086</TD><TD>        }</TD></TR><TR><TD CLASS="l">1087</TD><TD> </TD></TR><TR><TD CLASS="l">1088</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="19">1089</A></TD><TD>         * Note: users of this 'model' must still release it when finished.</TD></TR><TR><TD CLASS="l">1090</TD><TD>         * Returns null if there's not a model corresponding to document.</TD></TR><TR><TD CLASS="l">1091</TD><TD>         */</TD></TR><TR><TD CLASS="l">1092</TD><TD>        public IStructuredModel getExistingModelForEdit(IDocument document) {</TD></TR><TR CLASS="z"><TD CLASS="l">1093</TD><TD>                IStructuredModel result = null;</TD></TR><TR><TD CLASS="l">1094</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">1095</TD><TD>                SYNC.acquire();                </TD></TR><TR><TD CLASS="l">1096</TD><TD>                // create a snapshot</TD></TR><TR CLASS="z"><TD CLASS="l">1097</TD><TD>                Set ids = new HashSet(fManagedObjects.keySet());</TD></TR><TR CLASS="z"><TD CLASS="l">1098</TD><TD>                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1099</TD><TD>                for (Iterator iterator = ids.iterator(); iterator.hasNext();) {</TD></TR><TR CLASS="z"><TD CLASS="l">1100</TD><TD>                        Object potentialId = iterator.next();</TD></TR><TR CLASS="z"><TD CLASS="l">1101</TD><TD>                        SYNC.acquire();        </TD></TR><TR CLASS="z"><TD CLASS="l">1102</TD><TD>                        if (fManagedObjects.containsKey(potentialId)) {</TD></TR><TR><TD CLASS="l">1103</TD><TD>                                // check to see if still valid</TD></TR><TR CLASS="z"><TD CLASS="l">1104</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1105</TD><TD>                                IStructuredModel tempResult = getExistingModel(potentialId);</TD></TR><TR CLASS="z"><TD CLASS="l">1106</TD><TD>                                if (tempResult!=null &amp;&amp; document == tempResult.getStructuredDocument()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1107</TD><TD>                                        result = getExistingModelForEdit(potentialId);</TD></TR><TR CLASS="z"><TD CLASS="l">1108</TD><TD>                                        break;</TD></TR><TR><TD CLASS="l">1109</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1110</TD><TD>                        } else {</TD></TR><TR CLASS="z"><TD CLASS="l">1111</TD><TD>                                SYNC.release();</TD></TR><TR><TD CLASS="l">1112</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1113</TD><TD>                }</TD></TR><TR><TD CLASS="l">1114</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">1115</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1116</TD><TD>        }</TD></TR><TR><TD CLASS="l">1117</TD><TD> </TD></TR><TR><TD CLASS="l">1118</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1119</TD><TD>         * This is similar to the getModel method, except this method does not</TD></TR><TR><TD CLASS="l">1120</TD><TD>         * create a model. This method does increment the reference count (if it</TD></TR><TR><TD CLASS="l">1121</TD><TD>         * exists). If the model does not already exist in the cache of models,</TD></TR><TR><TD CLASS="l"><A NAME="1a">1122</A></TD><TD>         * null is returned.</TD></TR><TR><TD CLASS="l">1123</TD><TD>         */</TD></TR><TR><TD CLASS="l">1124</TD><TD>        public  IStructuredModel getExistingModelForEdit(IFile iFile) {</TD></TR><TR><TD CLASS="l">1125</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1126</TD><TD>                Assert.isNotNull(iFile, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1127</TD><TD>                Object id = calculateId(iFile);</TD></TR><TR CLASS="z"><TD CLASS="l">1128</TD><TD>                IStructuredModel result = getExistingModelForEdit(id);</TD></TR><TR CLASS="z"><TD CLASS="l">1129</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1130</TD><TD>        }</TD></TR><TR><TD CLASS="l">1131</TD><TD> </TD></TR><TR><TD CLASS="l">1132</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1133</TD><TD>         * This is similar to the getModel method, except this method does not</TD></TR><TR><TD CLASS="l">1134</TD><TD>         * create a model. This method does increment the reference count (if it</TD></TR><TR><TD CLASS="l">1135</TD><TD>         * exists). If the model does not already exist in the cache of models,</TD></TR><TR><TD CLASS="l">1136</TD><TD>         * null is returned.</TD></TR><TR><TD CLASS="l">1137</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="1b">1138</A></TD><TD>         * @deprecated use IFile form - this one will become protected or private</TD></TR><TR><TD CLASS="l">1139</TD><TD>         */</TD></TR><TR><TD CLASS="l">1140</TD><TD>        public IStructuredModel getExistingModelForEdit(Object id) {</TD></TR><TR><TD CLASS="l">1141</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1142</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1143</TD><TD>                IStructuredModel result = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1144</TD><TD>                boolean doRelease = true;</TD></TR><TR><TD CLASS="l">1145</TD><TD>                // let's see if we already have it in our cache</TD></TR><TR><TD CLASS="l">1146</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1147</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1148</TD><TD>                        SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR><TD CLASS="l">1149</TD><TD>                        // if not, then we'll simply return null</TD></TR><TR CLASS="z"><TD CLASS="l">1150</TD><TD>                        if (sharedObject != null) {</TD></TR><TR><TD CLASS="l">1151</TD><TD>                                // if shared object is in our cache, then simply increment its ref</TD></TR><TR><TD CLASS="l">1152</TD><TD>                                // count,</TD></TR><TR><TD CLASS="l">1153</TD><TD>                                // and return the object.</TD></TR><TR CLASS="z"><TD CLASS="l">1154</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1155</TD><TD>                                doRelease=false;</TD></TR><TR CLASS="z"><TD CLASS="l">1156</TD><TD>                                synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">1157</TD><TD>                                        if (sharedObject.doWait) {</TD></TR><TR CLASS="z"><TD CLASS="l">1158</TD><TD>                                                sharedObject.waitForLoadAttempt();</TD></TR><TR><TD CLASS="l">1159</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1160</TD><TD>                                        if (sharedObject.theSharedModel!=null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1161</TD><TD>                                                _incrCount(sharedObject, EDIT);</TD></TR><TR><TD CLASS="l">1162</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1163</TD><TD>                                        result = sharedObject.theSharedModel;</TD></TR><TR><TD CLASS="l">1164</TD><TD>                                }</TD></TR><TR CLASS="z"><TD CLASS="l">1165</TD><TD>                                trace(&#34;got existing model for Edit: &#34;, id); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1166</TD><TD>                                trace(&#34;   incremented referenceCountForEdit &#34;, id, sharedObject.referenceCountForEdit); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1167</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1168</TD><TD>                } finally {</TD></TR><TR CLASS="z"><TD CLASS="l">1169</TD><TD>                        if (doRelease) {</TD></TR><TR CLASS="z"><TD CLASS="l">1170</TD><TD>                                SYNC.release();</TD></TR><TR><TD CLASS="l">1171</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1172</TD><TD>                }</TD></TR><TR><TD CLASS="l">1173</TD><TD>                </TD></TR><TR CLASS="z"><TD CLASS="l">1174</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1175</TD><TD>        }</TD></TR><TR><TD CLASS="l">1176</TD><TD> </TD></TR><TR><TD CLASS="l">1177</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="53">1178</A></TD><TD>         * Note: users of this 'model' must still release it when finished.</TD></TR><TR><TD CLASS="l">1179</TD><TD>         * Returns null if there's not a model corresponding to document.</TD></TR><TR><TD CLASS="l">1180</TD><TD>         */</TD></TR><TR><TD CLASS="l">1181</TD><TD>        public IStructuredModel getExistingModelForRead(IDocument document) {</TD></TR><TR CLASS="c"><TD CLASS="l">1182</TD><TD>                IStructuredModel result = null;</TD></TR><TR><TD CLASS="l">1183</TD><TD>                </TD></TR><TR CLASS="c"><TD CLASS="l">1184</TD><TD>                SYNC.acquire();                </TD></TR><TR><TD CLASS="l">1185</TD><TD>                // create a snapshot</TD></TR><TR CLASS="c"><TD CLASS="l">1186</TD><TD>                Set ids = new HashSet(fManagedObjects.keySet());</TD></TR><TR CLASS="c"><TD CLASS="l">1187</TD><TD>                SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">1188</TD><TD>                for (Iterator iterator = ids.iterator(); iterator.hasNext();) {</TD></TR><TR CLASS="c"><TD CLASS="l">1189</TD><TD>                        Object potentialId = iterator.next();</TD></TR><TR CLASS="c"><TD CLASS="l">1190</TD><TD>                        SYNC.acquire();        </TD></TR><TR CLASS="c"><TD CLASS="l">1191</TD><TD>                        if (fManagedObjects.containsKey(potentialId)) {</TD></TR><TR><TD CLASS="l">1192</TD><TD>                                // check to see if still valid</TD></TR><TR CLASS="c"><TD CLASS="l">1193</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">1194</TD><TD>                                IStructuredModel tempResult = getExistingModel(potentialId);</TD></TR><TR CLASS="c"><TD CLASS="l">1195</TD><TD>                                if (tempResult!=null &amp;&amp; document == tempResult.getStructuredDocument()) {</TD></TR><TR CLASS="c"><TD CLASS="l">1196</TD><TD>                                        result = getExistingModelForRead(potentialId);</TD></TR><TR CLASS="c"><TD CLASS="l">1197</TD><TD>                                        break;</TD></TR><TR><TD CLASS="l">1198</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1199</TD><TD>                        } else {</TD></TR><TR CLASS="z"><TD CLASS="l">1200</TD><TD>                                SYNC.release();</TD></TR><TR><TD CLASS="l">1201</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1202</TD><TD>                }</TD></TR><TR><TD CLASS="l">1203</TD><TD>                </TD></TR><TR CLASS="c"><TD CLASS="l">1204</TD><TD>                return result;</TD></TR><TR><TD CLASS="l"><A NAME="59">1205</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1206</TD><TD> </TD></TR><TR><TD CLASS="l">1207</TD><TD>        public IStructuredModel getExistingModelForRead(IFile iFile) {</TD></TR><TR><TD CLASS="l">1208</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1209</TD><TD>                Assert.isNotNull(iFile, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">1210</TD><TD>                Object id = calculateId(iFile);</TD></TR><TR CLASS="c"><TD CLASS="l">1211</TD><TD>                IStructuredModel result = getExistingModelForRead(id);</TD></TR><TR CLASS="c"><TD CLASS="l">1212</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1213</TD><TD>        }</TD></TR><TR><TD CLASS="l">1214</TD><TD> </TD></TR><TR><TD CLASS="l">1215</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1216</TD><TD>         * This is similar to the getModel method, except this method does not</TD></TR><TR><TD CLASS="l">1217</TD><TD>         * create a model. This method does increment the reference count (if it</TD></TR><TR><TD CLASS="l">1218</TD><TD>         * exists). If the model does not already exist in the cache of models,</TD></TR><TR><TD CLASS="l">1219</TD><TD>         * null is returned.</TD></TR><TR><TD CLASS="l"><A NAME="4f">1220</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">1221</TD><TD>         * @deprecated use IFile form - this one will become protected or private</TD></TR><TR><TD CLASS="l">1222</TD><TD>         */</TD></TR><TR><TD CLASS="l">1223</TD><TD>        public  IStructuredModel getExistingModelForRead(Object id) {</TD></TR><TR CLASS="c"><TD CLASS="l">1224</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">1225</TD><TD>                IStructuredModel result = null;</TD></TR><TR CLASS="c"><TD CLASS="l">1226</TD><TD>                boolean doRelease = true;</TD></TR><TR><TD CLASS="l">1227</TD><TD>                // let's see if we already have it in our cache</TD></TR><TR><TD CLASS="l">1228</TD><TD>                try {</TD></TR><TR CLASS="c"><TD CLASS="l">1229</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="c"><TD CLASS="l">1230</TD><TD>                        SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR><TD CLASS="l">1231</TD><TD>                        // if not, then we'll simply return null</TD></TR><TR CLASS="c"><TD CLASS="l">1232</TD><TD>                        if (sharedObject != null) {</TD></TR><TR><TD CLASS="l">1233</TD><TD>                                // if shared object is in our cache, then simply increment its ref</TD></TR><TR><TD CLASS="l">1234</TD><TD>                                // count,</TD></TR><TR><TD CLASS="l">1235</TD><TD>                                // and return the object.</TD></TR><TR CLASS="c"><TD CLASS="l">1236</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">1237</TD><TD>                                doRelease=false;</TD></TR><TR><TD CLASS="l">1238</TD><TD> </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="86% line coverage (18 out of 21 instructions)">1239</TD><TD TITLE="86% line coverage (18 out of 21 instructions)">                                synchronized(sharedObject) {</TD></TR><TR CLASS="c"><TD CLASS="l">1240</TD><TD>                                        if (sharedObject.doWait) {</TD></TR><TR CLASS="c"><TD CLASS="l">1241</TD><TD>                                                sharedObject.waitForLoadAttempt();</TD></TR><TR><TD CLASS="l">1242</TD><TD>                                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1243</TD><TD>                                        if (sharedObject.theSharedModel!=null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1244</TD><TD>                                                _incrCount(sharedObject, READ);</TD></TR><TR><TD CLASS="l">1245</TD><TD>                                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1246</TD><TD>                                        result = sharedObject.theSharedModel;</TD></TR><TR><TD CLASS="l">1247</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1248</TD><TD>                        }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="60% line coverage (3 out of 5 instructions)">1249</TD><TD TITLE="60% line coverage (3 out of 5 instructions)">                } finally {</TD></TR><TR CLASS="c"><TD CLASS="l">1250</TD><TD>                        if (doRelease)</TD></TR><TR CLASS="c"><TD CLASS="l">1251</TD><TD>                                SYNC.release();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="50% line coverage (2 out of 4 instructions)">1252</TD><TD TITLE="50% line coverage (2 out of 4 instructions)">                }</TD></TR><TR CLASS="c"><TD CLASS="l">1253</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1254</TD><TD>        }</TD></TR><TR><TD CLASS="l">1255</TD><TD> </TD></TR><TR><TD CLASS="l">1256</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1257</TD><TD>         * @deprecated DMW: Tom, this is &#34;special&#34; for links builder Assuming its</TD></TR><TR><TD CLASS="l">1258</TD><TD>         *             still needed, wouldn't it be better to change to</TD></TR><TR><TD CLASS="l">1259</TD><TD>         *             getExistingModels()? -- will be removed. Its not thread</TD></TR><TR><TD CLASS="l">1260</TD><TD>         *             safe for one thread to get the Enumeration, when underlying</TD></TR><TR><TD CLASS="l"><A NAME="1c">1261</A></TD><TD>         *             data could be changed in another thread.</TD></TR><TR><TD CLASS="l">1262</TD><TD>         */</TD></TR><TR><TD CLASS="l">1263</TD><TD>        public  Enumeration getExistingModelIds() {</TD></TR><TR><TD CLASS="l">1264</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1265</TD><TD>                        SYNC.acquire();</TD></TR><TR><TD CLASS="l">1266</TD><TD>                        // create a copy</TD></TR><TR CLASS="z"><TD CLASS="l">1267</TD><TD>                        Vector keys = new Vector( fManagedObjects.keySet() );</TD></TR><TR CLASS="z"><TD CLASS="l">1268</TD><TD>                        return keys.elements();</TD></TR><TR CLASS="z"><TD CLASS="l">1269</TD><TD>                } finally {</TD></TR><TR CLASS="z"><TD CLASS="l">1270</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1271</TD><TD>                }</TD></TR><TR><TD CLASS="l">1272</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="1d">1273</A></TD><TD> </TD></TR><TR><TD CLASS="l">1274</TD><TD>        // TODO: replace (or supplement) this is a &#34;model info&#34; association to the</TD></TR><TR><TD CLASS="l">1275</TD><TD>        // IFile that created the model</TD></TR><TR><TD CLASS="l">1276</TD><TD>        private IFile getFileFor(IStructuredModel model) {</TD></TR><TR CLASS="z"><TD CLASS="l">1277</TD><TD>                if (model == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1278</TD><TD>                        return null;</TD></TR><TR CLASS="z"><TD CLASS="l">1279</TD><TD>                String path = model.getBaseLocation();</TD></TR><TR CLASS="z"><TD CLASS="l">1280</TD><TD>                if (path == null || path.length() == 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">1281</TD><TD>                        Object id = model.getId();</TD></TR><TR CLASS="z"><TD CLASS="l">1282</TD><TD>                        if (id == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1283</TD><TD>                                return null;</TD></TR><TR CLASS="z"><TD CLASS="l">1284</TD><TD>                        path = id.toString();</TD></TR><TR><TD CLASS="l">1285</TD><TD>                }</TD></TR><TR><TD CLASS="l">1286</TD><TD>                // TOODO needs rework for linked resources</TD></TR><TR CLASS="z"><TD CLASS="l">1287</TD><TD>                IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();</TD></TR><TR CLASS="z"><TD CLASS="l">1288</TD><TD>                IFile file = root.getFileForLocation(new Path(path));</TD></TR><TR CLASS="z"><TD CLASS="l">1289</TD><TD>                return file;</TD></TR><TR><TD CLASS="l">1290</TD><TD>        }</TD></TR><TR><TD CLASS="l">1291</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="5b">1292</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1293</TD><TD>         * One of the primary forms to get a managed model</TD></TR><TR><TD CLASS="l">1294</TD><TD>         */</TD></TR><TR><TD CLASS="l">1295</TD><TD>        public  IStructuredModel getModelForEdit(IFile iFile) throws IOException, CoreException {</TD></TR><TR CLASS="c"><TD CLASS="l">1296</TD><TD>                Assert.isNotNull(iFile, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">1297</TD><TD>                return _commonGetModel(iFile, EDIT, null, null);</TD></TR><TR><TD CLASS="l"><A NAME="1e">1298</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1299</TD><TD> </TD></TR><TR><TD CLASS="l">1300</TD><TD>        public  IStructuredModel getModelForEdit(IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR><TD CLASS="l">1301</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1302</TD><TD>                Assert.isNotNull(iFile, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1303</TD><TD>                return _commonGetModel(iFile, EDIT, encodingRule);</TD></TR><TR><TD CLASS="l"><A NAME="1f">1304</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1305</TD><TD> </TD></TR><TR><TD CLASS="l">1306</TD><TD>        public  IStructuredModel getModelForEdit(IFile iFile, String encoding, String lineDelimiter) throws java.io.UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR><TD CLASS="l">1307</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1308</TD><TD>                Assert.isNotNull(iFile, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="20">1309</A></TD><TD>                return _commonGetModel(iFile, EDIT, encoding, lineDelimiter);</TD></TR><TR><TD CLASS="l">1310</TD><TD>        }</TD></TR><TR><TD CLASS="l">1311</TD><TD> </TD></TR><TR><TD CLASS="l">1312</TD><TD>        public  IStructuredModel getModelForEdit(IStructuredDocument document) {</TD></TR><TR CLASS="z"><TD CLASS="l">1313</TD><TD>                return _getModelFor(document, EDIT);</TD></TR><TR><TD CLASS="l">1314</TD><TD>        }</TD></TR><TR><TD CLASS="l">1315</TD><TD> </TD></TR><TR><TD CLASS="l">1316</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1317</TD><TD>         * @see IModelManager</TD></TR><TR><TD CLASS="l"><A NAME="21">1318</A></TD><TD>         * @deprecated use IFile or String form</TD></TR><TR><TD CLASS="l">1319</TD><TD>         */</TD></TR><TR><TD CLASS="l">1320</TD><TD>        public  IStructuredModel getModelForEdit(Object id, InputStream inputStream, URIResolver resolver) throws java.io.UnsupportedEncodingException, IOException {</TD></TR><TR><TD CLASS="l">1321</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1322</TD><TD>                Assert.isNotNull(id, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1323</TD><TD>                String stringId = id.toString();</TD></TR><TR CLASS="z"><TD CLASS="l">1324</TD><TD>                return getModelForEdit(stringId, Utilities.getMarkSupportedStream(inputStream), resolver);</TD></TR><TR><TD CLASS="l">1325</TD><TD>        }</TD></TR><TR><TD CLASS="l">1326</TD><TD> </TD></TR><TR><TD CLASS="l">1327</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1328</TD><TD>         * @see IModelManager</TD></TR><TR><TD CLASS="l"><A NAME="22">1329</A></TD><TD>         * @deprecated - use IFile or String form</TD></TR><TR><TD CLASS="l">1330</TD><TD>         */</TD></TR><TR><TD CLASS="l">1331</TD><TD>        public  IStructuredModel getModelForEdit(Object id, Object modelType, String encodingName, String lineDelimiter, InputStream inputStream, URIResolver resolver) throws java.io.UnsupportedEncodingException, IOException {</TD></TR><TR><TD CLASS="l">1332</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1333</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1334</TD><TD>                String stringId = id.toString();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="23">1335</A></TD><TD>                return getModelForEdit(stringId, Utilities.getMarkSupportedStream(inputStream), resolver);</TD></TR><TR><TD CLASS="l">1336</TD><TD>        }</TD></TR><TR><TD CLASS="l">1337</TD><TD> </TD></TR><TR><TD CLASS="l">1338</TD><TD>        public  IStructuredModel getModelForEdit(String id, InputStream inputStream, URIResolver resolver) throws IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">1339</TD><TD>                if (id == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1340</TD><TD>                        throw new IllegalArgumentException(&#34;Program Error: id may not be null&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1341</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1342</TD><TD>                IStructuredModel result = null;</TD></TR><TR><TD CLASS="l">1343</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1344</TD><TD>                InputStream istream = Utilities.getMarkSupportedStream(inputStream);</TD></TR><TR CLASS="z"><TD CLASS="l">1345</TD><TD>                IModelHandler handler = calculateType(id, istream);</TD></TR><TR CLASS="z"><TD CLASS="l">1346</TD><TD>                if (handler != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1347</TD><TD>                        result = _commonCreateModel(istream, id, handler, resolver, EDIT, null, null);</TD></TR><TR><TD CLASS="l">1348</TD><TD>                }</TD></TR><TR><TD CLASS="l">1349</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1350</TD><TD>                        Logger.log(Logger.INFO, &#34;no model handler found for id&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1351</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1352</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1353</TD><TD>        }</TD></TR><TR><TD CLASS="l">1354</TD><TD> </TD></TR><TR><TD CLASS="l">1355</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="5c">1356</A></TD><TD>         * One of the primary forms to get a managed model</TD></TR><TR><TD CLASS="l">1357</TD><TD>         */</TD></TR><TR><TD CLASS="l">1358</TD><TD>        public  IStructuredModel getModelForRead(IFile iFile) throws IOException, CoreException {</TD></TR><TR><TD CLASS="l">1359</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1360</TD><TD>                Assert.isNotNull(iFile, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="24">1361</A></TD><TD>                return _commonGetModel(iFile, READ, null, null);</TD></TR><TR><TD CLASS="l">1362</TD><TD>        }</TD></TR><TR><TD CLASS="l">1363</TD><TD> </TD></TR><TR><TD CLASS="l">1364</TD><TD>        public  IStructuredModel getModelForRead(IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR CLASS="z"><TD CLASS="l">1365</TD><TD>                Assert.isNotNull(iFile, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="25">1366</A></TD><TD>                return _commonGetModel(iFile, READ, encodingRule);</TD></TR><TR><TD CLASS="l">1367</TD><TD>        }</TD></TR><TR><TD CLASS="l">1368</TD><TD> </TD></TR><TR><TD CLASS="l">1369</TD><TD>        public  IStructuredModel getModelForRead(IFile iFile, String encodingName, String lineDelimiter) throws java.io.UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR CLASS="z"><TD CLASS="l">1370</TD><TD>                Assert.isNotNull(iFile, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="26">1371</A></TD><TD>                return _commonGetModel(iFile, READ, encodingName, lineDelimiter);</TD></TR><TR><TD CLASS="l">1372</TD><TD>        }</TD></TR><TR><TD CLASS="l">1373</TD><TD> </TD></TR><TR><TD CLASS="l">1374</TD><TD>        public  IStructuredModel getModelForRead(IStructuredDocument document) {</TD></TR><TR CLASS="z"><TD CLASS="l">1375</TD><TD>                return _getModelFor(document, READ);</TD></TR><TR><TD CLASS="l">1376</TD><TD>        }</TD></TR><TR><TD CLASS="l">1377</TD><TD> </TD></TR><TR><TD CLASS="l">1378</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="27">1379</A></TD><TD>         * @see IModelManager</TD></TR><TR><TD CLASS="l">1380</TD><TD>         * @deprecated use IFile or String form</TD></TR><TR><TD CLASS="l">1381</TD><TD>         */</TD></TR><TR><TD CLASS="l">1382</TD><TD>        public  IStructuredModel getModelForRead(Object id, InputStream inputStream, URIResolver resolver) throws java.io.UnsupportedEncodingException, IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">1383</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1384</TD><TD>                String stringId = id.toString();</TD></TR><TR CLASS="z"><TD CLASS="l">1385</TD><TD>                return getModelForRead(stringId, Utilities.getMarkSupportedStream(inputStream), resolver);</TD></TR><TR><TD CLASS="l">1386</TD><TD>        }</TD></TR><TR><TD CLASS="l">1387</TD><TD> </TD></TR><TR><TD CLASS="l">1388</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="28">1389</A></TD><TD>         * @see IModelManager</TD></TR><TR><TD CLASS="l">1390</TD><TD>         * @deprecated use IFile form</TD></TR><TR><TD CLASS="l">1391</TD><TD>         */</TD></TR><TR><TD CLASS="l">1392</TD><TD>        public  IStructuredModel getModelForRead(Object id, Object modelType, String encodingName, String lineDelimiter, InputStream inputStream, URIResolver resolver) throws java.io.UnsupportedEncodingException, IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">1393</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1394</TD><TD>                String stringId = id.toString();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="29">1395</A></TD><TD>                return getModelForRead(stringId, Utilities.getMarkSupportedStream(inputStream), resolver);</TD></TR><TR><TD CLASS="l">1396</TD><TD>        }</TD></TR><TR><TD CLASS="l">1397</TD><TD> </TD></TR><TR><TD CLASS="l">1398</TD><TD>        public  IStructuredModel getModelForRead(String id, InputStream inputStream, URIResolver resolver) throws IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">1399</TD><TD>                InputStream istream = Utilities.getMarkSupportedStream(inputStream);</TD></TR><TR CLASS="z"><TD CLASS="l">1400</TD><TD>                IModelHandler handler = calculateType(id, istream);</TD></TR><TR CLASS="z"><TD CLASS="l">1401</TD><TD>                IStructuredModel result = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1402</TD><TD>                result = _commonCreateModel(istream, id, handler, resolver, READ, null, null);</TD></TR><TR CLASS="z"><TD CLASS="l">1403</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1404</TD><TD>        }</TD></TR><TR><TD CLASS="l">1405</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="5d">1406</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1407</TD><TD>         * @deprecated - only temporarily visible</TD></TR><TR><TD CLASS="l">1408</TD><TD>         */</TD></TR><TR><TD CLASS="l">1409</TD><TD>        public ModelHandlerRegistry getModelHandlerRegistry() {</TD></TR><TR CLASS="c"><TD CLASS="l">1410</TD><TD>                if (fModelHandlerRegistry == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1411</TD><TD>                        fModelHandlerRegistry = ModelHandlerRegistry.getInstance();</TD></TR><TR><TD CLASS="l">1412</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1413</TD><TD>                return fModelHandlerRegistry;</TD></TR><TR><TD CLASS="l">1414</TD><TD>        }</TD></TR><TR><TD CLASS="l">1415</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="4d">1416</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">1417</TD><TD>         * @see IModelManager#getNewModelForEdit(IFile, boolean)</TD></TR><TR><TD CLASS="l">1418</TD><TD>         */</TD></TR><TR><TD CLASS="l">1419</TD><TD>        public  IStructuredModel getNewModelForEdit(IFile iFile, boolean force) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException {</TD></TR><TR CLASS="c"><TD CLASS="l">1420</TD><TD>                Assert.isNotNull(iFile, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">1421</TD><TD>                SharedObject sharedObject = _commonNewModel(iFile, force);</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="86% line coverage (18 out of 21 instructions)">1422</TD><TD TITLE="86% line coverage (18 out of 21 instructions)">                synchronized(sharedObject) {</TD></TR><TR CLASS="c"><TD CLASS="l">1423</TD><TD>                        sharedObject.referenceCountForEdit = 1;</TD></TR><TR><TD CLASS="l">1424</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1425</TD><TD>                sharedObject.setLoaded();</TD></TR><TR CLASS="c"><TD CLASS="l">1426</TD><TD>                return sharedObject.theSharedModel;</TD></TR><TR><TD CLASS="l">1427</TD><TD>        }</TD></TR><TR><TD CLASS="l">1428</TD><TD> </TD></TR><TR><TD CLASS="l">1429</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="2a">1430</A></TD><TD>         * @see IModelManager#getNewModelForRead(IFile, boolean)</TD></TR><TR><TD CLASS="l">1431</TD><TD>         */</TD></TR><TR><TD CLASS="l">1432</TD><TD>        public  IStructuredModel getNewModelForRead(IFile iFile, boolean force) throws ResourceAlreadyExists, ResourceInUse, IOException, CoreException {</TD></TR><TR><TD CLASS="l">1433</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1434</TD><TD>                Assert.isNotNull(iFile, &#34;IFile parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1435</TD><TD>                SharedObject sharedObject = _commonNewModel(iFile, force);</TD></TR><TR CLASS="z"><TD CLASS="l">1436</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1437</TD><TD>                synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">1438</TD><TD>                        if (sharedObject.theSharedModel!=null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1439</TD><TD>                                sharedObject.referenceCountForRead = 1;</TD></TR><TR><TD CLASS="l">1440</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1441</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1442</TD><TD>                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1443</TD><TD>                sharedObject.setLoaded();</TD></TR><TR CLASS="z"><TD CLASS="l">1444</TD><TD>                return sharedObject.theSharedModel;</TD></TR><TR><TD CLASS="l">1445</TD><TD>        }</TD></TR><TR><TD CLASS="l">1446</TD><TD> </TD></TR><TR><TD CLASS="l">1447</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1448</TD><TD>         * This function returns the reference count of underlying model.</TD></TR><TR><TD CLASS="l">1449</TD><TD>         * </TD></TR><TR><TD CLASS="l">1450</TD><TD>         * @param id</TD></TR><TR><TD CLASS="l"><A NAME="2b">1451</A></TD><TD>         *            Object The id of the model TODO: try to refine the design</TD></TR><TR><TD CLASS="l">1452</TD><TD>         *            not to use this function</TD></TR><TR><TD CLASS="l">1453</TD><TD>         */</TD></TR><TR><TD CLASS="l">1454</TD><TD>        public  int getReferenceCount(Object id) {</TD></TR><TR CLASS="z"><TD CLASS="l">1455</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1456</TD><TD>                int count = 0;</TD></TR><TR><TD CLASS="l">1457</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">1458</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1459</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">1460</TD><TD>                if (sharedObject != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1461</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1462</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR CLASS="z"><TD CLASS="l">1463</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1464</TD><TD>                        synchronized (sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">1465</TD><TD>                                count = sharedObject.referenceCountForRead + sharedObject.referenceCountForEdit;</TD></TR><TR><TD CLASS="l">1466</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1467</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1468</TD><TD>                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1469</TD><TD>                return count;</TD></TR><TR><TD CLASS="l">1470</TD><TD>        }</TD></TR><TR><TD CLASS="l">1471</TD><TD> </TD></TR><TR><TD CLASS="l">1472</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1473</TD><TD>         * This function returns the reference count of underlying model.</TD></TR><TR><TD CLASS="l">1474</TD><TD>         * </TD></TR><TR><TD CLASS="l">1475</TD><TD>         * @param id</TD></TR><TR><TD CLASS="l"><A NAME="2c">1476</A></TD><TD>         *            Object The id of the model TODO: try to refine the design</TD></TR><TR><TD CLASS="l">1477</TD><TD>         *            not to use this function</TD></TR><TR><TD CLASS="l">1478</TD><TD>         */</TD></TR><TR><TD CLASS="l">1479</TD><TD>        public int getReferenceCountForEdit(Object id) {</TD></TR><TR CLASS="z"><TD CLASS="l">1480</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1481</TD><TD>                int count = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">1482</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1483</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">1484</TD><TD>                if (sharedObject != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1485</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1486</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR CLASS="z"><TD CLASS="l">1487</TD><TD>                        synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">1488</TD><TD>                                count = sharedObject.referenceCountForEdit;</TD></TR><TR><TD CLASS="l">1489</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1490</TD><TD>                } else {</TD></TR><TR CLASS="z"><TD CLASS="l">1491</TD><TD>                        SYNC.release();</TD></TR><TR><TD CLASS="l">1492</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1493</TD><TD>                return count;</TD></TR><TR><TD CLASS="l">1494</TD><TD>        }</TD></TR><TR><TD CLASS="l">1495</TD><TD> </TD></TR><TR><TD CLASS="l">1496</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1497</TD><TD>         * This function returns the reference count of underlying model.</TD></TR><TR><TD CLASS="l">1498</TD><TD>         * </TD></TR><TR><TD CLASS="l">1499</TD><TD>         * @param id</TD></TR><TR><TD CLASS="l"><A NAME="2d">1500</A></TD><TD>         *            Object The id of the model TODO: try to refine the design</TD></TR><TR><TD CLASS="l">1501</TD><TD>         *            not to use this function</TD></TR><TR><TD CLASS="l">1502</TD><TD>         */</TD></TR><TR><TD CLASS="l">1503</TD><TD>        public int getReferenceCountForRead(Object id) {</TD></TR><TR CLASS="z"><TD CLASS="l">1504</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1505</TD><TD>                int count = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">1506</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1507</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">1508</TD><TD>                if (sharedObject != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1509</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1510</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR CLASS="z"><TD CLASS="l">1511</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1512</TD><TD>                        synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">1513</TD><TD>                                count = sharedObject.referenceCountForRead;</TD></TR><TR><TD CLASS="l">1514</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1515</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1516</TD><TD>                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="2e">1517</A></TD><TD>                return count;</TD></TR><TR><TD CLASS="l">1518</TD><TD>        }</TD></TR><TR><TD CLASS="l">1519</TD><TD> </TD></TR><TR><TD CLASS="l">1520</TD><TD>        private void handleConvertLineDelimiters(IStructuredDocument structuredDocument, IFile iFile, EncodingRule encodingRule, EncodingMemento encodingMemento) throws CoreException, MalformedOutputExceptionWithDetail, UnsupportedEncodingException {</TD></TR><TR CLASS="z"><TD CLASS="l">1521</TD><TD>                if (structuredDocument.getNumberOfLines() &gt; 1) {</TD></TR><TR CLASS="z"><TD CLASS="l">1522</TD><TD>                        convertLineDelimiters(structuredDocument, iFile);</TD></TR><TR><TD CLASS="l">1523</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="2f">1524</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1525</TD><TD> </TD></TR><TR><TD CLASS="l">1526</TD><TD>        private void handleProgramError(Throwable t) {</TD></TR><TR><TD CLASS="l">1527</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1528</TD><TD>                Logger.logException(&#34;Impossible Program Error&#34;, t); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1529</TD><TD>        }</TD></TR><TR><TD CLASS="l">1530</TD><TD> </TD></TR><TR><TD CLASS="l">1531</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="52">1532</A></TD><TD>         * This function returns true if there are other references to the</TD></TR><TR><TD CLASS="l">1533</TD><TD>         * underlying model.</TD></TR><TR><TD CLASS="l">1534</TD><TD>         */</TD></TR><TR><TD CLASS="l">1535</TD><TD>        public  boolean isShared(Object id) {</TD></TR><TR CLASS="c"><TD CLASS="l">1536</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">1537</TD><TD>                int count = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">1538</TD><TD>                boolean result = false;</TD></TR><TR CLASS="c"><TD CLASS="l">1539</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="c"><TD CLASS="l">1540</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="c"><TD CLASS="l">1541</TD><TD>                if (sharedObject != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1542</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">1543</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR CLASS="c"><TD CLASS="l">1544</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="88% line coverage (21 out of 24 instructions)">1545</TD><TD TITLE="88% line coverage (21 out of 24 instructions)">                        synchronized(sharedObject) {</TD></TR><TR CLASS="c"><TD CLASS="l">1546</TD><TD>                                count = sharedObject.referenceCountForRead + sharedObject.referenceCountForEdit;</TD></TR><TR><TD CLASS="l">1547</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1548</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1549</TD><TD>                SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">1550</TD><TD>                result = count &gt; 1;</TD></TR><TR CLASS="c"><TD CLASS="l">1551</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1552</TD><TD>        }</TD></TR><TR><TD CLASS="l">1553</TD><TD> </TD></TR><TR><TD CLASS="l">1554</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1555</TD><TD>         * This function returns true if there are other references to the</TD></TR><TR><TD CLASS="l">1556</TD><TD>         * underlying model.</TD></TR><TR><TD CLASS="l">1557</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="30">1558</A></TD><TD>         * @param id</TD></TR><TR><TD CLASS="l">1559</TD><TD>         *            Object The id of the model</TD></TR><TR><TD CLASS="l">1560</TD><TD>         */</TD></TR><TR><TD CLASS="l">1561</TD><TD>        public  boolean isSharedForEdit(Object id) {</TD></TR><TR CLASS="z"><TD CLASS="l">1562</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1563</TD><TD>                int count = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">1564</TD><TD>                boolean result = false;</TD></TR><TR CLASS="z"><TD CLASS="l">1565</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1566</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">1567</TD><TD>                if (sharedObject != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1568</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1569</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR CLASS="z"><TD CLASS="l">1570</TD><TD>                        synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">1571</TD><TD>                                count = sharedObject.referenceCountForEdit;</TD></TR><TR><TD CLASS="l">1572</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1573</TD><TD>                } else {</TD></TR><TR CLASS="z"><TD CLASS="l">1574</TD><TD>                        SYNC.release();</TD></TR><TR><TD CLASS="l">1575</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1576</TD><TD>                result = count &gt; 1;</TD></TR><TR CLASS="z"><TD CLASS="l">1577</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1578</TD><TD>        }</TD></TR><TR><TD CLASS="l">1579</TD><TD> </TD></TR><TR><TD CLASS="l">1580</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1581</TD><TD>         * This function returns true if there are other references to the</TD></TR><TR><TD CLASS="l">1582</TD><TD>         * underlying model.</TD></TR><TR><TD CLASS="l">1583</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="31">1584</A></TD><TD>         * @param id</TD></TR><TR><TD CLASS="l">1585</TD><TD>         *            Object The id of the model</TD></TR><TR><TD CLASS="l">1586</TD><TD>         */</TD></TR><TR><TD CLASS="l">1587</TD><TD>        public  boolean isSharedForRead(Object id) {</TD></TR><TR CLASS="z"><TD CLASS="l">1588</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1589</TD><TD>                int count = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">1590</TD><TD>                boolean result = false;</TD></TR><TR CLASS="z"><TD CLASS="l">1591</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1592</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">1593</TD><TD>                if (sharedObject != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1594</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1595</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR CLASS="z"><TD CLASS="l">1596</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1597</TD><TD>                        synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">1598</TD><TD>                                count = sharedObject.referenceCountForRead;</TD></TR><TR><TD CLASS="l">1599</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1600</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1601</TD><TD>                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1602</TD><TD>                result = count &gt; 1;</TD></TR><TR CLASS="z"><TD CLASS="l">1603</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1604</TD><TD>        }</TD></TR><TR><TD CLASS="l">1605</TD><TD> </TD></TR><TR><TD CLASS="l">1606</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1607</TD><TD>         * This method can be called to determine if the model manager is within a</TD></TR><TR><TD CLASS="l">1608</TD><TD>         * &#34;aboutToChange&#34; and &#34;changed&#34; sequence.</TD></TR><TR><TD CLASS="l">1609</TD><TD>         * </TD></TR><TR><TD CLASS="l">1610</TD><TD>         * @deprecated the manager does not otherwise interact with these states</TD></TR><TR><TD CLASS="l"><A NAME="32">1611</A></TD><TD>         * @return false</TD></TR><TR><TD CLASS="l">1612</TD><TD>         */</TD></TR><TR><TD CLASS="l">1613</TD><TD>        public boolean isStateChanging() {</TD></TR><TR><TD CLASS="l">1614</TD><TD>                // doesn't seem to be used anymore</TD></TR><TR CLASS="z"><TD CLASS="l">1615</TD><TD>                return false;</TD></TR><TR><TD CLASS="l">1616</TD><TD>        }</TD></TR><TR><TD CLASS="l">1617</TD><TD> </TD></TR><TR><TD CLASS="l">1618</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="33">1619</A></TD><TD>         * This method changes the id of the model. TODO: try to refine the design</TD></TR><TR><TD CLASS="l">1620</TD><TD>         * not to use this function</TD></TR><TR><TD CLASS="l">1621</TD><TD>         */</TD></TR><TR><TD CLASS="l">1622</TD><TD>        public void moveModel(Object oldId, Object newId) {</TD></TR><TR CLASS="z"><TD CLASS="l">1623</TD><TD>                org.eclipse.wst.sse.core.internal.util.Assert.isNotNull(oldId, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">1624</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1625</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(oldId);</TD></TR><TR><TD CLASS="l">1626</TD><TD>                // if not found in cache, ignore request.</TD></TR><TR><TD CLASS="l">1627</TD><TD>                // this would normally be a program error</TD></TR><TR CLASS="z"><TD CLASS="l">1628</TD><TD>                if (sharedObject != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1629</TD><TD>                        fManagedObjects.remove(oldId);</TD></TR><TR CLASS="z"><TD CLASS="l">1630</TD><TD>                        fManagedObjects.put(newId, sharedObject);</TD></TR><TR><TD CLASS="l">1631</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1632</TD><TD>                SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="34">1633</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1634</TD><TD> </TD></TR><TR><TD CLASS="l">1635</TD><TD>        private String readInputStream(InputStream inputStream, String ianaEncodingName) throws UnsupportedEncodingException, IOException {</TD></TR><TR><TD CLASS="l">1636</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1637</TD><TD>                String allText = null;</TD></TR><TR CLASS="z"><TD CLASS="l">1638</TD><TD>                if ((ianaEncodingName != null) &amp;&amp; (ianaEncodingName.length() != 0)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1639</TD><TD>                        String enc = CodedIO.getAppropriateJavaCharset(ianaEncodingName);</TD></TR><TR CLASS="z"><TD CLASS="l">1640</TD><TD>                        if (enc == null) {</TD></TR><TR><TD CLASS="l">1641</TD><TD>                                // if no conversion was possible, let's assume that</TD></TR><TR><TD CLASS="l">1642</TD><TD>                                // the encoding is already a java encoding name, so we'll</TD></TR><TR><TD CLASS="l">1643</TD><TD>                                // proceed with that assumption. This is the case, for</TD></TR><TR><TD CLASS="l">1644</TD><TD>                                // example,</TD></TR><TR><TD CLASS="l">1645</TD><TD>                                // for the reload() procedure.</TD></TR><TR><TD CLASS="l">1646</TD><TD>                                // If in fact it is not a valid java encoding, then</TD></TR><TR><TD CLASS="l">1647</TD><TD>                                // the &#34;allText=&#34; line will cause an</TD></TR><TR><TD CLASS="l">1648</TD><TD>                                // UnsupportedEncodingException</TD></TR><TR CLASS="z"><TD CLASS="l">1649</TD><TD>                                enc = ianaEncodingName;</TD></TR><TR><TD CLASS="l">1650</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1651</TD><TD>                        allText = readInputStream(new InputStreamReader(inputStream, enc));</TD></TR><TR><TD CLASS="l">1652</TD><TD>                }</TD></TR><TR><TD CLASS="l">1653</TD><TD>                else {</TD></TR><TR><TD CLASS="l">1654</TD><TD>                        // we normally assume encoding is provided for this method, but if</TD></TR><TR><TD CLASS="l">1655</TD><TD>                        // not,</TD></TR><TR><TD CLASS="l">1656</TD><TD>                        // we'll use platform default</TD></TR><TR CLASS="z"><TD CLASS="l">1657</TD><TD>                        allText = readInputStream(new InputStreamReader(inputStream));</TD></TR><TR><TD CLASS="l">1658</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1659</TD><TD>                return allText;</TD></TR><TR><TD CLASS="l"><A NAME="35">1660</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1661</TD><TD> </TD></TR><TR><TD CLASS="l">1662</TD><TD>        private String readInputStream(InputStreamReader inputStream) throws IOException {</TD></TR><TR><TD CLASS="l">1663</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1664</TD><TD>                int numRead = 0;</TD></TR><TR CLASS="z"><TD CLASS="l">1665</TD><TD>                StringBuffer buffer = new StringBuffer();</TD></TR><TR CLASS="z"><TD CLASS="l">1666</TD><TD>                char tBuff[] = new char[READ_BUFFER_SIZE];</TD></TR><TR CLASS="z"><TD CLASS="l">1667</TD><TD>                while ((numRead = inputStream.read(tBuff, 0, tBuff.length)) != -1) {</TD></TR><TR CLASS="z"><TD CLASS="l">1668</TD><TD>                        buffer.append(tBuff, 0, numRead);</TD></TR><TR><TD CLASS="l">1669</TD><TD>                }</TD></TR><TR><TD CLASS="l">1670</TD><TD>                // remember -- we didn't open stream ... so we don't close it</TD></TR><TR CLASS="z"><TD CLASS="l">1671</TD><TD>                return buffer.toString();</TD></TR><TR><TD CLASS="l">1672</TD><TD>        }</TD></TR><TR><TD CLASS="l">1673</TD><TD> </TD></TR><TR><TD CLASS="l">1674</TD><TD>        /*</TD></TR><TR><TD CLASS="l">1675</TD><TD>         * @see IModelManager#reinitialize(IStructuredModel)</TD></TR><TR><TD CLASS="l"><A NAME="36">1676</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">1677</TD><TD>        public IStructuredModel reinitialize(IStructuredModel model) {</TD></TR><TR><TD CLASS="l">1678</TD><TD> </TD></TR><TR><TD CLASS="l">1679</TD><TD>                // getHandler (assume its the &#34;new one&#34;)</TD></TR><TR CLASS="z"><TD CLASS="l">1680</TD><TD>                IModelHandler handler = model.getModelHandler();</TD></TR><TR><TD CLASS="l">1681</TD><TD>                // getLoader for that new one</TD></TR><TR CLASS="z"><TD CLASS="l">1682</TD><TD>                IModelLoader loader = handler.getModelLoader();</TD></TR><TR><TD CLASS="l">1683</TD><TD>                // ask it to reinitialize</TD></TR><TR CLASS="z"><TD CLASS="l">1684</TD><TD>                model = loader.reinitialize(model);</TD></TR><TR><TD CLASS="l">1685</TD><TD>                // the loader should check to see if the one it received</TD></TR><TR><TD CLASS="l">1686</TD><TD>                // is the same type it would normally create.</TD></TR><TR><TD CLASS="l">1687</TD><TD>                // if not, it must &#34;start from scratch&#34; and create a whole</TD></TR><TR><TD CLASS="l">1688</TD><TD>                // new one.</TD></TR><TR><TD CLASS="l">1689</TD><TD>                // if it is of the same type, it should just 'replace text'</TD></TR><TR><TD CLASS="l">1690</TD><TD>                // replacing all the existing text with the new text.</TD></TR><TR><TD CLASS="l">1691</TD><TD>                // the important one is the JSP loader ... it should go through</TD></TR><TR><TD CLASS="l">1692</TD><TD>                // its embedded content checking and initialization</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="46">1693</A></TD><TD>                return model;</TD></TR><TR><TD CLASS="l">1694</TD><TD>        }</TD></TR><TR><TD CLASS="l">1695</TD><TD> </TD></TR><TR><TD CLASS="l">1696</TD><TD>         void releaseFromEdit(IStructuredModel structuredModel) {</TD></TR><TR CLASS="c"><TD CLASS="l">1697</TD><TD>                Object id = structuredModel.getId();</TD></TR><TR CLASS="c"><TD CLASS="l">1698</TD><TD>                if (id.equals(UNMANAGED_MODEL) || id.equals(DUPLICATED_MODEL)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1699</TD><TD>                        cleanupDiscardedModel(structuredModel);</TD></TR><TR><TD CLASS="l">1700</TD><TD>                }</TD></TR><TR><TD CLASS="l">1701</TD><TD>                else {</TD></TR><TR CLASS="c"><TD CLASS="l">1702</TD><TD>                        releaseFromEdit(id);</TD></TR><TR><TD CLASS="l">1703</TD><TD>                }</TD></TR><TR><TD CLASS="l"><A NAME="47">1704</A></TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1705</TD><TD>        }</TD></TR><TR><TD CLASS="l">1706</TD><TD>        </TD></TR><TR><TD CLASS="l">1707</TD><TD>         void releaseFromRead(IStructuredModel structuredModel) {</TD></TR><TR CLASS="c"><TD CLASS="l">1708</TD><TD>                Object id = structuredModel.getId();</TD></TR><TR CLASS="c"><TD CLASS="l">1709</TD><TD>                if (id.equals(UNMANAGED_MODEL) || id.equals(DUPLICATED_MODEL)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1710</TD><TD>                        cleanupDiscardedModel(structuredModel);</TD></TR><TR><TD CLASS="l">1711</TD><TD>                }</TD></TR><TR><TD CLASS="l">1712</TD><TD>                else {</TD></TR><TR CLASS="c"><TD CLASS="l">1713</TD><TD>                        releaseFromRead(id);</TD></TR><TR><TD CLASS="l">1714</TD><TD>                }</TD></TR><TR><TD CLASS="l">1715</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1716</TD><TD>        }</TD></TR><TR><TD CLASS="l">1717</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1718</TD><TD>         * default for use in same package, not subclasses</TD></TR><TR><TD CLASS="l">1719</TD><TD>         * </TD></TR><TR><TD CLASS="l">1720</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="44">1721</A></TD><TD>         private void releaseFromEdit(Object id) {</TD></TR><TR><TD CLASS="l">1722</TD><TD>                // ISSUE: many of these asserts should be changed to &#34;logs&#34;</TD></TR><TR><TD CLASS="l">1723</TD><TD>                // and continue to limp along?</TD></TR><TR><TD CLASS="l">1724</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1725</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">1726</TD><TD>                SharedObject sharedObject = null;</TD></TR><TR><TD CLASS="l">1727</TD><TD> </TD></TR><TR><TD CLASS="l">1728</TD><TD>                // ISSUE: here we need better &#34;spec&#34; what to do with</TD></TR><TR><TD CLASS="l">1729</TD><TD>                // unmanaged or duplicated models. Release still needs</TD></TR><TR><TD CLASS="l">1730</TD><TD>                // to be called on them, for now, but the model manager</TD></TR><TR><TD CLASS="l">1731</TD><TD>                // doesn't need to do anything.</TD></TR><TR CLASS="c"><TD CLASS="l">1732</TD><TD>                if (id.equals(UNMANAGED_MODEL) || id.equals(DUPLICATED_MODEL)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1733</TD><TD>                        throw new IllegalArgumentException(&#34;Ids of UNMANAGED_MODEL or DUPLICATED_MODEL are illegal here&#34;);</TD></TR><TR><TD CLASS="l">1734</TD><TD>                }</TD></TR><TR><TD CLASS="l">1735</TD><TD>                else {</TD></TR><TR CLASS="c"><TD CLASS="l">1736</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="c"><TD CLASS="l">1737</TD><TD>                        sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="c"><TD CLASS="l">1738</TD><TD>                        SYNC.release();</TD></TR><TR><TD CLASS="l">1739</TD><TD>                        </TD></TR><TR CLASS="c"><TD CLASS="l">1740</TD><TD>                        Assert.isNotNull(sharedObject, &#34;release was requested on a model that was not being managed&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">1741</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR><TD CLASS="l">1742</TD><TD>                        </TD></TR><TR CLASS="c"><TD CLASS="l">1743</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="92% line coverage (35 out of 38 instructions)">1744</TD><TD TITLE="92% line coverage (35 out of 38 instructions)">                        synchronized(sharedObject) {</TD></TR><TR CLASS="c"><TD CLASS="l">1745</TD><TD>                                _decrCount(sharedObject, EDIT);</TD></TR><TR CLASS="c"><TD CLASS="l">1746</TD><TD>                                if ((sharedObject.referenceCountForRead == 0) &amp;&amp; (sharedObject.referenceCountForEdit == 0)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1747</TD><TD>                                        discardModel(id, sharedObject);</TD></TR><TR><TD CLASS="l">1748</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1749</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">1750</TD><TD>                        SYNC.release();</TD></TR><TR><TD CLASS="l">1751</TD><TD>                        // if edit goes to zero, but still open for read,</TD></TR><TR><TD CLASS="l">1752</TD><TD>                        // then we should reload here, so we are in synch with</TD></TR><TR><TD CLASS="l">1753</TD><TD>                        // contents on disk.</TD></TR><TR><TD CLASS="l">1754</TD><TD>                        // ISSUE: should we check isDirty here?</TD></TR><TR><TD CLASS="l">1755</TD><TD>                        // ANSWER: here, for now now. model still has its own dirty</TD></TR><TR><TD CLASS="l">1756</TD><TD>                        // flag for some reason.</TD></TR><TR><TD CLASS="l">1757</TD><TD>                        // we need to address * that * too.</TD></TR><TR><TD CLASS="l">1758</TD><TD> </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">1759</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                        synchronized(sharedObject) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="59% line coverage (10 out of 17 instructions)">1760</TD><TD TITLE="59% line coverage (10 out of 17 instructions)">                                if ((sharedObject.referenceCountForRead &gt; 0) &amp;&amp; (sharedObject.referenceCountForEdit == 0) &amp;&amp; sharedObject.theSharedModel.isDirty()) {</TD></TR><TR CLASS="z"><TD CLASS="l">1761</TD><TD>                                        signalPreLifeCycleListenerRevert(sharedObject.theSharedModel);</TD></TR><TR CLASS="z"><TD CLASS="l">1762</TD><TD>                                        revertModel(id, sharedObject);</TD></TR><TR><TD CLASS="l">1763</TD><TD>                                        /*</TD></TR><TR><TD CLASS="l">1764</TD><TD>                                         * Because model events are fired to notify about the</TD></TR><TR><TD CLASS="l">1765</TD><TD>                                         * revert's changes, and listeners can still get/release</TD></TR><TR><TD CLASS="l">1766</TD><TD>                                         * the model from this thread (locking prevents it being</TD></TR><TR><TD CLASS="l">1767</TD><TD>                                         * done from other threads), the reference counts could</TD></TR><TR><TD CLASS="l">1768</TD><TD>                                         * have changed since we entered this if block, and the</TD></TR><TR><TD CLASS="l">1769</TD><TD>                                         * model could have been discarded.  Check the counts again.</TD></TR><TR><TD CLASS="l">1770</TD><TD>                                         */</TD></TR><TR CLASS="z"><TD CLASS="l">1771</TD><TD>                                        if (sharedObject.referenceCountForRead &gt; 0 &amp;&amp; sharedObject.referenceCountForEdit == 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">1772</TD><TD>                                                sharedObject.theSharedModel.setDirtyState(false);</TD></TR><TR><TD CLASS="l">1773</TD><TD>                                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1774</TD><TD>                                        signalPostLifeCycleListenerRevert(sharedObject.theSharedModel);</TD></TR><TR><TD CLASS="l">1775</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1776</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1777</TD><TD>                        </TD></TR><TR><TD CLASS="l">1778</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="38">1779</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1780</TD><TD> </TD></TR><TR><TD CLASS="l">1781</TD><TD>        // private for now, though public forms have been requested, in past.</TD></TR><TR><TD CLASS="l">1782</TD><TD>        private void revertModel(Object id, SharedObject sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">1783</TD><TD>                IStructuredDocument structuredDocument = sharedObject.theSharedModel.getStructuredDocument();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="3f">1784</A></TD><TD>                FileBufferModelManager.getInstance().revert(structuredDocument);</TD></TR><TR CLASS="z"><TD CLASS="l">1785</TD><TD>        }</TD></TR><TR><TD CLASS="l">1786</TD><TD> </TD></TR><TR><TD CLASS="l">1787</TD><TD>        private void signalPreLifeCycleListenerRevert(IStructuredModel structuredModel) {</TD></TR><TR CLASS="z"><TD CLASS="l">1788</TD><TD>                int type = ModelLifecycleEvent.MODEL_REVERT | ModelLifecycleEvent.PRE_EVENT;</TD></TR><TR><TD CLASS="l">1789</TD><TD>                // what's wrong with this design that a cast is needed here!?</TD></TR><TR CLASS="z"><TD CLASS="l">1790</TD><TD>                ModelLifecycleEvent event = new ModelLifecycleEvent(structuredModel, type);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="3e">1791</A></TD><TD>                ((AbstractStructuredModel) structuredModel).signalLifecycleEvent(event);</TD></TR><TR CLASS="z"><TD CLASS="l">1792</TD><TD>        }</TD></TR><TR><TD CLASS="l">1793</TD><TD> </TD></TR><TR><TD CLASS="l">1794</TD><TD>        private void signalPostLifeCycleListenerRevert(IStructuredModel structuredModel) {</TD></TR><TR CLASS="z"><TD CLASS="l">1795</TD><TD>                int type = ModelLifecycleEvent.MODEL_REVERT | ModelLifecycleEvent.POST_EVENT;</TD></TR><TR><TD CLASS="l">1796</TD><TD>                // what's wrong with this design that a cast is needed here!?</TD></TR><TR CLASS="z"><TD CLASS="l">1797</TD><TD>                ModelLifecycleEvent event = new ModelLifecycleEvent(structuredModel, type);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="43">1798</A></TD><TD>                ((AbstractStructuredModel) structuredModel).signalLifecycleEvent(event);</TD></TR><TR CLASS="z"><TD CLASS="l">1799</TD><TD>        }</TD></TR><TR><TD CLASS="l">1800</TD><TD> </TD></TR><TR><TD CLASS="l">1801</TD><TD>        private void discardModel(Object id, SharedObject sharedObject) {</TD></TR><TR CLASS="c"><TD CLASS="l">1802</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="c"><TD CLASS="l">1803</TD><TD>                fManagedObjects.remove(id);</TD></TR><TR CLASS="c"><TD CLASS="l">1804</TD><TD>                SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">1805</TD><TD>                IStructuredDocument structuredDocument = sharedObject.theSharedModel.getStructuredDocument();</TD></TR><TR><TD CLASS="l">1806</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1807</TD><TD>                if (structuredDocument == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1808</TD><TD>                        Platform.getLog(SSECorePlugin.getDefault().getBundle()).log(new Status(IStatus.ERROR, SSECorePlugin.ID, IStatus.ERROR, &#34;Attempted to discard a structured model but the underlying document has already been set to null: &#34; + sharedObject.theSharedModel.getBaseLocation(), null));</TD></TR><TR><TD CLASS="l">1809</TD><TD>                }</TD></TR><TR><TD CLASS="l">1810</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="58">1811</A></TD><TD>                cleanupDiscardedModel(sharedObject.theSharedModel);</TD></TR><TR CLASS="c"><TD CLASS="l">1812</TD><TD>        }</TD></TR><TR><TD CLASS="l">1813</TD><TD> </TD></TR><TR><TD CLASS="l">1814</TD><TD>        private void cleanupDiscardedModel(IStructuredModel structuredModel) {</TD></TR><TR CLASS="c"><TD CLASS="l">1815</TD><TD>                IStructuredDocument structuredDocument = structuredModel.getStructuredDocument();</TD></TR><TR><TD CLASS="l">1816</TD><TD>                /*</TD></TR><TR><TD CLASS="l">1817</TD><TD>                 * This call (and setting the StructuredDocument to null) were</TD></TR><TR><TD CLASS="l">1818</TD><TD>                 * previously done within the model itself, but for concurrency it</TD></TR><TR><TD CLASS="l">1819</TD><TD>                 * must be done here during a synchronized release.</TD></TR><TR><TD CLASS="l">1820</TD><TD>                 */</TD></TR><TR CLASS="c"><TD CLASS="l">1821</TD><TD>                structuredModel.getFactoryRegistry().release();</TD></TR><TR><TD CLASS="l">1822</TD><TD> </TD></TR><TR><TD CLASS="l">1823</TD><TD>                /*</TD></TR><TR><TD CLASS="l">1824</TD><TD>                 * For structured documents originating from file buffers, disconnect</TD></TR><TR><TD CLASS="l">1825</TD><TD>                 * us from the file buffer, now.</TD></TR><TR><TD CLASS="l">1826</TD><TD>                 */</TD></TR><TR CLASS="c"><TD CLASS="l">1827</TD><TD>                FileBufferModelManager.getInstance().releaseModel(structuredDocument);</TD></TR><TR><TD CLASS="l">1828</TD><TD> </TD></TR><TR><TD CLASS="l">1829</TD><TD>                /*</TD></TR><TR><TD CLASS="l">1830</TD><TD>                 * Setting the document to null is required since some subclasses of</TD></TR><TR><TD CLASS="l">1831</TD><TD>                 * model might have &#34;cleanup&#34; of listeners, etc., to remove, which</TD></TR><TR><TD CLASS="l">1832</TD><TD>                 * were initialized during the initial setStructuredDocument.</TD></TR><TR><TD CLASS="l">1833</TD><TD>                 * </TD></TR><TR><TD CLASS="l">1834</TD><TD>                 * The model itself in particular may have internal listeners used to</TD></TR><TR><TD CLASS="l">1835</TD><TD>                 * coordinate the document with its own &#34;structure&#34;.</TD></TR><TR><TD CLASS="l">1836</TD><TD>                 */</TD></TR><TR CLASS="c"><TD CLASS="l">1837</TD><TD>                structuredModel.setStructuredDocument(null);</TD></TR><TR CLASS="c"><TD CLASS="l">1838</TD><TD>        }</TD></TR><TR><TD CLASS="l">1839</TD><TD> </TD></TR><TR><TD CLASS="l">1840</TD><TD>        </TD></TR><TR><TD CLASS="l">1841</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="4c">1842</A></TD><TD>         * default for use in same package, not subclasses</TD></TR><TR><TD CLASS="l">1843</TD><TD>         * </TD></TR><TR><TD CLASS="l">1844</TD><TD>         */</TD></TR><TR><TD CLASS="l">1845</TD><TD>         private void releaseFromRead(Object id) {</TD></TR><TR CLASS="c"><TD CLASS="l">1846</TD><TD>                Assert.isNotNull(id, &#34;id parameter can not be null&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">1847</TD><TD>                SharedObject sharedObject = null;</TD></TR><TR><TD CLASS="l">1848</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1849</TD><TD>                if (id.equals(UNMANAGED_MODEL) || id.equals(DUPLICATED_MODEL)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1850</TD><TD>                        throw new IllegalArgumentException(&#34;Ids of UNMANAGED_MODEL or DUPLICATED_MODEL are illegal here&#34;);</TD></TR><TR><TD CLASS="l">1851</TD><TD>                }</TD></TR><TR><TD CLASS="l">1852</TD><TD>                else {</TD></TR><TR CLASS="c"><TD CLASS="l">1853</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="c"><TD CLASS="l">1854</TD><TD>                        sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="c"><TD CLASS="l">1855</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">1856</TD><TD>                        Assert.isNotNull(sharedObject, &#34;release was requested on a model that was not being managed&#34;); //$NON-NLS-1$</TD></TR><TR CLASS="c"><TD CLASS="l">1857</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR><TD CLASS="l">1858</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1859</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="92% line coverage (35 out of 38 instructions)">1860</TD><TD TITLE="92% line coverage (35 out of 38 instructions)">                synchronized(sharedObject) {</TD></TR><TR CLASS="c"><TD CLASS="l">1861</TD><TD>                        _decrCount(sharedObject, READ);</TD></TR><TR CLASS="c"><TD CLASS="l">1862</TD><TD>                        if ((sharedObject.referenceCountForRead == 0) &amp;&amp; (sharedObject.referenceCountForEdit == 0)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1863</TD><TD>                                discardModel(id, sharedObject);</TD></TR><TR><TD CLASS="l">1864</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1865</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1866</TD><TD>                SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">1867</TD><TD>        }</TD></TR><TR><TD CLASS="l">1868</TD><TD> </TD></TR><TR><TD CLASS="l">1869</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1870</TD><TD>         * This is similar to the getModel method, except this method does not use</TD></TR><TR><TD CLASS="l">1871</TD><TD>         * the cached version, but forces the cached version to be replaced with a</TD></TR><TR><TD CLASS="l">1872</TD><TD>         * fresh, unchanged version. Note: this method does not change any</TD></TR><TR><TD CLASS="l">1873</TD><TD>         * reference counts. Also, if there is not already a cached version of the</TD></TR><TR><TD CLASS="l">1874</TD><TD>         * model, then this call is essentially ignored (that is, it does not put</TD></TR><TR><TD CLASS="l">1875</TD><TD>         * a model in the cache) and returns null.</TD></TR><TR><TD CLASS="l">1876</TD><TD>         * </TD></TR><TR><TD CLASS="l">1877</TD><TD>         * @deprecated - will become protected, use reload directly on model</TD></TR><TR><TD CLASS="l"><A NAME="37">1878</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">1879</TD><TD>        public  IStructuredModel reloadModel(Object id, java.io.InputStream inputStream) throws java.io.UnsupportedEncodingException {</TD></TR><TR><TD CLASS="l">1880</TD><TD> </TD></TR><TR><TD CLASS="l">1881</TD><TD>                // get the existing model associated with this id</TD></TR><TR CLASS="z"><TD CLASS="l">1882</TD><TD>                IStructuredModel structuredModel = getExistingModel(id);</TD></TR><TR><TD CLASS="l">1883</TD><TD>                // for the model to be null is probably an error (that is,</TD></TR><TR><TD CLASS="l">1884</TD><TD>                // reload should not have been called, but we'll guard against</TD></TR><TR><TD CLASS="l">1885</TD><TD>                // a null pointer example and return null if we are no longer managing</TD></TR><TR><TD CLASS="l">1886</TD><TD>                // that model.</TD></TR><TR CLASS="z"><TD CLASS="l">1887</TD><TD>                if (structuredModel != null) {</TD></TR><TR><TD CLASS="l">1888</TD><TD>                        // get loader based on existing type</TD></TR><TR><TD CLASS="l">1889</TD><TD>                        // dmwTODO evaluate when reload should occur</TD></TR><TR><TD CLASS="l">1890</TD><TD>                        // with potentially new type (e.g. html 'save as' jsp).</TD></TR><TR CLASS="z"><TD CLASS="l">1891</TD><TD>                        IModelHandler handler = structuredModel.getModelHandler();</TD></TR><TR CLASS="z"><TD CLASS="l">1892</TD><TD>                        IModelLoader loader = handler.getModelLoader();</TD></TR><TR><TD CLASS="l">1893</TD><TD>                        // ask the loader to re-load</TD></TR><TR CLASS="z"><TD CLASS="l">1894</TD><TD>                        loader.reload(Utilities.getMarkSupportedStream(inputStream), structuredModel);</TD></TR><TR CLASS="z"><TD CLASS="l">1895</TD><TD>                        trace(&#34;re-loading model&#34;, id); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1896</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1897</TD><TD>                return structuredModel;</TD></TR><TR><TD CLASS="l">1898</TD><TD>        }</TD></TR><TR><TD CLASS="l">1899</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="39">1900</A></TD><TD>        public void saveModel(IFile iFile, String id, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR><TD CLASS="l">1901</TD><TD> </TD></TR><TR><TD CLASS="l">1902</TD><TD>                // let's see if we already have it in our cache</TD></TR><TR><TD CLASS="l">1903</TD><TD>        </TD></TR><TR CLASS="z"><TD CLASS="l">1904</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1905</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">1906</TD><TD>                if (sharedObject == null || sharedObject.theSharedModel == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1907</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1908</TD><TD>                        throw new IllegalStateException(SSECoreMessages.Program_Error__ModelManage_EXC_); //$NON-NLS-1$ = &#34;Program Error: ModelManagerImpl::saveModel. Model should be in the cache&#34;</TD></TR><TR><TD CLASS="l">1909</TD><TD>                } </TD></TR><TR><TD CLASS="l">1910</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1911</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1912</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR><TD CLASS="l">1913</TD><TD>                        </TD></TR><TR><TD CLASS="l">1914</TD><TD>                        /**</TD></TR><TR><TD CLASS="l">1915</TD><TD>                         * https://bugs.eclipse.org/bugs/show_bug.cgi?id=221610</TD></TR><TR><TD CLASS="l">1916</TD><TD>                         * </TD></TR><TR><TD CLASS="l">1917</TD><TD>                         * Sync removed from here to prevent deadlock. Although the model</TD></TR><TR><TD CLASS="l">1918</TD><TD>                         * instance may disappear or be made invalid while the save is</TD></TR><TR><TD CLASS="l">1919</TD><TD>                         * happening, the document itself still has the contents we're</TD></TR><TR><TD CLASS="l">1920</TD><TD>                         * trying to save. Simultaneous saves should be throttled by</TD></TR><TR><TD CLASS="l">1921</TD><TD>                         * resource locking without our intervention.</TD></TR><TR><TD CLASS="l">1922</TD><TD>                         */</TD></TR><TR CLASS="z"><TD CLASS="l">1923</TD><TD>                        boolean saved = false;</TD></TR><TR><TD CLASS="l">1924</TD><TD>                        // if this model was based on a File Buffer and we're writing back</TD></TR><TR><TD CLASS="l">1925</TD><TD>                        // to the same location, use the buffer to do the writing</TD></TR><TR CLASS="z"><TD CLASS="l">1926</TD><TD>                        if (FileBufferModelManager.getInstance().isExistingBuffer(sharedObject.theSharedModel.getStructuredDocument())) {</TD></TR><TR CLASS="z"><TD CLASS="l">1927</TD><TD>                                ITextFileBuffer buffer = FileBufferModelManager.getInstance().getBuffer(sharedObject.theSharedModel.getStructuredDocument());</TD></TR><TR CLASS="z"><TD CLASS="l">1928</TD><TD>                                IPath fileLocation = FileBuffers.normalizeLocation(iFile.getFullPath());</TD></TR><TR CLASS="z"><TD CLASS="l">1929</TD><TD>                                if (fileLocation.equals(buffer.getLocation())) {</TD></TR><TR CLASS="z"><TD CLASS="l">1930</TD><TD>                                        buffer.commit(new NullProgressMonitor(), true);</TD></TR><TR CLASS="z"><TD CLASS="l">1931</TD><TD>                                        saved = true;</TD></TR><TR><TD CLASS="l">1932</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1933</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1934</TD><TD>                        if (!saved) {</TD></TR><TR CLASS="z"><TD CLASS="l">1935</TD><TD>                                IStructuredModel model = sharedObject.theSharedModel;</TD></TR><TR CLASS="z"><TD CLASS="l">1936</TD><TD>                                IStructuredDocument document = model.getStructuredDocument();</TD></TR><TR CLASS="z"><TD CLASS="l">1937</TD><TD>                                saveStructuredDocument(document, iFile, encodingRule);</TD></TR><TR CLASS="z"><TD CLASS="l">1938</TD><TD>                                trace(&#34;saving model&#34;, id); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1939</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1940</TD><TD>                        sharedObject.theSharedModel.setDirtyState(false);</TD></TR><TR CLASS="z"><TD CLASS="l">1941</TD><TD>                        sharedObject.theSharedModel.setNewState(false);</TD></TR><TR><TD CLASS="l">1942</TD><TD>                }        </TD></TR><TR CLASS="z"><TD CLASS="l">1943</TD><TD>        }</TD></TR><TR><TD CLASS="l">1944</TD><TD> </TD></TR><TR><TD CLASS="l">1945</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1946</TD><TD>         * Saving the model really just means to save it's structured document.</TD></TR><TR><TD CLASS="l">1947</TD><TD>         * </TD></TR><TR><TD CLASS="l">1948</TD><TD>         * @param id</TD></TR><TR><TD CLASS="l">1949</TD><TD>         * @param outputStream</TD></TR><TR><TD CLASS="l">1950</TD><TD>         * @param encodingRule</TD></TR><TR><TD CLASS="l">1951</TD><TD>         * @throws UnsupportedEncodingException</TD></TR><TR><TD CLASS="l">1952</TD><TD>         * @throws IOException</TD></TR><TR><TD CLASS="l">1953</TD><TD>         * @throws CoreException</TD></TR><TR><TD CLASS="l">1954</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="3a">1955</A></TD><TD>        public void saveModel(String id, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR><TD CLASS="l">1956</TD><TD> </TD></TR><TR><TD CLASS="l">1957</TD><TD>                // let's see if we already have it in our cache</TD></TR><TR><TD CLASS="l">1958</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1959</TD><TD>                SYNC.acquire();</TD></TR><TR CLASS="z"><TD CLASS="l">1960</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">1961</TD><TD>                if (sharedObject == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1962</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1963</TD><TD>                        throw new IllegalStateException(SSECoreMessages.Program_Error__ModelManage_EXC_); //$NON-NLS-1$ = &#34;Program Error: ModelManagerImpl::saveModel. Model should be in the cache&#34;</TD></TR><TR><TD CLASS="l">1964</TD><TD>                }</TD></TR><TR><TD CLASS="l">1965</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1966</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">1967</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR><TD CLASS="l">1968</TD><TD>                        /**</TD></TR><TR><TD CLASS="l">1969</TD><TD>                         * https://bugs.eclipse.org/bugs/show_bug.cgi?id=221610</TD></TR><TR><TD CLASS="l">1970</TD><TD>                         * </TD></TR><TR><TD CLASS="l">1971</TD><TD>                         * Sync removed from here to prevent deadlock. Although the model</TD></TR><TR><TD CLASS="l">1972</TD><TD>                         * instance may disappear or be made invalid while the save is</TD></TR><TR><TD CLASS="l">1973</TD><TD>                         * happening, the document itself still has the contents we're</TD></TR><TR><TD CLASS="l">1974</TD><TD>                         * trying to save. Simultaneous saves should be throttled by</TD></TR><TR><TD CLASS="l">1975</TD><TD>                         * resource locking without our intervention.</TD></TR><TR><TD CLASS="l">1976</TD><TD>                         */</TD></TR><TR><TD CLASS="l">1977</TD><TD>                        /*</TD></TR><TR><TD CLASS="l">1978</TD><TD>                         * if this model was based on a File Buffer and we're writing back</TD></TR><TR><TD CLASS="l">1979</TD><TD>                         * to the same location, use the buffer to do the writing</TD></TR><TR><TD CLASS="l">1980</TD><TD>                         */</TD></TR><TR CLASS="z"><TD CLASS="l">1981</TD><TD>                        if (FileBufferModelManager.getInstance().isExistingBuffer(sharedObject.theSharedModel.getStructuredDocument())) {</TD></TR><TR CLASS="z"><TD CLASS="l">1982</TD><TD>                                ITextFileBuffer buffer = FileBufferModelManager.getInstance().getBuffer(sharedObject.theSharedModel.getStructuredDocument());</TD></TR><TR CLASS="z"><TD CLASS="l">1983</TD><TD>                                buffer.commit(new NullProgressMonitor(), true);</TD></TR><TR><TD CLASS="l">1984</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1985</TD><TD>                        else {</TD></TR><TR CLASS="z"><TD CLASS="l">1986</TD><TD>                                IFile iFile = getFileFor(sharedObject.theSharedModel);</TD></TR><TR CLASS="z"><TD CLASS="l">1987</TD><TD>                                IStructuredModel model = sharedObject.theSharedModel;</TD></TR><TR CLASS="z"><TD CLASS="l">1988</TD><TD>                                IStructuredDocument document = model.getStructuredDocument();</TD></TR><TR CLASS="z"><TD CLASS="l">1989</TD><TD>                                saveStructuredDocument(document, iFile);</TD></TR><TR CLASS="z"><TD CLASS="l">1990</TD><TD>                                trace(&#34;saving model&#34;, id); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1991</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1992</TD><TD>                        sharedObject.theSharedModel.setDirtyState(false);</TD></TR><TR CLASS="z"><TD CLASS="l">1993</TD><TD>                        sharedObject.theSharedModel.setNewState(false);</TD></TR><TR><TD CLASS="l">1994</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1995</TD><TD>        }</TD></TR><TR><TD CLASS="l">1996</TD><TD> </TD></TR><TR><TD CLASS="l">1997</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1998</TD><TD>         * @deprecated - this method is less efficient than IFile form, since it</TD></TR><TR><TD CLASS="l"><A NAME="3b">1999</A></TD><TD>         *             requires an extra &#34;copy&#34; of byte array, and should be avoid</TD></TR><TR><TD CLASS="l">2000</TD><TD>         *             in favor of the IFile form.</TD></TR><TR><TD CLASS="l">2001</TD><TD>         */</TD></TR><TR><TD CLASS="l">2002</TD><TD>        public void saveModel(String id, OutputStream outputStream, EncodingRule encodingRule) throws UnsupportedEncodingException, CoreException, IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">2003</TD><TD>                SYNC.acquire();</TD></TR><TR><TD CLASS="l">2004</TD><TD>                // let's see if we already have it in our cache</TD></TR><TR CLASS="z"><TD CLASS="l">2005</TD><TD>                SharedObject sharedObject = (SharedObject) fManagedObjects.get(id);</TD></TR><TR CLASS="z"><TD CLASS="l">2006</TD><TD>                if (sharedObject == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">2007</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">2008</TD><TD>                        throw new IllegalStateException(SSECoreMessages.Program_Error__ModelManage_EXC_); //$NON-NLS-1$ = &#34;Program Error: ModelManagerImpl::saveModel. Model should be in the cache&#34;</TD></TR><TR><TD CLASS="l">2009</TD><TD>                }</TD></TR><TR><TD CLASS="l">2010</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">2011</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="z"><TD CLASS="l">2012</TD><TD>                        sharedObject.waitForLoadAttempt();</TD></TR><TR CLASS="z"><TD CLASS="l">2013</TD><TD>                        synchronized(sharedObject) {</TD></TR><TR CLASS="z"><TD CLASS="l">2014</TD><TD>                                CodedStreamCreator codedStreamCreator = new CodedStreamCreator();</TD></TR><TR CLASS="z"><TD CLASS="l">2015</TD><TD>                                codedStreamCreator.set(sharedObject.theSharedModel.getId(), new DocumentReader(sharedObject.theSharedModel.getStructuredDocument()));</TD></TR><TR CLASS="z"><TD CLASS="l">2016</TD><TD>                                codedStreamCreator.setPreviousEncodingMemento(sharedObject.theSharedModel.getStructuredDocument().getEncodingMemento());</TD></TR><TR CLASS="z"><TD CLASS="l">2017</TD><TD>                                ByteArrayOutputStream byteArrayOutputStream = codedStreamCreator.getCodedByteArrayOutputStream(encodingRule);</TD></TR><TR CLASS="z"><TD CLASS="l">2018</TD><TD>                                byte[] outputBytes = byteArrayOutputStream.toByteArray();</TD></TR><TR CLASS="z"><TD CLASS="l">2019</TD><TD>                                outputStream.write(outputBytes);</TD></TR><TR CLASS="z"><TD CLASS="l">2020</TD><TD>                                trace(&#34;saving model&#34;, id); //$NON-NLS-1$</TD></TR><TR CLASS="z"><TD CLASS="l">2021</TD><TD>                                sharedObject.theSharedModel.setDirtyState(false);</TD></TR><TR CLASS="z"><TD CLASS="l">2022</TD><TD>                                sharedObject.theSharedModel.setNewState(false);</TD></TR><TR><TD CLASS="l">2023</TD><TD>                        }</TD></TR><TR><TD CLASS="l"><A NAME="3c">2024</A></TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2025</TD><TD>        }</TD></TR><TR><TD CLASS="l">2026</TD><TD> </TD></TR><TR><TD CLASS="l">2027</TD><TD>        public void saveStructuredDocument(IStructuredDocument structuredDocument, IFile iFile) throws UnsupportedEncodingException, CoreException, IOException {</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="3d">2028</A></TD><TD>                saveStructuredDocument(structuredDocument, iFile, EncodingRule.CONTENT_BASED);</TD></TR><TR CLASS="z"><TD CLASS="l">2029</TD><TD>        }</TD></TR><TR><TD CLASS="l">2030</TD><TD> </TD></TR><TR><TD CLASS="l">2031</TD><TD>        public void saveStructuredDocument(IStructuredDocument structuredDocument, IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, CoreException, IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">2032</TD><TD>                if (FileBufferModelManager.getInstance().isExistingBuffer(structuredDocument)) {</TD></TR><TR CLASS="z"><TD CLASS="l">2033</TD><TD>                        ITextFileBuffer buffer = FileBufferModelManager.getInstance().getBuffer(structuredDocument);</TD></TR><TR CLASS="z"><TD CLASS="l">2034</TD><TD>                        if (buffer.getLocation().equals(iFile.getFullPath()) || buffer.getLocation().equals(iFile.getLocation())) {</TD></TR><TR CLASS="z"><TD CLASS="l">2035</TD><TD>                                buffer.commit(new NullProgressMonitor(), true);</TD></TR><TR><TD CLASS="l">2036</TD><TD>                        }</TD></TR><TR><TD CLASS="l">2037</TD><TD>                }</TD></TR><TR><TD CLASS="l">2038</TD><TD>                else {</TD></TR><TR><TD CLASS="l">2039</TD><TD>                        // IModelHandler handler = calculateType(iFile);</TD></TR><TR><TD CLASS="l">2040</TD><TD>                        // IDocumentDumper dumper = handler.getDocumentDumper();</TD></TR><TR CLASS="z"><TD CLASS="l">2041</TD><TD>                        CodedStreamCreator codedStreamCreator = new CodedStreamCreator();</TD></TR><TR CLASS="z"><TD CLASS="l">2042</TD><TD>                        Reader reader = new DocumentReader(structuredDocument);</TD></TR><TR CLASS="z"><TD CLASS="l">2043</TD><TD>                        codedStreamCreator.set(iFile, reader);</TD></TR><TR CLASS="z"><TD CLASS="l">2044</TD><TD>                        codedStreamCreator.setPreviousEncodingMemento(structuredDocument.getEncodingMemento());</TD></TR><TR CLASS="z"><TD CLASS="l">2045</TD><TD>                        EncodingMemento encodingMemento = codedStreamCreator.getCurrentEncodingMemento();</TD></TR><TR><TD CLASS="l">2046</TD><TD> </TD></TR><TR><TD CLASS="l">2047</TD><TD>                        // be sure document's is updated, in case exception is thrown in</TD></TR><TR><TD CLASS="l">2048</TD><TD>                        // getCodedByteArrayOutputStream</TD></TR><TR CLASS="z"><TD CLASS="l">2049</TD><TD>                        structuredDocument.setEncodingMemento(encodingMemento);</TD></TR><TR><TD CLASS="l">2050</TD><TD> </TD></TR><TR><TD CLASS="l">2051</TD><TD>                        // Convert line delimiters after encoding memento is figured out,</TD></TR><TR><TD CLASS="l">2052</TD><TD>                        // but</TD></TR><TR><TD CLASS="l">2053</TD><TD>                        // before writing to output stream.</TD></TR><TR CLASS="z"><TD CLASS="l">2054</TD><TD>                        handleConvertLineDelimiters(structuredDocument, iFile, encodingRule, encodingMemento);</TD></TR><TR><TD CLASS="l">2055</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">2056</TD><TD>                        ByteArrayOutputStream codedByteStream = codedStreamCreator.getCodedByteArrayOutputStream(encodingRule);</TD></TR><TR CLASS="z"><TD CLASS="l">2057</TD><TD>                        InputStream codedStream = new ByteArrayInputStream(codedByteStream.toByteArray());</TD></TR><TR CLASS="z"><TD CLASS="l">2058</TD><TD>                        if (iFile.exists())</TD></TR><TR CLASS="z"><TD CLASS="l">2059</TD><TD>                                iFile.setContents(codedStream, true, true, null);</TD></TR><TR><TD CLASS="l">2060</TD><TD>                        else</TD></TR><TR CLASS="z"><TD CLASS="l">2061</TD><TD>                                iFile.create(codedStream, false, null);</TD></TR><TR CLASS="z"><TD CLASS="l">2062</TD><TD>                        codedByteStream.close();</TD></TR><TR CLASS="z"><TD CLASS="l">2063</TD><TD>                        codedStream.close();</TD></TR><TR><TD CLASS="l">2064</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2065</TD><TD>        }</TD></TR><TR><TD CLASS="l">2066</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="40">2067</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">2068</TD><TD>         * Common trace method</TD></TR><TR><TD CLASS="l">2069</TD><TD>         */</TD></TR><TR><TD CLASS="l">2070</TD><TD>        private void trace(String msg, Object id) {</TD></TR><TR CLASS="z"><TD CLASS="l">2071</TD><TD>                if (Logger.DEBUG_MODELMANAGER) {</TD></TR><TR CLASS="z"><TD CLASS="l">2072</TD><TD>                        Logger.log(Logger.INFO, msg + &#34; &#34; + Utilities.makeShortId(id)); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">2073</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2074</TD><TD>        }</TD></TR><TR><TD CLASS="l">2075</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="41">2076</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">2077</TD><TD>         * Common trace method</TD></TR><TR><TD CLASS="l">2078</TD><TD>         */</TD></TR><TR><TD CLASS="l">2079</TD><TD>        private void trace(String msg, Object id, int value) {</TD></TR><TR CLASS="z"><TD CLASS="l">2080</TD><TD>                if (Logger.DEBUG_MODELMANAGER) {</TD></TR><TR CLASS="z"><TD CLASS="l">2081</TD><TD>                        Logger.log(Logger.INFO, msg + Utilities.makeShortId(id) + &#34; (&#34; + value + &#34;)&#34;); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$</TD></TR><TR><TD CLASS="l"><A NAME="51">2082</A></TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">2083</TD><TD>        }</TD></TR><TR><TD CLASS="l">2084</TD><TD> </TD></TR><TR><TD CLASS="l">2085</TD><TD>         boolean isIdInUse(String newId) {</TD></TR><TR CLASS="c"><TD CLASS="l">2086</TD><TD>                        boolean inUse = false;</TD></TR><TR CLASS="c"><TD CLASS="l">2087</TD><TD>                        SYNC.acquire();</TD></TR><TR CLASS="c"><TD CLASS="l">2088</TD><TD>                        SharedObject object =(SharedObject) fManagedObjects.get(newId);</TD></TR><TR CLASS="c"><TD CLASS="l">2089</TD><TD>                        if (object!=null) {</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="71% line coverage (5 out of 7 instructions)">2090</TD><TD TITLE="71% line coverage (5 out of 7 instructions)">                                inUse = object.theSharedModel!=null;</TD></TR><TR><TD CLASS="l">2091</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">2092</TD><TD>                        SYNC.release();</TD></TR><TR CLASS="c"><TD CLASS="l">2093</TD><TD>                        return inUse;</TD></TR><TR><TD CLASS="l">2094</TD><TD>                }</TD></TR><TR><TD CLASS="l">2095</TD><TD>}</TD></TR></TABLE><P></P><TABLE CLASS="hdft" CELLSPACING="0" WIDTH="100%"><TR><TD CLASS="nv">[<A HREF="../xslUnitTestCoverage.html">all classes</A>][<A HREF="96.html">org.eclipse.wst.sse.core.internal.model</A>]</TD></TR><TR><TD CLASS="tl"><A HREF="http://www.eclemma.org/support.html">EMMA 2.0.5312 EclEmma Fix 1</A> (C) Vladimir Roubtsov</TD></TR></TABLE></BODY></HTML>