/** * */ package org.goko.core.workspace.io; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.apache.commons.io.IOUtils; import org.eclipse.core.runtime.URIUtil; import org.goko.core.common.exception.GkException; import org.goko.core.common.exception.GkTechnicalException; /** * @author PsyKo * @date 19 mars 2016 */ public class URIResourceLocation implements IResourceLocation { /** The URI referencing the resource in the project */ private URI uri; /** The absolute URI referencing the resource */ private URI absoluteUri; /** The number of references to this location */ private int referenceCount; /** The listeners */ private List<IResourceLocationListener> listeners; /** * @param uri */ public URIResourceLocation(URI uri) { this(uri, null); } /** * @param uri */ public URIResourceLocation(URI uri, URI absoluteUri) { super(); this.uri = uri; this.referenceCount = 0; this.absoluteUri = absoluteUri; this.listeners = new CopyOnWriteArrayList<IResourceLocationListener>(); } /** (inheritDoc) * @see org.goko.core.workspace.io.IResourceLocation#openInputStream() */ @Override public InputStream openInputStream() throws GkException { try { return absoluteUri.toURL().openStream(); } catch (IOException e) { throw new GkTechnicalException(e); } } /** (inheritDoc) * @see org.goko.core.workspace.io.IResourceLocation#canWrite() */ @Override public boolean canWrite() { return URIUtil.isFileURI(absoluteUri); } /** (inheritDoc) * @see org.goko.core.workspace.io.IResourceLocation#write(java.io.InputStream) */ @Override public void write(InputStream input) throws GkException { try { Files.write(Paths.get(absoluteUri), IOUtils.toByteArray(input), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); notifyChange(); } catch (IOException e) { throw new GkTechnicalException(e); } } /** (inheritDoc) * @see org.goko.core.workspace.io.IResourceLocation#bind() */ @Override public void bind() throws GkException { this.referenceCount += 1; } /** (inheritDoc) * @see org.goko.core.workspace.io.IResourceLocation#delete() */ @Override public void release() throws GkException { this.referenceCount -= 1; } /** * @return the uri */ public URI getUri() { return uri; } /** * @param uri the uri to set */ public void setUri(URI uri) { this.uri = uri; } /** * @return the referenceCount */ public int getReferenceCount() { return referenceCount; } /** * @return the absoluteUri */ public URI getAbsoluteUri() { return absoluteUri; } /** * @param absoluteUri the absoluteUri to set */ public void setAbsoluteUri(URI absoluteUri) { this.absoluteUri = absoluteUri; } /** (inheritDoc) * @see org.goko.core.workspace.io.IResourceLocation#addListener(org.goko.core.workspace.io.IResourceLocationListener) */ @Override public void addListener(IResourceLocationListener listener) { if(!listeners.contains(listener)){ listeners.add(listener); } } /** * Notifies registered listener for changes on this resource */ protected void notifyChange(){ for (IResourceLocationListener listener : listeners) { listener.onResourceChanged(this); } } }