diff options
Diffstat (limited to 'netx/net/sourceforge/jnlp/services/XPersistenceService.java')
-rw-r--r-- | netx/net/sourceforge/jnlp/services/XPersistenceService.java | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/netx/net/sourceforge/jnlp/services/XPersistenceService.java b/netx/net/sourceforge/jnlp/services/XPersistenceService.java new file mode 100644 index 0000000..db45163 --- /dev/null +++ b/netx/net/sourceforge/jnlp/services/XPersistenceService.java @@ -0,0 +1,177 @@ +// Copyright (C) 2001-2003 Jon A. Maxwell (JAM) +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + +package net.sourceforge.jnlp.services; + +import java.io.*; +import java.net.*; +import java.util.*; +import java.lang.ref.*; +import javax.jnlp.*; + +import net.sourceforge.jnlp.*; +import net.sourceforge.jnlp.cache.*; +import net.sourceforge.jnlp.runtime.*; + +/** + * The BasicService JNLP service. + * + * @author <a href="mailto:[email protected]">Jon A. Maxwell (JAM)</a> - initial author + * @version $Revision: 1.7 $ + */ +class XPersistenceService implements PersistenceService { + + // todo: recheck delete, etc to make sure security is tight + + protected XPersistenceService() { + } + + /** + * Checks whether the application has access to URL area + * requested. If the method returns normally then the specified + * location can be accessed by the current application. + * + * @throws MalformedURLException if the application cannot access the location + */ + protected void checkLocation(URL location) throws MalformedURLException { + ApplicationInstance app = JNLPRuntime.getApplication(); + if (app == null) + throw new MalformedURLException("Cannot determine the current application."); + + URL source = app.getJNLPFile().getCodeBase(); + + if (!source.getHost().equalsIgnoreCase(location.getHost())) + throw new MalformedURLException("Cannot access data from a different host."); + + // test for above codebase, not perfect but works for now + + String requestPath = location.getFile(); + if (-1 != requestPath.lastIndexOf("/")) + requestPath = requestPath.substring(0, requestPath.lastIndexOf("/")); + else + requestPath = ""; + + if (JNLPRuntime.isDebug()) { + System.out.println("codebase path: "+source.getFile()); + System.out.println("request path: "+requestPath); + } + + if (!source.getFile().startsWith(requestPath)) + throw new MalformedURLException("Cannot access data below source URL path."); + } + + /** + * Converts a URL into a file in the persistence store. + * + * @return the file + */ + protected File toCacheFile(URL location) throws MalformedURLException { + return CacheUtil.urlToPath(location, "pcache"); + } + + /** + * + * @return the maximum size of storage that got granted, in bytes + * @throws MalformedURLException if the application cannot access the location + */ + public long create(URL location, long maxsize) throws MalformedURLException, IOException { + checkLocation(location); + + File file = toCacheFile(location); + file.getParentFile().mkdirs(); + + if (!file.createNewFile()) + throw new IOException("File already exists."); + + return maxsize; + } + + /** + * + * @throws MalformedURLException if the application cannot access the location + */ + public void delete(URL location) throws MalformedURLException, IOException { + checkLocation(location); + + toCacheFile(location).delete(); + } + + /** + * + * @throws MalformedURLException if the application cannot access the location + */ + public FileContents get(URL location) throws MalformedURLException, IOException, FileNotFoundException { + checkLocation(location); + + File file = toCacheFile(location); + if (!file.exists()) + throw new FileNotFoundException("Persistence store for " + + location.toString() + " is not found."); + file.getParentFile().mkdirs(); + + return (FileContents) ServiceUtil.createPrivilegedProxy(FileContents.class, new XFileContents(file)); + } + + /** + * + * @throws MalformedURLException if the application cannot access the location + */ + public String[] getNames(URL location) throws MalformedURLException, IOException { + checkLocation(location); + + + File file = toCacheFile(location); + if (!file.isDirectory()) + return new String[0]; + + List result = new ArrayList(); + + // check whether this is right: only add files and not directories. + File entries[] = file.listFiles(); + for (int i=0; i < entries.length; i++) + if (entries[i].isFile()) + result.add(entries[i].getName()); + + return (String[]) result.toArray(new String[result.size()]); + } + + /** + * + * @throws MalformedURLException if the application cannot access the location + */ + public int getTag(URL location) throws MalformedURLException, IOException { + checkLocation(location); + + // todo: actually implement tags + + if (toCacheFile(location).exists()) + return PersistenceService.CACHED; + + return PersistenceService.CACHED; + } + + /** + * + * @throws MalformedURLException if the application cannot access the location + */ + public void setTag(URL location, int tag) throws MalformedURLException, IOException { + checkLocation(location); + + // todo: actually implement tags + } + +} |