/*
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.visualvm.application;
import com.sun.tools.visualvm.core.datasource.DataSource;
import com.sun.tools.visualvm.core.datasource.Storage;
import com.sun.tools.visualvm.core.datasupport.Stateful;
import com.sun.tools.visualvm.host.Host;
import java.io.File;
/**
* Abstract implementation of Application.
* Each application is defined by a Host on which it's running and an unique identificator.
*
* @author Jiri Sedlacek
*/
public abstract class Application extends DataSource implements Stateful {
/**
* Instance representing actually running VisualVM application.
*/
public static final Application CURRENT_APPLICATION = ApplicationSupport.getInstance().createCurrentApplication();
/**
* Process ID of the application is unknown.
*/
public static final int UNKNOWN_PID = -1;
private String id;
private Host host;
private int state = STATE_AVAILABLE;
/**
* Creates new instance of Application defined by a Host and unique identificator.
*
* @param host Host on which the application is running.
* @param id unique identificator of the application.
*/
public Application(Host host, String id) {
if (host == null) throw new IllegalArgumentException("Host cannot be null"); // NOI18N
if (id == null) throw new IllegalArgumentException("Application id cannot be null"); // NOI18N
this.host = host;
this.id = id;
}
/**
* Returns unique identificator of the application.
*
* @return unique identificator of the application.
*/
public final String getId() {
return id;
}
/**
* Returns process id of the application or Application.UNKNOWN_PID.
*
* @return process id of the application or Application.UNKNOWN_PID.
*/
public int getPid() {
return UNKNOWN_PID;
}
/**
* Returns Host on which the application is running.
*
* @return Host on which the application is running.
*/
public final Host getHost() {
return host;
}
/**
* Returns true if the application is running on Host.LOCALHOST, false otherwise.
*
* @return true if the application is running on Host.LOCALHOST, false otherwise.
*/
public final boolean isLocalApplication() {
return Host.LOCALHOST.equals(getHost());
}
public final synchronized int getState() {
return state;
}
protected final synchronized void setState(final int newState) {
final int oldState = state;
state = newState;
if (DataSource.EVENT_QUEUE.isRequestProcessorThread())
getChangeSupport().firePropertyChange(PROPERTY_STATE, oldState, newState);
else DataSource.EVENT_QUEUE.post(new Runnable() {
public void run() { getChangeSupport().firePropertyChange(PROPERTY_STATE, oldState, newState); };
});
}
@Override
public final int hashCode() {
return getId().hashCode();
}
@Override
public final boolean equals(Object obj) {
if (!(obj instanceof Application)) return false;
Application app = (Application) obj;
return getId().equals(app.getId());
}
@Override
public String toString() {
return "Application [id: " + getId() + ", pid: " + getPid() + ", host: " + getHost().getHostName() + "]"; // NOI18N
}
// <system_temp>/visualvm.dat/<application_id>
@Override
protected Storage createStorage() {
File directory = new File(Storage.getTemporaryStorageDirectoryString() +
File.separator + validFileName(getId()));
return new Storage(directory);
}
private static String validFileName(String fileName) {
char[] fileNameCh = fileName.toCharArray();
StringBuilder validFileName = new StringBuilder();
for (char ch : fileNameCh)
if (Character.isLetterOrDigit(ch)) validFileName.append(ch);
else validFileName.append('_'); // NOI18N
return validFileName.toString();
}
}