blob: 8d315e715f8dc3e01d1ef83b3c4e20baad97c75d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 flex.messaging.config;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
*
*/
public class LocalFileResolver implements ConfigurationFileResolver {
public static final int CLIENT = 0;
public static final int SERVER = 1;
public static final int LIVECYCLE = 2;
private static final int ERR_MSG_INVALID_PATH_CLIENT = 11106;
private static final int ERR_MSG_INVALID_PATH_SERVER = 11108;
private static final int ERR_MSG_INVALID_PATH_LIVECYCLE = 11122;
private Stack configurationPathStack = new Stack();
int version = CLIENT;
public LocalFileResolver() {
}
public LocalFileResolver(int version) {
this.version = version;
}
public void setErrorMessage(ConfigurationException e, String path) {
if (version == LIVECYCLE) {
// Invalid location: ''{0}''. Please specify a valid LiveCycle Data Services Configuration file via the LiveCycle Admin UI.
e.setMessage(ERR_MSG_INVALID_PATH_LIVECYCLE, new Object[]{path});
} else if (version == SERVER) {
// Please specify a valid ''services.configuration.file'' in web.xml. You specified ''{0}''. This is not a valid file system path reachable via the app server and is also not a path to a resource in your J2EE application archive.
e.setMessage(ERR_MSG_INVALID_PATH_SERVER, new Object[]{path});
} else {
// Please specify a valid <services/> file path in flex-config.xml.
e.setMessage(ERR_MSG_INVALID_PATH_CLIENT);
}
}
public InputStream getConfigurationFile(String path) {
File f = new File(path);
try {
if (f != null && f.exists() && f.isAbsolute()) {
FileInputStream fin = new FileInputStream(f);
pushConfigurationFile(f.getParent());
return fin;
} else {
ConfigurationException e = new ConfigurationException();
setErrorMessage(e, path);
throw e;
}
} catch (FileNotFoundException ex) {
ConfigurationException e = new ConfigurationException();
setErrorMessage(e, path);
e.setRootCause(ex);
throw e;
} catch (SecurityException se) {
ConfigurationException e = new ConfigurationException();
setErrorMessage(e, path);
e.setRootCause(se);
throw e;
}
}
public InputStream getIncludedFile(String src) {
String path = configurationPathStack.peek() + File.separator + src;
File f = new File(path);
try {
if (f != null && f.exists() && f.isAbsolute()) {
FileInputStream fin = new FileInputStream(f);
pushConfigurationFile(f.getParent());
return fin;
} else {
// Please specify a valid include file. ''{0}'' is invalid.
ConfigurationException e = new ConfigurationException();
e.setMessage(11107, new Object[]{path});
throw e;
}
} catch (FileNotFoundException ex) {
// Please specify a valid include file. ''{0}'' is invalid.
ConfigurationException e = new ConfigurationException();
e.setMessage(11107, new Object[]{path});
e.setRootCause(ex);
throw e;
} catch (SecurityException se) {
// Please specify a valid include file. ''{0}'' is invalid.
ConfigurationException e = new ConfigurationException();
e.setMessage(11107, new Object[]{path});
e.setRootCause(se);
throw e;
}
}
public void popIncludedFile() {
configurationPathStack.pop();
}
/**
* Returns the list of XML files (denoted by .xml extension) in the directory
* relative to the current configuration file.
*
* @param dir a directory relative to the current configuration file
* @return a (possibly empty) list of file names
*/
public List getFiles(String dir) {
List result = new ArrayList();
File f = new File(configurationPathStack.peek().toString(), dir);
if (f.exists() && f.isDirectory()) {
String[] xmlFiles = f.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".xml");
}
});
// prepend the directory to each filename
for (int i = 0; i < xmlFiles.length; i++) {
String file = xmlFiles[i];
result.add(dir + File.separator + file);
}
return result;
} else {
// Please specify a valid include directory. ''{0}'' is invalid.
ConfigurationException e = new ConfigurationException();
e.setMessage(11113, new Object[]{dir});
throw e;
}
}
private void pushConfigurationFile(String topLevelPath) {
configurationPathStack.push(topLevelPath);
}
public String getIncludedPath(String src) {
return configurationPathStack.peek() + File.separator + src;
}
public long getIncludedLastModified(String src) {
String path = configurationPathStack.peek() + File.separator + src;
File f = new File(path);
return f.lastModified();
}
}