001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.form;
043:
044: import java.util.*;
045: import org.openide.*;
046: import org.openide.util.Lookup;
047:
048: /**
049: * An abstract class which defines interface for persistence managers (being
050: * responsible for loading and saving forms) and provides a basic registration
051: * facility.
052: * PersistenceManager implementations should be able to deal with multiple
053: * forms being saved and loaded by one instance of persistence manager (but
054: * not concurrently).
055: *
056: * @author Ian Formanek, Tomas Pavek
057: */
058:
059: public abstract class PersistenceManager {
060:
061: // -------------------
062: // abstract interface
063:
064: /** This method is used to check if the persistence manager can read the
065: * given form (if it understands the form file format).
066: *
067: * @param formObject form data object representing the form.
068: * @return true if this persistence manager can load the form
069: * @exception PersistenceException if any unexpected problem occurred
070: */
071: public abstract boolean canLoadForm(FormDataObject formObject)
072: throws PersistenceException;
073:
074: /** This method loads the form from given data object.
075: * @param formObject FormDataObject representing the form files
076: * @param formModel FormModel to be filled with loaded data
077: * @param nonfatalErrors List to be filled with errors occurred during
078: * loading which are not fatal (but should be reported)
079: * @exception PersistenceException if some fatal problem occurred which
080: * prevents loading the form
081: */
082: public abstract void loadForm(FormDataObject formObject,
083: FormModel formModel, List<Throwable> nonfatalErrors)
084: throws PersistenceException;
085:
086: /** This method saves the form to given data object.
087: * @param formObject FormDataObject representing the form files
088: * @param formModel FormModel to be saved
089: * @param nonfatalErrors List to be filled with errors occurred during
090: * saving which are not fatal (but should be reported)
091: * @exception PersistenceException if some fatal problem occurred which
092: * prevents saving the form
093: */
094: public abstract void saveForm(FormDataObject formObject,
095: FormModel formModel, List<Throwable> nonfatalErrors)
096: throws PersistenceException;
097:
098: // ------------
099: // static registry [provisional only]
100:
101: private static List<PersistenceManager> managers;
102: private static List<String> managersByName;
103:
104: public static void registerManager(PersistenceManager manager) {
105: getManagersList().add(manager);
106: }
107:
108: public static void unregisterManager(PersistenceManager manager) {
109: getManagersList().remove(manager);
110: }
111:
112: static void registerManager(String managerClassName) {
113: getManagersNamesList().add(managerClassName);
114: }
115:
116: public static Iterator<PersistenceManager> getManagers() {
117: ClassLoader classLoader = null;
118: Iterator<String> iter = getManagersNamesList().iterator();
119: while (iter.hasNext()) { // create managers registered by name
120: if (classLoader == null)
121: classLoader = Lookup.getDefault().lookup(
122: ClassLoader.class);
123:
124: String pmClassName = iter.next();
125: try {
126: PersistenceManager manager = (PersistenceManager) classLoader
127: .loadClass(pmClassName).newInstance();
128: getManagersList().add(manager);
129: } catch (Exception ex1) {
130: notifyError(ex1, pmClassName);
131: } catch (LinkageError ex2) {
132: notifyError(ex2, pmClassName);
133: }
134: }
135: getManagersNamesList().clear(); // [is it OK to lose unsuccessful managers?]
136:
137: return getManagersList().iterator();
138: }
139:
140: private static List<PersistenceManager> getManagersList() {
141: if (managers == null) {
142: managers = new ArrayList<PersistenceManager>();
143: managers.add(new GandalfPersistenceManager());
144: }
145: return managers;
146: }
147:
148: private static List<String> getManagersNamesList() {
149: if (managersByName == null)
150: managersByName = new ArrayList<String>();
151: return managersByName;
152: }
153:
154: private static void notifyError(Throwable th, String pmClassName) {
155: String msg = FormUtils.getFormattedBundleString(
156: "FMT_ERR_PersistenceManagerInstantiation", // NOI18N
157: new Object[] { pmClassName });
158:
159: ErrorManager errorManager = ErrorManager.getDefault();
160: errorManager.annotate(th, msg);
161: errorManager.notify(ErrorManager.EXCEPTION, th);
162: }
163: }
|