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.dbschema.jdbcimpl;
043:
044: import java.util.*;
045:
046: import org.netbeans.modules.dbschema.*;
047:
048: /** Support class that manages set of objects and fires events
049: * about its changes.
050: */
051: public class DBElementsCollection implements DBElementProperties {
052:
053: /** Object to fire info about changes to */
054: DBElementImpl owner;
055:
056: DBElement[] _elms;
057:
058: /** Array template for typed returns */
059: private Object[] _template;
060:
061: //workaround for bug #4396371
062: //http://andorra.eng:8080/cgi-bin/ws.exe/bugtraq/bug.hts?where=bugid_value%3D4396371
063: protected static transient HashSet instances = new HashSet();
064:
065: public DBElementsCollection() {
066: this (null, null);
067: }
068:
069: /**
070: * @param owner owner of this array at which to fire changes
071: */
072: DBElementsCollection(DBElementImpl owner, Object[] template) {
073: this .owner = owner;
074: _template = template;
075: }
076:
077: public DBElement[] getElements() {
078: if (_elms != null)
079: return _elms;
080: else
081: return (DBElement[]) Arrays.asList(_template).toArray(
082: new DBElement[_template.length]);
083:
084: }
085:
086: public void changeElements(DBElement[] elements, int action) {
087: changeElements(Arrays.asList(elements), action);
088: }
089:
090: public void changeElements(List elems, int action) {
091: boolean changed = false;
092: DBElement[] oldElements = getElements();
093: int oldLength = (oldElements == null) ? 0 : oldElements.length;
094: int newLength = (elems == null) ? 0 : elems.size();
095: List list = null;
096:
097: switch (action) {
098: case DBElement.Impl.ADD:
099: if (newLength > 0) {
100: list = ((oldLength == 0) ? new ArrayList()
101: : new ArrayList(Arrays.asList(oldElements)));
102: list.addAll(elems);
103: changed = true;
104: }
105: break;
106: case DBElement.Impl.REMOVE:
107: break;
108: case DBElement.Impl.SET:
109: list = elems;
110: changed = true;
111: break;
112: }
113: if (changed)
114: _elms = (DBElement[]) list.toArray(_template);//getEmptyArray());
115:
116: }
117:
118: /** Find method that looks in member elements
119: * @param id the identifier (or null)
120: * @param types array of types to test (or null)
121: * @return the element or null
122: */
123: public DBElement find(DBIdentifier id) {
124: DBElement[] me = getElements();
125:
126: if (me == null)
127: return null;
128:
129: for (int i = 0; i < me.length; i++)
130: if (id.compareTo(me[i].getName(), false))
131: return me[i];
132:
133: return null;
134: }
135:
136: //=============== extra methods needed for xml archiver ==============
137:
138: /** Returns the owner of this collection. This method should only
139: * be used internally and for cloning and archiving.
140: * @return the owner of this collection
141: */
142: DBElementImpl getOwner() {
143: return owner;
144: }
145:
146: /** Set the owner of this collection to the supplied implementation.
147: * This method should only be used internally and for cloning and
148: * archiving.
149: * @param owner the owner of this collection
150: */
151: void setOwner(DBElementImpl owner) {
152: this .owner = owner;
153: }
154:
155: /** Set the collection of elements maintained by this holder to the
156: * supplied array. This method should only be used internally and for
157: * cloning and archiving.
158: * @param elements the collection of elements maintained by this holder
159: */
160: public void setElements(DBElement[] elements) {
161: _elms = elements;
162: }
163:
164: /** Returns the template for the array of this collection. This method
165: * should only be used internally and for cloning and archiving.
166: * @return the typed template of this collection
167: */
168: public Object[] getTemplate() {
169: return _template;
170: }
171:
172: /** Set the template for the array of this collection to the supplied
173: * array. This template is used so the array returned by getElements is
174: * properly typed. This method should only be used internally and
175: * for cloning and archiving.
176: * @param template the typed template of this collection
177: */
178: public void setTemplate(Object[] template) {
179: _template = template;
180: }
181: }
|