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.midp.automation;
028:
029: import java.util.*;
030: import java.io.*;
031: import com.sun.midp.midletsuite.*;
032: import com.sun.midp.security.*;
033: import com.sun.midp.installer.*;
034: import com.sun.midp.i18n.*;
035:
036: /**
037: * Base class for AutoSuiteDescriptor implementation
038: */
039: abstract class AutoSuiteDescriptorImpl extends AutoSuiteDescriptor {
040:
041: /** Internal representation of MIDlet suite */
042: protected MIDletSuiteImpl midletSuite;
043:
044: /** Vector containing descriptors of suite's MIDlets */
045: protected Vector suiteMIDlets = null;
046:
047: /** Number of MIDlets in the suite */
048: protected int totalMIDlets;
049:
050: /** Name of the suite */
051: protected String suiteName;
052:
053: /** Flag indicating whether this suite valid or not */
054: protected boolean isValid = false;
055:
056: /**
057: * Constructor
058: *
059: * @param midletSuite internal representation of MIDlet suite
060: */
061: protected AutoSuiteDescriptorImpl(MIDletSuiteImpl midletSuite) {
062: this .midletSuite = midletSuite;
063: this .isValid = true;
064: this .totalMIDlets = midletSuite.getNumberOfMIDlets();
065: this .suiteName = midletSuite
066: .getProperty(MIDletSuiteImpl.SUITE_NAME_PROP);
067:
068: updateMIDletsList();
069: }
070:
071: /**
072: * Invalidates suite
073: */
074: final void invalidate() {
075: midletSuite = null;
076: suiteMIDlets = null;
077: totalMIDlets = 0;
078:
079: isValid = false;
080: }
081:
082: /**
083: * Guarantees suite validness: if suite is not valid,
084: * exception is thrown
085: *
086: * @param s error string
087: */
088: final void guaranteeSuiteValid(String s)
089: throws IllegalStateException {
090:
091: if (!isValid) {
092: throw new IllegalStateException(s);
093: }
094: }
095:
096: /**
097: * Tests if this suite is external
098: *
099: * @return true, if this suite is internal
100: */
101: abstract boolean isExternalSuite();
102:
103: /**
104: * Gets suite ID
105: *
106: * @return suite ID as String
107: */
108: abstract int getSuiteID();
109:
110: /**
111: * Updates list of suite's MIDlets
112: */
113: abstract void updateMIDletsList();
114:
115: /**
116: * Factory method: constructs suite descriptor from suite ID
117: *
118: * @param suiteID ID ot the suite
119: * @param storage suite's storage
120: * @return suite descriptor
121: */
122: final static AutoSuiteDescriptor getInstanceBySuiteID(int suiteID,
123: MIDletSuiteStorage storage)
124: throws MIDletSuiteLockedException,
125: MIDletSuiteCorruptedException {
126:
127: AutoSuiteDescriptor suite = null;
128: MIDletSuiteImpl suiteImpl = null;
129: try {
130: // get internal suite representation from storage
131: suiteImpl = storage.getMIDletSuite(suiteID, false);
132: if (suiteImpl == null) {
133: throw new IllegalArgumentException("Invalid suite ID");
134: }
135: suite = new AutoExternalSuiteDescriptorImpl(suiteID,
136: suiteImpl);
137: } finally {
138: if (suiteImpl != null) {
139: suiteImpl.close();
140: }
141: }
142:
143: return suite;
144: }
145:
146: /**
147: * Factory method: constructs suite descriptor from MIDlet's class name
148: *
149: * @param className class name of internal MIDlet
150: * @return suite decriptor
151: */
152: final static AutoSuiteDescriptor getInstanceByClassName(
153: String className) throws IOException {
154:
155: AutoSuiteDescriptor suite = null;
156: MIDletSuiteImpl suiteImpl = null;
157: try {
158: // create internal suite representation
159: suiteImpl = (MIDletSuiteImpl) InternalMIDletSuiteImpl
160: .create(
161: className,
162: AutoInternalSuiteDescriptorImpl.INTERNAL_SUITE_ID);
163:
164: suite = new AutoInternalSuiteDescriptorImpl(className,
165: suiteImpl);
166: } finally {
167: if (suiteImpl != null) {
168: suiteImpl.close();
169: }
170: }
171:
172: return suite;
173: }
174:
175: /**
176: * AutoSuiteDescriptor implementation
177: */
178:
179: /**
180: * Gets name of the suite.
181: *
182: * @return name of the suite as specified in jar/jad
183: */
184: public String getSuiteName() {
185: guaranteeSuiteValid("getSuiteName");
186: return suiteName;
187: }
188:
189: /**
190: * Gets MIDlet which should be started by default for this
191: * suite, if any.
192: *
193: * @return AutoMIDletDescriptor representing default
194: * MIDlet
195: */
196: public AutoMIDletDescriptor getInitialMIDlet() {
197: guaranteeSuiteValid("getDefaultMIDlet");
198: return (AutoMIDletDescriptor) suiteMIDlets.elementAt(0);
199: }
200:
201: /**
202: * Gets suite's MIDlets.
203: *
204: * @return vector of AutoMIDletDescriptor objects representing
205: * suite's MIDlets,
206: * null if there is no default MIDlet for this suite
207: */
208: public Vector getSuiteMIDlets() {
209: guaranteeSuiteValid("getSuiteMIDlets");
210:
211: // copy suite's MIDlets vector into another
212: Vector midlets = new Vector(totalMIDlets);
213:
214: for (int i = 0; i < totalMIDlets; i++) {
215: Object o = suiteMIDlets.elementAt(i);
216: midlets.addElement(o);
217: }
218:
219: return midlets;
220: }
221:
222: /**
223: * Starts this suite's initial MIDlet.
224: *
225: * @param args MIDlet's arguments
226: * @return AutoMIDlet representing started MIDlet
227: */
228: public AutoMIDlet start(String[] args) {
229: AutoMIDletDescriptor midlet = getInitialMIDlet();
230: return midlet.start(args);
231: }
232: }
|