001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package com.sun.j2me.global;
028:
029: import com.sun.midp.main.Configuration;
030: import com.sun.midp.log.Logging;
031: import com.sun.midp.log.LogChannels;
032:
033: /**
034: * The <code>ResourceAbstractionLayer</code> class provides a layer of
035: * abstraction for {@link javax.microedition.global.ResourceManager}
036: * implementation. Sub-classes of <code>ResourceAbstractionLayer</code>
037: * correspond to individual implementations of access to application and
038: * device resources.
039: */
040: public abstract class ResourceAbstractionLayer {
041:
042: /**
043: * Constant name of resource abstraction layer class property.
044: */
045: private final static String ABSTRACTION_LAYER_PROPERTY = "microedition.global.resource.abstractionlayer";
046:
047: /**
048: * Constant name of default resource abstraction layer class.
049: */
050: private final static String DEFAULT_ABSTRACTION_LAYER = "com.sun.j2me.global.ResourceAbstractionLayerImpl";
051:
052: /**
053: * An instance of <code>ResourceAbstractionLayer</code>, which is
054: * used in the {@link #getInstance() getInstance} method.
055: */
056: private static ResourceAbstractionLayer abstractionLayer;
057:
058: /**
059: * Returns an instance <code>ResourceAbstractionLayer</code>. This
060: * instance is created only once (singleton) and then it is reused when
061: * the method is called again.
062: *
063: * @return the instance of the <code>AbstractionLayer</code> sub-class,
064: * <code>null</code> if unable to get sub-class instance
065: */
066: public static ResourceAbstractionLayer getInstance() {
067: if (abstractionLayer == null) {
068: String alClsName = Configuration
069: .getProperty(ABSTRACTION_LAYER_PROPERTY);
070: if (alClsName != null) {
071: try {
072: abstractionLayer = (ResourceAbstractionLayer) Class
073: .forName(alClsName).newInstance();
074: } catch (ClassNotFoundException cnf_ignore) {
075: /* intentionally ignored */
076: if (Logging.REPORT_LEVEL <= Logging.WARNING) {
077: Logging.report(Logging.WARNING,
078: LogChannels.LC_JSR238,
079: "Resource handler class does not exist:"
080: + alClsName);
081: }
082: } catch (InstantiationException ie_ignore) {
083: /* intentionally ignored */
084: if (Logging.REPORT_LEVEL <= Logging.WARNING) {
085: Logging.report(Logging.WARNING,
086: LogChannels.LC_JSR238,
087: "Resource handler class missing constructor:"
088: + alClsName);
089: }
090: } catch (IllegalAccessException iae_ignore) {
091: /* intentionally ignored */
092: if (Logging.REPORT_LEVEL <= Logging.WARNING) {
093: Logging.report(Logging.WARNING,
094: LogChannels.LC_JSR238,
095: "Resource handler class incorrect type:"
096: + alClsName);
097: }
098: }
099: }
100: if (abstractionLayer == null) {
101: // try default abstraction layer
102: try {
103: abstractionLayer = (ResourceAbstractionLayer) Class
104: .forName(DEFAULT_ABSTRACTION_LAYER)
105: .newInstance();
106: } catch (ClassNotFoundException cnf_ignore) {
107: /* intentionally ignored */
108: if (Logging.REPORT_LEVEL <= Logging.WARNING) {
109: Logging.report(Logging.WARNING,
110: LogChannels.LC_JSR238,
111: "Default Resource handler class does not exist:"
112: + DEFAULT_ABSTRACTION_LAYER);
113: }
114: } catch (InstantiationException ie_ignore) {
115: /* intentionally ignored */
116: if (Logging.REPORT_LEVEL <= Logging.WARNING) {
117: Logging.report(Logging.WARNING,
118: LogChannels.LC_JSR238,
119: "Resource handler class missing constructor:"
120: + DEFAULT_ABSTRACTION_LAYER);
121: }
122: } catch (IllegalAccessException iae_ignore) {
123: /* intentionally ignored */
124: if (Logging.REPORT_LEVEL <= Logging.WARNING) {
125: Logging.report(Logging.WARNING,
126: LogChannels.LC_JSR238,
127: "Resource handler class incorrect type:"
128: + DEFAULT_ABSTRACTION_LAYER);
129: }
130: }
131: }
132: }
133:
134: return abstractionLayer;
135: }
136:
137: /**
138: * A resource manager factory for creating application resource managers.
139: */
140: protected ResourceManagerFactory appResourceManagerFactory;
141:
142: /**
143: * Returns an instance of the <code>ResourceManagerFactory</code> sub-class,
144: * which is used to create resource managers for accessing application
145: * resources.
146: *
147: * @return the instance of the application resource manager factory
148: * @see ResourceManagerFactory
149: */
150: public ResourceManagerFactory getAppResourceManagerFactory() {
151: if (appResourceManagerFactory == null) {
152: appResourceManagerFactory = new AppResourceManagerFactory(
153: null);
154: }
155: return appResourceManagerFactory;
156: }
157:
158: /**
159: * Returns an instance of the <code>ResourceManagerFactory</code> sub-class,
160: * which is used to create resource managers for accessing device specific
161: * resources.
162: *
163: * @return the instance of the device resource manager factory
164: * @see ResourceManagerFactory
165: */
166: public abstract ResourceManagerFactory getDevResourceManagerFactory();
167: }
|