[jbosstools-commits] JBoss Tools SVN: r7131 - in trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam: internal/core and 1 other directories.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Wed Mar 26 14:39:31 EDT 2008


Author: scabanovich
Date: 2008-03-26 14:39:31 -0400 (Wed, 26 Mar 2008)
New Revision: 7131

Added:
   trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamMessages.java
   trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamMessages.java
Modified:
   trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/SeamCoreBuilder.java
   trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamProject.java
   trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXMLConstants.java
   trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/ClassScanner.java
   trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/TypeScanner.java
Log:
JBIDE-1258

Added: trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamMessages.java
===================================================================
--- trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamMessages.java	                        (rev 0)
+++ trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamMessages.java	2008-03-26 18:39:31 UTC (rev 7131)
@@ -0,0 +1,32 @@
+ /*******************************************************************************
+  * Copyright (c) 2007 Red Hat, Inc.
+  * Distributed under license by Red Hat, Inc. All rights reserved.
+  * This program is made available under the terms of the
+  * Eclipse Public License v1.0 which accompanies this distribution,
+  * and is available at http://www.eclipse.org/legal/epl-v10.html
+  *
+  * Contributor:
+  *     Red Hat, Inc. - initial API and implementation
+  ******************************************************************************/
+package org.jboss.tools.seam.core;
+
+import java.util.Collection;
+
+/**
+ * @author Viacheslav Kabanovich
+ */
+public interface ISeamMessages extends ISeamAnnotatedFactory {
+	
+	/**
+	 * 
+	 * @return collection of keys in resource bundles 
+	 */
+	public Collection<String> getPropertyNames();
+
+	/**
+	 * 
+	 * @return collection of properties declared in resource bundles
+	 */
+	public Collection<ISeamProperty> getProperties();
+
+}

Modified: trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/SeamCoreBuilder.java
===================================================================
--- trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/SeamCoreBuilder.java	2008-03-26 16:31:16 UTC (rev 7130)
+++ trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/SeamCoreBuilder.java	2008-03-26 18:39:31 UTC (rev 7131)
@@ -12,6 +12,7 @@
 
 import java.io.IOException;
 import java.util.Map;
+import java.util.Set;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
@@ -22,6 +23,7 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.osgi.util.NLS;
 import org.jboss.tools.common.model.util.TypeInfoCollector;
+import org.jboss.tools.seam.internal.core.SeamMessages;
 import org.jboss.tools.seam.internal.core.SeamProject;
 import org.jboss.tools.seam.internal.core.SeamResourceVisitor;
 import org.jboss.tools.seam.internal.core.scanner.IFileScanner;
@@ -116,10 +118,13 @@
 			} catch (IOException e) {
 				SeamCorePlugin.getPluginLog().logError(NLS.bind(SeamCoreMessages.SeamCoreBuilder_1,sp.getProject().getName()), e); //$NON-NLS-1$
 			}
+			
+			sp.postBuild();
 		
 		} finally {
 			sp.fireChanges();
-		}
+		}
+		
 		return null;
 	}
 

