/** * Copyright 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev; import java.util.HashMap; import java.util.Map; /** * Class used in the module drop-down box so that we can have a unique * object in the dropdown. It is important that identity is maintained, such * that if sessionKey, modulePanel, and moduleDisplayName are the same the * same SessionModule instance is returned so == means the same as equals. */ final class SessionModule { /** * Used to cache instances so we always return the same SessionModule * instance for the same key values. */ private static final Map<SessionModule, SessionModule> instanceCache = new HashMap<SessionModule, SessionModule>(); /** * Return a SessionModule instance for a given sessionKey, modulePanel, and * moduleDisplayName, re-using an existing instance if it exists. * * @param sessionKey * @param modulePanel * @param moduleDisplayName * @return unique SessionModule instance matching sessionKey and * moduleDisplayName */ public static SessionModule create(String sessionKey, Disconnectable modulePanel, String moduleDisplayName) { SessionModule sessionModule = new SessionModule(sessionKey, modulePanel, moduleDisplayName); if (instanceCache.containsKey(sessionModule)) { return instanceCache.get(sessionModule); } instanceCache.put(sessionModule, sessionModule); return sessionModule; } // @NotNull private final Disconnectable modulePanel; // @NotNull private final String moduleDisplayName; // @NotNull private final String sessionKey; private SessionModule(String sessionKey, Disconnectable modulePanel, String moduleDisplayName) { if (sessionKey == null) { throw new IllegalArgumentException("sessionKey cannot be null"); } if (modulePanel == null) { throw new IllegalArgumentException("modulePanel cannot be null"); } if (moduleDisplayName == null) { throw new IllegalArgumentException("moduleDisplayName cannot be null"); } this.sessionKey = sessionKey; this.modulePanel = modulePanel; this.moduleDisplayName = moduleDisplayName; } // Even though we guarantee identity, we still need equals implemented // so we can do so. @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } SessionModule other = (SessionModule) obj; return sessionKey.equals(other.sessionKey) && modulePanel.equals(other.modulePanel) && moduleDisplayName.equals(other.moduleDisplayName); } public String getModuleDisplayName() { return moduleDisplayName; } public Disconnectable getModulePanel() { return modulePanel; } /** * @return a unique key representing the session and the module name * within that session. */ public String getStringKey() { return sessionKey + moduleDisplayName; } @Override public int hashCode() { return sessionKey.hashCode() + 31 * moduleDisplayName.hashCode(); } /** * @return a string suitable for human display only, which consists of the * module's short name, possibly including a disambiguator for multiple * instances of the module name within the same session. */ @Override public String toString() { return moduleDisplayName; } }