blob: b9cb69ec42e93036ce45897a380da997aa84479d [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">AbstractStructuredModel.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>AbstractStructuredModel.java</TD><TD>100% (3/3)</TD><TD CLASS="h">41%  (42/102)</TD><TD CLASS="h">35%  (570/1646)</TD><TD CLASS="h">38%  (181.6/475)</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">AbstractStructuredModel$DirtyStateWatcher</A></TD><TD>100% (1/1)</TD><TD CLASS="h">17%  (1/6)</TD><TD CLASS="h">10%  (6/62)</TD><TD CLASS="h">6%   (1/16)</TD></TR><TR><TD CLASS="f"><A HREF="#1">newModel (NewDocumentEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2">noChange (NoChangeEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#3">nodesReplaced (StructuredDocumentRegionsReplacedEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/16)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4">regionChanged (RegionChangedEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/16)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR><TD CLASS="f"><A HREF="#5">regionsReplaced (RegionsReplacedEvent): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/16)</TD><TD CLASS="h">0%   (0/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#0">AbstractStructuredModel$DirtyStateWatcher (AbstractStructuredModel): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (6/6)</TD><TD>100% (1/1)</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="#7">AbstractStructuredModel$DocumentToModelNotifier</A></TD><TD>100% (1/1)</TD><TD CLASS="h">14%  (1/7)</TD><TD CLASS="h">11%  (6/54)</TD><TD CLASS="h">5%   (1/19)</TD></TR><TR><TD CLASS="f"><A HREF="#8">modelAboutToBeChanged (AboutToBeChangedEvent): 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 CLASS="o"><TD CLASS="f"><A HREF="#9">newModel (NewDocumentEvent): 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="#a">noChange (NoChangeEvent): 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 CLASS="o"><TD CLASS="f"><A HREF="#b">nodesReplaced (StructuredDocumentRegionsReplacedEvent): 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="#c">regionChanged (RegionChangedEvent): 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 CLASS="o"><TD CLASS="f"><A HREF="#d">regionsReplaced (RegionsReplacedEvent): 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="#7">AbstractStructuredModel$DocumentToModelNotifier (AbstractStructuredModel): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (6/6)</TD><TD>100% (1/1)</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="#f">AbstractStructuredModel</A></TD><TD>100% (1/1)</TD><TD CLASS="h">45%  (40/89)</TD><TD CLASS="h">36%  (558/1530)</TD><TD CLASS="h">41%  (179.6/440)</TD></TR><TR><TD CLASS="f"><A HREF="#10">aboutToReinitializeModel (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#11">beginRecording (Object): 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="#12">beginRecording (Object, String): 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 CLASS="o"><TD CLASS="f"><A HREF="#13">beginRecording (Object, String, String): void</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="#14">beginRecording (Object, String, String, int, int): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/12)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#15">beginRecording (Object, String, int, int): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/8)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#16">beginRecording (Object, int, int): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/8)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#17">copy (String): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/24)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR><TD CLASS="f"><A HREF="#18">disableUndoManagement (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#19">enableUndoManagement (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#1a">endRecording (Object): 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 CLASS="o"><TD CLASS="f"><A HREF="#1b">endRecording (Object, int, int): void</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="#1c">fireModelAboutToBeReinitialized (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/37)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1d">fireModelDirtyStateChanged (IStructuredModel, boolean): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/36)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR><TD CLASS="f"><A HREF="#1e">fireModelReinitialized (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/37)</TD><TD CLASS="h">0%   (0/8)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#1f">fireModelResourceDeleted (IStructuredModel): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/35)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR><TD CLASS="f"><A HREF="#20">fireModelResourceMoved (IStructuredModel, IStructuredModel): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/36)</TD><TD CLASS="h">0%   (0/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#21">getAdapter (Class): Object</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><TD CLASS="f"><A HREF="#22">getModelHandler (): IModelHandler</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#23">getReferenceCount (): int</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#24">getReferenceCountForEdit (): int</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#25">getReferenceCountForRead (): int</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#26">getReinitializeStateData (): Object</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#27">getSynchronizationStamp (): long</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#28">getUndoManager (): IStructuredTextUndoManager</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/15)</TD><TD CLASS="h">0%   (0/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#29">initId (String): 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><TD CLASS="f"><A HREF="#2a">isDirty (): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2b">isModelStateChanging (): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/7)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR><TD CLASS="f"><A HREF="#2c">isNew (): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2d">isSaveNeeded (): boolean</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="#2e">isSharedForEdit (): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#2f">isSharedForRead (): boolean</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/11)</TD><TD CLASS="h">0%   (0/3)</TD></TR><TR><TD CLASS="f"><A HREF="#30">modelReinitialized (): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/3)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#31">newInstance (): IStructuredModel</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="#32">reinit (): IStructuredModel</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/40)</TD><TD CLASS="h">0%   (0/14)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#33">reload (InputStream): 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><TD CLASS="f"><A HREF="#34">resourceDeleted (): 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="#35">resourceMoved (IStructuredModel): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/5)</TD><TD CLASS="h">0%   (0/2)</TD></TR><TR><TD CLASS="f"><A HREF="#36">save (): void</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 CLASS="o"><TD CLASS="f"><A HREF="#37">save (EncodingRule): void</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="#38">save (IFile): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/40)</TD><TD CLASS="h">0%   (0/11)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#39">save (IFile, EncodingRule): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/40)</TD><TD CLASS="h">0%   (0/11)</TD></TR><TR><TD CLASS="f"><A HREF="#3a">save (OutputStream): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/40)</TD><TD CLASS="h">0%   (0/11)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#3b">setDirtyState (boolean): void</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><TD CLASS="f"><A HREF="#3c">setFactoryRegistry (FactoryRegistry): 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="#3d">setModelManager (IModelManager): 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><TD CLASS="f"><A HREF="#3e">setReinitializeNeeded (boolean): 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="#3f">setReinitializeStateData (Object): 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><TD CLASS="f"><A HREF="#40">setUndoManager (IStructuredTextUndoManager): void</A></TD><TD> </TD><TD CLASS="h">0%   (0/1)</TD><TD CLASS="h">0%   (0/14)</TD><TD CLASS="h">0%   (0/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#41">fireModelChanged (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">16%  (4/25)</TD><TD CLASS="h">29%  (2/7)</TD></TR><TR><TD CLASS="f"><A HREF="#42">fireModelAboutToBeChanged (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">19%  (4/21)</TD><TD CLASS="h">40%  (2/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#43">beginLock (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">37%  (18/49)</TD><TD CLASS="h">60%  (6.6/11)</TD></TR><TR><TD CLASS="f"><A HREF="#44">internalModelChanged (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">46%  (19/41)</TD><TD CLASS="h">64%  (7/11)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#45">endLock (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">47%  (9/19)</TD><TD>80%  (4/5)</TD></TR><TR><TD CLASS="f"><A HREF="#46">internalAboutToBeChanged (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">49%  (20/41)</TD><TD CLASS="h">67%  (7.4/11)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#47">setId (String): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">59%  (37/63)</TD><TD CLASS="h">70%  (12.6/18)</TD></TR><TR><TD CLASS="f"><A HREF="#48">getContentTypeIdentifier (): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">60%  (6/10)</TD><TD CLASS="h">67%  (2/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#49">setModelHandler (IModelHandler): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">68%  (13/19)</TD><TD CLASS="h">67%  (6/9)</TD></TR><TR><TD CLASS="f"><A HREF="#4a">addModelStateListener (IModelStateListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">73%  (38/52)</TD><TD>82%  (9.8/12)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4b">changedModel (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">75%  (9/12)</TD><TD CLASS="h">75%  (3/4)</TD></TR><TR><TD CLASS="f"><A HREF="#4c">isModelChangeStateOnVergeOfEnding (): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">75%  (6/8)</TD><TD CLASS="h">75%  (0.8/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4d">removeModelStateListener (IModelStateListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD CLASS="h">79%  (48/61)</TD><TD CLASS="h">79%  (11.8/15)</TD></TR><TR><TD CLASS="f"><A HREF="#4e">removeModelLifecycleListener (IModelLifecycleListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>80%  (16/20)</TD><TD CLASS="h">76%  (3.8/5)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#4f">releaseFromEdit (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>81%  (21/26)</TD><TD>89%  (8/9)</TD></TR><TR><TD CLASS="f"><A HREF="#50">releaseFromRead (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>81%  (21/26)</TD><TD>89%  (8/9)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#51">isShared (): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>82%  (9/11)</TD><TD CLASS="h">67%  (2/3)</TD></TR><TR><TD CLASS="f"><A HREF="#52">computeModificationStamp (IResource): long</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>83%  (19/23)</TD><TD CLASS="h">78%  (7/9)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#53">addModelLifecycleListener (IModelLifecycleListener): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>88%  (21/24)</TD><TD>97%  (4.8/5)</TD></TR><TR><TD CLASS="f"><A HREF="#f">AbstractStructuredModel (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (25/25)</TD><TD>100% (7/7)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#55">_getModelManager (): ModelManagerImpl</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (10/10)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="f"><A HREF="#56">aboutToChangeModel (): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#57">getBaseLocation (): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (1/1)</TD></TR><TR><TD CLASS="f"><A HREF="#58">getFactoryRegistry (): FactoryRegistry</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (11/11)</TD><TD>100% (3/3)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#59">getId (): String</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (1/1)</TD></TR><TR><TD CLASS="f"><A HREF="#5a">getLockObjectFromDocument (): ILock</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (16/16)</TD><TD>100% (6/6)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#5b">getModelManager (): IModelManager</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (1/1)</TD></TR><TR><TD CLASS="f"><A HREF="#5c">getResolver (): URIResolver</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#5d">getStructuredDocument (): IStructuredDocument</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (7/7)</TD><TD>100% (3/3)</TD></TR><TR><TD CLASS="f"><A HREF="#5e">isReinitializationNeeded (): boolean</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (3/3)</TD><TD>100% (1/1)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#5f">resetSynchronizationStamp (IResource): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (6/6)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#60">setBaseLocation (String): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#61">setContentTypeIdentifier (String): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#62">setNewState (boolean): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#63">setResolver (URIResolver): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#64">setStructuredDocument (IStructuredDocument): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (72/72)</TD><TD>100% (18/18)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#65">setSynchronizationStamp (long): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (4/4)</TD><TD>100% (2/2)</TD></TR><TR><TD CLASS="f"><A HREF="#66">signalLifecycleEvent (ModelLifecycleEvent): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (9/9)</TD><TD>100% (4/4)</TD></TR><TR CLASS="o"><TD CLASS="f"><A HREF="#67">signalPostLifeCycleListenerRelease (IStructuredModel): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (13/13)</TD><TD>100% (4/4)</TD></TR><TR><TD CLASS="f"><A HREF="#68">signalPreLifeCycleEventRelease (IStructuredModel): void</A></TD><TD> </TD><TD>100% (1/1)</TD><TD>100% (13/13)</TD><TD>100% (4/4)</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, 2008 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.File;</TD></TR><TR><TD CLASS="l">16</TD><TD>import java.io.IOException;</TD></TR><TR><TD CLASS="l">17</TD><TD>import java.io.InputStream;</TD></TR><TR><TD CLASS="l">18</TD><TD>import java.io.OutputStream;</TD></TR><TR><TD CLASS="l">19</TD><TD>import java.io.UnsupportedEncodingException;</TD></TR><TR><TD CLASS="l">20</TD><TD> </TD></TR><TR><TD CLASS="l">21</TD><TD>import org.eclipse.core.resources.IFile;</TD></TR><TR><TD CLASS="l">22</TD><TD>import org.eclipse.core.resources.IResource;</TD></TR><TR><TD CLASS="l">23</TD><TD>import org.eclipse.core.runtime.CoreException;</TD></TR><TR><TD CLASS="l">24</TD><TD>import org.eclipse.core.runtime.IPath;</TD></TR><TR><TD CLASS="l">25</TD><TD>import org.eclipse.core.runtime.Platform;</TD></TR><TR><TD CLASS="l">26</TD><TD>import org.eclipse.core.runtime.jobs.ILock;</TD></TR><TR><TD CLASS="l">27</TD><TD>import org.eclipse.wst.sse.core.StructuredModelManager;</TD></TR><TR><TD CLASS="l">28</TD><TD>import org.eclipse.wst.sse.core.internal.ILockable;</TD></TR><TR><TD CLASS="l">29</TD><TD>import org.eclipse.wst.sse.core.internal.Logger;</TD></TR><TR><TD CLASS="l">30</TD><TD>import org.eclipse.wst.sse.core.internal.SSECoreMessages;</TD></TR><TR><TD CLASS="l">31</TD><TD>import org.eclipse.wst.sse.core.internal.encoding.EncodingRule;</TD></TR><TR><TD CLASS="l">32</TD><TD>import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler;</TD></TR><TR><TD CLASS="l">33</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.DocumentChanged;</TD></TR><TR><TD CLASS="l">34</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener;</TD></TR><TR><TD CLASS="l">35</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.IModelManager;</TD></TR><TR><TD CLASS="l">36</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;</TD></TR><TR><TD CLASS="l">37</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;</TD></TR><TR><TD CLASS="l">38</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;</TD></TR><TR><TD CLASS="l">39</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.AboutToBeChangedEvent;</TD></TR><TR><TD CLASS="l">40</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.IModelAboutToBeChangedListener;</TD></TR><TR><TD CLASS="l">41</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.IStructuredDocumentListener;</TD></TR><TR><TD CLASS="l">42</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.NewDocumentEvent;</TD></TR><TR><TD CLASS="l">43</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.NoChangeEvent;</TD></TR><TR><TD CLASS="l">44</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.RegionChangedEvent;</TD></TR><TR><TD CLASS="l">45</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.RegionsReplacedEvent;</TD></TR><TR><TD CLASS="l">46</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.events.StructuredDocumentRegionsReplacedEvent;</TD></TR><TR><TD CLASS="l">47</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.exceptions.ResourceInUse;</TD></TR><TR><TD CLASS="l">48</TD><TD>import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;</TD></TR><TR><TD CLASS="l">49</TD><TD>import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;</TD></TR><TR><TD CLASS="l">50</TD><TD>import org.eclipse.wst.sse.core.internal.util.URIResolver;</TD></TR><TR><TD CLASS="l">51</TD><TD>import org.eclipse.wst.sse.core.internal.util.Utilities;</TD></TR><TR><TD CLASS="l">52</TD><TD> </TD></TR><TR><TD CLASS="l">53</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="0">54</A></TD><TD>public abstract class AbstractStructuredModel implements IStructuredModel {</TD></TR><TR><TD CLASS="l">55</TD><TD> </TD></TR><TR><TD CLASS="l">56</TD><TD>        private static final String MODEL_MANAGER_NULL = &#34;Warning: AbstractStructuredModel::close:  model manager was null during a close of a model (which should be impossible)&#34;; //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">57</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">58</TD><TD>        class DirtyStateWatcher implements IStructuredDocumentListener {</TD></TR><TR><TD CLASS="l">59</TD><TD> </TD></TR><TR><TD CLASS="l">60</TD><TD>                public void newModel(NewDocumentEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l">61</TD><TD> </TD></TR><TR><TD CLASS="l">62</TD><TD>                        // I don't think its safe to assume a new model</TD></TR><TR><TD CLASS="l"><A NAME="1">63</A></TD><TD>                        // is always &#34;fresh&#34;, so we'll leave dirty state</TD></TR><TR><TD CLASS="l">64</TD><TD>                        // unchanged;</TD></TR><TR><TD CLASS="l">65</TD><TD>                        // but we'll tell everyone about it.</TD></TR><TR CLASS="z"><TD CLASS="l">66</TD><TD>                        setDirtyState(fDirtyState);</TD></TR><TR CLASS="z"><TD CLASS="l">67</TD><TD>                }</TD></TR><TR><TD CLASS="l"><A NAME="2">68</A></TD><TD> </TD></TR><TR><TD CLASS="l">69</TD><TD>                public void noChange(NoChangeEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l">70</TD><TD> </TD></TR><TR><TD CLASS="l">71</TD><TD>                        // don't change dirty state</TD></TR><TR CLASS="z"><TD CLASS="l">72</TD><TD>                }</TD></TR><TR><TD CLASS="l">73</TD><TD> </TD></TR><TR><TD CLASS="l">74</TD><TD>                public void nodesReplaced(StructuredDocumentRegionsReplacedEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l">75</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">76</TD><TD>                        setDirtyState(true);</TD></TR><TR><TD CLASS="l"><A NAME="3">77</A></TD><TD>                        // no need to listen any more</TD></TR><TR CLASS="z"><TD CLASS="l">78</TD><TD>                        if (fStructuredDocument != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">79</TD><TD>                                fStructuredDocument.removeDocumentChangedListener(fDirtyStateWatcher);</TD></TR><TR><TD CLASS="l">80</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">81</TD><TD>                }</TD></TR><TR><TD CLASS="l">82</TD><TD> </TD></TR><TR><TD CLASS="l">83</TD><TD>                public void regionChanged(RegionChangedEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l">84</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">85</TD><TD>                        setDirtyState(true);</TD></TR><TR><TD CLASS="l"><A NAME="4">86</A></TD><TD>                        // no need to listen any more</TD></TR><TR CLASS="z"><TD CLASS="l">87</TD><TD>                        if (fStructuredDocument != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">88</TD><TD>                                fStructuredDocument.removeDocumentChangedListener(fDirtyStateWatcher);</TD></TR><TR><TD CLASS="l">89</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">90</TD><TD>                }</TD></TR><TR><TD CLASS="l">91</TD><TD> </TD></TR><TR><TD CLASS="l">92</TD><TD>                public void regionsReplaced(RegionsReplacedEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l">93</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">94</TD><TD>                        setDirtyState(true);</TD></TR><TR><TD CLASS="l"><A NAME="5">95</A></TD><TD>                        // no need to listen any more</TD></TR><TR CLASS="z"><TD CLASS="l">96</TD><TD>                        if (fStructuredDocument != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">97</TD><TD>                                fStructuredDocument.removeDocumentChangedListener(fDirtyStateWatcher);</TD></TR><TR><TD CLASS="l"><A NAME="7">98</A></TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">99</TD><TD>                }</TD></TR><TR><TD CLASS="l">100</TD><TD>        }</TD></TR><TR><TD CLASS="l">101</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">102</TD><TD>        class DocumentToModelNotifier implements IStructuredDocumentListener, IModelAboutToBeChangedListener {</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>                 * (non-Javadoc)</TD></TR><TR><TD CLASS="l">106</TD><TD>                 * </TD></TR><TR><TD CLASS="l">107</TD><TD>                 * @see org.eclipse.wst.sse.core.events.IModelAboutToBeChangedListener#modelAboutToBeChanged(org.eclipse.wst.sse.core.events.AboutToBeChangedEvent)</TD></TR><TR><TD CLASS="l">108</TD><TD>                 */</TD></TR><TR><TD CLASS="l">109</TD><TD>                public void modelAboutToBeChanged(AboutToBeChangedEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l"><A NAME="8">110</A></TD><TD>                        // If we didn't originate the change, take note we are about to</TD></TR><TR><TD CLASS="l">111</TD><TD>                        // change based on our underlying document changing.</TD></TR><TR><TD CLASS="l">112</TD><TD>                        // If we did originate the change, we, or client, should have</TD></TR><TR><TD CLASS="l">113</TD><TD>                        // already called aboutToChangeModel.</TD></TR><TR CLASS="z"><TD CLASS="l">114</TD><TD>                        if (structuredDocumentEvent.getOriginalRequester() != this) {</TD></TR><TR CLASS="z"><TD CLASS="l">115</TD><TD>                                aboutToChangeModel();</TD></TR><TR><TD CLASS="l">116</TD><TD>                        }</TD></TR><TR><TD CLASS="l">117</TD><TD> </TD></TR><TR CLASS="z"><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>                 * (non-Javadoc)</TD></TR><TR><TD CLASS="l">122</TD><TD>                 * </TD></TR><TR><TD CLASS="l"><A NAME="9">123</A></TD><TD>                 * @see org.eclipse.wst.sse.core.events.IStructuredDocumentListener#newModel(org.eclipse.wst.sse.core.events.NewDocumentEvent)</TD></TR><TR><TD CLASS="l">124</TD><TD>                 */</TD></TR><TR><TD CLASS="l">125</TD><TD>                public void newModel(NewDocumentEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l">126</TD><TD>                        // if we didn't originate the change, take note we have changed</TD></TR><TR CLASS="z"><TD CLASS="l">127</TD><TD>                        if (structuredDocumentEvent.getOriginalRequester() != this) {</TD></TR><TR CLASS="z"><TD CLASS="l">128</TD><TD>                                changedModel();</TD></TR><TR><TD CLASS="l">129</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">130</TD><TD>                }</TD></TR><TR><TD CLASS="l">131</TD><TD> </TD></TR><TR><TD CLASS="l">132</TD><TD>                /*</TD></TR><TR><TD CLASS="l">133</TD><TD>                 * (non-Javadoc)</TD></TR><TR><TD CLASS="l">134</TD><TD>                 * </TD></TR><TR><TD CLASS="l"><A NAME="a">135</A></TD><TD>                 * @see org.eclipse.wst.sse.core.events.IStructuredDocumentListener#noChange(org.eclipse.wst.sse.core.events.NoChangeEvent)</TD></TR><TR><TD CLASS="l">136</TD><TD>                 */</TD></TR><TR><TD CLASS="l">137</TD><TD>                public void noChange(NoChangeEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l">138</TD><TD>                        // if we didn't originate the change, take note we have changed</TD></TR><TR CLASS="z"><TD CLASS="l">139</TD><TD>                        if (structuredDocumentEvent.getOriginalRequester() != this) {</TD></TR><TR CLASS="z"><TD CLASS="l">140</TD><TD>                                changedModel();</TD></TR><TR><TD CLASS="l">141</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">142</TD><TD>                }</TD></TR><TR><TD CLASS="l">143</TD><TD> </TD></TR><TR><TD CLASS="l">144</TD><TD>                /*</TD></TR><TR><TD CLASS="l">145</TD><TD>                 * (non-Javadoc)</TD></TR><TR><TD CLASS="l">146</TD><TD>                 * </TD></TR><TR><TD CLASS="l"><A NAME="b">147</A></TD><TD>                 * @see org.eclipse.wst.sse.core.events.IStructuredDocumentListener#nodesReplaced(org.eclipse.wst.sse.core.events.StructuredDocumentRegionsReplacedEvent)</TD></TR><TR><TD CLASS="l">148</TD><TD>                 */</TD></TR><TR><TD CLASS="l">149</TD><TD>                public void nodesReplaced(StructuredDocumentRegionsReplacedEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l">150</TD><TD>                        // if we didn't originate the change, take note we have changed</TD></TR><TR CLASS="z"><TD CLASS="l">151</TD><TD>                        if (structuredDocumentEvent.getOriginalRequester() != this) {</TD></TR><TR CLASS="z"><TD CLASS="l">152</TD><TD>                                changedModel();</TD></TR><TR><TD CLASS="l">153</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">154</TD><TD>                }</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>                 * (non-Javadoc)</TD></TR><TR><TD CLASS="l">158</TD><TD>                 * </TD></TR><TR><TD CLASS="l"><A NAME="c">159</A></TD><TD>                 * @see org.eclipse.wst.sse.core.events.IStructuredDocumentListener#regionChanged(org.eclipse.wst.sse.core.events.RegionChangedEvent)</TD></TR><TR><TD CLASS="l">160</TD><TD>                 */</TD></TR><TR><TD CLASS="l">161</TD><TD>                public void regionChanged(RegionChangedEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l">162</TD><TD>                        // if we didn't originate the change, take note we have changed</TD></TR><TR CLASS="z"><TD CLASS="l">163</TD><TD>                        if (structuredDocumentEvent.getOriginalRequester() != this) {</TD></TR><TR CLASS="z"><TD CLASS="l">164</TD><TD>                                changedModel();</TD></TR><TR><TD CLASS="l">165</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">166</TD><TD>                }</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>                 * (non-Javadoc)</TD></TR><TR><TD CLASS="l">170</TD><TD>                 * </TD></TR><TR><TD CLASS="l"><A NAME="d">171</A></TD><TD>                 * @see org.eclipse.wst.sse.core.events.IStructuredDocumentListener#regionsReplaced(org.eclipse.wst.sse.core.events.RegionsReplacedEvent)</TD></TR><TR><TD CLASS="l">172</TD><TD>                 */</TD></TR><TR><TD CLASS="l">173</TD><TD>                public void regionsReplaced(RegionsReplacedEvent structuredDocumentEvent) {</TD></TR><TR><TD CLASS="l">174</TD><TD>                        // if we didn't originate the change, take note we have changed</TD></TR><TR CLASS="z"><TD CLASS="l">175</TD><TD>                        if (structuredDocumentEvent.getOriginalRequester() != this) {</TD></TR><TR CLASS="z"><TD CLASS="l">176</TD><TD>                                changedModel();</TD></TR><TR><TD CLASS="l">177</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">178</TD><TD>                }</TD></TR><TR><TD CLASS="l">179</TD><TD> </TD></TR><TR><TD CLASS="l">180</TD><TD>        }</TD></TR><TR><TD CLASS="l">181</TD><TD> </TD></TR><TR><TD CLASS="l">182</TD><TD>        private FactoryRegistry factoryRegistry;</TD></TR><TR><TD CLASS="l">183</TD><TD>        private String fBaseLocation;</TD></TR><TR><TD CLASS="l">184</TD><TD>        boolean fDirtyState;</TD></TR><TR><TD CLASS="l">185</TD><TD>        DirtyStateWatcher fDirtyStateWatcher;</TD></TR><TR><TD CLASS="l">186</TD><TD>        DocumentToModelNotifier fDocumentToModelNotifier;</TD></TR><TR><TD CLASS="l">187</TD><TD>        private String fExplicitContentTypeIdentifier;</TD></TR><TR><TD CLASS="l">188</TD><TD>        private String fId;</TD></TR><TR><TD CLASS="l">189</TD><TD> </TD></TR><TR><TD CLASS="l">190</TD><TD>        private LifecycleNotificationManager fLifecycleNotificationManager;</TD></TR><TR><TD CLASS="l">191</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">192</TD><TD>        private final Object fListenerLock = new byte[0];</TD></TR><TR><TD CLASS="l">193</TD><TD>        protected ILock fLockObject;</TD></TR><TR><TD CLASS="l">194</TD><TD>        // private String fLineDelimiter;</TD></TR><TR><TD CLASS="l">195</TD><TD>        // private Object fType;</TD></TR><TR><TD CLASS="l">196</TD><TD>        private IModelHandler fModelHandler;</TD></TR><TR><TD CLASS="l">197</TD><TD>        // issue: we should not &#34;hold on&#34; to model manager, can </TD></TR><TR><TD CLASS="l">198</TD><TD>        // easily get with StructuredModelManager.getModelManager();</TD></TR><TR><TD CLASS="l">199</TD><TD>        // but will need to add more null checks.</TD></TR><TR><TD CLASS="l">200</TD><TD>        private IModelManager fModelManager;</TD></TR><TR><TD CLASS="l">201</TD><TD>        private int fModelStateChanging;</TD></TR><TR><TD CLASS="l">202</TD><TD>        private Object[] fModelStateListeners;</TD></TR><TR CLASS="c"><TD CLASS="l">203</TD><TD>        private boolean fNewState = false;</TD></TR><TR><TD CLASS="l">204</TD><TD>        private URIResolver fResolver;</TD></TR><TR><TD CLASS="l">205</TD><TD>        protected IStructuredDocument fStructuredDocument;</TD></TR><TR><TD CLASS="l">206</TD><TD>        /**</TD></TR><TR><TD CLASS="l">207</TD><TD>         * The time stamp of the underlying resource's modification date, at the</TD></TR><TR><TD CLASS="l">208</TD><TD>         * time this model was created, or the last time it was saved. Note: for</TD></TR><TR><TD CLASS="l">209</TD><TD>         * this version, this variable is not set automatically, be needs to be</TD></TR><TR><TD CLASS="l">210</TD><TD>         * managed by client. The FileModelProvider does this for most cases, but</TD></TR><TR><TD CLASS="l">211</TD><TD>         * if client do not use FileModelProvider, they must set this variable</TD></TR><TR><TD CLASS="l">212</TD><TD>         */</TD></TR><TR CLASS="c"><TD CLASS="l">213</TD><TD>        public long fSynchronizationStamp = IResource.NULL_STAMP;</TD></TR><TR><TD CLASS="l">214</TD><TD>        private boolean reinitializationNeeded;</TD></TR><TR><TD CLASS="l">215</TD><TD>        private Object reinitializeStateData;</TD></TR><TR><TD CLASS="l">216</TD><TD> </TD></TR><TR><TD CLASS="l">217</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="f">218</A></TD><TD>         * AbstractStructuredModel constructor comment.</TD></TR><TR><TD CLASS="l">219</TD><TD>         */</TD></TR><TR><TD CLASS="l">220</TD><TD>        public AbstractStructuredModel() {</TD></TR><TR><TD CLASS="l">221</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">222</TD><TD>                super();</TD></TR><TR CLASS="c"><TD CLASS="l">223</TD><TD>                fDirtyStateWatcher = new DirtyStateWatcher();</TD></TR><TR CLASS="c"><TD CLASS="l">224</TD><TD>                fDocumentToModelNotifier = new DocumentToModelNotifier();</TD></TR><TR CLASS="c"><TD CLASS="l">225</TD><TD>        }</TD></TR><TR><TD CLASS="l">226</TD><TD> </TD></TR><TR><TD CLASS="l">227</TD><TD> </TD></TR><TR><TD CLASS="l">228</TD><TD>        /**</TD></TR><TR><TD CLASS="l">229</TD><TD>         * This method is just for getting an instance of the model manager of the</TD></TR><TR><TD CLASS="l">230</TD><TD>         * right Impl type, to be used &#34;internally&#34; for making protected calls</TD></TR><TR><TD CLASS="l"><A NAME="55">231</A></TD><TD>         * directly to the impl class.</TD></TR><TR><TD CLASS="l">232</TD><TD>         */</TD></TR><TR><TD CLASS="l">233</TD><TD>        private ModelManagerImpl _getModelManager() {</TD></TR><TR><TD CLASS="l">234</TD><TD>                // TODO_future: redesign so we don't need this 'Impl' version</TD></TR><TR CLASS="c"><TD CLASS="l">235</TD><TD>                if (fModelManager == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">236</TD><TD>                        fModelManager = StructuredModelManager.getModelManager();</TD></TR><TR><TD CLASS="l">237</TD><TD>                }</TD></TR><TR><TD CLASS="l">238</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">239</TD><TD>                return (ModelManagerImpl) fModelManager;</TD></TR><TR><TD CLASS="l">240</TD><TD>        }</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>         * This API allows clients to declare that they are about to make a</TD></TR><TR><TD CLASS="l">244</TD><TD>         * &#34;large&#34; change to the model. This change might be in terms of content</TD></TR><TR><TD CLASS="l">245</TD><TD>         * or it might be in terms of the model id or base location. Note that in</TD></TR><TR><TD CLASS="l">246</TD><TD>         * the case of embedded calls, notification to listeners is sent only</TD></TR><TR><TD CLASS="l">247</TD><TD>         * once. Note that the client who is making these changes has the</TD></TR><TR><TD CLASS="l">248</TD><TD>         * responsibility to restore the models state once finished with the</TD></TR><TR><TD CLASS="l">249</TD><TD>         * changes. See getMemento and restoreState. The method</TD></TR><TR><TD CLASS="l">250</TD><TD>         * isModelStateChanging can be used by a client to determine if the model</TD></TR><TR><TD CLASS="l">251</TD><TD>         * is already in a change sequence.</TD></TR><TR><TD CLASS="l">252</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="56">253</A></TD><TD>        public void aboutToChangeModel() {</TD></TR><TR><TD CLASS="l">254</TD><TD> </TD></TR><TR><TD CLASS="l">255</TD><TD> </TD></TR><TR><TD CLASS="l">256</TD><TD>                // notice this is just a public avenue to our protected method</TD></TR><TR CLASS="c"><TD CLASS="l">257</TD><TD>                internalAboutToBeChanged();</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">260</TD><TD> </TD></TR><TR><TD CLASS="l">261</TD><TD>        public void aboutToReinitializeModel() {</TD></TR><TR><TD CLASS="l"><A NAME="10">262</A></TD><TD> </TD></TR><TR><TD CLASS="l">263</TD><TD> </TD></TR><TR><TD CLASS="l">264</TD><TD> </TD></TR><TR><TD CLASS="l">265</TD><TD>                // notice this is just a public avenue to our protected method</TD></TR><TR CLASS="z"><TD CLASS="l">266</TD><TD>                fireModelAboutToBeReinitialized();</TD></TR><TR CLASS="z"><TD CLASS="l">267</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="53">268</A></TD><TD> </TD></TR><TR><TD CLASS="l">269</TD><TD> </TD></TR><TR><TD CLASS="l">270</TD><TD>        public void addModelLifecycleListener(IModelLifecycleListener listener) {</TD></TR><TR><TD CLASS="l">271</TD><TD> </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="83% line coverage (15 out of 18 instructions)">272</TD><TD TITLE="83% line coverage (15 out of 18 instructions)">                synchronized (fListenerLock) {</TD></TR><TR CLASS="c"><TD CLASS="l">273</TD><TD>                        if (fLifecycleNotificationManager == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">274</TD><TD>                                fLifecycleNotificationManager = new LifecycleNotificationManager();</TD></TR><TR><TD CLASS="l">275</TD><TD>                        }</TD></TR><TR CLASS="c"><TD CLASS="l">276</TD><TD>                        fLifecycleNotificationManager.addListener(listener);</TD></TR><TR><TD CLASS="l">277</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="4a">278</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">279</TD><TD> </TD></TR><TR><TD CLASS="l">280</TD><TD>        public void addModelStateListener(IModelStateListener listener) {</TD></TR><TR><TD CLASS="l">281</TD><TD> </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">282</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (fListenerLock) {</TD></TR><TR><TD CLASS="l">283</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">284</TD><TD>                        if (!Utilities.contains(fModelStateListeners, listener)) {</TD></TR><TR CLASS="c"><TD CLASS="l">285</TD><TD>                                int oldSize = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">286</TD><TD>                                if (fModelStateListeners != null) {</TD></TR><TR><TD CLASS="l">287</TD><TD>                                        // normally won't be null, but we need to be sure, for</TD></TR><TR><TD CLASS="l">288</TD><TD>                                        // first</TD></TR><TR><TD CLASS="l">289</TD><TD>                                        // time through</TD></TR><TR CLASS="z"><TD CLASS="l">290</TD><TD>                                        oldSize = fModelStateListeners.length;</TD></TR><TR><TD CLASS="l">291</TD><TD>                                }</TD></TR><TR CLASS="c"><TD CLASS="l">292</TD><TD>                                int newSize = oldSize + 1;</TD></TR><TR CLASS="c"><TD CLASS="l">293</TD><TD>                                Object[] newListeners = new Object[newSize];</TD></TR><TR CLASS="c"><TD CLASS="l">294</TD><TD>                                if (fModelStateListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">295</TD><TD>                                        System.arraycopy(fModelStateListeners, 0, newListeners, 0, oldSize);</TD></TR><TR><TD CLASS="l">296</TD><TD>                                }</TD></TR><TR><TD CLASS="l">297</TD><TD>                                // add listener to last position</TD></TR><TR CLASS="c"><TD CLASS="l">298</TD><TD>                                newListeners[newSize - 1] = listener;</TD></TR><TR><TD CLASS="l">299</TD><TD>                                //</TD></TR><TR><TD CLASS="l">300</TD><TD>                                // now switch new for old</TD></TR><TR CLASS="c"><TD CLASS="l">301</TD><TD>                                fModelStateListeners = newListeners;</TD></TR><TR><TD CLASS="l">302</TD><TD>                        }</TD></TR><TR><TD CLASS="l">303</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">304</TD><TD>        }</TD></TR><TR><TD CLASS="l">305</TD><TD> </TD></TR><TR><TD CLASS="l">306</TD><TD>        /**</TD></TR><TR><TD CLASS="l">307</TD><TD>         * This lock to lock the small bits of data and operations in the models</TD></TR><TR><TD CLASS="l">308</TD><TD>         * themselfes. this lock is &#34;shared&#34; with document, so, eventually,</TD></TR><TR><TD CLASS="l">309</TD><TD>         * changes can be made safefly from either side.</TD></TR><TR><TD CLASS="l">310</TD><TD>         */</TD></TR><TR><TD CLASS="l">311</TD><TD>        protected final void beginLock() {</TD></TR><TR><TD CLASS="l">312</TD><TD> </TD></TR><TR><TD CLASS="l">313</TD><TD>                // if we get a different lock object</TD></TR><TR><TD CLASS="l"><A NAME="43">314</A></TD><TD>                // than we had before, besure to release</TD></TR><TR><TD CLASS="l">315</TD><TD>                // old one first before losing it.</TD></TR><TR><TD CLASS="l">316</TD><TD>                // ISSUE: this smells like an error condition,</TD></TR><TR><TD CLASS="l">317</TD><TD>                // when would this happen? better to check in set document?</TD></TR><TR CLASS="c"><TD CLASS="l">318</TD><TD>                ILock documentLock = getLockObjectFromDocument();</TD></TR><TR><TD CLASS="l">319</TD><TD> </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="60% line coverage (6 out of 10 instructions)">320</TD><TD TITLE="60% line coverage (6 out of 10 instructions)">                if (fLockObject != null &amp;&amp; fLockObject != documentLock) {</TD></TR><TR CLASS="z"><TD CLASS="l">321</TD><TD>                        fLockObject.release();</TD></TR><TR CLASS="z"><TD CLASS="l">322</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">323</TD><TD>                                Logger.log(Logger.INFO, &#34;Model lock released early&#34; + fLockObject + &#34; apparently document switched?&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">324</TD><TD>                        }</TD></TR><TR><TD CLASS="l">325</TD><TD> </TD></TR><TR><TD CLASS="l">326</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">327</TD><TD>                fLockObject = documentLock;</TD></TR><TR CLASS="c"><TD CLASS="l">328</TD><TD>                if (fLockObject != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">329</TD><TD>                        fLockObject.acquire();</TD></TR><TR CLASS="c"><TD CLASS="l">330</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">331</TD><TD>                                Logger.log(Logger.INFO, &#34;Model lock acquired: &#34; + fLockObject); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">332</TD><TD>                        }</TD></TR><TR><TD CLASS="l">333</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="11">334</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">335</TD><TD> </TD></TR><TR><TD CLASS="l">336</TD><TD>        public void beginRecording(Object requester) {</TD></TR><TR><TD CLASS="l">337</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">338</TD><TD>                beginRecording(requester, null, null);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="16">339</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">340</TD><TD> </TD></TR><TR><TD CLASS="l">341</TD><TD>        public void beginRecording(Object requester, int cursorPosition, int selectionLength) {</TD></TR><TR><TD CLASS="l">342</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">343</TD><TD>                beginRecording(requester, null, null, cursorPosition, selectionLength);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="12">344</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">345</TD><TD> </TD></TR><TR><TD CLASS="l">346</TD><TD>        public void beginRecording(Object requester, String label) {</TD></TR><TR><TD CLASS="l">347</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">348</TD><TD>                beginRecording(requester, label, null);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="15">349</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">350</TD><TD> </TD></TR><TR><TD CLASS="l">351</TD><TD>        public void beginRecording(Object requester, String label, int cursorPosition, int selectionLength) {</TD></TR><TR><TD CLASS="l">352</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">353</TD><TD>                beginRecording(requester, label, null, cursorPosition, selectionLength);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="13">354</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">355</TD><TD> </TD></TR><TR><TD CLASS="l">356</TD><TD>        public void beginRecording(Object requester, String label, String description) {</TD></TR><TR><TD CLASS="l">357</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">358</TD><TD>                if (getUndoManager() != null)</TD></TR><TR CLASS="z"><TD CLASS="l">359</TD><TD>                        getUndoManager().beginRecording(requester, label, description);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="14">360</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">361</TD><TD> </TD></TR><TR><TD CLASS="l">362</TD><TD>        public void beginRecording(Object requester, String label, String description, int cursorPosition, int selectionLength) {</TD></TR><TR><TD CLASS="l">363</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">364</TD><TD>                if (getUndoManager() != null)</TD></TR><TR CLASS="z"><TD CLASS="l">365</TD><TD>                        getUndoManager().beginRecording(requester, label, description, cursorPosition, selectionLength);</TD></TR><TR CLASS="z"><TD CLASS="l">366</TD><TD>        }</TD></TR><TR><TD CLASS="l">367</TD><TD> </TD></TR><TR><TD CLASS="l">368</TD><TD>        /**</TD></TR><TR><TD CLASS="l">369</TD><TD>         * This API allows a client controlled way of notifying all ModelEvent</TD></TR><TR><TD CLASS="l">370</TD><TD>         * listners that the model has been changed. This method is a matched pair</TD></TR><TR><TD CLASS="l">371</TD><TD>         * to aboutToChangeModel, and *must* be called after aboutToChangeModel</TD></TR><TR><TD CLASS="l">372</TD><TD>         * ... or some listeners could be left waiting indefinitely for the</TD></TR><TR><TD CLASS="l">373</TD><TD>         * changed event. So, its suggested that changedModel always be in a</TD></TR><TR><TD CLASS="l">374</TD><TD>         * finally clause. Likewise, a client should never call changedModel</TD></TR><TR><TD CLASS="l">375</TD><TD>         * without calling aboutToChangeModel first. In the case of embedded</TD></TR><TR><TD CLASS="l">376</TD><TD>         * calls, the notification is just sent once.</TD></TR><TR><TD CLASS="l">377</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="4b">378</A></TD><TD>        public void changedModel() {</TD></TR><TR><TD CLASS="l">379</TD><TD> </TD></TR><TR><TD CLASS="l">380</TD><TD> </TD></TR><TR><TD CLASS="l">381</TD><TD>                // notice this is just a public avenue to our protected method</TD></TR><TR CLASS="c"><TD CLASS="l">382</TD><TD>                internalModelChanged();</TD></TR><TR><TD CLASS="l">383</TD><TD>                // also note!</TD></TR><TR><TD CLASS="l">384</TD><TD>                // if we've been &#34;changed&#34; by a client, we might still need</TD></TR><TR><TD CLASS="l">385</TD><TD>                // to be re-initialized, so we'll check and handle that here.</TD></TR><TR><TD CLASS="l">386</TD><TD>                // Note only does this provide a solution to some &#34;missed&#34;</TD></TR><TR><TD CLASS="l">387</TD><TD>                // re-inits, in provides a built in way for clients to</TD></TR><TR><TD CLASS="l">388</TD><TD>                // &#34;force&#34; the model to handle itself, by bracketing any</TD></TR><TR><TD CLASS="l">389</TD><TD>                // changes with aboutToChange and changed, the model itself</TD></TR><TR><TD CLASS="l">390</TD><TD>                // will check. But only call re-init if all other pending</TD></TR><TR><TD CLASS="l">391</TD><TD>                // modelChanged states have been handled.</TD></TR><TR CLASS="c"><TD CLASS="l">392</TD><TD>                if (fModelStateChanging == 0 &amp;&amp; isReinitializationNeeded()) {</TD></TR><TR CLASS="z"><TD CLASS="l">393</TD><TD>                        reinit();</TD></TR><TR><TD CLASS="l">394</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">395</TD><TD>        }</TD></TR><TR><TD CLASS="l">396</TD><TD> </TD></TR><TR><TD CLASS="l">397</TD><TD> </TD></TR><TR><TD CLASS="l">398</TD><TD>        /**</TD></TR><TR><TD CLASS="l">399</TD><TD>         * Based on similar method in FileDocumentProvider. It will provide what</TD></TR><TR><TD CLASS="l">400</TD><TD>         * the modificationStamp would be if resetSynchronzationStamp(resource)</TD></TR><TR><TD CLASS="l">401</TD><TD>         * were used, although for this 'compute' API, no changes to the instance</TD></TR><TR><TD CLASS="l">402</TD><TD>         * are made.</TD></TR><TR><TD CLASS="l"><A NAME="52">403</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">404</TD><TD>        public long computeModificationStamp(IResource resource) {</TD></TR><TR><TD CLASS="l">405</TD><TD> </TD></TR><TR><TD CLASS="l">406</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">407</TD><TD>                long modificationStamp = resource.getModificationStamp();</TD></TR><TR CLASS="c"><TD CLASS="l">408</TD><TD>                IPath path = resource.getLocation();</TD></TR><TR CLASS="c"><TD CLASS="l">409</TD><TD>                if (path == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">410</TD><TD>                        return modificationStamp;</TD></TR><TR><TD CLASS="l">411</TD><TD>                }</TD></TR><TR><TD CLASS="l">412</TD><TD>                // Note: checking existence of file is a little different than</TD></TR><TR><TD CLASS="l">413</TD><TD>                // impl in</TD></TR><TR><TD CLASS="l">414</TD><TD>                // the FileDocumentProvider. See defect number 223790.</TD></TR><TR CLASS="c"><TD CLASS="l">415</TD><TD>                File file = path.toFile();</TD></TR><TR CLASS="c"><TD CLASS="l">416</TD><TD>                if (!file.exists()) {</TD></TR><TR CLASS="z"><TD CLASS="l">417</TD><TD>                        return modificationStamp;</TD></TR><TR><TD CLASS="l">418</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">419</TD><TD>                modificationStamp = file.lastModified();</TD></TR><TR CLASS="c"><TD CLASS="l">420</TD><TD>                return modificationStamp;</TD></TR><TR><TD CLASS="l">421</TD><TD>        }</TD></TR><TR><TD CLASS="l">422</TD><TD> </TD></TR><TR><TD CLASS="l">423</TD><TD> </TD></TR><TR><TD CLASS="l">424</TD><TD>        /**</TD></TR><TR><TD CLASS="l">425</TD><TD>         * Provides a copy of the model, but a new ID must be provided. The</TD></TR><TR><TD CLASS="l">426</TD><TD>         * principle of this copy is not to copy fields, etc., as is typically</TD></TR><TR><TD CLASS="l">427</TD><TD>         * done in a clone method, but to return a model with the same content in</TD></TR><TR><TD CLASS="l">428</TD><TD>         * the structuredDocument. Note: It is the callers responsibility to</TD></TR><TR><TD CLASS="l">429</TD><TD>         * setBaseLocation, listners, etc., as appropriate. Type and Encoding are</TD></TR><TR><TD CLASS="l">430</TD><TD>         * the only fields set by this method. If the newId provided already exist</TD></TR><TR><TD CLASS="l">431</TD><TD>         * in the model manager, a ResourceInUse exception is thrown.</TD></TR><TR><TD CLASS="l"><A NAME="17">432</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">433</TD><TD>        public IStructuredModel copy(String newId) throws ResourceInUse {</TD></TR><TR><TD CLASS="l">434</TD><TD> </TD></TR><TR><TD CLASS="l">435</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">436</TD><TD>                IStructuredModel newModel = null;</TD></TR><TR><TD CLASS="l">437</TD><TD>                // this first one should fail, if not, its treated as an error</TD></TR><TR><TD CLASS="l">438</TD><TD>                // If the caller wants to use an existing one, they can call</TD></TR><TR><TD CLASS="l">439</TD><TD>                // getExisting</TD></TR><TR><TD CLASS="l">440</TD><TD>                // after this failure</TD></TR><TR CLASS="z"><TD CLASS="l">441</TD><TD>                newModel = getModelManager().getExistingModelForEdit(newId);</TD></TR><TR CLASS="z"><TD CLASS="l">442</TD><TD>                if (newModel != null) {</TD></TR><TR><TD CLASS="l">443</TD><TD>                        // be sure to release the reference we got &#34;by accident&#34; (and</TD></TR><TR><TD CLASS="l">444</TD><TD>                        // no</TD></TR><TR><TD CLASS="l">445</TD><TD>                        // longer need)</TD></TR><TR CLASS="z"><TD CLASS="l">446</TD><TD>                        newModel.releaseFromEdit();</TD></TR><TR CLASS="z"><TD CLASS="l">447</TD><TD>                        throw new ResourceInUse();</TD></TR><TR><TD CLASS="l">448</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">449</TD><TD>                newModel = getModelManager().copyModelForEdit(getId(), newId);</TD></TR><TR CLASS="z"><TD CLASS="l">450</TD><TD>                return newModel;</TD></TR><TR><TD CLASS="l">451</TD><TD>        }</TD></TR><TR><TD CLASS="l">452</TD><TD> </TD></TR><TR><TD CLASS="l">453</TD><TD> </TD></TR><TR><TD CLASS="l">454</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="18">455</A></TD><TD>         * Disable undo management.</TD></TR><TR><TD CLASS="l">456</TD><TD>         */</TD></TR><TR><TD CLASS="l">457</TD><TD>        public void disableUndoManagement() {</TD></TR><TR><TD CLASS="l">458</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">459</TD><TD>                if (getUndoManager() != null)</TD></TR><TR CLASS="z"><TD CLASS="l">460</TD><TD>                        getUndoManager().disableUndoManagement();</TD></TR><TR CLASS="z"><TD CLASS="l">461</TD><TD>        }</TD></TR><TR><TD CLASS="l">462</TD><TD> </TD></TR><TR><TD CLASS="l">463</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="19">464</A></TD><TD>         * Enable undo management.</TD></TR><TR><TD CLASS="l">465</TD><TD>         */</TD></TR><TR><TD CLASS="l">466</TD><TD>        public void enableUndoManagement() {</TD></TR><TR><TD CLASS="l">467</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">468</TD><TD>                if (getUndoManager() != null)</TD></TR><TR CLASS="z"><TD CLASS="l">469</TD><TD>                        getUndoManager().enableUndoManagement();</TD></TR><TR CLASS="z"><TD CLASS="l">470</TD><TD>        }</TD></TR><TR><TD CLASS="l">471</TD><TD> </TD></TR><TR><TD CLASS="l">472</TD><TD>        /**</TD></TR><TR><TD CLASS="l">473</TD><TD>         * endLock is protected only for a very special purpose. So subclasses can</TD></TR><TR><TD CLASS="l">474</TD><TD>         * call it to end the lock after updates have been made, but before</TD></TR><TR><TD CLASS="l"><A NAME="45">475</A></TD><TD>         * notifications are sent</TD></TR><TR><TD CLASS="l">476</TD><TD>         * </TD></TR><TR><TD CLASS="l">477</TD><TD>         */</TD></TR><TR><TD CLASS="l">478</TD><TD>        protected final void endLock() {</TD></TR><TR CLASS="c"><TD CLASS="l">479</TD><TD>                if (fLockObject != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">480</TD><TD>                        fLockObject.release();</TD></TR><TR CLASS="c"><TD CLASS="l">481</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">482</TD><TD>                                Logger.log(Logger.INFO, &#34;Model lock released: &#34; + fLockObject); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">483</TD><TD>                        }</TD></TR><TR><TD CLASS="l">484</TD><TD> </TD></TR><TR><TD CLASS="l">485</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="1a">486</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">487</TD><TD> </TD></TR><TR><TD CLASS="l">488</TD><TD>        public void endRecording(Object requester) {</TD></TR><TR><TD CLASS="l">489</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">490</TD><TD>                if (getUndoManager() != null)</TD></TR><TR CLASS="z"><TD CLASS="l">491</TD><TD>                        getUndoManager().endRecording(requester);</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="1b">492</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">493</TD><TD> </TD></TR><TR><TD CLASS="l">494</TD><TD>        public void endRecording(Object requester, int cursorPosition, int selectionLength) {</TD></TR><TR><TD CLASS="l">495</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">496</TD><TD>                if (getUndoManager() != null)</TD></TR><TR CLASS="z"><TD CLASS="l">497</TD><TD>                        getUndoManager().endRecording(requester, cursorPosition, selectionLength);</TD></TR><TR CLASS="z"><TD CLASS="l">498</TD><TD>        }</TD></TR><TR><TD CLASS="l">499</TD><TD> </TD></TR><TR><TD CLASS="l">500</TD><TD>        /**</TD></TR><TR><TD CLASS="l">501</TD><TD>         * Informs all registered model state listeners that the the model is</TD></TR><TR><TD CLASS="l">502</TD><TD>         * about to under go a change. This change might be in terms of contents</TD></TR><TR><TD CLASS="l">503</TD><TD>         * or might be in terms of the model's id or base location.</TD></TR><TR><TD CLASS="l">504</TD><TD>         */</TD></TR><TR><TD CLASS="l">505</TD><TD>        private void fireModelAboutToBeChanged() {</TD></TR><TR><TD CLASS="l">506</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="42">507</A></TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l">508</TD><TD>                // remove listner</TD></TR><TR><TD CLASS="l">509</TD><TD>                // methods can change the actual instance of the listener array</TD></TR><TR><TD CLASS="l">510</TD><TD>                // from another thread</TD></TR><TR CLASS="c"><TD CLASS="l">511</TD><TD>                if (fModelStateListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">512</TD><TD>                        Object[] holdListeners = fModelStateListeners;</TD></TR><TR CLASS="z"><TD CLASS="l">513</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">514</TD><TD>                                ((IModelStateListener) holdListeners[i]).modelAboutToBeChanged(this);</TD></TR><TR><TD CLASS="l">515</TD><TD>                        }</TD></TR><TR><TD CLASS="l">516</TD><TD>                }</TD></TR><TR><TD CLASS="l">517</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">518</TD><TD>        }</TD></TR><TR><TD CLASS="l">519</TD><TD> </TD></TR><TR><TD CLASS="l">520</TD><TD>        protected void fireModelAboutToBeReinitialized() {</TD></TR><TR><TD CLASS="l">521</TD><TD> </TD></TR><TR><TD CLASS="l">522</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="1c">523</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">524</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">525</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">526</TD><TD>                // another thread</TD></TR><TR CLASS="z"><TD CLASS="l">527</TD><TD>                if (fModelStateListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">528</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">529</TD><TD>                                Logger.log(Logger.INFO, &#34;IModelStateListener event for &#34; + getId() + &#34; : modelAboutToBeReinitialized&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">530</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">531</TD><TD>                        Object[] holdListeners = fModelStateListeners;</TD></TR><TR CLASS="z"><TD CLASS="l">532</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR><TD CLASS="l">533</TD><TD>                                // NOTE: trick for transition. We actual use the same</TD></TR><TR><TD CLASS="l">534</TD><TD>                                // listeners</TD></TR><TR><TD CLASS="l">535</TD><TD>                                // as modelState, but only send this to those that have</TD></TR><TR><TD CLASS="l">536</TD><TD>                                // implemented ModelStateExtended.</TD></TR><TR CLASS="z"><TD CLASS="l">537</TD><TD>                                IModelStateListener listener = (IModelStateListener) holdListeners[i];</TD></TR><TR CLASS="z"><TD CLASS="l">538</TD><TD>                                listener.modelAboutToBeReinitialized(this);</TD></TR><TR><TD CLASS="l">539</TD><TD>                        }</TD></TR><TR><TD CLASS="l">540</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">541</TD><TD>        }</TD></TR><TR><TD CLASS="l">542</TD><TD> </TD></TR><TR><TD CLASS="l">543</TD><TD>        private void fireModelChanged() {</TD></TR><TR><TD CLASS="l">544</TD><TD>                // we must assign listeners</TD></TR><TR><TD CLASS="l"><A NAME="41">545</A></TD><TD>                // to local variable, since the add</TD></TR><TR><TD CLASS="l">546</TD><TD>                // and remove listner</TD></TR><TR><TD CLASS="l">547</TD><TD>                // methods can change the actual instance of the listener</TD></TR><TR><TD CLASS="l">548</TD><TD>                // array from another thread</TD></TR><TR CLASS="c"><TD CLASS="l">549</TD><TD>                if (fModelStateListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">550</TD><TD>                        Object[] holdListeners = fModelStateListeners;</TD></TR><TR CLASS="z"><TD CLASS="l">551</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR><TD CLASS="l">552</TD><TD>                                try {</TD></TR><TR CLASS="z"><TD CLASS="l">553</TD><TD>                                        ((IModelStateListener) holdListeners[i]).modelChanged(this);</TD></TR><TR><TD CLASS="l">554</TD><TD>                                }</TD></TR><TR><TD CLASS="l">555</TD><TD>                                // its so criticial that the begin/end arrive in</TD></TR><TR><TD CLASS="l">556</TD><TD>                                // pairs,</TD></TR><TR><TD CLASS="l">557</TD><TD>                                // if there happends to be an error in one of the</TD></TR><TR><TD CLASS="l">558</TD><TD>                                // modelChanged,</TD></TR><TR><TD CLASS="l">559</TD><TD>                                // they we want to be sure rest complete ok.</TD></TR><TR CLASS="z"><TD CLASS="l">560</TD><TD>                                catch (Exception e) {</TD></TR><TR CLASS="z"><TD CLASS="l">561</TD><TD>                                        Logger.logException(e);</TD></TR><TR><TD CLASS="l">562</TD><TD>                                }</TD></TR><TR><TD CLASS="l">563</TD><TD>                        }</TD></TR><TR><TD CLASS="l">564</TD><TD> </TD></TR><TR><TD CLASS="l">565</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">566</TD><TD>        }</TD></TR><TR><TD CLASS="l">567</TD><TD> </TD></TR><TR><TD CLASS="l">568</TD><TD>        /**</TD></TR><TR><TD CLASS="l">569</TD><TD>         * Informs all registered model state listeners about a change in the</TD></TR><TR><TD CLASS="l">570</TD><TD>         * dirty state of the model. The dirty state is entirely about changes in</TD></TR><TR><TD CLASS="l">571</TD><TD>         * the content of the model (not, for example, about changes to id, or</TD></TR><TR><TD CLASS="l">572</TD><TD>         * base location -- see modelMoved).</TD></TR><TR><TD CLASS="l">573</TD><TD>         */</TD></TR><TR><TD CLASS="l">574</TD><TD>        protected void fireModelDirtyStateChanged(IStructuredModel element, boolean isDirty) {</TD></TR><TR><TD CLASS="l">575</TD><TD> </TD></TR><TR><TD CLASS="l">576</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="1d">577</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">578</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">579</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">580</TD><TD>                // another thread</TD></TR><TR CLASS="z"><TD CLASS="l">581</TD><TD>                if (fModelStateListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">582</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">583</TD><TD>                                Logger.log(Logger.INFO, &#34;IModelStateListener event for &#34; + getId() + &#34; : modelDirtyStateChanged&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">584</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">585</TD><TD>                        Object[] holdListeners = fModelStateListeners;</TD></TR><TR CLASS="z"><TD CLASS="l">586</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">587</TD><TD>                                ((IModelStateListener) holdListeners[i]).modelDirtyStateChanged(element, isDirty);</TD></TR><TR><TD CLASS="l">588</TD><TD>                        }</TD></TR><TR><TD CLASS="l">589</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">590</TD><TD>        }</TD></TR><TR><TD CLASS="l">591</TD><TD> </TD></TR><TR><TD CLASS="l">592</TD><TD>        protected void fireModelReinitialized() {</TD></TR><TR><TD CLASS="l">593</TD><TD> </TD></TR><TR><TD CLASS="l">594</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="1e">595</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">596</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">597</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">598</TD><TD>                // another thread</TD></TR><TR CLASS="z"><TD CLASS="l">599</TD><TD>                if (fModelStateListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">600</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">601</TD><TD>                                Logger.log(Logger.INFO, &#34;IModelStateListener event for &#34; + getId() + &#34; : modelReinitialized&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">602</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">603</TD><TD>                        Object[] holdListeners = fModelStateListeners;</TD></TR><TR CLASS="z"><TD CLASS="l">604</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">605</TD><TD>                                IModelStateListener listener = (IModelStateListener) holdListeners[i];</TD></TR><TR CLASS="z"><TD CLASS="l">606</TD><TD>                                listener.modelReinitialized(this);</TD></TR><TR><TD CLASS="l">607</TD><TD>                        }</TD></TR><TR><TD CLASS="l">608</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">609</TD><TD>        }</TD></TR><TR><TD CLASS="l">610</TD><TD> </TD></TR><TR><TD CLASS="l">611</TD><TD>        /**</TD></TR><TR><TD CLASS="l">612</TD><TD>         * Informs all registered model state listeners about the deletion of a</TD></TR><TR><TD CLASS="l">613</TD><TD>         * model's underlying resource.</TD></TR><TR><TD CLASS="l">614</TD><TD>         */</TD></TR><TR><TD CLASS="l">615</TD><TD>        protected void fireModelResourceDeleted(IStructuredModel element) {</TD></TR><TR><TD CLASS="l">616</TD><TD> </TD></TR><TR><TD CLASS="l">617</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="1f">618</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">619</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">620</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">621</TD><TD>                // another thread</TD></TR><TR CLASS="z"><TD CLASS="l">622</TD><TD>                if (fModelStateListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">623</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">624</TD><TD>                                Logger.log(Logger.INFO, &#34;IModelStateListener event for &#34; + getId() + &#34; : modelResourceDeleted&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">625</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">626</TD><TD>                        Object[] holdListeners = fModelStateListeners;</TD></TR><TR CLASS="z"><TD CLASS="l">627</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">628</TD><TD>                                ((IModelStateListener) holdListeners[i]).modelResourceDeleted(element);</TD></TR><TR><TD CLASS="l">629</TD><TD>                        }</TD></TR><TR><TD CLASS="l">630</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">631</TD><TD>        }</TD></TR><TR><TD CLASS="l">632</TD><TD> </TD></TR><TR><TD CLASS="l">633</TD><TD>        /**</TD></TR><TR><TD CLASS="l">634</TD><TD>         * Informs all registered model state listeners that the resource</TD></TR><TR><TD CLASS="l">635</TD><TD>         * underlying a model has been moved. This is typically reflected in a</TD></TR><TR><TD CLASS="l">636</TD><TD>         * change to the id, baseLocation, or both.</TD></TR><TR><TD CLASS="l">637</TD><TD>         */</TD></TR><TR><TD CLASS="l">638</TD><TD>        protected void fireModelResourceMoved(IStructuredModel originalElement, IStructuredModel movedElement) {</TD></TR><TR><TD CLASS="l">639</TD><TD> </TD></TR><TR><TD CLASS="l">640</TD><TD>                // we must assign listeners to local variable, since the add and</TD></TR><TR><TD CLASS="l"><A NAME="20">641</A></TD><TD>                // remove</TD></TR><TR><TD CLASS="l">642</TD><TD>                // listner</TD></TR><TR><TD CLASS="l">643</TD><TD>                // methods can change the actual instance of the listener array from</TD></TR><TR><TD CLASS="l">644</TD><TD>                // another thread</TD></TR><TR CLASS="z"><TD CLASS="l">645</TD><TD>                if (fModelStateListeners != null) {</TD></TR><TR CLASS="z"><TD CLASS="l">646</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">647</TD><TD>                                Logger.log(Logger.INFO, &#34;IModelStateListener event for &#34; + getId() + &#34; : modelResourceMoved&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">648</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">649</TD><TD>                        Object[] holdListeners = fModelStateListeners;</TD></TR><TR CLASS="z"><TD CLASS="l">650</TD><TD>                        for (int i = 0; i &lt; holdListeners.length; i++) {</TD></TR><TR CLASS="z"><TD CLASS="l">651</TD><TD>                                ((IModelStateListener) holdListeners[i]).modelResourceMoved(originalElement, movedElement);</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"><A NAME="21">654</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">655</TD><TD> </TD></TR><TR><TD CLASS="l">656</TD><TD>        public Object getAdapter(Class adapter) {</TD></TR><TR><TD CLASS="l">657</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">658</TD><TD>                return Platform.getAdapterManager().getAdapter(this, adapter);</TD></TR><TR><TD CLASS="l">659</TD><TD>        }</TD></TR><TR><TD CLASS="l">660</TD><TD> </TD></TR><TR><TD CLASS="l">661</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="57">662</A></TD><TD>         * @return java.lang.String</TD></TR><TR><TD CLASS="l">663</TD><TD>         */</TD></TR><TR><TD CLASS="l">664</TD><TD>        public java.lang.String getBaseLocation() {</TD></TR><TR><TD CLASS="l">665</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">666</TD><TD>                return fBaseLocation;</TD></TR><TR><TD CLASS="l">667</TD><TD>        }</TD></TR><TR><TD CLASS="l">668</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="48">669</A></TD><TD>        /**</TD></TR><TR><TD CLASS="l">670</TD><TD>         * @see org.eclipse.wst.sse.core.internal.provisional.IStructuredModel#getContentTypeIdentifier()</TD></TR><TR><TD CLASS="l">671</TD><TD>         */</TD></TR><TR><TD CLASS="l">672</TD><TD>        public String getContentTypeIdentifier() {</TD></TR><TR CLASS="c"><TD CLASS="l">673</TD><TD>                if (fExplicitContentTypeIdentifier != null)</TD></TR><TR CLASS="c"><TD CLASS="l">674</TD><TD>                        return fExplicitContentTypeIdentifier;</TD></TR><TR CLASS="z"><TD CLASS="l">675</TD><TD>                return fModelHandler.getAssociatedContentTypeId();</TD></TR><TR><TD CLASS="l">676</TD><TD>        }</TD></TR><TR><TD CLASS="l">677</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="58">678</A></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>        public FactoryRegistry getFactoryRegistry() {</TD></TR><TR CLASS="c"><TD CLASS="l">682</TD><TD>                if (factoryRegistry == null) {</TD></TR><TR CLASS="c"><TD CLASS="l">683</TD><TD>                        factoryRegistry = new FactoryRegistry();</TD></TR><TR><TD CLASS="l">684</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">685</TD><TD>                return factoryRegistry;</TD></TR><TR><TD CLASS="l">686</TD><TD>        }</TD></TR><TR><TD CLASS="l">687</TD><TD> </TD></TR><TR><TD CLASS="l">688</TD><TD>        /**</TD></TR><TR><TD CLASS="l">689</TD><TD>         * The id is the id that the model manager uses to identify this model</TD></TR><TR><TD CLASS="l">690</TD><TD>         * </TD></TR><TR><TD CLASS="l">691</TD><TD>         * @ISSUE - no one should need to know ID, so this should be default access eventually. </TD></TR><TR><TD CLASS="l"><A NAME="59">692</A></TD><TD>         * If clients believe they do need ID, be sure to let us know (open a bug). </TD></TR><TR><TD CLASS="l">693</TD><TD>         */</TD></TR><TR><TD CLASS="l">694</TD><TD>        public String getId() {</TD></TR><TR><TD CLASS="l">695</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">696</TD><TD>                return fId;</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>        public abstract IndexedRegion getIndexedRegion(int offset);</TD></TR><TR><TD CLASS="l">700</TD><TD> </TD></TR><TR><TD CLASS="l">701</TD><TD>        /**</TD></TR><TR><TD CLASS="l">702</TD><TD>         * @return</TD></TR><TR><TD CLASS="l">703</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="5a">704</A></TD><TD>        private ILock getLockObjectFromDocument() {</TD></TR><TR><TD CLASS="l">705</TD><TD> </TD></TR><TR><TD CLASS="l">706</TD><TD>                // we always &#34;get afresh&#34; the lock object from our document,</TD></TR><TR><TD CLASS="l">707</TD><TD>                // just in case the instance of the document changes.</TD></TR><TR CLASS="c"><TD CLASS="l">708</TD><TD>                ILock result = null;</TD></TR><TR CLASS="c"><TD CLASS="l">709</TD><TD>                IStructuredDocument doc = fStructuredDocument;</TD></TR><TR CLASS="c"><TD CLASS="l">710</TD><TD>                if (doc != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">711</TD><TD>                        if (doc instanceof ILockable) {</TD></TR><TR><TD CLASS="l">712</TD><TD>                                // remember, more than one client can get the</TD></TR><TR><TD CLASS="l">713</TD><TD>                                // lock object, its during the aquire that the</TD></TR><TR><TD CLASS="l">714</TD><TD>                                // lock on the thread is obtained.</TD></TR><TR CLASS="c"><TD CLASS="l">715</TD><TD>                                result = ((ILockable) doc).getLockObject();</TD></TR><TR><TD CLASS="l">716</TD><TD>                        }</TD></TR><TR><TD CLASS="l">717</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">718</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">719</TD><TD>        }</TD></TR><TR><TD CLASS="l">720</TD><TD> </TD></TR><TR><TD CLASS="l">721</TD><TD>        /**</TD></TR><TR><TD CLASS="l">722</TD><TD>         * Gets the contentTypeDescription.</TD></TR><TR><TD CLASS="l">723</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="22">724</A></TD><TD>         * @return Returns a ContentTypeDescription</TD></TR><TR><TD CLASS="l">725</TD><TD>         */</TD></TR><TR><TD CLASS="l">726</TD><TD>        public IModelHandler getModelHandler() {</TD></TR><TR><TD CLASS="l">727</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">728</TD><TD>                return fModelHandler;</TD></TR><TR><TD CLASS="l">729</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="5b">730</A></TD><TD> </TD></TR><TR><TD CLASS="l">731</TD><TD> </TD></TR><TR><TD CLASS="l">732</TD><TD>        public IModelManager getModelManager() {</TD></TR><TR><TD CLASS="l">733</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">734</TD><TD>                return _getModelManager();</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><TD CLASS="l">738</TD><TD>         * This function returns the reference count of underlying model.</TD></TR><TR><TD CLASS="l">739</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="23">740</A></TD><TD>        // TODO: try to refine the design not to use this function</TD></TR><TR><TD CLASS="l">741</TD><TD>        public int getReferenceCount() {</TD></TR><TR><TD CLASS="l">742</TD><TD> </TD></TR><TR><TD CLASS="l">743</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">744</TD><TD>                if (getModelManager() == null)</TD></TR><TR CLASS="z"><TD CLASS="l">745</TD><TD>                        return 0;</TD></TR><TR CLASS="z"><TD CLASS="l">746</TD><TD>                return getModelManager().getReferenceCount(getId());</TD></TR><TR><TD CLASS="l">747</TD><TD>        }</TD></TR><TR><TD CLASS="l">748</TD><TD> </TD></TR><TR><TD CLASS="l">749</TD><TD> </TD></TR><TR><TD CLASS="l">750</TD><TD>        /**</TD></TR><TR><TD CLASS="l">751</TD><TD>         * This function returns the reference count of underlying model.</TD></TR><TR><TD CLASS="l">752</TD><TD>         */</TD></TR><TR><TD CLASS="l">753</TD><TD>        // TODO: try to refine the design not to use this function</TD></TR><TR><TD CLASS="l"><A NAME="24">754</A></TD><TD>        public int getReferenceCountForEdit() {</TD></TR><TR><TD CLASS="l">755</TD><TD> </TD></TR><TR><TD CLASS="l">756</TD><TD> </TD></TR><TR><TD CLASS="l">757</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">758</TD><TD>                if (getModelManager() == null)</TD></TR><TR CLASS="z"><TD CLASS="l">759</TD><TD>                        return 0;</TD></TR><TR CLASS="z"><TD CLASS="l">760</TD><TD>                return getModelManager().getReferenceCountForEdit(getId());</TD></TR><TR><TD CLASS="l">761</TD><TD>        }</TD></TR><TR><TD CLASS="l">762</TD><TD> </TD></TR><TR><TD CLASS="l">763</TD><TD> </TD></TR><TR><TD CLASS="l">764</TD><TD>        /**</TD></TR><TR><TD CLASS="l">765</TD><TD>         * This function returns the reference count of underlying model.</TD></TR><TR><TD CLASS="l">766</TD><TD>         */</TD></TR><TR><TD CLASS="l">767</TD><TD>        // TODO: try to refine the design not to use this function</TD></TR><TR><TD CLASS="l"><A NAME="25">768</A></TD><TD>        public int getReferenceCountForRead() {</TD></TR><TR><TD CLASS="l">769</TD><TD> </TD></TR><TR><TD CLASS="l">770</TD><TD> </TD></TR><TR><TD CLASS="l">771</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">772</TD><TD>                if (getModelManager() == null)</TD></TR><TR CLASS="z"><TD CLASS="l">773</TD><TD>                        return 0;</TD></TR><TR CLASS="z"><TD CLASS="l">774</TD><TD>                return getModelManager().getReferenceCountForRead(getId());</TD></TR><TR><TD CLASS="l"><A NAME="26">775</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">776</TD><TD> </TD></TR><TR><TD CLASS="l">777</TD><TD>        public Object getReinitializeStateData() {</TD></TR><TR><TD CLASS="l">778</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">779</TD><TD>                return reinitializeStateData;</TD></TR><TR><TD CLASS="l">780</TD><TD>        }</TD></TR><TR><TD CLASS="l">781</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="5c">782</A></TD><TD> </TD></TR><TR><TD CLASS="l">783</TD><TD> </TD></TR><TR><TD CLASS="l">784</TD><TD>        public URIResolver getResolver() {</TD></TR><TR><TD CLASS="l">785</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">786</TD><TD>                return fResolver;</TD></TR><TR><TD CLASS="l">787</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="5d">788</A></TD><TD> </TD></TR><TR><TD CLASS="l">789</TD><TD> </TD></TR><TR><TD CLASS="l">790</TD><TD>        public IStructuredDocument getStructuredDocument() {</TD></TR><TR><TD CLASS="l">791</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">792</TD><TD>                IStructuredDocument result = null;</TD></TR><TR CLASS="c"><TD CLASS="l">793</TD><TD>                result = fStructuredDocument;</TD></TR><TR CLASS="c"><TD CLASS="l">794</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">795</TD><TD>        }</TD></TR><TR><TD CLASS="l">796</TD><TD> </TD></TR><TR><TD CLASS="l">797</TD><TD>        /**</TD></TR><TR><TD CLASS="l">798</TD><TD>         * Insert the method's description here. Creation date: (9/7/2001 2:30:26</TD></TR><TR><TD CLASS="l">799</TD><TD>         * PM)</TD></TR><TR><TD CLASS="l">800</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="27">801</A></TD><TD>         * @return long</TD></TR><TR><TD CLASS="l">802</TD><TD>         */</TD></TR><TR><TD CLASS="l">803</TD><TD>        public long getSynchronizationStamp() {</TD></TR><TR><TD CLASS="l">804</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">805</TD><TD>                return fSynchronizationStamp;</TD></TR><TR><TD CLASS="l"><A NAME="28">806</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">807</TD><TD> </TD></TR><TR><TD CLASS="l">808</TD><TD>        public IStructuredTextUndoManager getUndoManager() {</TD></TR><TR><TD CLASS="l">809</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">810</TD><TD>                IStructuredTextUndoManager structuredTextUndoManager = null;</TD></TR><TR CLASS="z"><TD CLASS="l">811</TD><TD>                IStructuredDocument structuredDocument = getStructuredDocument();</TD></TR><TR CLASS="z"><TD CLASS="l">812</TD><TD>                if (structuredDocument == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">813</TD><TD>                        structuredTextUndoManager = null;</TD></TR><TR><TD CLASS="l">814</TD><TD>                }</TD></TR><TR><TD CLASS="l">815</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">816</TD><TD>                        structuredTextUndoManager = structuredDocument.getUndoManager();</TD></TR><TR><TD CLASS="l">817</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="29">818</A></TD><TD>                return structuredTextUndoManager;</TD></TR><TR><TD CLASS="l">819</TD><TD>        }</TD></TR><TR><TD CLASS="l">820</TD><TD> </TD></TR><TR><TD CLASS="l">821</TD><TD>        public void initId(String id) {</TD></TR><TR CLASS="z"><TD CLASS="l">822</TD><TD>                fId = id;</TD></TR><TR CLASS="z"><TD CLASS="l">823</TD><TD>        }</TD></TR><TR><TD CLASS="l">824</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="46">825</A></TD><TD>        final protected void internalAboutToBeChanged() {</TD></TR><TR><TD CLASS="l">826</TD><TD> </TD></TR><TR><TD CLASS="l">827</TD><TD>                // notice we only fire this event if we are not</TD></TR><TR><TD CLASS="l">828</TD><TD>                // already in a model state changing sequence</TD></TR><TR CLASS="c"><TD CLASS="l">829</TD><TD>                if (fModelStateChanging == 0) {</TD></TR><TR><TD CLASS="l">830</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">831</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">832</TD><TD>                                Logger.log(Logger.INFO, &#34;IModelStateListener event for &#34; + getId() + &#34; : modelAboutToBeChanged&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">833</TD><TD>                        }</TD></TR><TR><TD CLASS="l">834</TD><TD> </TD></TR><TR><TD CLASS="l">835</TD><TD>                        try {</TD></TR><TR CLASS="c"><TD CLASS="l">836</TD><TD>                                fireModelAboutToBeChanged();</TD></TR><TR><TD CLASS="l">837</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">838</TD><TD>                        catch (Exception e) {</TD></TR><TR CLASS="z"><TD CLASS="l">839</TD><TD>                                Logger.logException(&#34;Exception while notifying model state listers of about to change&#34;, e); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">840</TD><TD>                        }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="67% line coverage (4 out of 6 instructions)">841</TD><TD TITLE="67% line coverage (4 out of 6 instructions)">                        finally {</TD></TR><TR><TD CLASS="l">842</TD><TD>                                // begin lock after listeners notified, otherwise</TD></TR><TR><TD CLASS="l">843</TD><TD>                                // deadlock could occur if they call us back.</TD></TR><TR CLASS="c"><TD CLASS="l">844</TD><TD>                                beginLock();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="71% line coverage (5 out of 7 instructions)">845</TD><TD TITLE="71% line coverage (5 out of 7 instructions)">                        }</TD></TR><TR><TD CLASS="l">846</TD><TD> </TD></TR><TR><TD CLASS="l">847</TD><TD>                }</TD></TR><TR><TD CLASS="l">848</TD><TD>                // we always increment counter, for every request (so *must* receive</TD></TR><TR><TD CLASS="l">849</TD><TD>                // corresponding number of 'changedModel' requests)</TD></TR><TR CLASS="c"><TD CLASS="l">850</TD><TD>                fModelStateChanging++;</TD></TR><TR CLASS="c"><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>         * Informs all registered model state listeners that an impending change</TD></TR><TR><TD CLASS="l">855</TD><TD>         * is now complete. This method must only be called by 'modelChanged'</TD></TR><TR><TD CLASS="l">856</TD><TD>         * since it keeps track of counts.</TD></TR><TR><TD CLASS="l"><A NAME="44">857</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">858</TD><TD>        final protected void internalModelChanged() {</TD></TR><TR><TD CLASS="l">859</TD><TD> </TD></TR><TR><TD CLASS="l">860</TD><TD>                // always decrement</TD></TR><TR CLASS="c"><TD CLASS="l">861</TD><TD>                fModelStateChanging--;</TD></TR><TR><TD CLASS="l">862</TD><TD> </TD></TR><TR><TD CLASS="l">863</TD><TD> </TD></TR><TR><TD CLASS="l">864</TD><TD>                // Check integrity</TD></TR><TR><TD CLASS="l">865</TD><TD>                // to be less than zero is a programming error,</TD></TR><TR><TD CLASS="l">866</TD><TD>                // but we'll reset to zero</TD></TR><TR><TD CLASS="l">867</TD><TD>                // and try to continue</TD></TR><TR CLASS="c"><TD CLASS="l">868</TD><TD>                if (fModelStateChanging &lt; 0) {</TD></TR><TR CLASS="z"><TD CLASS="l">869</TD><TD>                        fModelStateChanging = 0;</TD></TR><TR><TD CLASS="l">870</TD><TD>                        // should not be locked, but just in case</TD></TR><TR CLASS="z"><TD CLASS="l">871</TD><TD>                        endLock();</TD></TR><TR CLASS="z"><TD CLASS="l">872</TD><TD>                        throw new IllegalStateException(&#34;Program Error: modelStateChanging was less than zero&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">873</TD><TD>                }</TD></TR><TR><TD CLASS="l">874</TD><TD> </TD></TR><TR><TD CLASS="l">875</TD><TD> </TD></TR><TR><TD CLASS="l">876</TD><TD>                // We only fire this event if all pending requests are done.</TD></TR><TR><TD CLASS="l">877</TD><TD>                // That is, if we've received the same number of modelChanged as</TD></TR><TR><TD CLASS="l">878</TD><TD>                // we have aboutToChangeModel.</TD></TR><TR CLASS="c"><TD CLASS="l">879</TD><TD>                if (fModelStateChanging == 0) {</TD></TR><TR CLASS="c"><TD CLASS="l">880</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">881</TD><TD>                                Logger.log(Logger.INFO, &#34;IModelStateListener event for &#34; + getId() + &#34; : modelChanged&#34;); //$NON-NLS-1$ //$NON-NLS-2$</TD></TR><TR><TD CLASS="l">882</TD><TD>                        }</TD></TR><TR><TD CLASS="l">883</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">884</TD><TD>                        endLock();</TD></TR><TR><TD CLASS="l">885</TD><TD>                        // notifify listeners outside of locked state (or deadlock</TD></TR><TR><TD CLASS="l">886</TD><TD>                        // can occur if one of them calls us back.</TD></TR><TR CLASS="c"><TD CLASS="l">887</TD><TD>                        fireModelChanged();</TD></TR><TR><TD CLASS="l">888</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="2a">889</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">890</TD><TD> </TD></TR><TR><TD CLASS="l">891</TD><TD>        public boolean isDirty() {</TD></TR><TR><TD CLASS="l">892</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">893</TD><TD>                return fDirtyState;</TD></TR><TR><TD CLASS="l">894</TD><TD>        }</TD></TR><TR><TD CLASS="l">895</TD><TD> </TD></TR><TR><TD CLASS="l">896</TD><TD>        /**</TD></TR><TR><TD CLASS="l">897</TD><TD>         * This method has very special purpose, its used in subclass</TD></TR><TR><TD CLASS="l">898</TD><TD>         * 'changedModel' to know when to do &#34;ending&#34; sorts of things, right</TD></TR><TR><TD CLASS="l">899</TD><TD>         * before a call to super.ChangedModel would in deed put the model in</TD></TR><TR><TD CLASS="l">900</TD><TD>         * 'end' state. Put another way, at the beginning of the subclasses's</TD></TR><TR><TD CLASS="l">901</TD><TD>         * changedModel, the isModelStateChanging is true, but at end, it will be</TD></TR><TR><TD CLASS="l">902</TD><TD>         * false. So, this method allows a small &#34;peek ahead&#34;.</TD></TR><TR><TD CLASS="l"><A NAME="4c">903</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">904</TD><TD>        protected boolean isModelChangeStateOnVergeOfEnding() {</TD></TR><TR><TD CLASS="l">905</TD><TD> </TD></TR><TR><TD CLASS="l">906</TD><TD> </TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="75% line coverage (6 out of 8 instructions)">907</TD><TD TITLE="75% line coverage (6 out of 8 instructions)">                return fModelStateChanging == 1;</TD></TR><TR><TD CLASS="l">908</TD><TD>        }</TD></TR><TR><TD CLASS="l">909</TD><TD> </TD></TR><TR><TD CLASS="l">910</TD><TD>        /**</TD></TR><TR><TD CLASS="l">911</TD><TD>         * This method can be called to determine if the model is within a</TD></TR><TR><TD CLASS="l">912</TD><TD>         * &#34;aboutToChange&#34; and &#34;changed&#34; sequence.</TD></TR><TR><TD CLASS="l"><A NAME="2b">913</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">914</TD><TD>        public boolean isModelStateChanging() {</TD></TR><TR><TD CLASS="l">915</TD><TD> </TD></TR><TR><TD CLASS="l">916</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">917</TD><TD>                return fModelStateChanging &gt; 0;</TD></TR><TR><TD CLASS="l"><A NAME="2c">918</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">919</TD><TD> </TD></TR><TR><TD CLASS="l">920</TD><TD>        public boolean isNew() {</TD></TR><TR><TD CLASS="l">921</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">922</TD><TD>                return fNewState;</TD></TR><TR><TD CLASS="l"><A NAME="5e">923</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">924</TD><TD> </TD></TR><TR><TD CLASS="l">925</TD><TD>        public boolean isReinitializationNeeded() {</TD></TR><TR><TD CLASS="l">926</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">927</TD><TD>                return reinitializationNeeded;</TD></TR><TR><TD CLASS="l">928</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="2d">929</A></TD><TD> </TD></TR><TR><TD CLASS="l">930</TD><TD>        public boolean isSaveNeeded() {</TD></TR><TR><TD CLASS="l">931</TD><TD> </TD></TR><TR><TD CLASS="l">932</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">933</TD><TD>                if (!isSharedForEdit())</TD></TR><TR CLASS="z"><TD CLASS="l">934</TD><TD>                        return isDirty();</TD></TR><TR><TD CLASS="l">935</TD><TD>                else</TD></TR><TR CLASS="z"><TD CLASS="l">936</TD><TD>                        return false;</TD></TR><TR><TD CLASS="l">937</TD><TD>        }</TD></TR><TR><TD CLASS="l">938</TD><TD> </TD></TR><TR><TD CLASS="l">939</TD><TD> </TD></TR><TR><TD CLASS="l">940</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="51">941</A></TD><TD>         * This function returns true if there are other references to the</TD></TR><TR><TD CLASS="l">942</TD><TD>         * underlying model.</TD></TR><TR><TD CLASS="l">943</TD><TD>         */</TD></TR><TR><TD CLASS="l">944</TD><TD>        public boolean isShared() {</TD></TR><TR CLASS="c"><TD CLASS="l">945</TD><TD>                if (getModelManager() == null)</TD></TR><TR CLASS="z"><TD CLASS="l">946</TD><TD>                        return false;</TD></TR><TR CLASS="c"><TD CLASS="l">947</TD><TD>                return getModelManager().isShared(getId());</TD></TR><TR><TD CLASS="l">948</TD><TD>        }</TD></TR><TR><TD CLASS="l">949</TD><TD> </TD></TR><TR><TD CLASS="l">950</TD><TD> </TD></TR><TR><TD CLASS="l">951</TD><TD>        /**</TD></TR><TR><TD CLASS="l">952</TD><TD>         * This function returns true if there are other references to the</TD></TR><TR><TD CLASS="l">953</TD><TD>         * underlying model.</TD></TR><TR><TD CLASS="l"><A NAME="2e">954</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">955</TD><TD>        public boolean isSharedForEdit() {</TD></TR><TR><TD CLASS="l">956</TD><TD> </TD></TR><TR><TD CLASS="l">957</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">958</TD><TD>                if (getModelManager() == null)</TD></TR><TR CLASS="z"><TD CLASS="l">959</TD><TD>                        return false;</TD></TR><TR CLASS="z"><TD CLASS="l">960</TD><TD>                return getModelManager().isSharedForEdit(getId());</TD></TR><TR><TD CLASS="l">961</TD><TD>        }</TD></TR><TR><TD CLASS="l">962</TD><TD> </TD></TR><TR><TD CLASS="l">963</TD><TD> </TD></TR><TR><TD CLASS="l">964</TD><TD>        /**</TD></TR><TR><TD CLASS="l">965</TD><TD>         * This function returns true if there are other references to the</TD></TR><TR><TD CLASS="l">966</TD><TD>         * underlying model.</TD></TR><TR><TD CLASS="l"><A NAME="2f">967</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">968</TD><TD>        public boolean isSharedForRead() {</TD></TR><TR><TD CLASS="l">969</TD><TD> </TD></TR><TR><TD CLASS="l">970</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">971</TD><TD>                if (getModelManager() == null)</TD></TR><TR CLASS="z"><TD CLASS="l">972</TD><TD>                        return false;</TD></TR><TR CLASS="z"><TD CLASS="l">973</TD><TD>                return getModelManager().isSharedForRead(getId());</TD></TR><TR><TD CLASS="l">974</TD><TD>        }</TD></TR><TR><TD CLASS="l">975</TD><TD> </TD></TR><TR><TD CLASS="l">976</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="30">977</A></TD><TD>        public void modelReinitialized() {</TD></TR><TR><TD CLASS="l">978</TD><TD> </TD></TR><TR><TD CLASS="l">979</TD><TD> </TD></TR><TR><TD CLASS="l">980</TD><TD>                // notice this is just a public avenue to our protected method</TD></TR><TR CLASS="z"><TD CLASS="l">981</TD><TD>                fireModelReinitialized();</TD></TR><TR CLASS="z"><TD CLASS="l"><A NAME="31">982</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">983</TD><TD> </TD></TR><TR><TD CLASS="l">984</TD><TD>        public IStructuredModel newInstance() throws IOException {</TD></TR><TR><TD CLASS="l">985</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">986</TD><TD>                IStructuredModel newModel = null;</TD></TR><TR><TD CLASS="l">987</TD><TD>                // we delegate to the model manager, so loader, etc., can be</TD></TR><TR><TD CLASS="l">988</TD><TD>                // used.</TD></TR><TR CLASS="z"><TD CLASS="l">989</TD><TD>                newModel = getModelManager().createNewInstance(this);</TD></TR><TR CLASS="z"><TD CLASS="l">990</TD><TD>                return newModel;</TD></TR><TR><TD CLASS="l">991</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="32">992</A></TD><TD> </TD></TR><TR><TD CLASS="l">993</TD><TD>        public IStructuredModel reinit() {</TD></TR><TR><TD CLASS="l">994</TD><TD> </TD></TR><TR><TD CLASS="l">995</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">996</TD><TD>                IStructuredModel result = null;</TD></TR><TR CLASS="z"><TD CLASS="l">997</TD><TD>                if (fModelStateChanging == 0) {</TD></TR><TR><TD CLASS="l">998</TD><TD>                        try {</TD></TR><TR CLASS="z"><TD CLASS="l">999</TD><TD>                                aboutToChangeModel();</TD></TR><TR CLASS="z"><TD CLASS="l">1000</TD><TD>                                aboutToReinitializeModel();</TD></TR><TR CLASS="z"><TD CLASS="l">1001</TD><TD>                                result = _getModelManager().reinitialize(this);</TD></TR><TR><TD CLASS="l">1002</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1003</TD><TD>                        finally {</TD></TR><TR CLASS="z"><TD CLASS="l">1004</TD><TD>                                setReinitializeNeeded(false);</TD></TR><TR CLASS="z"><TD CLASS="l">1005</TD><TD>                                setReinitializeStateData(null);</TD></TR><TR CLASS="z"><TD CLASS="l">1006</TD><TD>                                modelReinitialized();</TD></TR><TR CLASS="z"><TD CLASS="l">1007</TD><TD>                                changedModel();</TD></TR><TR CLASS="z"><TD CLASS="l">1008</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1009</TD><TD>                }</TD></TR><TR><TD CLASS="l">1010</TD><TD>                else {</TD></TR><TR CLASS="z"><TD CLASS="l">1011</TD><TD>                        if (Logger.DEBUG_MODELSTATE) {</TD></TR><TR CLASS="z"><TD CLASS="l">1012</TD><TD>                                Logger.log(Logger.INFO, &#34;indeed!!!&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1013</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1014</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1015</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1016</TD><TD>        }</TD></TR><TR><TD CLASS="l">1017</TD><TD> </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>         * This function allows the model to free up any resources it might be</TD></TR><TR><TD CLASS="l">1021</TD><TD>         * using. In particular, itself, as stored in the IModelManager.</TD></TR><TR><TD CLASS="l"><A NAME="4f">1022</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">1023</TD><TD>        public void releaseFromEdit() {</TD></TR><TR><TD CLASS="l">1024</TD><TD> </TD></TR><TR><TD CLASS="l">1025</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1026</TD><TD>                if (getModelManager() == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1027</TD><TD>                        throw new IllegalStateException(MODEL_MANAGER_NULL); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1028</TD><TD>                }</TD></TR><TR><TD CLASS="l">1029</TD><TD>                else {</TD></TR><TR><TD CLASS="l">1030</TD><TD>                        /*</TD></TR><TR><TD CLASS="l">1031</TD><TD>                         * Be sure to check the shared state before releasing. (Since</TD></TR><TR><TD CLASS="l">1032</TD><TD>                         * isShared assumes a count of 1 means not shared ... and we want</TD></TR><TR><TD CLASS="l">1033</TD><TD>                         * our '1' to be that one.) The problem, of course, is that</TD></TR><TR><TD CLASS="l">1034</TD><TD>                         * between pre-cycle notification and post-release notification,</TD></TR><TR><TD CLASS="l">1035</TD><TD>                         * the model could once again have become shared, rendering the</TD></TR><TR><TD CLASS="l">1036</TD><TD>                         * release notification incorrect.</TD></TR><TR><TD CLASS="l">1037</TD><TD>                         */</TD></TR><TR CLASS="c"><TD CLASS="l">1038</TD><TD>                        boolean isShared = isShared();</TD></TR><TR><TD CLASS="l">1039</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1040</TD><TD>                        if (!isShared) {</TD></TR><TR CLASS="c"><TD CLASS="l">1041</TD><TD>                                signalPreLifeCycleEventRelease(this);</TD></TR><TR><TD CLASS="l">1042</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1043</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1044</TD><TD>                        _getModelManager().releaseFromEdit(this);</TD></TR><TR CLASS="c"><TD CLASS="l">1045</TD><TD>                        if (!isShared) {</TD></TR><TR CLASS="c"><TD CLASS="l">1046</TD><TD>                                signalPostLifeCycleListenerRelease(this);</TD></TR><TR><TD CLASS="l">1047</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1048</TD><TD>                }</TD></TR><TR><TD CLASS="l">1049</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1050</TD><TD>        }</TD></TR><TR><TD CLASS="l">1051</TD><TD> </TD></TR><TR><TD CLASS="l">1052</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1053</TD><TD>         * This function allows the model to free up any resources it might be</TD></TR><TR><TD CLASS="l"><A NAME="50">1054</A></TD><TD>         * using. In particular, itself, as stored in the IModelManager.</TD></TR><TR><TD CLASS="l">1055</TD><TD>         */</TD></TR><TR><TD CLASS="l">1056</TD><TD>        public void releaseFromRead() {</TD></TR><TR><TD CLASS="l">1057</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1058</TD><TD>                if (getModelManager() == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1059</TD><TD>                        throw new IllegalStateException(MODEL_MANAGER_NULL); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1060</TD><TD>                }</TD></TR><TR><TD CLASS="l">1061</TD><TD>                else {</TD></TR><TR><TD CLASS="l">1062</TD><TD>                        /*</TD></TR><TR><TD CLASS="l">1063</TD><TD>                         * Be sure to check the shared state before releasing. (Since</TD></TR><TR><TD CLASS="l">1064</TD><TD>                         * isShared assumes a count of 1 means not shared ... and we want</TD></TR><TR><TD CLASS="l">1065</TD><TD>                         * our '1' to be that one.) The problem, of course, is that</TD></TR><TR><TD CLASS="l">1066</TD><TD>                         * between pre-cycle notification and post-release notification,</TD></TR><TR><TD CLASS="l">1067</TD><TD>                         * the model could once again have become shared, rendering the</TD></TR><TR><TD CLASS="l">1068</TD><TD>                         * release notification incorrect.</TD></TR><TR><TD CLASS="l">1069</TD><TD>                         */</TD></TR><TR CLASS="c"><TD CLASS="l">1070</TD><TD>                        boolean isShared = isShared();</TD></TR><TR><TD CLASS="l">1071</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1072</TD><TD>                        if (!isShared) {</TD></TR><TR CLASS="c"><TD CLASS="l">1073</TD><TD>                                signalPreLifeCycleEventRelease(this);</TD></TR><TR><TD CLASS="l">1074</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1075</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1076</TD><TD>                        _getModelManager().releaseFromRead(this);</TD></TR><TR><TD CLASS="l">1077</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1078</TD><TD>                        if (!isShared) {</TD></TR><TR CLASS="c"><TD CLASS="l">1079</TD><TD>                                signalPostLifeCycleListenerRelease(this);</TD></TR><TR><TD CLASS="l">1080</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1081</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1082</TD><TD>        }</TD></TR><TR><TD CLASS="l">1083</TD><TD> </TD></TR><TR><TD CLASS="l">1084</TD><TD> </TD></TR><TR><TD CLASS="l">1085</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1086</TD><TD>         * This function replenishes the model with the resource without saving</TD></TR><TR><TD CLASS="l">1087</TD><TD>         * any possible changes. It is used when one editor may be closing, and</TD></TR><TR><TD CLASS="l"><A NAME="33">1088</A></TD><TD>         * specifially says not to save the model, but another &#34;display&#34; of the</TD></TR><TR><TD CLASS="l">1089</TD><TD>         * model still needs to hang on to some model, so needs a fresh copy.</TD></TR><TR><TD CLASS="l">1090</TD><TD>         */</TD></TR><TR><TD CLASS="l">1091</TD><TD>        public IStructuredModel reload(InputStream inputStream) throws IOException {</TD></TR><TR CLASS="z"><TD CLASS="l">1092</TD><TD>                IStructuredModel result = null;</TD></TR><TR><TD CLASS="l">1093</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1094</TD><TD>                        aboutToChangeModel();</TD></TR><TR CLASS="z"><TD CLASS="l">1095</TD><TD>                        result = _getModelManager().reloadModel(getId(), inputStream);</TD></TR><TR><TD CLASS="l">1096</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1097</TD><TD>                catch (UnsupportedEncodingException e) {</TD></TR><TR><TD CLASS="l">1098</TD><TD>                        // log for now, unless we find reason not to</TD></TR><TR CLASS="z"><TD CLASS="l">1099</TD><TD>                        Logger.log(Logger.INFO, e.getMessage());</TD></TR><TR><TD CLASS="l">1100</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1101</TD><TD>                finally {</TD></TR><TR CLASS="z"><TD CLASS="l">1102</TD><TD>                        changedModel();</TD></TR><TR CLASS="z"><TD CLASS="l">1103</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1104</TD><TD>                return result;</TD></TR><TR><TD CLASS="l">1105</TD><TD>        }</TD></TR><TR><TD CLASS="l">1106</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="4e">1107</A></TD><TD>        public void removeModelLifecycleListener(IModelLifecycleListener listener) {</TD></TR><TR><TD CLASS="l">1108</TD><TD> </TD></TR><TR><TD CLASS="l">1109</TD><TD>                // if manager is null, then none have been added, so</TD></TR><TR><TD CLASS="l">1110</TD><TD>                // no need to remove any</TD></TR><TR CLASS="c"><TD CLASS="l">1111</TD><TD>                if (fLifecycleNotificationManager == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1112</TD><TD>                        return;</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="80% line coverage (12 out of 15 instructions)">1113</TD><TD TITLE="80% line coverage (12 out of 15 instructions)">                synchronized (fListenerLock) {</TD></TR><TR CLASS="c"><TD CLASS="l">1114</TD><TD>                        fLifecycleNotificationManager.removeListener(listener);</TD></TR><TR><TD CLASS="l">1115</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1116</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="4d">1117</A></TD><TD> </TD></TR><TR><TD CLASS="l">1118</TD><TD> </TD></TR><TR><TD CLASS="l">1119</TD><TD>        public void removeModelStateListener(IModelStateListener listener) {</TD></TR><TR><TD CLASS="l">1120</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1121</TD><TD>                if (listener == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1122</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l">1123</TD><TD>                if (fModelStateListeners == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1124</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1125</TD><TD>                // if its not in the listeners, we'll ignore the request</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="81% line coverage (13 out of 16 instructions)">1126</TD><TD TITLE="81% line coverage (13 out of 16 instructions)">                synchronized (fListenerLock) {</TD></TR><TR CLASS="c"><TD CLASS="l">1127</TD><TD>                        if (Utilities.contains(fModelStateListeners, listener)) {</TD></TR><TR CLASS="c"><TD CLASS="l">1128</TD><TD>                                int oldSize = fModelStateListeners.length;</TD></TR><TR CLASS="c"><TD CLASS="l">1129</TD><TD>                                int newSize = oldSize - 1;</TD></TR><TR CLASS="c"><TD CLASS="l">1130</TD><TD>                                Object[] newListeners = new Object[newSize];</TD></TR><TR CLASS="c"><TD CLASS="l">1131</TD><TD>                                int index = 0;</TD></TR><TR CLASS="c"><TD CLASS="l">1132</TD><TD>                                for (int i = 0; i &lt; oldSize; i++) {</TD></TR><TR CLASS="c"><TD CLASS="l">1133</TD><TD>                                        if (fModelStateListeners[i] == listener) { // ignore</TD></TR><TR><TD CLASS="l">1134</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1135</TD><TD>                                        else {</TD></TR><TR><TD CLASS="l">1136</TD><TD>                                                // copy old to new if its not the one we are</TD></TR><TR><TD CLASS="l">1137</TD><TD>                                                // removing</TD></TR><TR CLASS="z"><TD CLASS="l">1138</TD><TD>                                                newListeners[index++] = fModelStateListeners[i];</TD></TR><TR><TD CLASS="l">1139</TD><TD>                                        }</TD></TR><TR><TD CLASS="l">1140</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1141</TD><TD>                                // now that we have a new array, let's switch it for the</TD></TR><TR><TD CLASS="l">1142</TD><TD>                                // old</TD></TR><TR><TD CLASS="l">1143</TD><TD>                                // one</TD></TR><TR CLASS="c"><TD CLASS="l">1144</TD><TD>                                fModelStateListeners = newListeners;</TD></TR><TR><TD CLASS="l">1145</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1146</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1147</TD><TD>        }</TD></TR><TR><TD CLASS="l">1148</TD><TD> </TD></TR><TR><TD CLASS="l">1149</TD><TD> </TD></TR><TR><TD CLASS="l">1150</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1151</TD><TD>         * A method that modifies the model's synchronization stamp to match the</TD></TR><TR><TD CLASS="l">1152</TD><TD>         * resource. Turns out there's several ways of doing it, so this ensures a</TD></TR><TR><TD CLASS="l">1153</TD><TD>         * common algorithm.</TD></TR><TR><TD CLASS="l"><A NAME="5f">1154</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">1155</TD><TD>        public void resetSynchronizationStamp(IResource resource) {</TD></TR><TR><TD CLASS="l">1156</TD><TD> </TD></TR><TR><TD CLASS="l">1157</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1158</TD><TD>                setSynchronizationStamp(computeModificationStamp(resource));</TD></TR><TR CLASS="c"><TD CLASS="l">1159</TD><TD>        }</TD></TR><TR><TD CLASS="l">1160</TD><TD> </TD></TR><TR><TD CLASS="l">1161</TD><TD> </TD></TR><TR><TD CLASS="l">1162</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1163</TD><TD>         * This API allows a client to initiate notification to all interested</TD></TR><TR><TD CLASS="l">1164</TD><TD>         * parties that a model's underlying resource has been deleted.</TD></TR><TR><TD CLASS="l">1165</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="34">1166</A></TD><TD>        public void resourceDeleted() {</TD></TR><TR><TD CLASS="l">1167</TD><TD> </TD></TR><TR><TD CLASS="l">1168</TD><TD> </TD></TR><TR><TD CLASS="l">1169</TD><TD>                // notice this is just a public avenue to our protected method</TD></TR><TR CLASS="z"><TD CLASS="l">1170</TD><TD>                fireModelResourceDeleted(this);</TD></TR><TR CLASS="z"><TD CLASS="l">1171</TD><TD>        }</TD></TR><TR><TD CLASS="l">1172</TD><TD> </TD></TR><TR><TD CLASS="l">1173</TD><TD> </TD></TR><TR><TD CLASS="l">1174</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1175</TD><TD>         * This method allows a model client to initiate notification to all</TD></TR><TR><TD CLASS="l">1176</TD><TD>         * interested parties that a model's underlying resource location has</TD></TR><TR><TD CLASS="l">1177</TD><TD>         * changed. Note: we assume caller has already changed baseLocation, Id,</TD></TR><TR><TD CLASS="l">1178</TD><TD>         * etc., since its really up to the client to determine what's &#34;new&#34; about</TD></TR><TR><TD CLASS="l">1179</TD><TD>         * a moved model. Caution: 'this' and 'newModel' may be the same object.</TD></TR><TR><TD CLASS="l">1180</TD><TD>         * This is the case for current working with FileModelProvider, but have</TD></TR><TR><TD CLASS="l">1181</TD><TD>         * left the dual argument for future possibilities.</TD></TR><TR><TD CLASS="l">1182</TD><TD>         */</TD></TR><TR><TD CLASS="l"><A NAME="35">1183</A></TD><TD>        public void resourceMoved(IStructuredModel newModel) {</TD></TR><TR><TD CLASS="l">1184</TD><TD> </TD></TR><TR><TD CLASS="l">1185</TD><TD> </TD></TR><TR><TD CLASS="l">1186</TD><TD>                // notice this is just a public avenue to our protected method</TD></TR><TR CLASS="z"><TD CLASS="l">1187</TD><TD>                fireModelResourceMoved(this, newModel);</TD></TR><TR CLASS="z"><TD CLASS="l">1188</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="36">1189</A></TD><TD> </TD></TR><TR><TD CLASS="l">1190</TD><TD> </TD></TR><TR><TD CLASS="l">1191</TD><TD>        public void save() throws UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR><TD CLASS="l">1192</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1193</TD><TD>                int type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.PRE_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1194</TD><TD>                ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1195</TD><TD>                signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR><TD CLASS="l">1196</TD><TD> </TD></TR><TR><TD CLASS="l">1197</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1198</TD><TD>                        String stringId = getId();</TD></TR><TR CLASS="z"><TD CLASS="l">1199</TD><TD>                        _getModelManager().saveModel(stringId, EncodingRule.CONTENT_BASED);</TD></TR><TR><TD CLASS="l">1200</TD><TD>                }</TD></TR><TR><TD CLASS="l">1201</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1202</TD><TD>                finally {</TD></TR><TR><TD CLASS="l">1203</TD><TD>                        // we put end notification in finally block, so even if</TD></TR><TR><TD CLASS="l">1204</TD><TD>                        // error occurs during save, listeners are still notified,</TD></TR><TR><TD CLASS="l">1205</TD><TD>                        // since their code could depend on receiving, to clean up</TD></TR><TR><TD CLASS="l">1206</TD><TD>                        // some state, or coordinate other resources.</TD></TR><TR CLASS="z"><TD CLASS="l">1207</TD><TD>                        type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.POST_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1208</TD><TD>                        modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1209</TD><TD>                        signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR CLASS="z"><TD CLASS="l">1210</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1211</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="37">1212</A></TD><TD> </TD></TR><TR><TD CLASS="l">1213</TD><TD> </TD></TR><TR><TD CLASS="l">1214</TD><TD>        public void save(EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR><TD CLASS="l">1215</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1216</TD><TD>                int type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.PRE_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1217</TD><TD>                ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1218</TD><TD>                signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR><TD CLASS="l">1219</TD><TD> </TD></TR><TR><TD CLASS="l">1220</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1221</TD><TD>                        String stringId = getId();</TD></TR><TR CLASS="z"><TD CLASS="l">1222</TD><TD>                        _getModelManager().saveModel(stringId, encodingRule);</TD></TR><TR><TD CLASS="l">1223</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1224</TD><TD>                finally {</TD></TR><TR><TD CLASS="l">1225</TD><TD>                        // we put end notification in finally block, so even if</TD></TR><TR><TD CLASS="l">1226</TD><TD>                        // error occurs during save, listeners are still notified,</TD></TR><TR><TD CLASS="l">1227</TD><TD>                        // since their code could depend on receiving, to clean up</TD></TR><TR><TD CLASS="l">1228</TD><TD>                        // some state, or coordinate other resources.</TD></TR><TR CLASS="z"><TD CLASS="l">1229</TD><TD>                        type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.POST_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1230</TD><TD>                        modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1231</TD><TD>                        signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR CLASS="z"><TD CLASS="l">1232</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1233</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="38">1234</A></TD><TD> </TD></TR><TR><TD CLASS="l">1235</TD><TD> </TD></TR><TR><TD CLASS="l">1236</TD><TD>        public void save(IFile iFile) throws UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR><TD CLASS="l">1237</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1238</TD><TD>                int type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.PRE_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1239</TD><TD>                ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1240</TD><TD>                signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR><TD CLASS="l">1241</TD><TD> </TD></TR><TR><TD CLASS="l">1242</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1243</TD><TD>                        String stringId = getId();</TD></TR><TR CLASS="z"><TD CLASS="l">1244</TD><TD>                        _getModelManager().saveModel(iFile, stringId, EncodingRule.CONTENT_BASED);</TD></TR><TR><TD CLASS="l">1245</TD><TD>                }</TD></TR><TR><TD CLASS="l">1246</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1247</TD><TD>                finally {</TD></TR><TR><TD CLASS="l">1248</TD><TD>                        // we put end notification in finally block, so even if</TD></TR><TR><TD CLASS="l">1249</TD><TD>                        // error occurs during save, listeners are still notified,</TD></TR><TR><TD CLASS="l">1250</TD><TD>                        // since their code could depend on receiving, to clean up</TD></TR><TR><TD CLASS="l">1251</TD><TD>                        // some state, or coordinate other resources.</TD></TR><TR CLASS="z"><TD CLASS="l">1252</TD><TD>                        type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.POST_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1253</TD><TD>                        modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1254</TD><TD>                        signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR CLASS="z"><TD CLASS="l">1255</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1256</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="39">1257</A></TD><TD> </TD></TR><TR><TD CLASS="l">1258</TD><TD> </TD></TR><TR><TD CLASS="l">1259</TD><TD>        public void save(IFile iFile, EncodingRule encodingRule) throws UnsupportedEncodingException, IOException, CoreException {</TD></TR><TR><TD CLASS="l">1260</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1261</TD><TD>                int type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.PRE_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1262</TD><TD>                ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1263</TD><TD>                signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR><TD CLASS="l">1264</TD><TD> </TD></TR><TR><TD CLASS="l">1265</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1266</TD><TD>                        String stringId = getId();</TD></TR><TR CLASS="z"><TD CLASS="l">1267</TD><TD>                        _getModelManager().saveModel(iFile, stringId, encodingRule);</TD></TR><TR><TD CLASS="l">1268</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1269</TD><TD>                finally {</TD></TR><TR><TD CLASS="l">1270</TD><TD>                        // we put end notificatioon in finally block, so even if</TD></TR><TR><TD CLASS="l">1271</TD><TD>                        // error occurs during save, listeners are still notified,</TD></TR><TR><TD CLASS="l">1272</TD><TD>                        // since their code could depend on receiving, to clean up</TD></TR><TR><TD CLASS="l">1273</TD><TD>                        // some state, or coordinate other resources.</TD></TR><TR CLASS="z"><TD CLASS="l">1274</TD><TD>                        type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.POST_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1275</TD><TD>                        modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1276</TD><TD>                        signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR CLASS="z"><TD CLASS="l">1277</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1278</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="3a">1279</A></TD><TD> </TD></TR><TR><TD CLASS="l">1280</TD><TD> </TD></TR><TR><TD CLASS="l">1281</TD><TD>        public void save(OutputStream outputStream) throws UnsupportedEncodingException, CoreException, IOException {</TD></TR><TR><TD CLASS="l">1282</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1283</TD><TD>                int type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.PRE_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1284</TD><TD>                ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1285</TD><TD>                signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR><TD CLASS="l">1286</TD><TD> </TD></TR><TR><TD CLASS="l">1287</TD><TD>                try {</TD></TR><TR CLASS="z"><TD CLASS="l">1288</TD><TD>                        String stringId = getId();</TD></TR><TR CLASS="z"><TD CLASS="l">1289</TD><TD>                        _getModelManager().saveModel(stringId, outputStream, EncodingRule.CONTENT_BASED);</TD></TR><TR><TD CLASS="l">1290</TD><TD>                }</TD></TR><TR><TD CLASS="l">1291</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1292</TD><TD>                finally {</TD></TR><TR><TD CLASS="l">1293</TD><TD>                        // we put end notification in finally block, so even if</TD></TR><TR><TD CLASS="l">1294</TD><TD>                        // error occurs during save, listeners are still notified,</TD></TR><TR><TD CLASS="l">1295</TD><TD>                        // since their code could depend on receiving, to clean up</TD></TR><TR><TD CLASS="l">1296</TD><TD>                        // some state, or coordinate other resources.</TD></TR><TR CLASS="z"><TD CLASS="l">1297</TD><TD>                        type = ModelLifecycleEvent.MODEL_SAVED | ModelLifecycleEvent.POST_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1298</TD><TD>                        modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1299</TD><TD>                        signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR CLASS="z"><TD CLASS="l">1300</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1301</TD><TD>        }</TD></TR><TR><TD CLASS="l">1302</TD><TD> </TD></TR><TR><TD CLASS="l">1303</TD><TD> </TD></TR><TR><TD CLASS="l">1304</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1305</TD><TD>         * This attribute is typically used to denote the model's underlying</TD></TR><TR><TD CLASS="l"><A NAME="60">1306</A></TD><TD>         * resource.</TD></TR><TR><TD CLASS="l">1307</TD><TD>         */</TD></TR><TR><TD CLASS="l">1308</TD><TD>        public void setBaseLocation(java.lang.String newBaseLocation) {</TD></TR><TR><TD CLASS="l">1309</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="61">1310</A></TD><TD>                fBaseLocation = newBaseLocation;</TD></TR><TR CLASS="c"><TD CLASS="l">1311</TD><TD>        }</TD></TR><TR><TD CLASS="l">1312</TD><TD> </TD></TR><TR><TD CLASS="l">1313</TD><TD>        public void setContentTypeIdentifier(String contentTypeIdentifier) {</TD></TR><TR CLASS="c"><TD CLASS="l">1314</TD><TD>                fExplicitContentTypeIdentifier = contentTypeIdentifier;</TD></TR><TR CLASS="c"><TD CLASS="l">1315</TD><TD>        }</TD></TR><TR><TD CLASS="l">1316</TD><TD> </TD></TR><TR><TD CLASS="l">1317</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1318</TD><TD>         * </TD></TR><TR><TD CLASS="l"><A NAME="3b">1319</A></TD><TD>         */</TD></TR><TR><TD CLASS="l">1320</TD><TD>        public void setDirtyState(boolean dirtyState) {</TD></TR><TR><TD CLASS="l">1321</TD><TD> </TD></TR><TR><TD CLASS="l">1322</TD><TD>                // no need to process (set or fire event), if same value</TD></TR><TR CLASS="z"><TD CLASS="l">1323</TD><TD>                if (fDirtyState != dirtyState) {</TD></TR><TR><TD CLASS="l">1324</TD><TD>                        // pre-change notification</TD></TR><TR CLASS="z"><TD CLASS="l">1325</TD><TD>                        int type = ModelLifecycleEvent.MODEL_DIRTY_STATE | ModelLifecycleEvent.PRE_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1326</TD><TD>                        ModelLifecycleEvent modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1327</TD><TD>                        signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR><TD CLASS="l">1328</TD><TD> </TD></TR><TR><TD CLASS="l">1329</TD><TD> </TD></TR><TR><TD CLASS="l">1330</TD><TD>                        // the actual change</TD></TR><TR CLASS="z"><TD CLASS="l">1331</TD><TD>                        fDirtyState = dirtyState;</TD></TR><TR><TD CLASS="l">1332</TD><TD> </TD></TR><TR><TD CLASS="l">1333</TD><TD>                        // old notification</TD></TR><TR><TD CLASS="l">1334</TD><TD>                        // TODO: C3 remove old notification</TD></TR><TR CLASS="z"><TD CLASS="l">1335</TD><TD>                        if (fDirtyState == false) {</TD></TR><TR><TD CLASS="l">1336</TD><TD>                                // if we are being set to not dirty (such as just been saved)</TD></TR><TR><TD CLASS="l">1337</TD><TD>                                // then we need to start listening for changes</TD></TR><TR><TD CLASS="l">1338</TD><TD>                                // again to know when to set state to true;</TD></TR><TR CLASS="z"><TD CLASS="l">1339</TD><TD>                                getStructuredDocument().addDocumentChangedListener(fDirtyStateWatcher);</TD></TR><TR><TD CLASS="l">1340</TD><TD>                        }</TD></TR><TR CLASS="z"><TD CLASS="l">1341</TD><TD>                        fireModelDirtyStateChanged(this, dirtyState);</TD></TR><TR><TD CLASS="l">1342</TD><TD> </TD></TR><TR><TD CLASS="l">1343</TD><TD> </TD></TR><TR><TD CLASS="l">1344</TD><TD>                        // post change notification</TD></TR><TR CLASS="z"><TD CLASS="l">1345</TD><TD>                        type = ModelLifecycleEvent.MODEL_DIRTY_STATE | ModelLifecycleEvent.POST_EVENT;</TD></TR><TR CLASS="z"><TD CLASS="l">1346</TD><TD>                        modelLifecycleEvent = new ModelLifecycleEvent(this, type);</TD></TR><TR CLASS="z"><TD CLASS="l">1347</TD><TD>                        signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR><TD CLASS="l">1348</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1349</TD><TD>        }</TD></TR><TR><TD CLASS="l">1350</TD><TD> </TD></TR><TR><TD CLASS="l">1351</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="3c">1352</A></TD><TD>         * @deprecated - will likely be deprecated soon, in favor of direct 'adds'</TD></TR><TR><TD CLASS="l">1353</TD><TD>         *             ... but takes some redesign.</TD></TR><TR><TD CLASS="l">1354</TD><TD>         */</TD></TR><TR><TD CLASS="l">1355</TD><TD>        public void setFactoryRegistry(FactoryRegistry factoryRegistry) {</TD></TR><TR CLASS="z"><TD CLASS="l">1356</TD><TD>                this.factoryRegistry = factoryRegistry;</TD></TR><TR CLASS="z"><TD CLASS="l">1357</TD><TD>        }</TD></TR><TR><TD CLASS="l">1358</TD><TD> </TD></TR><TR><TD CLASS="l">1359</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1360</TD><TD>         * The id is the id that the model manager uses to identify this model. If</TD></TR><TR><TD CLASS="l">1361</TD><TD>         * it is being set here, it means the model manger is already managing the</TD></TR><TR><TD CLASS="l">1362</TD><TD>         * model with another id, so we have to keep it in sync. This method calls</TD></TR><TR><TD CLASS="l">1363</TD><TD>         * notifies listners, if they haven't been notified already, that a &#34;model</TD></TR><TR><TD CLASS="l">1364</TD><TD>         * state change&#34; is about to occur.</TD></TR><TR><TD CLASS="l">1365</TD><TD>         */</TD></TR><TR><TD CLASS="l">1366</TD><TD>        public void setId(String newId) throws ResourceInUse {</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>                // It makes no sense, I don't think, to have an id of null, so</TD></TR><TR><TD CLASS="l"><A NAME="47">1370</A></TD><TD>                // we'll throw an illegal argument exception if someone trys. Note:</TD></TR><TR><TD CLASS="l">1371</TD><TD>                // the IModelManager could not manage a model with an id of null,</TD></TR><TR><TD CLASS="l">1372</TD><TD>                // since it uses hashtables, and you can't have a null id for a</TD></TR><TR><TD CLASS="l">1373</TD><TD>                // hashtable.</TD></TR><TR CLASS="c"><TD CLASS="l">1374</TD><TD>                if (newId == null)</TD></TR><TR CLASS="z"><TD CLASS="l">1375</TD><TD>                        throw new IllegalArgumentException(SSECoreMessages.A_model_s_id_can_not_be_nu_EXC_); //$NON-NLS-1$ = &#34;A model's id can not be null&#34;</TD></TR><TR><TD CLASS="l">1376</TD><TD>                // To guard against throwing a spurious ResourceInUse exception,</TD></TR><TR><TD CLASS="l">1377</TD><TD>                // which can occur when two pieces of code both want to change the id,</TD></TR><TR><TD CLASS="l">1378</TD><TD>                // so the second request is spurious, we'll ignore any requests that</TD></TR><TR><TD CLASS="l">1379</TD><TD>                // attempt to change the id to what it already is ... note, we use</TD></TR><TR><TD CLASS="l">1380</TD><TD>                // 'equals', not identity ('==') so that things like</TD></TR><TR><TD CLASS="l">1381</TD><TD>                // strings can be used. This is the same criteria that ids are</TD></TR><TR><TD CLASS="l">1382</TD><TD>                // found in model manager -- well, actually, I just checked, and for</TD></TR><TR><TD CLASS="l">1383</TD><TD>                // the hashtable impl, the criteria uses .equals AND the condition</TD></TR><TR><TD CLASS="l">1384</TD><TD>                // that the hash values be identical (I'm assuming this is always</TD></TR><TR><TD CLASS="l">1385</TD><TD>                // true, if equals is true, for now, I'm not sure</TD></TR><TR><TD CLASS="l">1386</TD><TD>                // we can assume that hashtable will always be used, but in</TD></TR><TR><TD CLASS="l">1387</TD><TD>                // general, should match.)</TD></TR><TR><TD CLASS="l">1388</TD><TD>                //</TD></TR><TR CLASS="c"><TD CLASS="l">1389</TD><TD>                if (newId.equals(fId))</TD></TR><TR CLASS="z"><TD CLASS="l">1390</TD><TD>                        return;</TD></TR><TR><TD CLASS="l">1391</TD><TD>                // we must guard against reassigning an id to one that we already</TD></TR><TR><TD CLASS="l">1392</TD><TD>                // are managing.</TD></TR><TR CLASS="c"><TD CLASS="l">1393</TD><TD>                if (getModelManager() != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1394</TD><TD>                        boolean inUse = ((ModelManagerImpl)getModelManager()).isIdInUse(newId);</TD></TR><TR CLASS="c"><TD CLASS="l">1395</TD><TD>                        if (inUse) {</TD></TR><TR CLASS="z"><TD CLASS="l">1396</TD><TD>                                throw new ResourceInUse();</TD></TR><TR><TD CLASS="l">1397</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1398</TD><TD>                }</TD></TR><TR><TD CLASS="l">1399</TD><TD>                try {</TD></TR><TR><TD CLASS="l">1400</TD><TD>                        // normal code path</TD></TR><TR CLASS="c"><TD CLASS="l">1401</TD><TD>                        aboutToChangeModel();</TD></TR><TR CLASS="c"><TD CLASS="l">1402</TD><TD>                        String oldId = fId;</TD></TR><TR CLASS="c"><TD CLASS="l">1403</TD><TD>                        fId = newId;</TD></TR><TR CLASS="c"><TD CLASS="l">1404</TD><TD>                        if (getModelManager() != null) {</TD></TR><TR><TD CLASS="l">1405</TD><TD>                                // if managed and the id has changed, notify to</TD></TR><TR><TD CLASS="l">1406</TD><TD>                                // IModelManager</TD></TR><TR><TD CLASS="l">1407</TD><TD>                                // TODO: try to refine the design not to do that</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="25% line coverage (2 out of 8 instructions)">1408</TD><TD TITLE="25% line coverage (2 out of 8 instructions)">                                if (oldId != null &amp;&amp; newId != null &amp;&amp; !newId.equals(oldId)) {</TD></TR><TR CLASS="z"><TD CLASS="l">1409</TD><TD>                                        getModelManager().moveModel(oldId, newId);</TD></TR><TR><TD CLASS="l">1410</TD><TD>                                }</TD></TR><TR><TD CLASS="l">1411</TD><TD>                        }</TD></TR><TR><TD CLASS="l">1412</TD><TD>                }</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="67% line coverage (4 out of 6 instructions)">1413</TD><TD TITLE="67% line coverage (4 out of 6 instructions)">                finally {</TD></TR><TR><TD CLASS="l">1414</TD><TD>                        // make sure this finally is only executed if 'about to Change</TD></TR><TR><TD CLASS="l">1415</TD><TD>                        // model' has</TD></TR><TR><TD CLASS="l">1416</TD><TD>                        // been executed.</TD></TR><TR CLASS="c"><TD CLASS="l">1417</TD><TD>                        changedModel();</TD></TR><TR CLASS="p"><TD CLASS="l" TITLE="71% line coverage (5 out of 7 instructions)">1418</TD><TD TITLE="71% line coverage (5 out of 7 instructions)">                }</TD></TR><TR CLASS="c"><TD CLASS="l">1419</TD><TD>        }</TD></TR><TR><TD CLASS="l">1420</TD><TD> </TD></TR><TR><TD CLASS="l">1421</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1422</TD><TD>         * Sets the contentTypeDescription.</TD></TR><TR><TD CLASS="l">1423</TD><TD>         * </TD></TR><TR><TD CLASS="l">1424</TD><TD>         * @param contentTypeDescription</TD></TR><TR><TD CLASS="l">1425</TD><TD>         *            The contentTypeDescription to set</TD></TR><TR><TD CLASS="l">1426</TD><TD>         */</TD></TR><TR><TD CLASS="l">1427</TD><TD>        public void setModelHandler(IModelHandler modelHandler) {</TD></TR><TR><TD CLASS="l">1428</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="49">1429</A></TD><TD>                // no need to fire events if modelHandler has been null</TD></TR><TR><TD CLASS="l">1430</TD><TD>                // for this model --</TD></TR><TR><TD CLASS="l">1431</TD><TD>                // this is an attempt at initialization optimization and may need</TD></TR><TR><TD CLASS="l">1432</TD><TD>                // to change in future.</TD></TR><TR CLASS="c"><TD CLASS="l">1433</TD><TD>                boolean trueChange = false;</TD></TR><TR CLASS="c"><TD CLASS="l">1434</TD><TD>                if (fModelHandler != null)</TD></TR><TR CLASS="z"><TD CLASS="l">1435</TD><TD>                        trueChange = true;</TD></TR><TR CLASS="c"><TD CLASS="l">1436</TD><TD>                if (trueChange) {</TD></TR><TR CLASS="z"><TD CLASS="l">1437</TD><TD>                        internalAboutToBeChanged();</TD></TR><TR><TD CLASS="l">1438</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1439</TD><TD>                fModelHandler = modelHandler;</TD></TR><TR CLASS="c"><TD CLASS="l">1440</TD><TD>                if (trueChange) {</TD></TR><TR CLASS="z"><TD CLASS="l">1441</TD><TD>                        internalModelChanged();</TD></TR><TR><TD CLASS="l">1442</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1443</TD><TD>        }</TD></TR><TR><TD CLASS="l">1444</TD><TD> </TD></TR><TR><TD CLASS="l"><A NAME="3d">1445</A></TD><TD> </TD></TR><TR><TD CLASS="l">1446</TD><TD> </TD></TR><TR><TD CLASS="l">1447</TD><TD>        public void setModelManager(IModelManager newModelManager) {</TD></TR><TR><TD CLASS="l">1448</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1449</TD><TD>                fModelManager = newModelManager;</TD></TR><TR CLASS="z"><TD CLASS="l">1450</TD><TD>        }</TD></TR><TR><TD CLASS="l">1451</TD><TD> </TD></TR><TR><TD CLASS="l">1452</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="62">1453</A></TD><TD>         * </TD></TR><TR><TD CLASS="l">1454</TD><TD>         */</TD></TR><TR><TD CLASS="l">1455</TD><TD>        public void setNewState(boolean newState) {</TD></TR><TR><TD CLASS="l">1456</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1457</TD><TD>                fNewState = newState;</TD></TR><TR CLASS="c"><TD CLASS="l">1458</TD><TD>        }</TD></TR><TR><TD CLASS="l">1459</TD><TD> </TD></TR><TR><TD CLASS="l">1460</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="3e">1461</A></TD><TD>         * Sets a &#34;flag&#34; that reinitialization is needed.</TD></TR><TR><TD CLASS="l">1462</TD><TD>         */</TD></TR><TR><TD CLASS="l">1463</TD><TD>        public void setReinitializeNeeded(boolean needed) {</TD></TR><TR><TD CLASS="l">1464</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1465</TD><TD>                reinitializationNeeded = needed;</TD></TR><TR CLASS="z"><TD CLASS="l">1466</TD><TD>        }</TD></TR><TR><TD CLASS="l">1467</TD><TD> </TD></TR><TR><TD CLASS="l">1468</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1469</TD><TD>         * Holds any data that the reinit procedure might find useful in</TD></TR><TR><TD CLASS="l">1470</TD><TD>         * reinitializing the model. This is handy, since the reinitialization may</TD></TR><TR><TD CLASS="l">1471</TD><TD>         * not take place at once, and some &#34;old&#34; data may be needed to properly</TD></TR><TR><TD CLASS="l">1472</TD><TD>         * undo previous settings. Note: the parameter was intentionally made to</TD></TR><TR><TD CLASS="l"><A NAME="3f">1473</A></TD><TD>         * be of type 'Object' so different models can use in different ways.</TD></TR><TR><TD CLASS="l">1474</TD><TD>         */</TD></TR><TR><TD CLASS="l">1475</TD><TD>        public void setReinitializeStateData(Object object) {</TD></TR><TR><TD CLASS="l">1476</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1477</TD><TD>                reinitializeStateData = object;</TD></TR><TR CLASS="z"><TD CLASS="l">1478</TD><TD>        }</TD></TR><TR><TD CLASS="l"><A NAME="63">1479</A></TD><TD> </TD></TR><TR><TD CLASS="l">1480</TD><TD> </TD></TR><TR><TD CLASS="l">1481</TD><TD>        public void setResolver(URIResolver newResolver) {</TD></TR><TR><TD CLASS="l">1482</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1483</TD><TD>                fResolver = newResolver;</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="64">1484</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1485</TD><TD> </TD></TR><TR><TD CLASS="l">1486</TD><TD> </TD></TR><TR><TD CLASS="l">1487</TD><TD>        public void setStructuredDocument(IStructuredDocument newStructuredDocument) {</TD></TR><TR CLASS="c"><TD CLASS="l">1488</TD><TD>                boolean lifeCycleNotification = false;</TD></TR><TR CLASS="c"><TD CLASS="l">1489</TD><TD>                if (fStructuredDocument != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1490</TD><TD>                        fStructuredDocument.removeDocumentChangedListener(fDirtyStateWatcher);</TD></TR><TR CLASS="c"><TD CLASS="l">1491</TD><TD>                        fStructuredDocument.removeDocumentAboutToChangeListener(fDocumentToModelNotifier);</TD></TR><TR CLASS="c"><TD CLASS="l">1492</TD><TD>                        fStructuredDocument.removeDocumentChangedListener(fDocumentToModelNotifier);</TD></TR><TR><TD CLASS="l">1493</TD><TD>                        // prechange notification</TD></TR><TR CLASS="c"><TD CLASS="l">1494</TD><TD>                        lifeCycleNotification = true;</TD></TR><TR CLASS="c"><TD CLASS="l">1495</TD><TD>                        ModelLifecycleEvent modelLifecycleEvent = new DocumentChanged(ModelLifecycleEvent.PRE_EVENT, this, fStructuredDocument, newStructuredDocument);</TD></TR><TR CLASS="c"><TD CLASS="l">1496</TD><TD>                        signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR><TD CLASS="l">1497</TD><TD>                }</TD></TR><TR><TD CLASS="l">1498</TD><TD> </TD></TR><TR><TD CLASS="l">1499</TD><TD>                // hold for life cycle notification</TD></TR><TR CLASS="c"><TD CLASS="l">1500</TD><TD>                IStructuredDocument previousDocument = fStructuredDocument;</TD></TR><TR><TD CLASS="l">1501</TD><TD>                // the actual change</TD></TR><TR CLASS="c"><TD CLASS="l">1502</TD><TD>                fStructuredDocument = newStructuredDocument;</TD></TR><TR><TD CLASS="l">1503</TD><TD> </TD></TR><TR><TD CLASS="l">1504</TD><TD> </TD></TR><TR><TD CLASS="l">1505</TD><TD>                // at the super class level, we'll listen for structuredDocument</TD></TR><TR><TD CLASS="l">1506</TD><TD>                // changes</TD></TR><TR><TD CLASS="l">1507</TD><TD>                // so we can set our dirty state flag</TD></TR><TR CLASS="c"><TD CLASS="l">1508</TD><TD>                if (fStructuredDocument != null) {</TD></TR><TR CLASS="c"><TD CLASS="l">1509</TD><TD>                        fStructuredDocument.addDocumentChangedListener(fDirtyStateWatcher);</TD></TR><TR CLASS="c"><TD CLASS="l">1510</TD><TD>                        fStructuredDocument.addDocumentAboutToChangeListener(fDocumentToModelNotifier);</TD></TR><TR CLASS="c"><TD CLASS="l">1511</TD><TD>                        fStructuredDocument.addDocumentChangedListener(fDocumentToModelNotifier);</TD></TR><TR><TD CLASS="l">1512</TD><TD>                }</TD></TR><TR><TD CLASS="l">1513</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1514</TD><TD>                if (lifeCycleNotification) {</TD></TR><TR><TD CLASS="l">1515</TD><TD>                        // post change notification</TD></TR><TR CLASS="c"><TD CLASS="l">1516</TD><TD>                        ModelLifecycleEvent modelLifecycleEvent = new DocumentChanged(ModelLifecycleEvent.POST_EVENT, this, previousDocument, newStructuredDocument);</TD></TR><TR CLASS="c"><TD CLASS="l">1517</TD><TD>                        signalLifecycleEvent(modelLifecycleEvent);</TD></TR><TR><TD CLASS="l">1518</TD><TD>                }</TD></TR><TR CLASS="c"><TD CLASS="l">1519</TD><TD>        }</TD></TR><TR><TD CLASS="l">1520</TD><TD> </TD></TR><TR><TD CLASS="l">1521</TD><TD>        /**</TD></TR><TR><TD CLASS="l">1522</TD><TD>         * Insert the method's description here. Creation date: (9/7/2001 2:30:26</TD></TR><TR><TD CLASS="l">1523</TD><TD>         * PM)</TD></TR><TR><TD CLASS="l">1524</TD><TD>         * </TD></TR><TR><TD CLASS="l">1525</TD><TD>         * @param newSynchronizationStamp</TD></TR><TR><TD CLASS="l"><A NAME="65">1526</A></TD><TD>         *            long</TD></TR><TR><TD CLASS="l">1527</TD><TD>         */</TD></TR><TR><TD CLASS="l">1528</TD><TD>        protected void setSynchronizationStamp(long newSynchronizationStamp) {</TD></TR><TR><TD CLASS="l">1529</TD><TD> </TD></TR><TR CLASS="c"><TD CLASS="l">1530</TD><TD>                fSynchronizationStamp = newSynchronizationStamp;</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="40">1531</A></TD><TD>        }</TD></TR><TR><TD CLASS="l">1532</TD><TD> </TD></TR><TR><TD CLASS="l">1533</TD><TD>        public void setUndoManager(IStructuredTextUndoManager undoManager) {</TD></TR><TR><TD CLASS="l">1534</TD><TD> </TD></TR><TR CLASS="z"><TD CLASS="l">1535</TD><TD>                IStructuredDocument structuredDocument = getStructuredDocument();</TD></TR><TR CLASS="z"><TD CLASS="l">1536</TD><TD>                if (structuredDocument == null) {</TD></TR><TR CLASS="z"><TD CLASS="l">1537</TD><TD>                        throw new IllegalStateException(&#34;document was null when undo manager set on model&#34;); //$NON-NLS-1$</TD></TR><TR><TD CLASS="l">1538</TD><TD>                }</TD></TR><TR CLASS="z"><TD CLASS="l">1539</TD><TD>                structuredDocument.setUndoManager(undoManager);</TD></TR><TR CLASS="z"><TD CLASS="l">1540</TD><TD>        }</TD></TR><TR><TD CLASS="l">1541</TD><TD> </TD></TR><TR><TD CLASS="l">1542</TD><TD>        /**</TD></TR><TR><TD CLASS="l"><A NAME="66">1543</A></TD><TD>         * To be called only by &#34;friendly&#34; classes, such as ModelManager, and</TD></TR><TR><TD CLASS="l">1544</TD><TD>         * subclasses.</TD></TR><TR><TD CLASS="l">1545</TD><TD>         */</TD></TR><TR><TD CLASS="l">1546</TD><TD>        void signalLifecycleEvent(ModelLifecycleEvent event) {</TD></TR><TR CLASS="c"><TD CLASS="l">1547</TD><TD>                if (fLifecycleNotificationManager == null)</TD></TR><TR CLASS="c"><TD CLASS="l">1548</TD><TD>                        return;</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="67">1549</A></TD><TD>                fLifecycleNotificationManager.signalLifecycleEvent(event);</TD></TR><TR CLASS="c"><TD CLASS="l">1550</TD><TD>        }</TD></TR><TR><TD CLASS="l">1551</TD><TD> </TD></TR><TR><TD CLASS="l">1552</TD><TD>        private void signalPostLifeCycleListenerRelease(IStructuredModel structuredModel) {</TD></TR><TR CLASS="c"><TD CLASS="l">1553</TD><TD>                int type = ModelLifecycleEvent.MODEL_RELEASED | ModelLifecycleEvent.POST_EVENT;</TD></TR><TR><TD CLASS="l">1554</TD><TD>                // what's wrong with this design that a cast is needed here!?</TD></TR><TR CLASS="c"><TD CLASS="l">1555</TD><TD>                ModelLifecycleEvent event = new ModelLifecycleEvent(structuredModel, type);</TD></TR><TR CLASS="c"><TD CLASS="l"><A NAME="68">1556</A></TD><TD>                ((AbstractStructuredModel) structuredModel).signalLifecycleEvent(event);</TD></TR><TR CLASS="c"><TD CLASS="l">1557</TD><TD>        }</TD></TR><TR><TD CLASS="l">1558</TD><TD> </TD></TR><TR><TD CLASS="l">1559</TD><TD>        private void signalPreLifeCycleEventRelease(IStructuredModel structuredModel) {</TD></TR><TR CLASS="c"><TD CLASS="l">1560</TD><TD>                int type = ModelLifecycleEvent.MODEL_RELEASED | ModelLifecycleEvent.PRE_EVENT;</TD></TR><TR><TD CLASS="l">1561</TD><TD>                // what's wrong with this design that a cast is needed here!?</TD></TR><TR CLASS="c"><TD CLASS="l">1562</TD><TD>                ModelLifecycleEvent event = new ModelLifecycleEvent(structuredModel, type);</TD></TR><TR CLASS="c"><TD CLASS="l">1563</TD><TD>                ((AbstractStructuredModel) structuredModel).signalLifecycleEvent(event);</TD></TR><TR CLASS="c"><TD CLASS="l">1564</TD><TD>        }</TD></TR><TR><TD CLASS="l">1565</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>