You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2007/01/16 08:23:24 UTC
svn commit: r496612 - in
/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb:
alt/config/ assembler/classic/
Author: dblevins
Date: Mon Jan 15 23:23:23 2007
New Revision: 496612
URL: http://svn.apache.org/viewvc?view=rev&rev=496612
Log:
Breaking up EntityContainerInfo into more types, consolidating code for default providers
Added:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BmpEntityContainerInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpEntityContainerInfo.java (contents, props changed)
- copied, changed from r496488, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityContainerInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ProxyFactoryInfo.java (contents, props changed)
- copied, changed from r496488, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/IntraVmServerInfo.java
Removed:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityContainerInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/IntraVmServerInfo.java
Modified:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ConfigurationFactory.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ServiceUtils.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainerInfo.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/FacilitiesInfo.java
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ConfigurationFactory.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ConfigurationFactory.java?view=diff&rev=496612&r1=496611&r2=496612
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ConfigurationFactory.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ConfigurationFactory.java Mon Jan 15 23:23:23 2007
@@ -28,21 +28,22 @@
import org.apache.openejb.alt.config.sys.ServiceProvider;
import org.apache.openejb.alt.config.sys.TransactionManager;
import org.apache.openejb.assembler.classic.AppInfo;
+import org.apache.openejb.assembler.classic.BmpEntityContainerInfo;
import org.apache.openejb.assembler.classic.ClientInfo;
+import org.apache.openejb.assembler.classic.CmpEntityContainerInfo;
import org.apache.openejb.assembler.classic.ConnectionManagerInfo;
import org.apache.openejb.assembler.classic.ConnectorInfo;
import org.apache.openejb.assembler.classic.ContainerInfo;
import org.apache.openejb.assembler.classic.ContainerSystemInfo;
import org.apache.openejb.assembler.classic.EjbJarInfo;
import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
-import org.apache.openejb.assembler.classic.EntityContainerInfo;
import org.apache.openejb.assembler.classic.FacilitiesInfo;
-import org.apache.openejb.assembler.classic.IntraVmServerInfo;
import org.apache.openejb.assembler.classic.JndiContextInfo;
import org.apache.openejb.assembler.classic.ManagedConnectionFactoryInfo;
import org.apache.openejb.assembler.classic.MdbContainerInfo;
import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
import org.apache.openejb.assembler.classic.OpenEjbConfigurationFactory;
+import org.apache.openejb.assembler.classic.ProxyFactoryInfo;
import org.apache.openejb.assembler.classic.SecurityServiceInfo;
import org.apache.openejb.assembler.classic.ServiceInfo;
import org.apache.openejb.assembler.classic.StatefulSessionContainerInfo;
@@ -119,7 +120,6 @@
List<String> jarList = DeploymentsResolver.resolveAppLocations(openejb.getDeployments());
-
List<AppInfo> appInfos = new ArrayList<AppInfo>();
for (String pathname : jarList) {
@@ -258,7 +258,7 @@
if (provider == null || provider.length < 1) return;
for (int i = 0; i < provider.length; i++) {
- JndiContextInfo info = createService(provider[i], new JndiContextInfo(), "Default Jndi Provider", JndiProvider.class);
+ JndiContextInfo info = configureService(provider[i], JndiContextInfo.class, "Default Jndi Provider", JndiProvider.class);
facilities.remoteJndiContexts.add(info);
}
@@ -266,12 +266,12 @@
private void initSecutityService(Openejb openejb, FacilitiesInfo facilities) throws OpenEJBException {
- facilities.securityService = createService(openejb.getSecurityService(), new SecurityServiceInfo(), DEFAULT_SECURITY_SERVICE, SecurityService.class);
+ facilities.securityService = configureService(openejb.getSecurityService(), SecurityServiceInfo.class, DEFAULT_SECURITY_SERVICE, SecurityService.class);
}
private void initTransactionService(Openejb openejb, FacilitiesInfo facilities) throws OpenEJBException {
- facilities.transactionService = createService(openejb.getTransactionService(), new TransactionServiceInfo(), DEFAULT_TRANSACTION_MANAGER, TransactionManager.class);
+ facilities.transactionService = configureService(openejb.getTransactionService(), TransactionServiceInfo.class, DEFAULT_TRANSACTION_MANAGER, TransactionManager.class);
}
@@ -284,7 +284,7 @@
for (int i = 0; i < conn.length; i++) {
- ManagedConnectionFactoryInfo info = createService(conn[i], new ManagedConnectionFactoryInfo(), DEFAULT_JDBC_DATABASE, Connector.class);
+ ManagedConnectionFactoryInfo info = configureService(conn[i], ManagedConnectionFactoryInfo.class, DEFAULT_JDBC_DATABASE, Connector.class);
ConnectorInfo connectorInfo = new ConnectorInfo();
connectorInfo.connectorId = info.id;
@@ -299,7 +299,7 @@
private void initConnectionManagers(Openejb openejb, FacilitiesInfo facilities)
throws OpenEJBException {
- ConnectionManagerInfo service = createService(openejb.getConnectionManager(), new ConnectionManagerInfo(), DEFAULT_LOCAL_TX_CON_MANAGER, ConnectionManager.class);
+ ConnectionManagerInfo service = configureService(openejb.getConnectionManager(), ConnectionManagerInfo.class, DEFAULT_LOCAL_TX_CON_MANAGER, ConnectionManager.class);
facilities.connectionManagers.add(service);
}
@@ -318,24 +318,95 @@
throw new RuntimeException("Unable to determine the version of your VM. No ProxyFactory Can be installed");
}
- facilities.intraVmServer = createService(openejb.getProxyFactory(), new IntraVmServerInfo(), defaultId, ProxyFactory.class);
+ facilities.intraVmServer = configureService(openejb.getProxyFactory(), ProxyFactoryInfo.class, defaultId, ProxyFactory.class);
+
+ }
+
+ public static class DefaultService {
+ private final Class<? extends Service> type;
+ private final String id;
+
+ public DefaultService(String id, Class<? extends Service> type) {
+ this.id = id;
+ this.type = type;
+ }
+ }
+
+ private static final Map<Class<? extends ServiceInfo>, DefaultService> defaultProviders = new HashMap();
+
+ static {
+ defaultProviders.put(MdbContainerInfo.class, new DefaultService(DEFAULT_MDB_CONTAINER, Container.class));
+ defaultProviders.put(StatefulSessionContainerInfo.class, new DefaultService(DEFAULT_STATEFUL_CONTAINER, Container.class));
+ defaultProviders.put(StatelessSessionContainerInfo.class, new DefaultService(DEFAULT_STATELESS_CONTAINER, Container.class));
+ defaultProviders.put(CmpEntityContainerInfo.class, new DefaultService(DEFAULT_CMP_CONTAINER, Container.class));
+ defaultProviders.put(BmpEntityContainerInfo.class, new DefaultService(DEFAULT_BMP_CONTAINER, Container.class));
+ defaultProviders.put(SecurityServiceInfo.class, new DefaultService(DEFAULT_SECURITY_SERVICE, SecurityService.class));
+ defaultProviders.put(TransactionServiceInfo.class, new DefaultService(DEFAULT_TRANSACTION_MANAGER, TransactionManager.class));
+ defaultProviders.put(ConnectionManagerInfo.class, new DefaultService(DEFAULT_LOCAL_TX_CON_MANAGER, ConnectionManager.class));
+ defaultProviders.put(ProxyFactoryInfo.class, new DefaultService(DEFAULT_JDK_13_PROXYFACTORY, ProxyFactory.class));
+
+ // Should be connector info
+ defaultProviders.put(ManagedConnectionFactoryInfo.class, new DefaultService(DEFAULT_JDBC_DATABASE, Connector.class));
+ }
+
+ public <T extends ServiceInfo> T configureDefault(Class<? extends T> type) throws OpenEJBException {
+ DefaultService defaultService = defaultProviders.get(type);
+
+ Service service = null;
+ try {
+ service = (Service) defaultService.type.newInstance();
+ service.setProvider(defaultService.id);
+ service.setId(defaultService.id);
+ } catch (Exception e) {
+ throw new OpenEJBException("Cannot instantiate class " + defaultService.type.getName(), e);
+ }
+
+ T info = null;
+ try {
+ info = type.newInstance();
+ } catch (Exception e) {
+ throw new OpenEJBException("Cannot instantiate class " + type.getName(), e);
+ }
+
+ return configureService(service, info, defaultService.type.getSimpleName());
+ }
+
+ public <T extends ServiceInfo> T configureService(Service service, Class<? extends T> info, String defaultId, Class type) throws OpenEJBException {
+ if (service == null) {
+ return configureDefault(info);
+ } else if (service.getProvider() == null) {
+
+ try {
+ ServiceUtils.getServiceProvider(service.getId());
+ service.setProvider(service.getId());
+ } catch (Exception e) {
+
+ service.setProvider(defaultId);
+ }
+ }
+ try {
+ return configureService(service, info.newInstance(), type.getSimpleName());
+ } catch (Exception e) {
+ throw new OpenEJBException("Cannot instantiate class " + e);
+ }
}
- public <T extends ServiceInfo> T createService(Service service, T info, String defaultId, Class type) throws OpenEJBException {
- service = (Service) initService(service, defaultId, type);
- ServiceProvider provider = ServiceUtils.getServiceProvider(service);
+ private <T extends ServiceInfo>T configureService(Service service, T info, String serviceType) throws OpenEJBException {
+ ServiceProvider provider = ServiceUtils.getServiceProvider(service.getProvider());
+ Properties properties = ServiceUtils.assemblePropertiesFor(serviceType, service.getId(), service.getContent(), configLocation, provider);
- String serviceType = type.getSimpleName();
- checkType(provider, service, serviceType);
+ if (!provider.getProviderType().equals(serviceType)) {
+ handleException("conf.4902", service, serviceType);
+ }
- info.serviceType = type.getSimpleName();
+ info.serviceType = provider.getProviderType();
info.codebase = service.getJar();
info.description = provider.getDescription();
info.displayName = provider.getDisplayName();
info.className = provider.getClassName();
info.id = service.getId();
- info.properties = ServiceUtils.assemblePropertiesFor(serviceType, service.getId(), service.getContent(), configLocation, provider);
+ info.properties = properties;
info.constructorArgs.addAll(parseConstructorArgs(provider));
String serviceId = serviceType + ":" + info.id;
@@ -357,27 +428,26 @@
String defaultId;
if (declaration.getCtype().equals("STATELESS")) {
defaultId = DEFAULT_STATELESS_CONTAINER;
- info = new StatelessSessionContainerInfo();
+ info = configureService(declaration, StatelessSessionContainerInfo.class, defaultId, Container.class);
} else if (declaration.getCtype().equals("STATEFUL")) {
defaultId = DEFAULT_STATEFUL_CONTAINER;
- info = new StatefulSessionContainerInfo();
+ info = configureService(declaration, StatefulSessionContainerInfo.class, defaultId, Container.class);
} else if (declaration.getCtype().equals("BMP_ENTITY")) {
defaultId = DEFAULT_BMP_CONTAINER;
- info = new EntityContainerInfo();
+ info = configureService(declaration, BmpEntityContainerInfo.class, defaultId, Container.class);
} else if (declaration.getCtype().equals("CMP_ENTITY")) {
defaultId = DEFAULT_CMP_CONTAINER;
- info = new EntityContainerInfo();
+ info = configureService(declaration, CmpEntityContainerInfo.class, defaultId, Container.class);
} else if (declaration.getCtype().equals("CMP2_ENTITY")) {
defaultId = DEFAULT_CMP2_CONTAINER;
- info = new EntityContainerInfo();
+ info = configureService(declaration, CmpEntityContainerInfo.class, defaultId, Container.class);
} else if (declaration.getCtype().equals("MESSAGE")) {
defaultId = DEFAULT_MDB_CONTAINER;
- info = new MdbContainerInfo();
+ info = configureService(declaration, MdbContainerInfo.class, defaultId, Container.class);
} else {
throw new OpenEJBException("Unrecognized contianer type " + declaration.getCtype());
}
- createService(declaration, info, defaultId, Container.class);
this.containers.add(info);
containerTable.put(info.id, info);
@@ -411,37 +481,6 @@
throw new OpenEJBException(msg);
}
bean.containerId = d.getContainerId();
- }
- }
-
- public Service initService(Service service, String defaultName, Class type) throws OpenEJBException {
-
- if (service == null) {
- try {
- service = (Service) type.newInstance();
- service.setProvider(defaultName);
- service.setId(defaultName);
- } catch (Exception e) {
- throw new OpenEJBException("Cannot instantiate class " + type);
- }
- } else if (service.getProvider() == null) {
-
- try {
- ServiceUtils.getServiceProvider(service.getId());
- service.setProvider(service.getId());
- } catch (Exception e) {
-
- service.setProvider(defaultName);
- }
- }
-
- return service;
- }
-
- private void checkType(ServiceProvider provider, Service service, String type)
- throws OpenEJBException {
- if (!provider.getProviderType().equals(type)) {
- handleException("conf.4902", service, type);
}
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ServiceUtils.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ServiceUtils.java?view=diff&rev=496612&r1=496611&r2=496612
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ServiceUtils.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/alt/config/ServiceUtils.java Mon Jan 15 23:23:23 2007
@@ -38,10 +38,6 @@
public static Messages messages = new Messages("org.apache.openejb.util.resources");
public static Logger logger = Logger.getInstance("OpenEJB", "org.apache.openejb.util.resources");
- public static ServiceProvider getServiceProvider(Service service) throws OpenEJBException {
- return getServiceProvider(service.getProvider());
- }
-
public static ServiceProvider getServiceProvider(String id) throws OpenEJBException {
String providerName = null;
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?view=diff&rev=496612&r1=496611&r2=496612
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Mon Jan 15 23:23:23 2007
@@ -424,7 +424,7 @@
config.containerSystem.containers.add(serviceInfo);
}
- public void createProxyFactory(IntraVmServerInfo serviceInfo) throws OpenEJBException, NamingException {
+ public void createProxyFactory(ProxyFactoryInfo serviceInfo) throws OpenEJBException, NamingException {
ObjectRecipe serviceRecipe = new ObjectRecipe(serviceInfo.className, serviceInfo.factoryMethod, serviceInfo.constructorArgs.toArray(new String[0]), null);
serviceRecipe.setAllProperties(serviceInfo.properties);
Added: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BmpEntityContainerInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BmpEntityContainerInfo.java?view=auto&rev=496612
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BmpEntityContainerInfo.java (added)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/BmpEntityContainerInfo.java Mon Jan 15 23:23:23 2007
@@ -0,0 +1,20 @@
+/**
+ * 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.openejb.assembler.classic;
+
+public class BmpEntityContainerInfo extends ContainerInfo {
+}
Copied: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpEntityContainerInfo.java (from r496488, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityContainerInfo.java)
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpEntityContainerInfo.java?view=diff&rev=496612&p1=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityContainerInfo.java&r1=496488&p2=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpEntityContainerInfo.java&r2=496612
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EntityContainerInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpEntityContainerInfo.java Mon Jan 15 23:23:23 2007
@@ -16,5 +16,5 @@
*/
package org.apache.openejb.assembler.classic;
-public class EntityContainerInfo extends ContainerInfo {
+public class CmpEntityContainerInfo extends ContainerInfo {
}
Propchange: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpEntityContainerInfo.java
------------------------------------------------------------------------------
svn:keywords = Date Rev Author Id Revision HeadURL
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainerInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainerInfo.java?view=diff&rev=496612&r1=496611&r2=496612
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainerInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ContainerInfo.java Mon Jan 15 23:23:23 2007
@@ -16,10 +16,6 @@
*/
package org.apache.openejb.assembler.classic;
-import java.util.Properties;
-import java.util.List;
-import java.util.ArrayList;
-
public abstract class ContainerInfo extends ServiceInfo {
}
Modified: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/FacilitiesInfo.java
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/FacilitiesInfo.java?view=diff&rev=496612&r1=496611&r2=496612
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/FacilitiesInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/FacilitiesInfo.java Mon Jan 15 23:23:23 2007
@@ -21,7 +21,7 @@
public class FacilitiesInfo extends InfoObject {
- public IntraVmServerInfo intraVmServer;
+ public ProxyFactoryInfo intraVmServer;
public final List<JndiContextInfo> remoteJndiContexts = new ArrayList<JndiContextInfo>();
public final List<ConnectorInfo> connectors = new ArrayList<ConnectorInfo>();
public final List<ConnectionManagerInfo> connectionManagers = new ArrayList<ConnectionManagerInfo>();
Copied: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ProxyFactoryInfo.java (from r496488, incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/IntraVmServerInfo.java)
URL: http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ProxyFactoryInfo.java?view=diff&rev=496612&p1=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/IntraVmServerInfo.java&r1=496488&p2=incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ProxyFactoryInfo.java&r2=496612
==============================================================================
--- incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/IntraVmServerInfo.java (original)
+++ incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ProxyFactoryInfo.java Mon Jan 15 23:23:23 2007
@@ -16,6 +16,6 @@
*/
package org.apache.openejb.assembler.classic;
-public class IntraVmServerInfo extends ServiceInfo {
+public class ProxyFactoryInfo extends ServiceInfo {
}
Propchange: incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/ProxyFactoryInfo.java
------------------------------------------------------------------------------
svn:keywords = Date Rev Author Id Revision HeadURL