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 * If you wish your version of this file to be governed by only the CDDL
025 * or only the GPL Version 2, indicate your decision by adding
026 * "[Contributor] elects to include this software in this distribution
027 * under the [CDDL or GPL Version 2] license." If you do not indicate a
028 * single choice of license, a recipient has the option to distribute
029 * your version of this file under either the CDDL, the GPL Version 2 or
030 * to extend the choice of license to its licensees as provided above.
031 * However, if you add GPL Version 2 code and therefore, elected the GPL
032 * Version 2 license, then the option applies only if the new code is
033 * made subject to such option by the copyright holder.
034 *
035 * Contributor(s):
036 *
037 * Portions Copyrighted 2007 Sun Microsystems, Inc.
038 */
039
040 package org.netbeans.modules.j2ee.deployment.impl.bridge;
041
042 import java.util.ArrayList;
043 import java.util.Collections;
044 import java.util.HashMap;
045 import java.util.List;
046 import java.util.Map;
047 import javax.swing.event.ChangeListener;
048 import org.netbeans.api.server.ServerInstance;
049 import org.netbeans.modules.j2ee.deployment.devmodules.spi.InstanceListener;
050 import org.netbeans.modules.j2ee.deployment.impl.Server;
051 import org.netbeans.modules.j2ee.deployment.impl.ServerRegistry;
052 import org.netbeans.modules.j2ee.deployment.plugins.api.InstanceProperties;
053 import org.openide.util.ChangeSupport;
054
055 /**
056 *
057 * @author Petr Hejl
058 */
059 public class BridgingServerInstanceProvider implements
060 org.netbeans.spi.server.ServerInstanceProvider,
061 InstanceListener {
062
063 private final ChangeSupport changeSupport = new ChangeSupport(this );
064
065 private final Server server;
066
067 private Map<org.netbeans.modules.j2ee.deployment.impl.ServerInstance, BridgingServerInstance> instances = new HashMap<org.netbeans.modules.j2ee.deployment.impl.ServerInstance, BridgingServerInstance>();
068
069 public BridgingServerInstanceProvider(Server server) {
070 assert server != null : "Server must not be null"; // NOI18N
071 this .server = server;
072 }
073
074 public final void addInstanceListener() {
075 ServerRegistry.getInstance().addInstanceListener(this );
076 }
077
078 public final void removeInstanceListener() {
079 ServerRegistry.getInstance().removeInstanceListener(this );
080 }
081
082 public void addChangeListener(ChangeListener listener) {
083 changeSupport.addChangeListener(listener);
084 }
085
086 public void removeChangeListener(ChangeListener listener) {
087 changeSupport.removeChangeListener(listener);
088 }
089
090 public void changeDefaultInstance(String oldServerInstanceID,
091 String newServerInstanceID) {
092
093 }
094
095 public void instanceAdded(String serverInstanceID) {
096 if (server.handlesUri(serverInstanceID)) {
097 changeSupport.fireChange();
098 }
099 }
100
101 public void instanceRemoved(String serverInstanceID) {
102 InstanceProperties props = InstanceProperties
103 .getInstanceProperties(serverInstanceID);
104 if (server.handlesUri(serverInstanceID)
105 && (props == null || isRegisteredWithUI(props))) {
106 changeSupport.fireChange();
107 }
108 }
109
110 // TODO we could slightly optimize this by cacheing
111 public synchronized List<ServerInstance> getInstances() {
112 refreshCache();
113 List<ServerInstance> instancesList = new ArrayList<ServerInstance>(
114 instances.size());
115 for (BridgingServerInstance instance : instances.values()) {
116 instancesList.add(instance.getCommonInstance());
117 }
118 return instancesList;
119 }
120
121 @Override
122 public boolean equals(Object obj) {
123 if (obj == null) {
124 return false;
125 }
126 if (getClass() != obj.getClass()) {
127 return false;
128 }
129 final BridgingServerInstanceProvider other = (BridgingServerInstanceProvider) obj;
130 if (this .server != other.server
131 && (this .server == null || !this .server
132 .equals(other.server))) {
133 return false;
134 }
135 return true;
136 }
137
138 @Override
139 public int hashCode() {
140 int hash = 3;
141 hash = 67 * hash
142 + (this .server != null ? this .server.hashCode() : 0);
143 return hash;
144 }
145
146 protected synchronized ServerInstance getBridge(
147 org.netbeans.modules.j2ee.deployment.impl.ServerInstance instance) {
148 refreshCache();
149 BridgingServerInstance bridgingInstance = instances
150 .get(instance);
151 return bridgingInstance == null ? null : bridgingInstance
152 .getCommonInstance();
153 }
154
155 private synchronized void refreshCache() {
156 List<org.netbeans.modules.j2ee.deployment.impl.ServerInstance> toRemove = new ArrayList<org.netbeans.modules.j2ee.deployment.impl.ServerInstance>(
157 instances.keySet());
158
159 for (org.netbeans.modules.j2ee.deployment.impl.ServerInstance instance : ServerRegistry
160 .getInstance().getServerInstances()) {
161 if (instance.getServer().equals(server)
162 && isRegisteredWithUI(instance
163 .getInstanceProperties())) {
164 if (!instances.containsKey(instance)) {
165 instances.put(instance, BridgingServerInstance
166 .createInstance(instance));
167 } else {
168 toRemove.remove(instance);
169 }
170 }
171 }
172
173 instances.keySet().removeAll(toRemove);
174 }
175
176 private boolean isRegisteredWithUI(InstanceProperties props) {
177 String withoutUI = props
178 .getProperty(InstanceProperties.REGISTERED_WITHOUT_UI);
179 if (withoutUI == null) {
180 return true;
181 }
182 return !Boolean.valueOf(withoutUI);
183 }
184 }
|