Refactoring some photark objects as Components, and properly adding dependencies and scope

git-svn-id: https://svn.apache.org/repos/asf/incubator/photark/trunk@923086 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/photark-filesystem/src/main/java/org/apache/photark/filesystem/impl/GalleryImpl.java b/photark-filesystem/src/main/java/org/apache/photark/filesystem/impl/GalleryImpl.java
index 2d9c600..65228e2 100644
--- a/photark-filesystem/src/main/java/org/apache/photark/filesystem/impl/GalleryImpl.java
+++ b/photark-filesystem/src/main/java/org/apache/photark/filesystem/impl/GalleryImpl.java
@@ -21,62 +21,64 @@
 
 import java.io.File;
 import java.net.URL;
+import java.util.logging.Logger;
 
 import org.apache.photark.services.album.Album;
-import org.apache.photark.services.gallery.AbsGalleryImpl;
+import org.apache.photark.services.gallery.BaseGalleryImpl;
 import org.apache.photark.services.gallery.Gallery;
 import org.oasisopen.sca.annotation.Init;
 
-public class GalleryImpl extends AbsGalleryImpl implements Gallery {
-   
-	public GalleryImpl(){
-		
-	}
-	
-	public GalleryImpl(String name){
-		super(name);
-	}
-	
-	
-	@Init
-	public void init() {
-		System.out.println(">>> Initializing fileSystem Gallery");
-		try {
-			URL galleryURL = this.getClass().getClassLoader().getResource(name);
-			if(galleryURL == null) {
-				// Accomodate for J2EE classpath that starts in WEB-INF\classes
-				galleryURL = this.getClass().getClassLoader().getResource("../../" + name);
-			}
-			if(galleryURL == null) {
-				// Workaroud for Google apps Engine 
-				String galleryDir = System.getProperty("user.dir") + "/"  + name;
-				galleryURL = new URL("file://" + galleryDir);
-			}
+public class GalleryImpl extends BaseGalleryImpl implements Gallery {
+    private static final Logger logger = Logger.getLogger(GalleryImpl.class.getName());
 
-			if(galleryURL != null) {
-				File album = new File(galleryURL.toURI());
-				if (album.isDirectory() && album.exists()) {
-					File[] albums = album.listFiles();
-					for(File albumFile : albums) {
-						if(! albumFile.getName().startsWith(".")) {
-							if(albumFile.isDirectory() && albumFile.exists()) {
-								Album newAlbum = new org.apache.photark.filesystem.impl.AlbumImpl();
-								newAlbum.setName(albumFile.getName());
-								newAlbum.setLocation(albumFile.getPath());
-								this.albums.add(newAlbum);
-							}                                
-						}
-					}
-				}
-			}
-		} catch (Exception e) {
-			// FIXME: ignore for now
-			e.printStackTrace();
-		}
-		initialized = true;
-	}
-	
-	public void addAlbum(String albumName){
-		 
-	}
+    public GalleryImpl(){
+
+    }
+
+    public GalleryImpl(String name){
+        super(name);
+    }
+
+
+    @Init
+    public void init() {
+        logger.info("Initializing fileSystem Gallery");
+        try {
+            URL galleryURL = this.getClass().getClassLoader().getResource(name);
+            if(galleryURL == null) {
+                // Accomodate for J2EE classpath that starts in WEB-INF\classes
+                galleryURL = this.getClass().getClassLoader().getResource("../../" + name);
+            }
+            if(galleryURL == null) {
+                // Workaroud for Google apps Engine 
+                String galleryDir = System.getProperty("user.dir") + "/"  + name;
+                galleryURL = new URL("file://" + galleryDir);
+            }
+
+            if(galleryURL != null) {
+                File album = new File(galleryURL.toURI());
+                if (album.isDirectory() && album.exists()) {
+                    File[] albums = album.listFiles();
+                    for(File albumFile : albums) {
+                        if(! albumFile.getName().startsWith(".")) {
+                            if(albumFile.isDirectory() && albumFile.exists()) {
+                                Album newAlbum = new org.apache.photark.filesystem.impl.AlbumImpl();
+                                newAlbum.setName(albumFile.getName());
+                                newAlbum.setLocation(albumFile.getPath());
+                                this.albums.add(newAlbum);
+                            }                                
+                        }
+                    }
+                }
+            }
+        } catch (Exception e) {
+            // FIXME: ignore for now
+            e.printStackTrace();
+        }
+        initialized = true;
+    }
+
+    public void addAlbum(String albumName){
+
+    }
 }
\ No newline at end of file
diff --git a/photark-jcr/src/main/java/org/apache/photark/jcr/JCRRepositoryManager.java b/photark-jcr/src/main/java/org/apache/photark/jcr/JCRRepositoryManager.java
new file mode 100644
index 0000000..883f91c
--- /dev/null
+++ b/photark-jcr/src/main/java/org/apache/photark/jcr/JCRRepositoryManager.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.    
+ */
+
+package org.apache.photark.jcr;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.jcr.LoginException;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
+
+import org.apache.jackrabbit.core.TransientRepository;
+import org.oasisopen.sca.annotation.Destroy;
+import org.oasisopen.sca.annotation.EagerInit;
+import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Scope;
+
+/**
+ *  A JCR Repository Manager that controls access to JCR session
+ *  This is a singleton component controlled by the SCA Runtime via scope composite 
+ */
+@Scope("COMPOSITE")
+@EagerInit
+public class JCRRepositoryManager {
+    private static final Logger logger = Logger.getLogger(JCRRepositoryManager.class.getName());
+    
+    /** JCR Repository **/
+    private static Repository repository;
+    /** JCR Repository Session **/
+    private static Session session;
+
+    public JCRRepositoryManager() throws IOException {
+        logger.log(Level.INFO,"JCRRepositoryManager Constructor : " + this.hashCode());
+    }
+ 
+    @Init
+    public void init() {
+       initializeRepository();
+    }
+    
+    @Destroy
+    public void destroy() {
+        logger.log(Level.INFO,"Shutting down JCR repository");
+        session.logout();
+        session = null;
+        repository = null;
+    }
+    
+    /**
+     * Retrieve current JCR Session
+     * 
+     * @return A valid Session object
+     * @throws RepositoryException
+     * @throws LoginException
+     */
+    public Session getSession() throws LoginException, RepositoryException {
+        if( session == null) {
+            initializeRepository();
+        }
+        return session;
+    }
+    
+    /**
+     * Initialize the JCR Repository
+     */
+    private synchronized void initializeRepository() {
+        logger.fine("Initializing JCR repository");
+        try {
+            if( repository == null) {
+                repository = new TransientRepository();
+            }
+            session = repository.login(new SimpleCredentials("photarkUser", "passwordDoesNotMatter".toCharArray()));                
+        } catch (Exception e) {
+            logger.log(Level.INFO, ">>>Error initializing JCR repository : " + e.getMessage(), e);
+        } 
+    }
+}
\ No newline at end of file
diff --git a/photark-jcr/src/main/java/org/apache/photark/services/album/jcr/AlbumImpl.java b/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRAlbumImpl.java
similarity index 80%
rename from photark-jcr/src/main/java/org/apache/photark/services/album/jcr/AlbumImpl.java
rename to photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRAlbumImpl.java
index 261c29b..78e4889 100644
--- a/photark-jcr/src/main/java/org/apache/photark/services/album/jcr/AlbumImpl.java
+++ b/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRAlbumImpl.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.photark.services.album.jcr;
+package org.apache.photark.jcr.services;
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -27,6 +27,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.logging.Logger;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
@@ -34,28 +35,33 @@
 import javax.jcr.Session;
 
 import org.apache.photark.Image;
+import org.apache.photark.jcr.JCRRepositoryManager;
 import org.apache.photark.services.album.Album;
 import org.apache.photark.services.album.ImageFilter;
-import org.apache.photark.services.gallery.jcr.JCRSession;
+import org.oasisopen.sca.annotation.Destroy;
 import org.oasisopen.sca.annotation.Init;
 import org.oasisopen.sca.annotation.Property;
 
-public class AlbumImpl implements Album {
+public class JCRAlbumImpl implements Album {
+    private static final Logger logger = Logger.getLogger(JCRAlbumImpl.class.getName());
+    
+    private JCRRepositoryManager repositoryManager;
+    
     private String gallery;
     private String name;
     private String location;
-    private Session session = JCRSession.getSession();
     private boolean initialized;
     private static Map<String, Album> albums = new HashMap<String, Album>();
 
-    public synchronized static Album createAlbum(String name) {
+    public synchronized static Album createAlbum(JCRRepositoryManager repositoryManager, String name) {
         if (!albums.containsKey(name)) {
-            albums.put(name, new AlbumImpl(name));
+            albums.put(name, new JCRAlbumImpl(repositoryManager,name));
         }
         return albums.get(name);
     }
 
-    public AlbumImpl(String name) {
+    public JCRAlbumImpl(JCRRepositoryManager repositoryManager, String name) {
+        this.repositoryManager = repositoryManager;
         this.name = name;
     }
 
@@ -66,14 +72,15 @@
      */
     @Init
     public synchronized void init() {
-        System.out.println(">>> Initializing JCR Album");
+        logger.info("Initializing JCR Album");
         try {
             URL albumURL = this.getClass().getClassLoader().getResource(getLocation());
             if (albumURL == null) {
                 String loc = "../../" + getLocation();
                 albumURL = this.getClass().getClassLoader().getResource(loc);
             }
-
+            
+            Session session = repositoryManager.getSession();
             if (albumURL != null) {
                 try {
                     File album = new File(albumURL.toURI());
@@ -103,9 +110,16 @@
         } catch (Exception e) {
             // FIXME: ignore for now
             e.printStackTrace();
+        } finally {
+            //repositoryManager.releaseSession();
         }
         initialized = true;
     }
+    
+    @Destroy
+    public void destroy() {
+        //repositoryManager.releaseSession();
+    }
 
     @Property
     public void setGallery(String gallery) {
@@ -132,7 +146,7 @@
     }
 
     public void setLocation(String location) {
-        System.out.println("inside setLocation:location:" + location);
+        logger.info("inside setLocation:location:" + location);
         this.location = location;
     }
 
@@ -142,6 +156,7 @@
         }
         List<String> pictures = new ArrayList<String>();
         try {
+            Session session = repositoryManager.getSession();
             Node root = session.getRootNode();
             Node albumNode = root.getNode(name);
             NodeIterator nodes = albumNode.getNodes();
@@ -155,6 +170,8 @@
         } catch (Exception e) {
             // FIXME: ignore for now
             e.printStackTrace();
+        } finally {
+            //repositoryManager.releaseSession();
         }
 
         String[] pictureArray = new String[pictures.size()];
@@ -164,6 +181,7 @@
 
     public void removeNodes() {
         try {
+            Session session = repositoryManager.getSession();
             Node root = session.getRootNode();
             NodeIterator nodes = root.getNodes();
             while (nodes.hasNext()) {
@@ -177,12 +195,15 @@
         } catch (Exception e) {
             // FIXME: ignore for now
             e.printStackTrace();
+        } finally {
+            //repositoryManager.releaseSession();
         }
 
     }
 
     public void addPicture(Image picture) {
         try {
+            Session session = repositoryManager.getSession();
             Node root = session.getRootNode();
             Node albumNode = root.getNode(name);
             Node picNode = albumNode.addNode(picture.getName());
@@ -193,11 +214,14 @@
             session.save();
         } catch (RepositoryException e) {
             e.printStackTrace();
+        }  finally {
+            //repositoryManager.releaseSession();
         }
     }
 
     public void deletePicture(Image picture) {
         try {
+            Session session = repositoryManager.getSession();
             Node root = session.getRootNode();
             Node albumNode = root.getNode(name);
             Node picNode = albumNode.addNode(picture.getName());
@@ -205,6 +229,8 @@
             session.save();
         } catch (RepositoryException e) {
             e.printStackTrace();
+        }  finally {
+            //repositoryManager.releaseSession();
         }
     }
 
@@ -217,10 +243,12 @@
      * @throws RepositoryException
      */
     private Node getAlbumNode(String name) throws RepositoryException {
+        Session session = repositoryManager.getSession();
         Node root = session.getRootNode();
-        if (root.hasNode(name))
+        if (root.hasNode(name)) {
             return root.getNode(name);
-        else
+        } else {
             return root.addNode(name);
+        }
     }
 }
diff --git a/photark-jcr/src/main/java/org/apache/photark/services/gallery/jcr/GalleryImpl.java b/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRGalleryImpl.java
similarity index 67%
rename from photark-jcr/src/main/java/org/apache/photark/services/gallery/jcr/GalleryImpl.java
rename to photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRGalleryImpl.java
index 59026eb..e597922 100644
--- a/photark-jcr/src/main/java/org/apache/photark/services/gallery/jcr/GalleryImpl.java
+++ b/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRGalleryImpl.java
@@ -17,35 +17,47 @@
  * under the License.
  */
 
-package org.apache.photark.services.gallery.jcr;
+package org.apache.photark.jcr.services;
 
 import java.io.File;
 import java.net.URL;
+import java.util.logging.Logger;
 
 import javax.jcr.Node;
 import javax.jcr.NodeIterator;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
+import org.apache.photark.jcr.JCRRepositoryManager;
 import org.apache.photark.services.album.Album;
-import org.apache.photark.services.album.jcr.AlbumImpl;
-import org.apache.photark.services.gallery.AbsGalleryImpl;
+import org.apache.photark.services.gallery.BaseGalleryImpl;
 import org.apache.photark.services.gallery.Gallery;
 import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Reference;
+import org.oasisopen.sca.annotation.Scope;
 
-public class GalleryImpl extends AbsGalleryImpl implements Gallery {
+@Scope("COMPOSITE")
+public class JCRGalleryImpl extends BaseGalleryImpl implements Gallery {
+    private static final Logger logger = Logger.getLogger(JCRGalleryImpl.class.getName());
+    
+    private JCRRepositoryManager repositoryManager;
 
-    public GalleryImpl() {
+    public JCRGalleryImpl() {
 
     }
+    
+    @Reference(name="repositoryManager")
+    protected void setRepositoryManager(JCRRepositoryManager repositoryManager) {
+        this.repositoryManager = repositoryManager;
+    }
 
-    public GalleryImpl(String name) {
+    public JCRGalleryImpl(String name) {
         super(name);
     }
 
     @Init
     public void init() {
-        System.out.println(">>> Initializing JCR Gallery");
+        logger.info("Initializing JCR Gallery");
         try {
             URL galleryURL = this.getClass().getClassLoader().getResource(name);
             if (galleryURL == null) {
@@ -60,9 +72,9 @@
                     for (File albumFile : albums) {
                         if (!albumFile.getName().startsWith(".")) {
                             if (albumFile.isDirectory() && albumFile.exists()) {
-                                Album newAlbum = AlbumImpl.createAlbum(albumFile.getName());
+                                Album newAlbum = JCRAlbumImpl.createAlbum(repositoryManager, albumFile.getName());
                                 newAlbum.setName(albumFile.getName());
-                                ((AlbumImpl)newAlbum).setGallery(name);
+                                ((JCRAlbumImpl)newAlbum).setGallery(name);
                                 this.albums.add(newAlbum);
                             }
                         }
@@ -74,13 +86,13 @@
             // FIXME: ignore for now
             e.printStackTrace();
         }
-
+        
         initialized = true;
     }
-
+    
     private void getAlbumsFromJcrRepository() {
         try {
-            Session session = JCRSession.getSession();
+            Session session = repositoryManager.getSession();
             Node rootNode = session.getRootNode();
             NodeIterator albumNodes = rootNode.getNodes();
             while (albumNodes.hasNext()) {
@@ -89,29 +101,38 @@
                     continue;
                 }
                 String albumName = albumNode.getName();
-                Album album = AlbumImpl.createAlbum(albumName);
+                Album album = JCRAlbumImpl.createAlbum(repositoryManager, albumName);
                 if (!albums.contains(album)) {
                     albums.add(album);
                 }
             }
         } catch (RepositoryException e) {
             e.printStackTrace();
+        } finally {
+            //repositoryManager.releaseSession();
         }
     }
 
     public void addAlbum(String albumName) {
-        Session session = JCRSession.getSession();
         try {
+            Session session = repositoryManager.getSession();
             Node rootNode = session.getRootNode();
             if (rootNode.hasNode(albumName)) {
-                System.out.println("This album is already in gallery");
+                logger.info("This album is already in gallery");
                 return;
             }
             // add album to the root
             rootNode.addNode(albumName);
             session.save();
+            // add album to the list of albums
+            Album album = JCRAlbumImpl.createAlbum(repositoryManager, albumName);
+            if (!albums.contains(album)) {
+                albums.add(album);
+            }
         } catch (RepositoryException e) {
             e.printStackTrace();
+        } finally {
+            //repositoryManager.releaseSession();
         }
     }
 }
diff --git a/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRImageCollectionImpl.java b/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRImageCollectionImpl.java
index 1a4423c..ac36c61 100644
--- a/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRImageCollectionImpl.java
+++ b/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRImageCollectionImpl.java
@@ -19,7 +19,9 @@
 
 package org.apache.photark.jcr.services;
 
+import java.io.IOException;
 import java.io.InputStream;
+import java.util.logging.Logger;
 
 import javax.jcr.Node;
 import javax.jcr.PathNotFoundException;
@@ -27,12 +29,13 @@
 import javax.jcr.Session;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.photark.jcr.JCRRepositoryManager;
 import org.apache.photark.services.ImageCollection;
-import org.apache.photark.services.gallery.jcr.JCRSession;
 import org.apache.tuscany.sca.data.collection.Entry;
 import org.apache.tuscany.sca.data.collection.NotFoundException;
 import org.oasisopen.sca.annotation.Destroy;
 import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Reference;
 import org.oasisopen.sca.annotation.Scope;
 import org.oasisopen.sca.annotation.Service;
 
@@ -43,19 +46,34 @@
 @Scope("COMPOSITE")
 @Service(ImageCollection.class)
 public class JCRImageCollectionImpl implements ImageCollection {
-    private Session session = JCRSession.getSession();
-
-    @Init
-    public void init() {
-    }
+    private static final Logger logger = Logger.getLogger(JCRImageCollectionImpl.class.getName());
     
-    @Destroy
-    public void destroy() {    
-    }
+    private JCRRepositoryManager repositoryManager;
 
     public JCRImageCollectionImpl() {
         
     }
+    
+    @Reference(name="repositoryManager")
+    protected void setRepositoryManager(JCRRepositoryManager repositoryManager) {
+        this.repositoryManager = repositoryManager;
+    }
+
+    
+    @Init
+    public void init() {
+        try {
+            repositoryManager = new JCRRepositoryManager();
+        } catch (IOException e) {
+            // FIXME: ignore for now
+            e.printStackTrace();
+        }
+    }
+    
+    @Destroy
+    public void destroy() {
+        //repositoryManager.releaseSession();
+    }
 
     public InputStream get(String key) throws NotFoundException {
         String sub = StringUtils.substringAfter(key, "gallery/");
@@ -63,6 +81,7 @@
         String albumName = stringArray[0];
         InputStream inStream = null;
         try {
+            Session session = repositoryManager.getSession();
             Node root = session.getRootNode();
             Node albumNode = root.getNode(albumName);
             String image = stringArray[1];
@@ -73,6 +92,8 @@
             e.printStackTrace();
         } catch (RepositoryException e) {
             e.printStackTrace();
+        } finally {
+            //repositoryManager.releaseSession();
         }
         return inStream;
     }
@@ -90,7 +111,7 @@
     }
 
     public String post(String key, InputStream inputStream) {
-        System.out.println("insdie post:" + key);
+        logger.info("insdie post:" + key);
 
         return key;
     }
diff --git a/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRImageUploadServiceImpl.java b/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRImageUploadServiceImpl.java
index b89ebe3..68da44a 100644
--- a/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRImageUploadServiceImpl.java
+++ b/photark-jcr/src/main/java/org/apache/photark/jcr/services/JCRImageUploadServiceImpl.java
@@ -43,12 +43,12 @@
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.apache.photark.Image;
+import org.apache.photark.jcr.JCRRepositoryManager;
 import org.apache.photark.jcr.util.ArchiveFileExtractor;
 import org.apache.photark.services.album.Album;
-import org.apache.photark.services.album.jcr.AlbumImpl;
 import org.apache.photark.services.gallery.Gallery;
-import org.apache.photark.services.gallery.jcr.GalleryImpl;
 import org.oasisopen.sca.annotation.Init;
+import org.oasisopen.sca.annotation.Reference;
 import org.oasisopen.sca.annotation.Scope;
 import org.oasisopen.sca.annotation.Service;
 
@@ -66,8 +66,12 @@
     
     private String supportedImageTypes[] = {".jpg", ".jpeg", ".png", ".gif"};
     
+    private JCRRepositoryManager repositoryManager;
+    
     private ServletFileUpload upload;
     
+    private Gallery gallery;
+    
     /**
      * Initialize the component.
      */
@@ -77,6 +81,20 @@
         upload.setSizeMax(MAX_UPLOAD_ZIP_IN_MEGS * 1024 * 1024);
     }
 
+    public JCRImageUploadServiceImpl() {
+
+    }
+    
+    @Reference(name="repositoryManager")
+    protected void setRepositoryManager(JCRRepositoryManager repositoryManager) {
+        this.repositoryManager = repositoryManager;
+    }
+
+    @Reference(name="gallery")
+    protected void setGallery(Gallery gallery) {
+        this.gallery = gallery;
+    }
+    
     @Override
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         response.setContentType("text/html");
@@ -85,7 +103,7 @@
         out.write("<html><body><h1>Photark Upload Service</h1></body></html>");
     }
 
-
+    @SuppressWarnings("unchecked")
     @Override
     public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
         response.setContentType("text/html");
@@ -151,11 +169,11 @@
             out.write(sb.toString());
 
         } catch (FileUploadException e) {
-            System.out.println("Error: " + e.getMessage());
-            e.printStackTrace();
+            logger.info("Error uploading file : " + e.getMessage());
+            response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Error uploading file : " + e.getMessage());
         } catch (Exception e) {
-            System.out.println("Error: " + e.getMessage());
-            e.printStackTrace();
+            logger.info("Error uploading file : " + e.getMessage());
+            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Error uploading file : " + e.getMessage());
         }
     }
 
@@ -164,9 +182,8 @@
      * @param picture Picture
      */
     private void addPictureToAlbum(String albumName, Image image) {
-    	Gallery gallery = new GalleryImpl();
     	gallery.addAlbum(albumName);
-        Album album = new AlbumImpl(albumName);
+        Album album = new JCRAlbumImpl(repositoryManager, albumName);
         album.addPicture(image);
     }
     
@@ -182,7 +199,7 @@
             streamFactory.createArchiveInputStream(inStream);
             return true;
         } catch (ArchiveException e) {
-            e.printStackTrace();
+            logger.info("File is not an archive");
         }
         return false;
     }
diff --git a/photark-jcr/src/main/java/org/apache/photark/services/gallery/jcr/JCRSession.java b/photark-jcr/src/main/java/org/apache/photark/services/gallery/jcr/JCRSession.java
deleted file mode 100644
index 88552f0..0000000
--- a/photark-jcr/src/main/java/org/apache/photark/services/gallery/jcr/JCRSession.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.photark.services.gallery.jcr;
-
-import java.io.IOException;
-
-import javax.jcr.LoginException;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.SimpleCredentials;
-
-import org.apache.jackrabbit.core.TransientRepository;
-
-public class JCRSession {
-
-    private static Session session;
-
-    private static void initSession() {
-        try {
-            Repository repository = new TransientRepository();
-            session = repository.login(new SimpleCredentials("username", "password".toCharArray()));
-        } catch (LoginException e) {
-            e.printStackTrace();
-        } catch (IOException e) {
-            e.printStackTrace();
-        } catch (RepositoryException e) {
-            e.printStackTrace();
-        }
-    }
-
-    public synchronized static Session getSession() {
-        if (session == null) {
-            initSession();
-        }
-        return session;
-    }
-    
-    public void releaseSession() {
-        if(session != null) {
-            session.logout();
-        }
-    }
-    
-    public void destroy() {
-        releaseSession();
-    }
-}
diff --git a/photark-webapp/src/main/webapp/WEB-INF/web.composite b/photark-webapp/src/main/webapp/WEB-INF/web.composite
index e2aad0b..d601732 100644
--- a/photark-webapp/src/main/webapp/WEB-INF/web.composite
+++ b/photark-webapp/src/main/webapp/WEB-INF/web.composite
@@ -24,12 +24,14 @@
   
     <!-- Facade component for Gallery -->
     <component name="Gallery">
-   		<implementation.java class="org.apache.photark.services.gallery.jcr.GalleryImpl"/>
+   		<implementation.java class="org.apache.photark.jcr.services.JCRGalleryImpl"/>
    		<property name="name">gallery</property>
    		<service name="Gallery">
    			<interface.java interface="org.apache.photark.services.gallery.Gallery"/>
+   			<binding.sca name="local"/>
    			<tuscany:binding.jsonrpc uri="/GalleryService"/>
    		</service>
+   		<reference name="repositoryManager" target="RepositoryManager"/>
     </component>
     
     <!-- Component responsible for providing REST access to images -->
@@ -37,7 +39,8 @@
 		<implementation.java class="org.apache.photark.jcr.services.JCRImageCollectionImpl"/>
 		<service name="ImageCollection">
 			<tuscany:binding.http uri="/gallery"/>
-		</service>    	  	
+		</service>
+		<reference name="repositoryManager" target="RepositoryManager"/>
 	</component>
     
     <!-- Component responsible for providing upload support for gallery/album -->
@@ -45,6 +48,15 @@
 		<implementation.java class="org.apache.photark.jcr.services.JCRImageUploadServiceImpl"/>
 		<service name="Servlet">
 			<tuscany:binding.http uri="/admin/upload"/>
-		</service>    	  	
-	</component>    
+		</service>
+		<reference name="repositoryManager" target="RepositoryManager"/>
+		<reference name="gallery" target="Gallery">
+			<binding.sca name="local"/>
+		</reference>  	  	
+	</component>
+	
+    <!-- Component responsible for providing JCR Management Support -->
+    <component name="RepositoryManager">
+		<implementation.java class="org.apache.photark.jcr.JCRRepositoryManager"/>
+	</component> 	    
 </composite>
diff --git a/photark/src/main/java/org/apache/photark/services/gallery/AbsGalleryImpl.java b/photark/src/main/java/org/apache/photark/services/gallery/BaseGalleryImpl.java
similarity index 87%
rename from photark/src/main/java/org/apache/photark/services/gallery/AbsGalleryImpl.java
rename to photark/src/main/java/org/apache/photark/services/gallery/BaseGalleryImpl.java
index e274796..8057bbe 100644
--- a/photark/src/main/java/org/apache/photark/services/gallery/AbsGalleryImpl.java
+++ b/photark/src/main/java/org/apache/photark/services/gallery/BaseGalleryImpl.java
@@ -21,22 +21,24 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.logging.Logger;
 
 import org.apache.photark.services.album.Album;
 import org.oasisopen.sca.annotation.Property;
 
-public abstract class AbsGalleryImpl implements Gallery {
-
+public abstract class BaseGalleryImpl {
+    private static final Logger logger = Logger.getLogger(BaseGalleryImpl.class.getName());
+    
     protected String name;
     private String location;
     protected boolean initialized;
     protected List<Album> albums = new ArrayList<Album>();
 
-    public AbsGalleryImpl() {
+    public BaseGalleryImpl() {
 
     }
 
-    public AbsGalleryImpl(String name) {
+    public BaseGalleryImpl(String name) {
         this.name = name;
     }
 
@@ -51,9 +53,9 @@
         this.name = name;
     }
 
-    public void addAlbum(Album album) {
-
-    }
+    //public void addAlbum(Album album) {
+    //
+    //}
 
     public Album[] getAlbums() {
         if (!initialized) {
@@ -74,7 +76,7 @@
             if (pictures.length > 0) {
                 return albumLookup.getPictures()[0];
             } else {
-                System.out.println("No Album Cover Picture found for album:" + albumName);
+                logger.info("No Album Cover Picture found for album:" + albumName);
                 return null;
             }
         } else {