Author: tv
Date: Tue Apr  7 19:08:26 2015
New Revision: 1671924

URL: http://svn.apache.org/r1671924
Log:
Move to JAXB for parsing and object mapping.

Modified:
    
turbine/fulcrum/trunk/intake/src/java/org/apache/fulcrum/intake/IntakeServiceImpl.java

Modified: 
turbine/fulcrum/trunk/intake/src/java/org/apache/fulcrum/intake/IntakeServiceImpl.java
URL: 
http://svn.apache.org/viewvc/turbine/fulcrum/trunk/intake/src/java/org/apache/fulcrum/intake/IntakeServiceImpl.java?rev=1671924&r1=1671923&r2=1671924&view=diff
==============================================================================
--- 
turbine/fulcrum/trunk/intake/src/java/org/apache/fulcrum/intake/IntakeServiceImpl.java
 (original)
+++ 
turbine/fulcrum/trunk/intake/src/java/org/apache/fulcrum/intake/IntakeServiceImpl.java
 Tue Apr  7 19:08:26 2015
@@ -30,6 +30,7 @@ import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.OutputStream;
 import java.lang.reflect.Method;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -37,6 +38,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import javax.xml.XMLConstants;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.bind.helpers.DefaultValidationEventHandler;
+import javax.xml.validation.SchemaFactory;
+
 import org.apache.avalon.framework.activity.Initializable;
 import org.apache.avalon.framework.configuration.Configurable;
 import org.apache.avalon.framework.configuration.Configuration;
@@ -48,13 +55,13 @@ import org.apache.avalon.framework.logge
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
 import org.apache.avalon.framework.service.Serviceable;
-import org.apache.commons.pool.KeyedObjectPool;
-import org.apache.commons.pool.KeyedPoolableObjectFactory;
-import org.apache.commons.pool.impl.StackKeyedObjectPool;
+import org.apache.commons.pool2.KeyedObjectPool;
+import org.apache.commons.pool2.KeyedPooledObjectFactory;
+import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
+import org.apache.commons.pool2.impl.GenericKeyedObjectPoolConfig;
+import org.apache.fulcrum.intake.model.AppData;
+import org.apache.fulcrum.intake.model.Field;
 import org.apache.fulcrum.intake.model.Group;
-import org.apache.fulcrum.intake.transform.XmlToAppData;
-import org.apache.fulcrum.intake.xmlmodel.AppData;
-import org.apache.fulcrum.intake.xmlmodel.XmlGroup;
 
 /**
  * This service provides access to input processing objects based on an XML
@@ -105,7 +112,7 @@ public class IntakeServiceImpl extends A
      * @param groupName
      *            The name to register the group under
      * @param group
-     *            The XML Group to register in
+     *            The Group to register in
      * @param appData
      *            The app Data object where the group can be found
      * @param checkKey
@@ -113,16 +120,16 @@ public class IntakeServiceImpl extends A
      *
      * @return true if successful, false if not
      */
