001// Copyright 2014 The Apache Software Foundation 002// 003// Licensed under the Apache License, Version 2.0 (the "License"); 004// you may not use this file except in compliance with the License. 005// You may obtain a copy of the License at 006// 007// http://www.apache.org/licenses/LICENSE-2.0 008// 009// Unless required by applicable law or agreed to in writing, software 010// distributed under the License is distributed on an "AS IS" BASIS, 011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012// See the License for the specific language governing permissions and 013// limitations under the License. 014package org.apache.tapestry5.internal.services; 015 016import java.io.IOException; 017import java.io.InputStream; 018import java.net.MalformedURLException; 019import java.net.URL; 020import java.util.Locale; 021 022import org.apache.tapestry5.commons.Resource; 023import org.apache.tapestry5.internal.util.VirtualResource; 024 025public class UrlResource extends VirtualResource { 026 027 final public static URL PLACEHOLDER_URL; 028 029 static { 030 try 031 { 032 PLACEHOLDER_URL = new URL("http://tapestry.apache.org"); 033 } 034 catch (MalformedURLException e) 035 { 036 throw new ExceptionInInitializerError(e); 037 } 038 } 039 040 final private URL url; 041 042 private Boolean exists; 043 044 private InputStream inputStream; 045 046 public UrlResource() 047 { 048 this(PLACEHOLDER_URL); 049 exists = true; 050 } 051 052 public UrlResource(URL url) 053 { 054 super(); 055 this.url = url; 056 } 057 058 @Override 059 public InputStream openStream() throws IOException 060 { 061 if (exists == null) 062 { 063 try 064 { 065 inputStream = url.openStream(); 066 exists = true; 067 } 068 catch (IOException e) 069 { 070 exists = false; 071 throw e; 072 } 073 } 074 return inputStream; 075 } 076 077 @Override 078 public URL toURL() 079 { 080 return url; 081 } 082 083 @Override 084 public boolean exists() 085 { 086 if (exists == null) 087 { 088 try 089 { 090 openStream(); 091 } 092 catch (IOException e) 093 { 094 // openStream() will always set the exists field. 095 } 096 } 097 return exists; 098 } 099 100 @Override 101 public Resource forLocale(Locale locale) 102 { 103 return this; 104 } 105 106 @Override 107 public String toString() 108 { 109 return "UrlResource [url=" + url + "]"; 110 } 111 112}