| /********************************************************************** |
| * Copyright (c) 2003, 2006 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - Initial API and implementation |
| **********************************************************************/ |
| package org.eclipse.wst.server.core.internal; |
| |
| import java.util.*; |
| import java.io.File; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.wst.server.core.IServer; |
| /** |
| * Helper to obtain and store the global publish information. |
| * (what files were published and when) Delegates to PublishState |
| * for all server specific publishing information. |
| */ |
| public class PublishInfo { |
| protected static PublishInfo instance; |
| |
| protected static final String PUBLISH_DIR = "publish"; |
| |
| // map of server ids to Strings of filename containing publish data |
| protected Map serverIdToPath; |
| |
| // map of loaded serverIds to publish info |
| protected Map serverIdToPublishInfo; |
| |
| /** |
| * PublishInfo constructor comment. |
| */ |
| private PublishInfo() { |
| super(); |
| |
| serverIdToPath = new HashMap(); |
| serverIdToPublishInfo = new HashMap(); |
| load(); |
| } |
| |
| /** |
| * Return the publish info. |
| * |
| * @return org.eclipse.wst.server.core.internal.PublishInfo |
| */ |
| public static PublishInfo getInstance() { |
| if (instance == null) { |
| synchronized (PUBLISH_DIR) { |
| instance = new PublishInfo(); |
| } |
| } |
| return instance; |
| } |
| |
| /** |
| * Return the publish state. |
| * |
| * @return org.eclipse.wst.server.core.internal.PublishState |
| * @param server org.eclipse.wst.server.core.IServer |
| */ |
| public ServerPublishInfo getServerPublishInfo(IServer server) { |
| // have we tried loading yet? |
| String serverId = server.getId(); |
| if (serverIdToPath.containsKey(serverId)) { |
| if (serverIdToPublishInfo.containsKey(serverId)) |
| return (ServerPublishInfo) serverIdToPublishInfo.get(serverId); |
| |
| // force .dat extension |
| String partialPath = (String) serverIdToPath.get(serverId); |
| partialPath = partialPath.substring(0, partialPath.length() - 3) + "dat"; |
| IPath path = ServerPlugin.getInstance().getStateLocation().append(PUBLISH_DIR).append(partialPath); |
| ServerPublishInfo spi = new ServerPublishInfo(path); |
| serverIdToPublishInfo.put(serverId, spi); |
| return spi; |
| } |
| |
| // first time server is being used |
| IPath path = ServerPlugin.getInstance().getStateLocation().append(PUBLISH_DIR); |
| File file = new File(path.toOSString()); |
| if (!file.exists()) |
| file.mkdir(); |
| |
| file = null; |
| int i = 0; |
| String partialPath = null; |
| ServerPublishInfo spi = null; |
| synchronized (PUBLISH_DIR) { |
| while (file == null || file.exists()) { |
| partialPath = "publish" + i + ".dat"; |
| path = ServerPlugin.getInstance().getStateLocation().append(PUBLISH_DIR).append(partialPath); |
| if (serverIdToPath.get(partialPath) == null) |
| file = new File(path.toOSString()); |
| i++; |
| } |
| |
| spi = new ServerPublishInfo(path); |
| serverIdToPath.put(serverId, partialPath); |
| serverIdToPublishInfo.put(serverId, spi); |
| save(); |
| } |
| return spi; |
| } |
| |
| /** |
| * Remove the server publish state. |
| * |
| * @param server org.eclipse.wst.server.core.IServer |
| */ |
| public void removeServerPublishInfo(IServer server) { |
| IPath path = ServerPlugin.getInstance().getStateLocation().append(PUBLISH_DIR); |
| File file = new File(path.toOSString()); |
| if (!file.exists()) |
| return; |
| |
| String serverId = server.getId(); |
| String path2 = (String) serverIdToPath.get(serverId); |
| synchronized (PUBLISH_DIR) { |
| serverIdToPath.remove(serverId); |
| serverIdToPublishInfo.remove(serverId); |
| save(); |
| } |
| if (path2 != null) { |
| path.append(path2).toFile().delete(); |
| path2 = path2.substring(0, path2.length() - 3) + "xml"; |
| path.append(path2).toFile().delete(); |
| path2 = path2.substring(0, path2.length() - 3) + "dat"; |
| path.append(path2).toFile().delete(); |
| } |
| } |
| |
| /** |
| * |
| */ |
| protected void load() { |
| Trace.trace(Trace.FINEST, "Loading publish info"); |
| String filename = ServerPlugin.getInstance().getStateLocation().append("publish.xml").toOSString(); |
| |
| try { |
| IMemento memento = XMLMemento.loadMemento(filename); |
| |
| IMemento[] serverChild = memento.getChildren("server"); |
| int size = serverChild.length; |
| serverIdToPath = new HashMap(size + 2); |
| |
| for (int i = 0; i < size; i++) { |
| String id = serverChild[i].getString("id"); |
| String partialPath = serverChild[i].getString("path"); |
| serverIdToPath.put(id, partialPath); |
| } |
| } catch (Exception e) { |
| Trace.trace(Trace.WARNING, "Could not load global publish info: " + e.getMessage()); |
| } |
| } |
| |
| /** |
| * |
| */ |
| protected void save() { |
| String filename = ServerPlugin.getInstance().getStateLocation().append("publish.xml").toOSString(); |
| |
| try { |
| XMLMemento memento = XMLMemento.createWriteRoot("publish-info"); |
| |
| Iterator iterator = serverIdToPath.keySet().iterator(); |
| while (iterator.hasNext()) { |
| String serverId = (String) iterator.next(); |
| String partialPath = (String) serverIdToPath.get(serverId); |
| |
| IMemento server = memento.createChild("server"); |
| server.putString("id", serverId); |
| server.putString("path", partialPath); |
| } |
| |
| memento.saveToFile(filename); |
| } catch (Exception e) { |
| Trace.trace(Trace.SEVERE, "Could not save global publish info", e); |
| } |
| } |
| } |