001/* Filter for simple class name changes
002
003 Copyright (c) 2002-2016 The Regents of the University of California.
004 All rights reserved.
005 Permission is hereby granted, without written agreement and without
006 license or royalty fees, to use, copy, modify, and distribute this
007 software and its documentation for any purpose, provided that the above
008 copyright notice and the following two paragraphs appear in all copies
009 of this software.
010
011 IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY
012 FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
013 ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
014 THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
015 SUCH DAMAGE.
016
017 THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
018 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
019 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
020 PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
021 CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
022 ENHANCEMENTS, OR MODIFICATIONS.
023
024 PT_COPYRIGHT_VERSION_2
025 COPYRIGHTENDKEY
026 */
027package ptolemy.moml.filter;
028
029import java.util.HashMap;
030import java.util.HashSet;
031import java.util.Iterator;
032import java.util.Map;
033import java.util.StringTokenizer;
034
035import ptolemy.kernel.util.NamedObj;
036import ptolemy.moml.MoMLParser;
037
038///////////////////////////////////////////////////////////////////
039//// ClassChanges
040
041/** When this class is registered with the MoMLParser.setMoMLFilter()
042 method, it will cause MoMLParser to filter so that models from
043 earlier releases will run in the current release.
044
045 <p>This class will filter moml for simple class changes where
046 the context of the class name to be changed does not matter - all
047 occurrences of the class name will be changed.  This class
048 can be thought of as a primitive form of sed.
049
050 <p> If a class within an actor is what has changed, use (@see
051 PropertyClassChanges) instead.
052
053 @author Christopher Hylands
054 @version $Id$
055 @since Ptolemy II 2.0
056 @Pt.ProposedRating Red (cxh)
057 @Pt.AcceptedRating Red (cxh)
058 */
059public class ClassChanges extends MoMLFilterSimple {
060    /** Clear the map of class renames and the set of class removals.
061     */
062    public static void clear() {
063        _classChanges = new HashMap<String, String>();
064        _classesToRemove = new HashSet<String>();
065    }
066
067    /** If the attributeName is "class" and attributeValue names a
068     *  class that needs to be renamed, then substitute in the new class
069     *  name. If the attributeValue names a class that needs to be removed,
070     *  then return null, which will cause the MoMLParser to skip the
071     *  rest of the element;
072     *
073     *  @param container  The container for this attribute.
074     *  @param element The XML element name.
075     *  @param attributeName The name of the attribute.
076     *  @param attributeValue The value of the attribute.
077     *  @param xmlFile The file currently being parsed.
078     *  @return the value of the attributeValue argument.
079     */
080    @Override
081    public String filterAttributeValue(NamedObj container, String element,
082            String attributeName, String attributeValue, String xmlFile) {
083        // This method gets called many times by the MoMLParser,
084        // so we try to be smart about the number of comparisons
085        // and we try to group comparisons together so that we
086        // are not making the same comparison more than once.
087        if (attributeValue == null) {
088            // attributeValue == null is fairly common, so we check for
089            // that first
090            return null;
091        }
092
093        // If you change this class, you should run before and after
094        // timing tests on large moml files, a good command to run
095        // is:
096        // $PTII/bin/ptolemy -test $PTII/ptolemy/domains/ct/demo/CarTracking/CarTracking.xml
097        // which will open up a large xml file and then close after 2 seconds.
098        if (attributeName.equals("class")) {
099            if (_classChanges.containsKey(attributeValue)) {
100                // We found a class with a class change.
101                MoMLParser.setModified(true);
102
103                // Uncomment this to trace changes.
104                //System.out.println("ClassChanges: " + attributeValue  + " " + _classChanges.get(attributeValue));
105
106                return _classChanges.get(attributeValue);
107            } else if (_classesToRemove.contains(attributeValue)) {
108                // We found a class to remove.
109                return null;
110            }
111        }
112        return attributeValue;
113    }
114
115    /** In this class, do nothing.
116     *  @param container The object created by this element.
117     *  @param elementName The element name.
118     *  @param currentCharData The character data, which appears
119     *   only in the doc and configure elements
120     *  @param xmlFile The file currently being parsed.
121     *  @exception Exception Not thrown in this base class.
122     */
123    @Override
124    public void filterEndElement(NamedObj container, String elementName,
125            StringBuffer currentCharData, String xmlFile) throws Exception {
126    }
127
128    /** Add a class to be filtered. Note that if you add a class with this
129     *  method, then you must remove it with {@link #remove(String)},
130     *  calling "new ClassChanges()" will not remove a class that was
131     *  added with this method.
132     *  @param oldName The old name of the class to be filtered.
133     *  @param newName The new name of the class to be filtered. If
134     *  the value is null, then the class in oldName will be removed.
135     *  @see #remove(String)
136     */
137    public void put(String oldName, String newName) {
138        if (newName == null) {
139            _classesToRemove.add(oldName);
140        } else {
141            _classChanges.put(oldName, newName);
142        }
143    }
144
145    /** Remove a class to be filtered.
146     *  @param className The name of the class to be filtered
147     *  out, for example "ptolemy.copernicus.kernel.GeneratorAttribute".
148     *  @see #put(String, String)
149     */
150    public void remove(String className) {
151        if (_classChanges.containsKey(className)) {
152            _classChanges.remove(className);
153        } else if (_classesToRemove.contains(className)) {
154            _classesToRemove.remove(className);
155        }
156    }
157
158    /** Return a string that describes what the filter does.
159     *  @return the description of the filter that ends with a newline.
160     */
161    @Override
162    public String toString() {
163        StringBuffer results = new StringBuffer(getClass().getName()
164                + ": change any class names that have been "
165                + "renamed and remove obsolete classes.\n"
166                + "Below are original class names followed by "
167                + "the new class names:\n");
168
169        for (Map.Entry<String, String> classChange : _classChanges.entrySet()) {
170            String className = classChange.getKey();
171            results.append("\t" + className + "\t -> " + classChange.getValue()
172                    + "\n");
173        }
174
175        results.append("\nBelow are the classes to remove:\n");
176
177        Iterator classesToRemove = _classesToRemove.iterator();
178
179        while (classesToRemove.hasNext()) {
180            String className = (String) classesToRemove.next();
181            results.append("\t" + className + "\n");
182        }
183
184        return results.toString();
185    }
186
187    ///////////////////////////////////////////////////////////////////
188    ////                         private variables                 ////
189    // Map of actor names a HashMap of property names to new classes.
190    private static HashMap<String, String> _classChanges;
191
192    static {
193        ///////////////////////////////////////////////////////////
194        // Actors and attributes that have changed names.
195        _classChanges = new HashMap<String, String>();
196
197        // If the ptolemy.ptII.classesToChange property is set, then
198        // assume that it is consists of fully qualified class names in
199        // pairs.  The first name is the old class name, the second name is the
200        // new name.
201        String propertyName = "ptolemy.ptII.classesToChange";
202        try {
203            String classesToChange = System.getProperty(propertyName);
204            if (classesToChange != null && !classesToChange.equals("")) {
205                StringTokenizer tokenizer = new StringTokenizer(
206                        classesToChange);
207                while (tokenizer.hasMoreTokens()) {
208                    String oldClassName = tokenizer.nextToken();
209                    if (tokenizer.hasMoreTokens()) {
210                        String newClassName = tokenizer.nextToken();
211                        System.out.println(
212                                "ptolemy.moml.filter.ClassChanges(): property "
213                                        + propertyName + " was set, adding "
214                                        + oldClassName + " -> " + newClassName);
215                        _classChanges.put(oldClassName, newClassName);
216                    }
217                }
218            }
219        } catch (Throwable throwable) {
220            System.err.println("Failed to handle the \"" + propertyName + "\": "
221                    + throwable);
222            throwable.printStackTrace();
223        }
224
225        // JSAccessor
226        _classChanges.put("org.terraswarm.accessor.jjs.JSAccessor",
227                "org.terraswarm.accessor.JSAccessor");
228
229        // AccessorOne
230        _classChanges.put("org.terraswarm.kernel.AccessorOne",
231                "org.terraswarm.accessor.JSAccessor");
232
233        // Rhino JavaScript
234        _classChanges.put("ptolemy.actor.lib.js.JavaScript",
235                "ptolemy.actor.lib.jjs.JavaScript");
236
237        // Location
238        _classChanges.put("ptolemy.moml.Location",
239                "ptolemy.kernel.util.Location");
240
241        // New in 2.1-devel-2
242        _classChanges.put("ptolemy.kernel.util.VersionAttribute",
243                "ptolemy.kernel.attributes.VersionAttribute");
244
245        _classChanges.put("ptolemy.kernel.util.RelativeLocation",
246                "ptolemy.vergil.basic.RelativeLocation");
247
248        // New in 2.3-devel
249        _classChanges.put("ptolemy.actor.lib.comm.SerialComm",
250                "ptolemy.actor.lib.io.comm.SerialComm");
251
252        // New in 3.1-devel
253        _classChanges.put("ptolemy.domains.fsm.lib.RelationList",
254                "ptolemy.domains.modal.kernel.RelationList");
255
256        _classChanges.put("ptolemy.domains.fsm.kernel.CommitActionsAttribute",
257                "ptolemy.domains.modal.kernel.CommitActionsAttribute");
258
259        _classChanges.put("ptolemy.domains.fsm.kernel.FSMDirector",
260                "ptolemy.domains.modal.kernel.FSMDirector");
261
262        _classChanges.put("ptolemy.domains.fsm.kernel.OutputActionsAttribute",
263                "ptolemy.domains.modal.kernel.OutputActionsAttribute");
264
265        _classChanges.put("ptolemy.domains.fsm.kernel.State",
266                "ptolemy.domains.modal.kernel.State");
267
268        _classChanges.put("ptolemy.domains.fsm.kernel.Transition",
269                "ptolemy.domains.modal.kernel.Transition");
270
271        _classChanges.put("ptolemy.domains.fsm.modal.ModalModel",
272                "ptolemy.domains.modal.modal.ModalModel");
273
274        _classChanges.put("ptolemy.domains.fsm.modal.ModalPort",
275                "ptolemy.domains.modal.modal.ModalPort");
276
277        _classChanges.put("ptolemy.domains.fsm.modal.State",
278                "ptolemy.domains.modal.modal.State");
279
280        _classChanges.put("ptolemy.domains.fsm.modal.Refinement",
281                "ptolemy.domains.modal.modal.Refinement");
282
283        _classChanges.put("ptolemy.domains.fsm.modal.RefinementPort",
284                "ptolemy.domains.modal.modal.RefinementPort");
285
286        _classChanges.put(
287                "ptolemy.vergil.fsm.modal.HierarchicalStateControllerFactory",
288                "ptolemy.vergil.fsm.modal.HierarchicalStateControllerFactory");
289
290        _classChanges.put("ptolemy.vergil.fsm.modal.ModalTableauFactory",
291                "ptolemy.vergil.modal.modal.ModalTableauFactory");
292
293        // Renamed in 3.1-devel
294        _classChanges.put("ptolemy.vergil.icon.ImageEditorIcon",
295                "ptolemy.vergil.icon.ImageIcon");
296
297        // Replaced FileAttribute with FileParameter in 3.2-devel
298        _classChanges.put("ptolemy.kernel.attributes.FileAttribute",
299                "ptolemy.data.expr.FileParameter");
300
301        // SDFIOPort is obsolete as of 3.2-devel
302        _classChanges.put("ptolemy.domains.sdf.kernel.SDFIOPort",
303                "ptolemy.actor.TypedIOPort");
304
305        // Moved MultiInstanceComposite
306        _classChanges.put("ptolemy.actor.hoc.MultiInstanceComposite",
307                "ptolemy.actor.lib.hoc.MultiInstanceComposite");
308
309        // Moved ModalModel
310        _classChanges.put("ptolemy.vergil.fsm.modal.ModalModel",
311                "ptolemy.domains.modal.modal.ModalModel");
312
313        _classChanges.put(
314                "ptolemy.vergil.fsm.modal.HierarchicalStateControllerFactory",
315                "ptolemy.vergil.modal.modal.HierarchicalStateControllerFactory");
316
317        // Moved InterfaceAutomatonTransition
318        _classChanges.put(
319                "ptolemy.domains.fsm.kernel.InterfaceAutomatonTransition",
320                "ptolemy.domains.modal.kernel.ia.InterfaceAutomatonTransition");
321
322        // Moved InterfaceAutomatonTransition
323        _classChanges.put("ptolemy.domains.fsm.kernel.InterfaceAutomaton",
324                "ptolemy.domains.modal.kernel.ia.InterfaceAutomaton");
325
326        // Moved InterfaceAutomatonTransition
327        _classChanges.put(
328                "ptolemy.domains.modal.kernel.InterfaceAutomatonTransition",
329                "ptolemy.domains.modal.kernel.ia.InterfaceAutomatonTransition");
330
331        // Moved InterfaceAutomatonTransition
332        _classChanges.put("ptolemy.domains.modal.kernel.InterfaceAutomaton",
333                "ptolemy.domains.modal.kernel.ia.InterfaceAutomaton");
334
335        // Moved ModalTableauFactory
336        _classChanges.put(
337                "ptolemy.vergil.fsm.modal.ModalModel$ModalTableauFactory",
338                "ptolemy.vergil.modal.modal.ModalTableauFactory");
339
340        // Moved ModalPort
341        _classChanges.put("ptolemy.vergil.fsm.modal.ModalPort",
342                "ptolemy.domains.modal.modal.ModalPort");
343
344        // Moved ModalController
345        _classChanges.put("ptolemy.vergil.fsm.modal.ModalController",
346                "ptolemy.domains.modal.modal.ModalController");
347
348        // Moved Refinement
349        _classChanges.put("ptolemy.vergil.fsm.modal.Refinement",
350                "ptolemy.domains.modal.modal.Refinement");
351
352        // Moved RefinementPort
353        _classChanges.put("ptolemy.vergil.fsm.modal.RefinementPort",
354                "ptolemy.domains.modal.modal.RefinementPort");
355
356        // Moved TransitionRefinement
357        _classChanges.put("ptolemy.vergil.fsm.modal.TransitionRefinement",
358                "ptolemy.domains.modal.modal.TransitionRefinement");
359
360        // Moved TransitionRefinementPort
361        _classChanges.put("ptolemy.vergil.fsm.modal.TransitionRefinementPort",
362                "ptolemy.domains.modal.modal.TransitionRefinementPort");
363
364        // Moved IDAttribute from ptolemy.kernel.attributes to
365        // ptolemy.vergil.kernel.atttributes
366        _classChanges.put("ptolemy.kernel.attributes.IDAttribute",
367                "ptolemy.vergil.kernel.attributes.IDAttribute");
368
369        _classChanges.put("ptolemy.domains.gr.lib.ViewScreen",
370                "ptolemy.domains.gr.lib.ViewScreen3D");
371
372        _classChanges.put("ptolemy.domains.sr.lib.Default",
373                "ptolemy.actor.lib.Default");
374
375        _classChanges.put("ptolemy.domains.sr.lib.Latch",
376                "ptolemy.domains.sr.lib.Current");
377
378        // Renamed VergilPreferences
379        _classChanges.put("ptolemy.vergil.VergilPreferences",
380                "ptolemy.actor.gui.PtolemyPreferences");
381
382        // Use FPScheduler instead of SROptimizedScheduler
383        _classChanges.put("ptolemy.domains.sr.kernel.SROptimizedScheduler",
384                "ptolemy.actor.sched.FixedPointScheduler");
385
386        // Moved HSFSMDirector
387        _classChanges.put("ptolemy.domains.fsm.kernel.HSFSMDirector",
388                "ptolemy.domains.ct.kernel.HSFSMDirector");
389
390        // Moved ParameterSet
391        _classChanges.put("ptolemy.data.expr.ParameterSet",
392                "ptolemy.actor.parameters.ParameterSet");
393
394        // ColtSeedParameter is obsolete
395        _classChanges.put("ptolemy.actor.lib.colt.ColtSeedParameter",
396                "ptolemy.moml.SharedParameter");
397
398        // 1/08: Moved SingleTokenCommutator so that DDF can extend it
399        _classChanges.put("ptolemy.domains.sr.lib.SingleTokenCommutator",
400                "ptolemy.actor.lib.SingleTokenCommutator");
401
402        // DependencyHighlighter is really a vergil class
403        _classChanges.put("ptolemy.actor.gui.DependencyHighlighter",
404                "ptolemy.vergil.basic.DependencyHighlighter");
405
406        _classChanges.put("ptolemy.moml.SharedParameter",
407                "ptolemy.actor.parameters.SharedParameter");
408
409        _classChanges.put("ptolemy.actor.lib.gui.LEDMatrix",
410                "ptolemy.vergil.actor.lib.LEDMatrix");
411
412        _classChanges.put("ptolemy.actor.lib.gui.ModelDisplay",
413                "ptolemy.vergil.actor.lib.ModelDisplay");
414
415        _classChanges.put("ptolemy.domains.sr.lib.ButtonTime",
416                "ptolemy.domains.sr.lib.gui.ButtonTime");
417
418        _classChanges.put("ptolemy.domains.sr.lib.NonStrictDisplay",
419                "ptolemy.domains.sr.lib.gui.NonStrictDisplay");
420
421        _classChanges.put("ptolemy.actor.lib.CodegenActor",
422                "ptolemy.actor.lib.jni.CodegenActor");
423
424        _classChanges.put("ptolemy.codegen.c.actor.lib.CodegenActor",
425                "ptolemy.codegen.c.actor.lib.jni.CodegenActor");
426
427        _classChanges.put("ptolemy.codegen.kernel.Director",
428                "ptolemy.codegen.actor.Director");
429
430        _classChanges.put("ptolemy.domains.de.lib.UnionMerge",
431                "ptolemy.actor.lib.UnionMerge");
432
433        // Look for Kepler's NamedObjId, and if we don't find it, then
434        // add it to the filter.  This makes it much easier to open
435        // Kepler models in Ptolemy.
436        try {
437            Class.forName("org.kepler.moml.NamedObjId");
438        } catch (ClassNotFoundException ex) {
439            _classChanges.put("org.kepler.moml.NamedObjId",
440                    "ptolemy.kernel.util.StringAttribute");
441        }
442
443        // Look for Kepler's CompositeClassEntity, and if we don't find it, then
444        // add it to the filter.  This makes it much easier to open
445        // Kepler models in Ptolemy.
446        try {
447            Class.forName("org.kepler.moml.CompositeClassEntity");
448        } catch (ClassNotFoundException ex) {
449            _classChanges.put("org.kepler.moml.CompositeClassEntity",
450                    "ptolemy.actor.TypedCompositeActor");
451        }
452
453        // Look for Kepler's NamedOjbIdReferralList, and if we don't find it, then
454        // add it to the filter.  This makes it much easier to open
455        // Kepler models in Ptolemy.
456        try {
457            Class.forName("org.kepler.moml.NamedObjIdReferralList");
458        } catch (ClassNotFoundException ex) {
459            _classChanges.put("org.kepler.moml.NamedObjIdReferralList",
460                    "ptolemy.kernel.util.StringAttribute");
461        }
462
463        // Look for Kepler's SemanticType, and if we don't find it, then
464        // add it to the filter.  This makes it much easier to open
465        // Kepler models in Ptolemy.
466        try {
467            Class.forName("org.kepler.sms.SemanticType");
468        } catch (ClassNotFoundException ex) {
469            _classChanges.put("org.kepler.sms.SemanticType",
470                    "ptolemy.kernel.util.StringAttribute");
471        }
472
473        _classChanges.put("ptolemy.data.unit.UnitAttribute",
474                "ptolemy.moml.unit.UnitAttribute");
475
476        _classChanges.put("ptolemy.domains.properties.LatticeElement",
477                "ptolemy.domains.properties.kernel.LatticeElement");
478        _classChanges.put("ptolemy.domains.properties.LatticeElementIcon",
479                "ptolemy.vergil.properties.LatticeElementIcon");
480        _classChanges.put("ptolemy.domains.properties.PropertyLatticeComposite",
481                "ptolemy.domains.properties.kernel.PropertyLatticeComposite");
482
483        // Renamed the DE Sampler to MostRecent.
484        _classChanges.put("ptolemy.domains.de.lib.Sampler",
485                "ptolemy.domains.de.lib.MostRecent");
486
487        // Moved SingleEvent.
488        _classChanges.put("ptolemy.domains.de.lib.SingleEvent",
489                "ptolemy.actor.lib.SingleEvent");
490
491        _classChanges.put("ptolemy.actor.lib.GetCurrentMicrostep",
492                "ptolemy.actor.lib.CurrentMicrostep");
493
494        // Moved MonitorValue into the gui package.
495        _classChanges.put("ptolemy.actor.lib.MonitorValue",
496                "ptolemy.actor.lib.gui.MonitorValue");
497
498        // Classes moved from vergil.export.html to vergil.export.web
499        _classChanges.put("ptolemy.vergil.basic.export.html.AreaEventType",
500                "ptolemy.vergil.basic.export.web.AreaEventType");
501        _classChanges.put("ptolemy.vergil.basic.export.html.DefaultIconLink",
502                "ptolemy.vergil.basic.export.web.DefaultIconLink");
503        _classChanges.put("ptolemy.vergil.basic.export.html.DefaultIconScript",
504                "ptolemy.vergil.basic.export.web.DefaultIconScript");
505        _classChanges.put("ptolemy.vergil.basic.export.html.DefaultTitle",
506                "ptolemy.vergil.basic.export.web.DefaultTitle");
507        _classChanges.put("ptolemy.vergil.basic.export.html.HTMLImage",
508                "ptolemy.vergil.basic.export.web.HTMLImage");
509        _classChanges.put("ptolemy.vergil.basic.export.html.HTMLText",
510                "ptolemy.vergil.basic.export.web.HTMLText");
511        _classChanges.put("ptolemy.vergil.basic.export.html.HTMLTextPosition",
512                "ptolemy.vergil.basic.export.web.HTMLTextPosition");
513        _classChanges.put("ptolemy.vergil.basic.export.html.IconLink",
514                "ptolemy.vergil.basic.export.web.IconLink");
515        _classChanges.put("ptolemy.vergil.basic.export.html.IconScript",
516                "ptolemy.vergil.basic.export.web.IconScript");
517        _classChanges.put("ptolemy.vergil.basic.export.html.LinkTarget",
518                "ptolemy.vergil.basic.export.web.LinkTarget");
519        _classChanges.put("ptolemy.vergil.basic.export.html.LinkToOpenTableaux",
520                "ptolemy.vergil.basic.export.web.LinkToOpenTableaux");
521        _classChanges.put(
522                "ptolemy.vergil.basic.export.html.ParameterDisplayIconScript",
523                "ptolemy.vergil.basic.export.web.ParameterDisplayIconScript");
524        _classChanges.put("ptolemy.vergil.basic.export.html.Title",
525                "ptolemy.vergil.basic.export.web.Title");
526        _classChanges.put("ptolemy.vergil.basic.export.html.WebContent",
527                "ptolemy.vergil.basic.export.web.WebContent");
528        _classChanges.put(
529                "ptolemy.vergil.basic.export.html.WebExportParameters",
530                "ptolemy.vergil.basic.export.web.WebExportParameters");
531        _classChanges.put("ptolemy.vergil.basic.export.html.WebExportable",
532                "ptolemy.vergil.basic.export.web.WebExportable");
533        _classChanges.put("ptolemy.vergil.basic.export.html.WebExporter",
534                "ptolemy.vergil.basic.export.web.WebExporter");
535
536        // ptolemy.actor.lib.jni was removed before ptII-9.0
537        _classChanges.put("ptolemy.actor.lib.jni.EmbeddedCActor",
538                "ptolemy.cg.lib.EmbeddedCodeActor");
539
540        _classChanges.put("ptolemy.vergil.basic.export.html.HTMLPageAssembler",
541                "ptolemy.vergil.basic.export.html.jsoup.HTMLPageAssembler");
542
543        //Move hlaptolemy classes from $PTII/ptolemy.apps to $PTII/org
544        {
545            String[] hlaPt2Classes = { "HlaPublisher", "HlaManager",
546                    "HlaSubscriber" };
547            for (int i = 0; i < hlaPt2Classes.length; ++i) {
548                _classChanges.put(
549                        "ptolemy.apps.hlacerti.lib." + hlaPt2Classes[i],
550                        "org.hlacerti.lib." + hlaPt2Classes[i]);
551            }
552        }
553
554        // KIELER LayoutHint was moved
555        _classChanges.put("ptolemy.vergil.basic.layout.kieler.LayoutHint",
556                "ptolemy.vergil.actor.LayoutHint");
557
558        // KIELER LayoutConfiguraiont was extended
559        _classChanges.put("ptolemy.vergil.basic.layout.LayoutConfiguration",
560                "ptolemy.vergil.basic.layout.ActorLayoutConfiguration");
561
562    }
563
564    // Set of class names that are obsolete and should be simply
565    // removed.
566    private static HashSet<String> _classesToRemove;
567
568    static {
569        ////////////////////////////////////////////////////////////
570        // Classes that are obsolete and should be removed.
571        _classesToRemove = new HashSet<String>();
572
573        _classesToRemove.add("ptolemy.codegen.c.kernel.CCodeGenerator");
574
575        // NotEditableParameter
576        _classesToRemove.add("ptolemy.data.expr.NotEditableParameter");
577
578        //DEIOPort
579        _classesToRemove.add("ptolemy.domains.de.kernel.DEIOPort");
580
581        // SROptimizedScheduler
582        _classesToRemove.add("ptolemy.domains.sr.kernel.SROptimizedScheduler");
583
584        // SRRandomizedScheduler
585        _classesToRemove.add("ptolemy.domains.sr.kernel.SRRandomizedScheduler");
586
587    }
588}