/* * Copyright (C) 2009 eXo Platform SAS. * * This 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 software 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 software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.exoplatform.services.jcr.ext.resource; import org.exoplatform.services.jcr.ext.common.SessionProvider; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URLConnection; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; /** * @author <a href="mailto:andrew00x@gmail.com">Andrey Parfonov</a> * @version $Id: $ */ public class JcrURLConnection extends URLConnection { private static final Log LOG = ExoLogger.getLogger("exo.jcr.component.ext.JcrURLConnection"); private SessionProvider sessionProvider; private NodeRepresentationService nodeRepresentationService; private UnifiedNodeReference nodeReference; private NodeRepresentation nodeRepresentation; private Session session; private boolean closeSessionProvider; public JcrURLConnection(UnifiedNodeReference nodeReference, SessionProvider sessionProvider, NodeRepresentationService nodeRepresentationService, boolean closeSessionProvider) throws MalformedURLException { super(nodeReference.getURL()); this.sessionProvider = sessionProvider; this.nodeReference = nodeReference; this.nodeRepresentationService = nodeRepresentationService; this.closeSessionProvider = closeSessionProvider; doOutput = false; allowUserInteraction = false; useCaches = false; ifModifiedSince = 0; } public JcrURLConnection(UnifiedNodeReference nodeReference, SessionProvider sessionProvider, NodeRepresentationService nodeRepresentationService) throws MalformedURLException { super(nodeReference.getURL()); this.sessionProvider = sessionProvider; this.nodeReference = nodeReference; this.nodeRepresentationService = nodeRepresentationService; doOutput = false; allowUserInteraction = false; useCaches = false; ifModifiedSince = 0; } /* * (non-Javadoc) * @see java.net.URLConnection#connect() */ @Override public void connect() throws IOException { if (connected) return; try { session = sessionProvider.getSession(sessionProvider.getCurrentWorkspace(), sessionProvider.getCurrentRepository()); Node node = null; if (nodeReference.isPath()) { node = (Node)session.getItem(nodeReference.getPath()); } else if (nodeReference.isIdentitifier()) { node = session.getNodeByUUID(nodeReference.getIdentitifier().getString()); } else { throw new IllegalArgumentException("Absolute path or Identifier was not found!"); } nodeRepresentation = nodeRepresentationService.getNodeRepresentation(node, "text/xml"); connected = true; } catch (Exception e) { //e.printStackTrace(); throw new IOException("Connection refused!", e); } } /** * Close connection to JCR. */ public void disconnect() { if (!connected) return; session.logout(); connected = false; } /* * (non-Javadoc) * @see java.net.URLConnection#getInputStream() */ @Override public InputStream getInputStream() throws IOException { if (!connected) connect(); try { return nodeRepresentation.getInputStream(); } catch (IOException e) { //e.printStackTrace(); throw new IOException("can't get input stream", e); } catch (RepositoryException e) { //e.printStackTrace(); throw new IOException("can't get input stream", e); } } /* * (non-Javadoc) * @see java.net.URLConnection#getContent() */ @Override public Object getContent() throws IOException { if (!connected) connect(); return nodeRepresentation.getNode(); } /* * (non-Javadoc) * @see java.net.URLConnection#getContent(java.lang.Class[]) */ @Override public Object getContent(Class[] classes) throws IOException { throw new UnsupportedOperationException("protocol support only " + "javax.jcr.Node as content, use method getContent() instead this."); } /* * (non-Javadoc) * @see java.net.URLConnection#getContentType() */ @Override public String getContentType() { try { if (!connected) { connect(); } return nodeRepresentation.getMediaType(); } catch (IOException e) { if (LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } catch (RepositoryException e) { if (LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } return null; } /* * (non-Javadoc) * @see java.net.URLConnection#getContentLength() */ @Override public int getContentLength() { try { if (!connected) { connect(); } return (int)nodeRepresentation.getContentLenght(); } catch (IOException e) { if (LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } catch (RepositoryException e) { if (LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } return -1; } /* * (non-Javadoc) * @see java.net.URLConnection#setDoOutput(boolean) */ @Override public void setDoOutput(boolean dooutput) { if (dooutput) throw new UnsupportedOperationException("protocol doesn't support output!"); super.setDoOutput(dooutput); } /* * (non-Javadoc) * @see java.net.URLConnection#getContentEncoding() */ @Override public String getContentEncoding() { try { if (!connected) { connect(); } return nodeRepresentation.getContentEncoding(); } catch (Exception e) { if (LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } return null; } /* * (non-Javadoc) * @see java.net.URLConnection#getLastModified() */ @Override public long getLastModified() { try { if (!connected) { connect(); } return nodeRepresentation.getLastModified(); } catch (IOException e) { if (LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } catch (RepositoryException e) { if (LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + e.getMessage()); } } return 0; } /* * (non-Javadoc) * @see java.net.URLConnection#setAllowUserInteraction(boolean) */ @Override public void setAllowUserInteraction(boolean allowuserinteraction) { if (allowuserinteraction) throw new UnsupportedOperationException("protocol doesn't support user interaction!"); super.setAllowUserInteraction(allowuserinteraction); } /* * (non-Javadoc) * @see java.net.URLConnection#setUseCaches(boolean) */ @Override public void setUseCaches(boolean usecaches) { if (usecaches) throw new UnsupportedOperationException("protocol doesn't support caches!"); super.setUseCaches(usecaches); } /* * (non-Javadoc) * @see java.net.URLConnection#setIfModifiedSince(long) */ @Override public void setIfModifiedSince(long ifmodifiedsince) { if (ifmodifiedsince > 0) throw new UnsupportedOperationException("protocol doesn't support this feature!"); super.setIfModifiedSince(ifmodifiedsince); } /* * (non-Javadoc) * @see java.net.URLConnection#setRequestProperty(java.lang.String, java.lang.String) */ @Override public void addRequestProperty(String key, String value) { throw new UnsupportedOperationException("protocol doesn't support request properties!"); } /* * (non-Javadoc) * @see java.net.URLConnection#setRequestProperty(java.lang.String, java.lang.String) */ @Override public void setRequestProperty(String key, String value) { throw new UnsupportedOperationException("protocol doesn't support request properties!"); } @Override protected void finalize() throws Throwable { try { if (closeSessionProvider) { sessionProvider.close(); } } catch (Exception t) { if (LOG.isTraceEnabled()) { LOG.trace("An exception occurred: " + t.getMessage()); } } finally { super.finalize(); } } }