Added: trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamMessages.java
===================================================================
--- trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamMessages.java	                        (rev 0)
+++ trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamMessages.java	2008-03-26 18:39:31 UTC (rev 7131)
@@ -0,0 +1,207 @@
+ /*******************************************************************************
+  * Copyright (c) 2007 Red Hat, Inc.
+  * Distributed under license by Red Hat, Inc. All rights reserved.
+  * This program is made available under the terms of the
+  * Eclipse Public License v1.0 which accompanies this distribution,
+  * and is available at http://www.eclipse.org/legal/epl-v10.html
+  *
+  * Contributor:
+  *     Red Hat, Inc. - initial API and implementation
+  ******************************************************************************/
+package org.jboss.tools.seam.internal.core;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.jboss.tools.common.model.util.EclipseResourceUtil;
+import org.jboss.tools.seam.core.ISeamComponent;
+import org.jboss.tools.seam.core.ISeamElement;
+import org.jboss.tools.seam.core.ISeamMessages;
+import org.jboss.tools.seam.core.ISeamProject;
+import org.jboss.tools.seam.core.ISeamProperty;
+import org.jboss.tools.seam.core.ISeamXmlComponentDeclaration;
+import org.jboss.tools.seam.core.SeamCorePlugin;
+import org.jboss.tools.seam.core.event.Change;
+import org.jboss.tools.seam.core.event.ISeamValue;
+import org.jboss.tools.seam.core.event.ISeamValueList;
+import org.jboss.tools.seam.core.event.ISeamValueString;
+import org.w3c.dom.Element;
+
+/**
+ * @author Viacheslav Kabanovich
+ */
+public class SeamMessages extends SeamAnnotatedFactory implements ISeamMessages {
+	static Map<String, IResource> EMPTY = new HashMap<String, IResource>();
+	Map<String, IResource> resources = EMPTY;
+	Map<String, Long> timestamps = null;
+	Set<String> keys = null;
+	
+	public SeamMessages() {}
+	
+	public void revalidate() {
+		Map<String, IResource> resources2 = getResources();
+		if(changed(resources2)) {
+			timestamps = new HashMap<String, Long>();
+			for (String n : resources2.keySet()) {
+				IResource r = resources2.get(n);
+				timestamps.put(n, r.getLocalTimeStamp());
+			}
+			resources = resources2;
+			keys = null;
+		}
+	}
+	
+	private boolean changed(Map<String, IResource> resources2) {
+		if(resources == resources2) return false;
+		if(resources2.size() != resources.size()) return true;
+		if(timestamps == null) return true;
+		for (String s: resources2.keySet()) {
+			IResource r2 = resources2.get(s);
+			IResource r1 = resources.get(s);
+			if(r1 == null || !r2.equals(r1)) return true;
+			long l1 = r1.getLocalTimeStamp();
+			long l2 = timestamps.get(s);
+			if(l1 != l2) return true;
+		}
+		
+		return false;		
+	}	
+	
+	private Map<String, IResource> getResources() {
+		ISeamProject p = getSeamProject();
+		if(p == null) return EMPTY;
+		IResource[] srcs = EclipseResourceUtil.getJavaSourceRoots(p.getProject());
+		ISeamComponent c = p.getComponent("org.jboss.seam.core.resourceLoader");
+		if(c == null) return EMPTY;
+		List<String> names = new ArrayList<String>();
+		Set<ISeamXmlComponentDeclaration> ds = c.getXmlDeclarations();
+		for (ISeamXmlComponentDeclaration d: ds) {
+			ISeamProperty property = d.getProperty("bundleNames");
+			if(property == null) continue;
+			ISeamValue v = property.getValue();
+			if(v == null) continue;
+			if(v instanceof ISeamValueList) {
+				List<ISeamValueString> vs = ((ISeamValueList)v).getValues();
+				for (ISeamValueString s: vs) {
+					if(s.getValue() == null) continue;
+					String b = s.getValue().getValue();
+					names.add(b);
+				}
+			}
+		}
+		if(ds.size() == 0) {
+			names.add("messages");
+		}
+		return getResources(names, srcs);
+	}
+
+	public Collection<ISeamProperty> getProperties() {
+		throw new RuntimeException("Not implemented");
+	}
+
+	public Collection<String> getPropertyNames() {
+		if(keys == null) {
+			keys = new HashSet<String>();
+			for (IResource r: resources.values()) {
+				IPath p = r.getLocation();
+				if(p == null) continue;
+				File f = p.toFile();
+				Properties properties = new Properties();
+				try {
+					properties.load(new FileInputStream(f));
+				} catch (IOException e) {
+					//ignore 
+					//TODO keep error for validation
+				}
+				Set<?> s = properties.keySet();
+				for (Object o : s) keys.add((String)o);
+			}
+		}
+		return keys;
+	}
+	
+	private Map<String, IResource> getResources(List<String> names, IResource[] srcs) {
+		Map<String, IResource> rs = new HashMap<String, IResource>();
+		for (String name: names) {
+			String n = name.replace('.', '/');
+			int k = n.lastIndexOf('/');
+			String p = k < 0 ? null : n.substring(0, k);
+			if(k >= 0) n = n.substring(k + 1);
+			IResource result = null;
+			for (int j = 0; j < srcs.length && result == null; j++) {
+				result = find(p, n, srcs[j]);
+			}
+			if(result != null) {
+				rs.put(name, result);
+			}
+		}
+		return rs;
+	}
+	
+	private IResource find(String pack, String name, IResource src) {
+		if(!(src instanceof IContainer)) return null;
+		IContainer c = (IContainer)src;
+		if(pack != null) {
+			c = c.getFolder(new Path(pack));
+		}
+		if(c == null || !c.exists()) return null;
+		String suffix = ".properties";
+		String name_ = name + "_";
+		String name_p = name + suffix;
+		IResource result = null;
+		try {
+			IResource[] rs = c.members();
+			for (int i = 0; i < rs.length; i++) {
+				String n = rs[i].getName();
+				if(name_p.equals(n)) return rs[i];
+				if(result == null && n.startsWith(name_) && n.endsWith(suffix)) {
+					result = rs[i];
+				}
+			}
+		} catch (CoreException e) {
+			SeamCorePlugin.getPluginLog().logError(e);
+		}
+		
+		return result;
+	}
+
+	public SeamMessages clone() throws CloneNotSupportedException {
+		SeamMessages c = (SeamMessages)super.clone();
+		return c;
+	}
+
+	public void loadXML(Element element, Properties context) {
+		super.loadXML(element, context);
+
+	}
+
+	public List<Change> merge(ISeamElement s) {
+		List<Change> changes = super.merge(s);
+		keys = null;
+		return changes;
+	}
+
+	public String getXMLClass() {
+		return SeamXMLConstants.CLS_MESSAGES;
+	}
+
+	public Element toXML(Element parent, Properties context) {
+		Element e = super.toXML(parent, context);
+		return e;
+	}
+	
+}

