blob: 04b623ba4fcdb4c2ecbecf39f91b033f0f96cb04 [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();
}
}