001: /*=============================================================================
002: * Copyright Texas Instruments, Inc., 2001. All Rights Reserved.
003: *
004: * This program is free software; you can redistribute it and/or modify
005: * it under the terms of the GNU General Public License as published by
006: * the Free Software Foundation; either version 2 of the License, or
007: * (at your option) any later version.
008: *
009: * This program is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
012: * GNU General Public License for more details.
013: *
014: * You should have received a copy of the GNU General Public License
015: * along with this program; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: */
018:
019: package ti.chimera;
020:
021: /**
022: * A service is an API provided by a plugin. A plugin can provide zero or
023: * more services. If a plugin provides many methods which can be called, they
024: * should be logically grouped as services. If a service is requested, and
025: * the plugin providing that service has not already been started, it will be
026: * automatically started. When the service is no longer in use (ie. the
027: * service instance is garbage collected), the plugin may be stopped. (This
028: * is tracked using a {@link Resource}, so the plugin will only be stopped if
029: * there are no other resources causing the plugin to be active.
030: * <p>
031: * The service instance should be lightweight (ie. not have state), because
032: * it is possible that multiple instances of the service exist at any time.
033: * <p>
034: * If a service implementation provided by a plugin (written in either java
035: * or script) is to be used by code written in java, there must be an abstract
036: * class that subclasses this class to define the API provided by that service.
037: * The implementer of that service must then subclass that service class and
038: * implement the abstract methods defined it defines. It is recommended
039: * that all well defined "core" services provide an interface (abstract
040: * class) that can be implemented by the provider of that service.
041: * <p>
042: * <b>NOTE:</b> There is a reason for implementing this as an abstract class,
043: * rather than an interface. It is to prevent the service implementer from
044: * being lazy and just making an existing object implement an interface, which
045: * could pollute the service with other methods which are not part of the
046: * well defined service interface. Script code could inadvertantly call one
047: * of these methods. If the service were to be overridden by another
048: * implementation which did not define those method(s), it could cause run-
049: * time errors. Service implementations should be inner-classes which provide
050: * only those public methods defined by the service.
051: *
052: * @author Rob Clark
053: * @version 0.1
054: */
055: public abstract class Service {
056: /**
057: * The name of this service.
058: */
059: private String name;
060:
061: /*=======================================================================*/
062: /**
063: * Class Constructor.
064: *
065: * @param name the name of this service
066: */
067: public Service(String name) {
068: this .name = name;
069: }
070:
071: /*=======================================================================*/
072: /**
073: * Get the name of this service.
074: *
075: * @return the name
076: */
077: public final String getName() {
078: return name;
079: }
080:
081: /*=======================================================================*/
082: /**
083: * Convert to string. Make the service show up as something meaningful
084: * if used as a string... handy for debuggging.
085: *
086: * @return the name
087: */
088: public String toString() {
089: return "[service: \"" + getName() + "\"]";
090: }
091: }
092:
093: /*
094: * Local Variables:
095: * tab-width: 2
096: * indent-tabs-mode: nil
097: * mode: java
098: * c-indentation-style: java
099: * c-basic-offset: 2
100: * eval: (c-set-offset 'substatement-open '0)
101: * eval: (c-set-offset 'case-label '+)
102: * eval: (c-set-offset 'inclass '+)
103: * eval: (c-set-offset 'inline-open '0)
104: * End:
105: */
|