Modified: trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamProject.java
===================================================================
--- trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamProject.java	2008-03-26 16:31:16 UTC (rev 7130)
+++ trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamProject.java	2008-03-26 18:39:31 UTC (rev 7131)
@@ -623,6 +623,8 @@
 						d = new SeamXmlFactory();
 					} else if(SeamXMLConstants.CLS_JAVA.equals(cls)) {
 						d = new SeamAnnotatedFactory();
+					} else if(SeamXMLConstants.CLS_MESSAGES.equals(cls)) {
+						d = new SeamMessages();
 					}
 					if(d == null) continue;
 					d.loadXML(cs[j], context);
@@ -647,6 +649,7 @@
 				statistics.add(new Long(t2 - t1));
 			}
 		}
+		postBuild();
 	}
 	
 	/*
@@ -857,6 +860,10 @@
 		for (int i = 0; i < factories.length; i++) {
 			AbstractContextVariable loaded = (AbstractContextVariable)factories[i];
 			AbstractContextVariable current = (AbstractContextVariable)currentFactories.remove(loaded.getId());
+			if(current != null && current.getClass() != loaded.getClass()) {
+				this.factories.removeFactory((ISeamFactory)current);
+				current = null;
+			}
 			if(current != null) {
 				List<Change> changes = current.merge(loaded);
 				fireChanges(changes);
@@ -1539,6 +1546,17 @@
 		return map;
 	}
 	
+	public void postBuild() {
+		Set<ISeamFactory> fff = getFactoriesByName("org.jboss.seam.international.messages");
+		if(fff.size() > 0) {
+			ISeamFactory m = fff.iterator().next();
+			if(m instanceof SeamMessages) {
+				SeamMessages sm = (SeamMessages)m;
+				sm.revalidate();
+			}
+		}
+	}
+	
 	/**
 	 * 
 	 * @param builderID

Modified: trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXMLConstants.java
===================================================================
--- trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXMLConstants.java	2008-03-26 16:31:16 UTC (rev 7130)
+++ trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXMLConstants.java	2008-03-26 18:39:31 UTC (rev 7131)
@@ -23,6 +23,7 @@
 	
 	public String CLS_PROPERTIES = "properties";
 	public String CLS_JAVA = "java";
+	public String CLS_MESSAGES = "messages";
 	
 	public String CLS_MAP = "map";
 	public String CLS_LIST = "list";

Modified: trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/ClassScanner.java
===================================================================
--- trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/ClassScanner.java	2008-03-26 16:31:16 UTC (rev 7130)
+++ trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/ClassScanner.java	2008-03-26 18:39:31 UTC (rev 7131)
@@ -30,6 +30,7 @@
 import org.jboss.tools.seam.internal.core.BijectedAttribute;
 import org.jboss.tools.seam.internal.core.SeamAnnotatedFactory;
 import org.jboss.tools.seam.internal.core.SeamJavaComponentDeclaration;
+import org.jboss.tools.seam.internal.core.SeamMessages;
 import org.jboss.tools.seam.internal.core.scanner.LoadedDeclarations;
 import org.jboss.tools.seam.internal.core.scanner.Util;
 import org.jboss.tools.seam.internal.core.scanner.java.SeamAnnotations;
@@ -184,7 +185,10 @@
 		if(name == null || name.length() == 0) {
 			name = m.getName();
 		}
-		SeamAnnotatedFactory factory = new SeamAnnotatedFactory();
+		SeamAnnotatedFactory factory =
+			("org.jboss.seam.international.messages".equals(name) && m.getName().equals("getMessages")) 
+			? new SeamMessages()
+			: new SeamAnnotatedFactory();
 		factory.setParentDeclaration(component);
 		ds.getFactories().add(factory);
 		IMethod im = findIMethod(component, m);

Modified: trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/TypeScanner.java
===================================================================
--- trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/TypeScanner.java	2008-03-26 16:31:16 UTC (rev 7130)
+++ trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/TypeScanner.java	2008-03-26 18:39:31 UTC (rev 7131)
@@ -42,6 +42,7 @@
 import org.jboss.tools.seam.internal.core.SeamAnnotatedFactory;
 import org.jboss.tools.seam.internal.core.SeamComponentMethod;
 import org.jboss.tools.seam.internal.core.SeamJavaComponentDeclaration;
+import org.jboss.tools.seam.internal.core.SeamMessages;
 import org.jboss.tools.seam.internal.core.scanner.LoadedDeclarations;
 import org.jboss.tools.seam.internal.core.scanner.Util;
 import org.jboss.tools.seam.internal.core.scanner.java.SeamAnnotations;
@@ -205,7 +206,10 @@
 		if(name == null || name.length() == 0) {
 			name = new String(m.getSelector());
 		}
-		SeamAnnotatedFactory factory = new SeamAnnotatedFactory();
+		SeamAnnotatedFactory factory = 
+			("org.jboss.seam.international.messages".equals(name) && new String(m.getSelector()).equals("getMessages")) 
+			? new SeamMessages()
+			: new SeamAnnotatedFactory();
 		factory.setParentDeclaration(component);
 		factory.setSourcePath(component.getSourcePath());
 		ds.getFactories().add(factory);




More information about the jbosstools-commits mailing list