-    private boolean registerGroup(String groupName, XmlGroup group,
+    private boolean registerGroup(String groupName, Group group,
             AppData appData, boolean checkKey)
     {
-        if (groupNames.keySet().contains(groupName))
+        if (groupNames.containsKey(groupName))
         {
             // This name already exists.
             return false;
         }
 
-        boolean keyExists = groupNameMap.keySet().contains(group.getKey());
+        boolean keyExists = groupNameMap.containsKey(group.getGID());
 
         if (checkKey && keyExists)
         {
@@ -131,18 +138,18 @@ public class IntakeServiceImpl extends A
         }
 
         groupNames.put(groupName, appData);
-
-        groupKeyMap.put(groupName, group.getKey());
+        groupKeyMap.put(groupName, group.getGID());
 
         if (!keyExists)
         {
             // This key does not exist. Add it to the hash.
-            groupNameMap.put(group.getKey(), groupName);
+            groupNameMap.put(group.getGID(), groupName);
         }
 
-        List<String> classNames = group.getMapToObjects();
-        for (String className : classNames)
+        List<Field<?>> fields = group.getFields();
+        for (Field<?> field : fields)
         {
+            String className = field.getMapToObject();
             if (!getterMap.containsKey(className))
             {
                 getterMap.put(className, new HashMap<String, Method>());
@@ -352,6 +359,7 @@ public class IntakeServiceImpl extends A
      * @throws IntakeException
      *             if recycling fails.
      */
+    @Override
     public Group getGroup(String groupName) throws IntakeException
     {
         Group group = null;
@@ -390,6 +398,7 @@ public class IntakeServiceImpl extends A
      * @throws IntakeException
      *             The passed group name does not exist.
      */
+    @Override
     public void releaseGroup(Group instance) throws IntakeException
     {
         if (instance != null)
@@ -425,6 +434,7 @@ public class IntakeServiceImpl extends A
      * @throws IntakeException
      *             The passed group name does not exist.
      */
+    @Override
     public int getSize(String groupName) throws IntakeException
     {
         AppData appData = groupNames.get(groupName);
@@ -445,6 +455,7 @@ public class IntakeServiceImpl extends A
      *
      * @return array of names.
      */
+    @Override
     public String[] getGroupNames()
     {
         return groupNames.keySet().toArray(new String[0]);
@@ -457,6 +468,7 @@ public class IntakeServiceImpl extends A
      *            the name of the group.
      * @return the the key.
      */
+    @Override
     public String getGroupKey(String groupName)
     {
         return groupKeyMap.get(groupName);
@@ -469,6 +481,7 @@ public class IntakeServiceImpl extends A
      *            the key.
      * @return groupName the name of the group.
      */
+    @Override
     public String getGroupName(String groupKey)
     {
         return groupNameMap.get(groupKey);
@@ -485,6 +498,7 @@ public class IntakeServiceImpl extends A
      * @throws ClassNotFoundException
      * @throws IntrospectionException
      */
+    @Override
     public Method getFieldSetter(String className, String propName)
             throws ClassNotFoundException, IntrospectionException
     {
@@ -543,6 +557,7 @@ public class IntakeServiceImpl extends A
      * @throws ClassNotFoundException
      * @throws IntrospectionException
      */
+    @Override
     public Method getFieldGetter(String className, String propName)
             throws ClassNotFoundException, IntrospectionException
     {
@@ -594,6 +609,7 @@ public class IntakeServiceImpl extends A
     /**
      * Avalon component lifecycle method
      */
+    @Override
     public void configure(Configuration conf) throws ConfigurationException
     {
         final Configuration xmlPaths = conf.getChild(XML_PATHS, false);
@@ -630,11 +646,12 @@ public class IntakeServiceImpl extends A
 
     /**
      * Avalon component lifecycle method Initializes the service by loading
-     * default class loaders and customized object factories.
+     * xml rule files and creating the Intake groups.
      *
      * @throws Exception
      *             if initialization fails.
      */
+    @Override
     public void initialize() throws Exception
     {
         Map<AppData, File> appDataElements = null;
@@ -688,17 +705,21 @@ public class IntakeServiceImpl extends A
         else
         {
             // Parse all the given XML files
+            JAXBContext jaxb = JAXBContext.newInstance(AppData.class);
+            Unmarshaller um = jaxb.createUnmarshaller();
+
+            // Debug mapping
+            um.setEventHandler(new DefaultValidationEventHandler());
+
+            URL schemaURL = getClass().getResource("/intake.xsd");
+            SchemaFactory schemaFactory = 
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
+            um.setSchema(schemaFactory.newSchema(schemaURL));
             appDataElements = new HashMap<AppData, File>();
 
             for (File xmlFile : xmlFiles)
             {
-                AppData appData = null;
-
                 getLogger().debug("Now parsing: " + xmlFile);
-
-                XmlToAppData xmlApp = new XmlToAppData();
-                xmlApp.enableLogging(getLogger());
-                appData = xmlApp.parseFile(xmlFile);
+                AppData appData = (AppData)um.unmarshal(xmlFile);
 
                 appDataElements.put(appData, xmlFile);
                 getLogger().debug("Saving appData for " + xmlFile);
@@ -707,26 +728,26 @@ public class IntakeServiceImpl extends A
             saveSerialized(serialDataPath, appDataElements);
         }
 
+        int counter = 0;
         for (AppData appData : appDataElements.keySet())
         {
             int maxPooledGroups = 0;
-            List<XmlGroup> glist = appData.getGroups();
+            List<Group> glist = appData.getGroups();
 
             String groupPrefix = appData.getGroupPrefix();
 
             for (int i = glist.size() - 1; i >= 0; i--)
             {
-                XmlGroup g = glist.get(i);
-                String groupName = g.getName();
+                Group g = glist.get(i);
+                String groupName = g.getIntakeGroupName();
 
-                boolean registerUnqualified = registerGroup(groupName, g,
-                        appData, true);
+                boolean registerUnqualified = registerGroup(groupName, g, 
appData, true);
 
                 if (!registerUnqualified)
                 {
                     getLogger().info(
                             "Ignored redefinition of Group " + groupName
-                                    + " or Key " + g.getKey() + " from "
+                                    + " or Key " + g.getGID() + " from "
                                     + appDataElements.get(appData));
                 }
 
@@ -751,16 +772,25 @@ public class IntakeServiceImpl extends A
                     }
                 }
 
-                maxPooledGroups = Math.max(maxPooledGroups, Integer
-                        .parseInt(g.getPoolCapacity()));
+                // Init fields
+                for (Field<?> f : g.getFields())
+                {
+                    f.initGetterAndSetter();
+                }
 
+                maxPooledGroups = Math.max(maxPooledGroups, 
g.getPoolCapacity());
             }
 
-            KeyedPoolableObjectFactory<String, Group> factory =
+            KeyedPooledObjectFactory<String, Group> factory =
                 new Group.GroupFactory(appData);
 
+            GenericKeyedObjectPoolConfig poolConfig = new 
GenericKeyedObjectPoolConfig();
+            poolConfig.setMaxTotal(maxPooledGroups);
+            poolConfig.setJmxEnabled(true);
+            poolConfig.setJmxNamePrefix("fulcrum-intake-pool-" + counter++);
+
             keyedPools.put(appData,
-                new StackKeyedObjectPool<String, Group>(factory, 
maxPooledGroups));
+                new GenericKeyedObjectPool<String, Group>(factory, 
poolConfig));
         }
 
         if (getLogger().isInfoEnabled())
@@ -773,6 +803,7 @@ public class IntakeServiceImpl extends A
      * @see org.apache.avalon.framework.context.Contextualizable
      * @avalon.entry key="urn:avalon:home" type="java.io.File"
      */
+    @Override
     public void contextualize(Context context) throws ContextException
     {
         this.applicationRoot = context.get("urn:avalon:home").toString();
@@ -783,6 +814,7 @@ public class IntakeServiceImpl extends A
      *
      * @avalon.dependency 
type="org.apache.fulcrum.localization.LocalizationService"
      */
+    @Override
     public void service(ServiceManager manager) throws ServiceException
     {
         IntakeServiceFacade.setIntakeService(this);


Reply via email to