Here am I again. I am struggling for 2 days now to load an image from the filesystem into my webpage. The image needs to be loaded based on the product id.
The steps I did was: 1. Implemented a FileSystemAssetFactory based on the ClasspathAssetFactory 2. Implemented a FileSystemResource; See the code below: In my html the following code is generated: <img src=" /advertaza/assets/classpath/6675930334be219a/C:/tmp/pictures/8/71/1001/thumb1.jpg " alt=""/> As you can see the file system path is exposed into the webpage. I don't want this. The second problem is that the image is not loaded/visible in the webpage. What am I doing wrong? Are there tapestry guru's who can help me out? Thanks, Peter /* *My quick example code */ public String getThumbnailPath() { Asset asset = assetSource.getAsset(null, "file:/8/71/1001/thumb1.jpg", null); return asset.toClientURL(); } public class FileSystemAssetFactory implements AssetFactory { private final ClasspathAssetAliasManager aliasManager; private final Map<Resource, String> resourceToDefaultPath = CollectionFactory.newConcurrentMap(); private final FileSystemResource rootResource; private final AssetPathConverter converter; private final boolean invariant; public FileSystemAssetFactory(ClasspathAssetAliasManager aliasManager, AssetPathConverter converter) { this.aliasManager = aliasManager; this.converter = converter; rootResource = new FileSystemResource("C:/tmp/pictures/"); invariant = converter.isInvariant(); } private String clientURL(Resource resource) { String defaultPath = resourceToDefaultPath.get(resource); if (defaultPath == null) { defaultPath = buildDefaultPath(resource); resourceToDefaultPath.put(resource, defaultPath); } return converter.convertAssetPath(defaultPath); } private String buildDefaultPath(Resource resource) { //boolean requiresDigest = cache.requiresDigest(resource); String path = resource.getPath(); int lastdotx = path.lastIndexOf('.'); path = path.substring(0, lastdotx + 1) + path.substring(lastdotx); return aliasManager.toClientURL(path); } public Asset createAsset(final Resource resource) { return new AbstractAsset(invariant) { public Resource getResource() { return resource; } public String toClientURL() { return clientURL(resource); } }; } public Resource getRootResource() { return rootResource; } } public class FileSystemResource extends AbstractResource { private static final int PRIME = 37; /** * Constructor with the root path * @param path the root */ public FileSystemResource(String path) { super(path); } /** * */ @Override protected Resource newResource(String path) { return new FileSystemResource(path); } @Override public URL toURL() { String filePath = getPath(); File file = new File(filePath); if (file != null && file.exists()) { try { return file.toURL(); } catch (MalformedURLException ex) { throw new RuntimeException(ex); } } return null; } @Override public String toString() { return getPath(); } @Override public int hashCode() { return PRIME * getPath().hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final FileSystemResource other = (FileSystemResource) obj; return getPath().equals(other.getPath()); } }