/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.model.plugin;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.content.IContentDescription;
import org.eclipse.ui.IWindowListener;
import org.eclipse.ui.IWorkbenchWindow;
import org.jboss.tools.common.log.BaseUIPlugin;
import org.jboss.tools.common.log.IPluginLog;
import org.jboss.tools.common.model.XJob;
import org.jboss.tools.common.model.XModelConstants;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
public class ModelPlugin extends BaseUIPlugin implements IModelPlugin, IWindowListener {
public static final String PLUGIN_ID = "org.jboss.tools.common.model"; //$NON-NLS-1$
private static ModelPlugin plugin;
private ResourceBundle resourceBundle;
private XModelSaveParticipant save = new XModelSaveParticipant();
public static final String TEMP_FILE_PREFIX = "efs_";
File tempFolder;
File stateTempFolder;
public ModelPlugin() {
plugin = this;
try {
File f = File.createTempFile(TEMP_FILE_PREFIX, ".x"); //$NON-NLS-1$ //$NON-NLS-2$
tempFolder = f.getParentFile();
f.deleteOnExit();
} catch (IOException e) {
getPluginLog().logError("ModelPlugin:requestForTempFolder:" + e.getMessage()); //$NON-NLS-1$
}
}
public static ModelPlugin getDefault() {
return plugin;
}
public File getTempFolder() {
return tempFolder;
}
public File getStateTempFolder() {
return stateTempFolder;
}
public static boolean isDebugEnabled() {
return getDefault().isDebugging();
}
public static IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
public static String getResourceString(String key) {
ResourceBundle bundle = ModelPlugin.getDefault().getResourceBundle();
try {
return bundle.getString(key);
} catch (MissingResourceException e) {
return key;
}
}
public ResourceBundle getResourceBundle() {
return resourceBundle;
}
public XModelSaveParticipant getSaveParticipant() {
return save;
}
public void start(BundleContext context) throws Exception {
System.setProperty(XModelConstants.HOME, EclipseResourceUtil.getInstallPath(context.getBundle()));
super.start(context);
Bundle bundle = Platform.getBundle(PLUGIN_ID);
File location = Platform.getStateLocation(bundle).toFile();
stateTempFolder = new File(location, "tmp");
stateTempFolder.mkdirs();
}
protected void initializeDefaultPluginPreferences() {
}
public void stop(BundleContext context) throws Exception {
super.stop(context);
cleanTempFiles();
XJob.shutdown();
}
private void cleanTempFiles() {
cleanEFS_Files(tempFolder, System.currentTimeMillis() - 30l * 24l * 60l * 60l * 1000l); //in global folder remove only files one month old.
cleanEFS_Files(stateTempFolder, -1);
}
private void cleanEFS_Files(File folder, long beforeTime) {
if(folder != null && folder.exists()) {
File[] fs = folder.listFiles();
if(fs != null) for (int i = 0; i < fs.length; i++) {
String n = fs[i].getName();
if(n.startsWith(TEMP_FILE_PREFIX)) {
if(beforeTime == -1 || fs[i].lastModified() < beforeTime) {
fs[i].delete(); //$NON-NLS-1$
}
}
}
}
}
public void windowActivated(IWorkbenchWindow window) {}
public void windowClosed(IWorkbenchWindow window) {
try {
save.saving(null);
} catch (CoreException e) {
getPluginLog().logError(e);
}
}
public void windowDeactivated(IWorkbenchWindow window) {
}
public void windowOpened(IWorkbenchWindow window) {
}
/**
* @return IPluginLog object
*/
public static IPluginLog getPluginLog() {
return getDefault();
}
public static boolean isUTF8BOM(String encoding, IFile file) throws CoreException {
if ("UTF-8".equals(encoding) && file != null && file.exists()) { //$NON-NLS-1$
IContentDescription description= file.getContentDescription();
if (description != null) {
byte[] bom= (byte[]) description.getProperty(IContentDescription.BYTE_ORDER_MARK);
if (bom != null) {
if (bom != IContentDescription.BOM_UTF_8)
throw new CoreException(new Status(IStatus.ERROR, ModelPlugin.PLUGIN_ID, IStatus.OK,"wrongByteOrderMark", null)); //$NON-NLS-1$
return true;
}
}
}
return false;
}
public static String getContent(InputStream contentStream, String encoding, boolean skipUTF8BOM) throws CoreException {
Reader in= null;
try {
if (skipUTF8BOM) {
for (int i= 0; i < 3; i++)
if (contentStream.read() == -1) {
throw new IOException("notEnoughBytesForBOM"); //$NON-NLS-1$
}
}
final int DEFAULT_FILE_SIZE= 15 * 1024;
if (encoding == null)
in= new BufferedReader(new InputStreamReader(contentStream), DEFAULT_FILE_SIZE);
else
in= new BufferedReader(new InputStreamReader(contentStream, encoding), DEFAULT_FILE_SIZE);
StringBuffer buffer= new StringBuffer(DEFAULT_FILE_SIZE);
char[] readBuffer= new char[2048];
int n= in.read(readBuffer);
while (n > 0) {
buffer.append(readBuffer, 0, n);
n= in.read(readBuffer);
}
return buffer.toString();
} catch (IOException x) {
throw new CoreException(new Status(IStatus.ERROR, ModelPlugin.PLUGIN_ID, IStatus.OK, "Failed to access or read underlying storage", x)); //$NON-NLS-1$
} finally {
try {
if (in != null)
in.close();
else
contentStream.close();
} catch (IOException ignored) {
}
}
}
}