blob: f3fa8aa94b93da41ed684bb6c0205900d7fd419d [file] [log] [blame]
package org.eclipse.jst.validation.sample.workbenchimpl;
/*
* Licensed Material - Property of IBM
* (C) Copyright IBM Corp. 2002, 2003 - All Rights Reserved.
* US Government Users Restricted Rights - Use, duplication or disclosure
* restricted by GSA ADP Schedule Contract with IBM Corp.
*
* DISCLAIMER OF WARRANTIES.
* The following [enclosed] code is sample code created by IBM
* Corporation. This sample code is not part of any standard or IBM
* product and is provided to you solely for the purpose of assisting
* you in the development of your applications. The code is provided
* "AS IS". IBM MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
* NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE, REGARDING THE FUNCTION OR PERFORMANCE OF
* THIS CODE. THIS CODE MAY CONTAIN ERRORS. IBM shall not be liable
* for any damages arising out of your use of the sample code, even
* if it has been advised of the possibility of such damages.
*
*/
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jem.util.logger.proxy.Logger;
import org.eclipse.jst.validation.sample.PModelEnum;
import org.eclipse.jst.validation.sample.parser.APropertyFile;
import org.eclipse.jst.validation.sample.parser.PropertyLine;
import org.eclipse.wst.validation.internal.core.IFileDelta;
import org.eclipse.wst.validation.internal.operations.WorkbenchContext;
import org.eclipse.wst.validation.internal.operations.WorkbenchFileDelta;
/**
* This class implements the WebSphere Studio IValidationContext for the
* Properties Validator.
*/
public class PropertiesHelper extends WorkbenchContext {
public PropertiesHelper() {
super();
registerModel(PModelEnum.LINEINPUTREADER, "loadLineNumberReader", new Class[]{java.lang.String.class}); //$NON-NLS-1$
registerModel(PModelEnum.RELEASE_LINEINPUTREADER, "releaseLineNumberReader", new Class[]{java.io.LineNumberReader.class}); //$NON-NLS-1$
registerModel(PModelEnum.ALL_PROPERTIES_FILES, "loadAllPropertiesFiles"); //$NON-NLS-1$
registerModel(PModelEnum.MSGLOGGER, "getMsgLogger"); //$NON-NLS-1$
registerModel(PModelEnum.FILTER, "filter", new Class[]{IFileDelta[].class}); //$NON-NLS-1$
}
/**
* @see com.ibm.etools.validate.IWorkbenchContext#getTargetObjectName(Object)
*/
public String getTargetObjectName(Object object) {
return null;
}
/**
* @see com.ibm.etools.validate.IWorkbenchContext#getResource(Object)
*/
public IResource getResource(Object object) {
IFile file = null;
if(object instanceof PropertyLine) {
PropertyLine line = (PropertyLine)object;
APropertyFile pFile = line.getFile();
String fileName = pFile.getQualifiedFileName(); // a ValidationPropertyFile returns the file name as its qualified name
file = getFile(fileName);
}
else if(object instanceof APropertyFile) {
APropertyFile pFile = (APropertyFile)object;
String fileName = pFile.getQualifiedFileName(); // a ValidationPropertyFile returns the file name as its qualified name
file = getFile(fileName);
}
if((file == null) || (!file.exists())) {
return super.getResource(object);
}
return file;
}
/**
* When a full validation is performed, this method returns an
* IFileDelta[] containing one IFileDelta for each .properties
* file in the IProject.
*/
public IFileDelta[] loadAllPropertiesFiles() {
IProject project = getProject();
final Set files = new HashSet();
IResourceVisitor visitor = new IResourceVisitor() {
public boolean visit(IResource res) throws CoreException {
if(!res.isAccessible()) {
return false; // if the resource isn't accessible then neither are its children
}
if(isSrcFile(res)) { //$NON-NLS-1$
WorkbenchFileDelta newFileDelta = new WorkbenchFileDelta(res.getFullPath().toString(), IFileDelta.CHANGED, res);
files.add(newFileDelta);
}
return true; // visit the resource's children as well
}
};
try {
project.accept(visitor, IResource.DEPTH_INFINITE, true); // true means include phantom resources
}
catch(CoreException e) {
Logger logger = getMsgLogger();
if(logger.isLoggingLevel(Level.SEVERE)) {
logger.write(e);
}
}
IFileDelta[] result = new IFileDelta[files.size()];
files.toArray(result);
return result;
}
/**
* Return the IFile handle for the file identified by fileName.
* null will be returned if the file does not exist.
*/
public IFile getFile(String fileName) {
IFile file = (IFile)ResourcesPlugin.getWorkspace().getRoot().findMember(fileName);
return file;
}
/**
* Given the file name of an existing .properties file, return
* the LineNumberReader that will read the file.
*/
public LineNumberReader loadLineNumberReader(String fileName) {
try {
IFile file = getFile(fileName);
InputStream in = file.getContents();
InputStreamReader reader = new InputStreamReader(in);
// Because we want to read in a line at a time from the file, convert the InputStreamReader to a LineReader
LineNumberReader lineInput = new LineNumberReader(reader);
return lineInput;
}
catch(CoreException exc) {
Logger logger = getMsgLogger();
if(logger.isLoggingLevel(Level.SEVERE)) {
logger.write(exc);
}
return null;
}
}
/**
* This method doesn't load anything; it releases the resources allocated
* by the loadLineNumberReader method. Its result will never be used, so always
* return null.
*/
public LineNumberReader releaseLineNumberReader(LineNumberReader reader) {
if(reader == null) {
return null;
}
try {
reader.close();
}
catch (IOException exc) {
Logger logger = getMsgLogger();
if(logger.isLoggingLevel(Level.SEVERE)) {
logger.write(exc);
}
}
return null;
}
/**
* The MsgLogger from this method can be used to log exceptions.
* This method will never return null.
*/
public Logger getMsgLogger() {
return PropertiesValidatorPlugin.getPlugin().getMsgLogger();
}
// package visibility for performance reasons (synthetic accessor method)
boolean isSrcFile(IResource res) {
// Want to filter out the copies in the "bin" directory.
if(res == null) {
return false;
}
if(!(res instanceof IFile)) {
return false;
}
if(!"properties".equals(res.getFileExtension())) { //$NON-NLS-1$
return false;
}
if(res.isDerived()) {
// Created by eclipse
return false;
}
return true;
}
public IFileDelta[] filter(IFileDelta[] changedFiles) {
IFileDelta[] temp = new IFileDelta[changedFiles.length];
int count = 0;
for(int i=0; i<changedFiles.length; i++) {
IFileDelta fd = changedFiles[i];
IResource resource = ((WorkbenchFileDelta)fd).getResource();
if(isSrcFile(resource)) {
temp[count++] = fd;
}
}
if(count == changedFiles.length) {
return changedFiles;
}
IFileDelta[] result = new IFileDelta[count];
System.arraycopy(temp, 0, result, 0, count);
return result;
}
}