/*
*
*
* Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 only, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License version 2 for more details (a copy is
* included at /legal/license.txt).
*
* You should have received a copy of the GNU General Public License
* version 2 along with this work; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 or visit www.sun.com if you need additional
* information or have any questions.
*/
package com.sun.j2me.global;
import javax.microedition.global.ResourceException;
import java.io.IOException;
import com.sun.midp.log.Logging;
import com.sun.midp.log.LogChannels;
/**
* This class represents a resource manager for accessing device resources. In
* the case of emulator it reuses the application resource manager
* implementation and extends the application resource file format with new
* data types which are needed by the emulator.
*
*/
public class DevResourceManager extends AppResourceManager {
/**
* Class name
*/
private static final String classname = DevResourceManager.class.getName();
/**
* constant for NumberFormatSymbols type.
*/
public final static byte TYPE_NUMBER_FORMAT_SYMBOLS = (byte) 0xfe;
/**
* constant for DateFormatSymbols type.
*/
public final static byte TYPE_DATETIME_FORMAT_SYMBOLS = (byte) 0xfd;
/**
* Creates a new instance of <code>DevResourceManager</code>. The new
* instance can be used to get device resources of the given locale. The
* resource files will be accessed through the given resource bundle
* reader.
*
* @param baseName baseName should be always "common.res". Because this
* constructor is called by the {@link DevResourceManagerFactory} it is
* always ok.
* @param locales array of supported locales
* @param readers array of opened readers for supported locales
* @param resourceCache cache instance used across resource managers.
*/
public DevResourceManager(String baseName,
String[] locales,
ResourceBundleReader[] readers,
ResourceCache resourceCache) {
super(baseName, locales, readers, resourceCache);
}
/**
* Creates a new instance of <code>DevResourceManager</code>. The new
* instance can be used to get device resources of the given locale. The
* resource files will be accessed through the given resource bundle
* reader.
*
* @param base the base name
* @param locales array of supported locales
* @param readers array of opened readers for supported locales
*/
public DevResourceManager(String base,
String[] locales,
ResourceBundleReader[] readers) {
this(base, locales, readers, null);
}
/**
* Check if it is known resource type by this manager. Convert it to the
* expected object. It recognizes {@link #TYPE_STRING},
* {@link #TYPE_BINARY},
* {@link #TYPE_NUMBER_FORMAT_SYMBOLS},
* {@link #TYPE_DATETIME_FORMAT_SYMBOLS}.
*
* @param resourceID resource identifier
* @param type the resource type
* @param length the resource length
* @param reader resource bundle reader
* @return resource as object
* @throws IOException thrown when resource cannot be read or
* cannot be converted
*/
protected Object convertToResourceType(int resourceID,
byte type, int length,
ResourceBundleReader reader) throws IOException {
DevResourceBundleReader devReader = (DevResourceBundleReader) reader;
if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
Logging.report(Logging.INFORMATION, LogChannels.LC_JSR238,
classname + ": converting resource id = \"" +
resourceID + "\" to object type :\"" + type +
"\" with reader : " + reader);
}
if (type == TYPE_NUMBER_FORMAT_SYMBOLS) {
NumberFormatSymbols nfs = new NumberFormatSymbols();
devReader.deserializeResource(nfs, resourceID);
if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
Logging.report(Logging.INFORMATION, LogChannels.LC_JSR238,
classname + ": " +
"Resource type is NUMBER_FORMAT_SYMBOLS");
}
return nfs;
} else if (type == TYPE_DATETIME_FORMAT_SYMBOLS) {
DateFormatSymbols dfs = new DateFormatSymbols();
devReader.deserializeResource(dfs, resourceID);
if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
Logging.report(Logging.INFORMATION, LogChannels.LC_JSR238,
classname + ": " +
"Resource type is DATETIME_FORMAT_SYMBOLS");
}
return dfs;
} else {
byte[] data = null;
if (length != 0) {
data = reader.getRawResourceData(resourceID);
} else {
data = new byte[0];
}
if (type == TYPE_STRING) {
Object o = getUTF8(data);
return o;
} else if (type == TYPE_BINARY) {
return data;
}
}
return null;
}
/**
* The method clones resource.
*
* @return copy of resource
* @param resource the resource to clone
*/
protected Object cloneResource(Object resource) {
Object clon = super.cloneResource(resource);
if (resource instanceof NumberFormatSymbols ||
resource instanceof DateFormatSymbols) {
if (Logging.REPORT_LEVEL <= Logging.INFORMATION) {
Logging.report(Logging.INFORMATION, LogChannels.LC_JSR238,
classname + ": clone resource");
}
SerializableResource sr = (SerializableResource)resource;
clon = sr.clone();
}
return clon;
}
}
|