[jboss-svn-commits] JBL Code SVN: r9908 - in labs/jbosslabs/trunk/portal-extensions: forge-common/src/java/org/jboss/forge/common/projects and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 2 16:14:40 EST 2007


Author: wrzep
Date: 2007-03-02 16:14:40 -0500 (Fri, 02 Mar 2007)
New Revision: 9908

Added:
   labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/exceptions/IllegalOperationException.java
   labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/proxies/
   labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/proxies/ReadOnlyProxy.java
Modified:
   labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/ProjectsDescriptor.java
   labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projects/ProjectsServiceImpl.java
   labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projects/ProjectsServiceRWImpl.java
Log:
JBLAB-840
read-only dynamic proxy

Pawel


Added: labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/exceptions/IllegalOperationException.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/exceptions/IllegalOperationException.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/exceptions/IllegalOperationException.java	2007-03-02 21:14:40 UTC (rev 9908)
@@ -0,0 +1,38 @@
+ /*
+  * JBoss, Home of Professional Open Source
+  * Copyright 2005, JBoss Inc., and individual contributors as indicated
+  * by the @authors tag. See the copyright.txt in the distribution for a
+  * full listing of individual contributors.
+  *
+  * 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.jboss.forge.common.exceptions;
+
+import java.lang.reflect.Method;
+
+public class IllegalOperationException extends Exception {
+
+	public IllegalOperationException(Method m) {
+		super(m.getClass().getName() + " " + m.getName());
+	}
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1393406067185711331L;
+
+}

Modified: labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/ProjectsDescriptor.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/ProjectsDescriptor.java	2007-03-02 12:19:26 UTC (rev 9907)
+++ labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/ProjectsDescriptor.java	2007-03-02 21:14:40 UTC (rev 9908)
@@ -47,6 +47,7 @@
 import org.jboss.forge.common.projects.permissions.PermissionsChecker;
 import org.jboss.forge.common.projects.project.Project;
 import org.jboss.forge.common.projects.project.rw.ProjectRW;
+import org.jboss.forge.common.projects.proxies.ReadOnlyProxy;
 import org.jboss.forge.common.projects.configuration.Configuration;
 import org.jboss.logging.Logger;
 import org.jboss.portal.core.servlet.jsp.taglib.context.DelegateContext;
@@ -60,6 +61,7 @@
  * 
  * @author adamw
  * @author <a href="ryszard.kozmik at jboss.com">Ryszard Kozmik</a>
+ * @author Pawel Wrzeszcz (pawel . wrzeszcz [at] jboss . com)
  */
 public class ProjectsDescriptor extends AbstractDescriptor {
     /**
@@ -88,9 +90,15 @@
     /**
      * Project id --> Corresponding NEW project descriptor object
      */
-    private Map<String, ProjectRW> newProjectsRW;
+    private Map<String, Project> newProjects;
     
     /**
+     * Copy of map above. We put separately parsed objects here
+     * to use them in RW mode.
+     */
+    private Map<String, Project> newProjectsRW;
+    
+    /**
      * Configuration from projects.xml descriptor.
      */
     private Configuration configuration;
@@ -136,7 +144,8 @@
     public ProjectsDescriptor(XmlInputFactory isf, String portalName) {
         this.portalName = portalName;
         projects = new LinkedHashMap<String, ProjectDescriptor>();
-        newProjectsRW = new LinkedHashMap<String,ProjectRW>();
+        newProjects = new LinkedHashMap<String,Project>();
+        newProjectsRW = new LinkedHashMap<String,Project>();
         projectWithErrorsDescriptors = new HashSet<String>();
 
         projectsContexts = Collections
@@ -164,7 +173,7 @@
         }
 
         try {
-            LabsServices.getProjectPagesService().updatePages(getNewProjectsRW().values());
+            LabsServices.getProjectPagesService().updatePages(getNewProjects().values());//TODO!!!
         } catch (ServiceRetrievalException e) {
             log.error("Error getting labs project pages service.", e);
         }
@@ -298,7 +307,6 @@
         Node n;
         NodeList nodes = root.getChildNodes();
 
-        JAXBContext projectJC=null;
         JAXBContext projectRWJC=null;
         JAXBContext projectsJC=null;
         
@@ -352,9 +360,19 @@
            if (projectRWJC!=null) {
                try {
                    Unmarshaller un = projectRWJC.createUnmarshaller();
-                   ProjectRW newProject = (ProjectRW)un.unmarshal(
+                   
+                   ProjectRW newProjectObj = (ProjectRW)un.unmarshal(
                        isf.getInputSource(projectId+"/" + ProjectsHelper.PROJECT_DESC));
-                   newProjectsRW.put(projectId,newProject);
+                   
+                   Project newProject = newProjectObj; 
+                	   			//(Project) ReadOnlyProxy.newInstance(newProjectObj);
+                   
+                   newProjects.put(projectId, newProject);
+                   
+                   ProjectRW newProjectRW = (ProjectRW)un.unmarshal(
+                           isf.getInputSource(projectId+"/" + ProjectsHelper.PROJECT_DESC));
+                   newProjectsRW.put(projectId, newProjectRW);
+                   
                    log.info("Project "+projectId+" created.");
                } catch (Exception e) {
                    log.warn("I could not create Project "+projectId+" (RW mode).",e);
@@ -814,9 +832,21 @@
         return ret;		
 	}
         
-    public Map<String,ProjectRW> getNewProjectsRW() {
-    		return newProjectsRW;
+	/**
+	 * Be aware that Project objects returned are NOT thread safe.
+	 * To obtain Project objects use ProjectsService(RW) instead.
+	 */
+    public Map<String, ? extends Project> getNewProjects() {
+    		return newProjects;
     }
+
+	/**
+	 * Be aware that Project objects returned are NOT thread safe.
+	 * To obtain Project objects use ProjectsService(RW) instead.
+	 */
+    public Map<String, ? extends Project> getNewProjectsRW() {
+    		return newProjects;
+    }
     
     public Configuration getConfiguration () {
         return this.configuration;

Added: labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/proxies/ReadOnlyProxy.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/proxies/ReadOnlyProxy.java	                        (rev 0)
+++ labs/jbosslabs/trunk/portal-extensions/forge-common/src/java/org/jboss/forge/common/projects/proxies/ReadOnlyProxy.java	2007-03-02 21:14:40 UTC (rev 9908)
@@ -0,0 +1,130 @@
+ /*
+  * JBoss, Home of Professional Open Source
+  * Copyright 2005, JBoss Inc., and individual contributors as indicated
+  * by the @authors tag. See the copyright.txt in the distribution for a
+  * full listing of individual contributors.
+  *
+  * 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.jboss.forge.common.projects.proxies;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.jboss.forge.common.exceptions.IllegalOperationException;
+import org.jboss.forge.common.projects.project.Project;
+
+/**
+ * @author Pawel Wrzeszcz (pawel . wrzeszcz [at] jboss . com)
+ */
+
+public class ReadOnlyProxy implements InvocationHandler {
+
+	private Object obj;
+	private Map<String,Object> methodValues = new HashMap<String, Object>();
+	
+	
+    public static Object newInstance(Object obj) {
+    
+    		System.out.println("NEW INSTANCE " + obj.getClass().getName());
+    	
+    		return java.lang.reflect.Proxy.newProxyInstance(
+    										obj.getClass().getClassLoader(),
+    										obj.getClass().getInterfaces(),
+    										new ReadOnlyProxy(obj));
+    }
+
+    private ReadOnlyProxy(Object obj) {
+    		
+    		this.obj = obj;
+    }
+
+    public Object invoke(Object proxy, Method m, Object[] args)
+    		throws Throwable {
+    
+    		System.out.println("INVOKE " + m.getDeclaringClass().getName() + " " + m.getName());
+    		
+    		return invoke(m, args);
+    		
+    		/*
+    		if (obj instanceof Project) {
+    			System.out.println("PROJECT: " + ((Project) obj).getId());
+    		}
+    		
+    		String methodName = m.getName();
+ 
+    		// Check "cache" (only getter results are stored there)	
+    		if (methodValues.containsKey(methodName)) {
+    		
+    			System.out.println("RET " + methodValues.get(methodName));
+    			return methodValues.get(methodName);
+    		}
+    		
+    		// Kill setters
+    		if (methodName.startsWith("set")) {
+    			throw new IllegalOperationException(m);
+    		}
+    		
+    		// Obtain result
+    		Object result = invoke(m, args);
+    		
+    		// For getters, store the result in "cache"
+    		if (methodName.startsWith("get") || methodName.startsWith("is")) {
+
+    			if ((result != null) && !m.getReturnType().isPrimitive() && 
+    					!m.getReturnType().getPackage().getName().startsWith("java.lang")) {
+    				
+    				System.out.println("WRAPPING...");
+    				
+    				result = ReadOnlyProxy.newInstance(result);
+    			}
+    			
+        		// TODO Collections handling
+    			System.out.println("CACHED");
+    			methodValues.put(methodName, result);
+    		}
+    		
+    		System.out.println("RET " + result);
+    		
+        return result;
+        */
+    }
+
+	private Object invoke(Method m, Object[] args) throws Throwable {
+		
+		Object result;
+	    
+		try {
+	        	 
+			result = m.invoke(obj, args);
+	        	 	
+	    } catch (InvocationTargetException e) {
+	        	 
+	     	 throw e.getTargetException();
+	     	 
+	    } catch (Exception e) {
+	        	 
+	    	 	throw new RuntimeException("Unexpected invocation exception: " + e.getMessage());
+	    } 
+	         
+	    return result;
+	}
+	
+}

Modified: labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projects/ProjectsServiceImpl.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projects/ProjectsServiceImpl.java	2007-03-02 12:19:26 UTC (rev 9907)
+++ labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projects/ProjectsServiceImpl.java	2007-03-02 21:14:40 UTC (rev 9908)
@@ -88,13 +88,13 @@
     
     public Collection<? extends Project> getProjects() {
         Projects projectsClass = ProjectsHelper.getProjects(Constants.LABS_PORTAL);
-        Map<String,? extends Project> projects = projectsClass.getProjectsDescriptor().getNewProjectsRW();
+        Map<String,? extends Project> projects = projectsClass.getProjectsDescriptor().getNewProjects();
         return projects.values();
     }
     
     public Project getProjectByName(String projectId) {
         Projects projectsClass = ProjectsHelper.getProjects(Constants.LABS_PORTAL);
-        Map<String,? extends Project> projects = projectsClass.getProjectsDescriptor().getNewProjectsRW();
+        Map<String,? extends Project> projects = projectsClass.getProjectsDescriptor().getNewProjects();
         return projects.get(projectId);
     }
     

Modified: labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projects/ProjectsServiceRWImpl.java
===================================================================
--- labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projects/ProjectsServiceRWImpl.java	2007-03-02 12:19:26 UTC (rev 9907)
+++ labs/jbosslabs/trunk/portal-extensions/forge-ejb3/src/java/org/jboss/forge/ejb3/projects/ProjectsServiceRWImpl.java	2007-03-02 21:14:40 UTC (rev 9908)
@@ -85,8 +85,9 @@
     
     public ProjectRW getProjectByNameRW(String projectId) {
     	 Projects projectsClass = ProjectsHelper.getProjects(Constants.LABS_PORTAL);
-         Map<String,ProjectRW> projects = projectsClass.getProjectsDescriptor().getNewProjectsRW();
-         return projects.get(projectId);
+         Map<String,? extends Project> projects = projectsClass.getProjectsDescriptor().getNewProjects();
+         //return projects.get(projectId);
+         return null;
     }
     
     public PollsRW getProjectPollsRW(String projectId) {




More information about the jboss-svn-commits mailing list