You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by re...@apache.org on 2009/08/20 22:43:22 UTC

svn commit: r806346 [2/3] - in /cocoon/cocoon3/trunk: cocoon-profiling/ cocoon-profiling/src/main/java/org/ cocoon-profiling/src/main/java/org/apache/ cocoon-profiling/src/main/java/org/apache/cocoon/ cocoon-profiling/src/main/java/org/apache/cocoon/pr...

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataComparator.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataComparator.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataComparator.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataComparator.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,32 @@
+/*
+ * 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.cocoon.profiling.data;
+
+import java.util.Comparator;
+
+/**
+ * Comparator that compares profiling data objects using their invocation start time.
+ */
+public class ProfilingDataComparator implements Comparator<ProfilingData> {
+
+    /**
+     * {@inheritDoc}
+     */
+    public int compare(ProfilingData arg0, ProfilingData arg1) {
+        return (int) Math.signum(arg0.getInvocationStartTime() - arg1.getInvocationStartTime());
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataComparator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataComparator.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataComparator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataHolder.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataHolder.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataHolder.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataHolder.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,45 @@
+/*
+ * 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.cocoon.profiling.data;
+
+/**
+ * Interface for the storage layer of the profiling module. Supports storage and retrieval of
+ * {@link ProfilingData} objects based on a key.
+ * <p>
+ * The stored {@link ProfilingData} objects may be discarded at any point in time.
+ * </p>
+ */
+public interface ProfilingDataHolder {
+
+    /**
+     * Store the given {@link ProfilingData} objects using the given id as key.
+     * 
+     * @param id
+     * @param data
+     */
+    void store(String id, ProfilingData data);
+
+    /**
+     * Retrieve the {@link ProfilingData} objects stored with the given id as key.
+     * 
+     * @param id
+     * @return the {@link ProfilingData} stored with the given id as key or null if there is no
+     *         mapping for the given id.
+     */
+    ProfilingData get(String id);
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataHolder.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataHolder.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataHolder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManager.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManager.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManager.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManager.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,41 @@
+/*
+ * 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.cocoon.profiling.data;
+
+/**
+ * The {@link ProfilingDataManager} is responsible for building the data structure by linking the
+ * {@link ProfilingData} elements together.
+ * 
+ * <p>
+ * The creation of the data structure is solely in the responsibility of the
+ * {@link ProfilingDataManager} and has to be accomplished using the information stored in the
+ * {@link ProfilingData} objects. Furthermore it has to group the incoming {@link ProfilingData}
+ * objects and to move the whole data structure to the {@link ProfilingDataHolder} after one group
+ * was completely processed.
+ * </p>
+ */
+public interface ProfilingDataManager {
+
+    /**
+     * Add and process the given profiling data.
+     * 
+     * @param data
+     */
+    public void add(ProfilingData data);
+
+    public void setProfilingDataHolder(ProfilingDataHolder profilingDataHolder);
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManager.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManagerImpl.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManagerImpl.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManagerImpl.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManagerImpl.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,161 @@
+/*
+ * 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.cocoon.profiling.data;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * This class connects ProfilingData objects according to request id
+ */
+public class ProfilingDataManagerImpl implements ProfilingDataManager {
+
+    private HashMap<String, LinkedList<ProfilingData>> dataMap = new HashMap<String, LinkedList<ProfilingData>>();
+
+    private ProfilingDataHolder profilingDataHolder;
+
+    /**
+     * {@inheritDoc}
+     */
+    public void add(ProfilingData data) {
+        String id = data.getProfilingId();
+        LinkedList<ProfilingData> temp = this.dataMap.get(id);
+
+        if (temp != null) {
+            temp.add(data);
+            if (data.isRoot()) {
+                this.finish(id);
+            }
+        } else {
+            // new request
+            temp = new LinkedList<ProfilingData>();
+            this.dataMap.put(id, temp);
+            temp.add(data);
+        }
+    }
+
+    /**
+     * build a tree structure
+     *
+     * @param list
+     *            a list sorted according to invocation timestamp
+     * @return the root tree node
+     */
+    private ProfilingData buildTree(List<ProfilingData> list) {
+        ProfilingData root = list.remove(0);
+        int maxLevel = 0;
+
+        while (!list.isEmpty()) {
+            maxLevel = Math.max(maxLevel, list.get(0).getInvocationDepth());
+            this.addNode(root, list);
+        }
+
+        for (int i = maxLevel; i > 1; i--) {
+            this.correctChildAssignments(root, i);
+        }
+        return root;
+    }
+
+    /**
+     * links children at the specified level to the correct parents so the time ordering is correct
+     */
+    private void correctChildAssignments(ProfilingData root, int level) {
+        while (root.getInvocationDepth() < level - 2) {
+            root = root.getChild(0);
+        }
+        List<ProfilingData> children = new ArrayList<ProfilingData>(root.getChild(0).getChildren());
+        root.getChild(0).removeAllChildren();
+        int size = root.getChildCount();
+        ProfilingData temp = null;
+
+        for (int i = 1; i < size; i++) {
+            while (!children.isEmpty()
+                    && root.getChild(i).getInvocationStartTime() > children.get(0).getInvocationStartTime()) {
+                temp = children.remove(0);
+                root.getChild(i - 1).addChild(temp);
+            }
+        }
+        while (!children.isEmpty()) {
+            temp = children.remove(0);
+            root.getChild(size - 1).addChild(temp);
+        }
+    }
+
+    /**
+     * Insert data into tree structure
+     *
+     * @param root
+     *            the root node of the tree structure
+     */
+    private void addNode(ProfilingData root, List<ProfilingData> list) {
+        ProfilingData data = list.remove(0);
+
+        // iterate to nearest tree node
+        while (root.getInvocationDepth() < data.getInvocationDepth() && root.hasChildren()) {
+            root = root.getChild(0);
+        }
+        // add before current node
+        if (root.getInvocationDepth() > data.getInvocationDepth()) {
+            data.addChildren(root.getParent().getChildren());
+            root.getParent().removeAllChildren();
+            root.getParent().addChild(data);
+            return;
+        }
+        // add on the same level as current node
+        if (root.getInvocationDepth() == data.getInvocationDepth()) {
+            root.getParent().addChild(data);
+            return;
+        }
+        // add as child
+        if (!root.hasChildren()) {
+            root.addChild(data);
+            return;
+        }
+        throw new RuntimeException("Cannot add ProfilingData object to tree structure");
+    }
+
+    /**
+     * To be called when a request was finished. build a tree and store it in
+     * {@link ProfilingDataHolder}
+     *
+     * @param id the request id
+     */
+    private void finish(String id) {
+        try {
+            LinkedList<ProfilingData> list = this.dataMap.get(id);
+
+            // remove useless method calls
+            if (list.size() <= 3) {
+                return;
+            }
+
+            Collections.sort(list, new ProfilingDataComparator());
+            ProfilingData data = this.buildTree(list);
+
+            this.profilingDataHolder.store(id, data);
+        } finally {
+            this.dataMap.remove(id);
+        }
+    }
+
+    public void setProfilingDataHolder(ProfilingDataHolder profilingDataHolder) {
+        this.profilingDataHolder = profilingDataHolder;
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManagerImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManagerImpl.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingDataManagerImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingIdGenerator.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingIdGenerator.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingIdGenerator.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingIdGenerator.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,50 @@
+/*
+ * 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.cocoon.profiling.data;
+
+/**
+ * The {@link ProfilingIdGenerator} has to work thread dependent. So the id generated by
+ * {@link ProfilingIdGenerator#create()} should only be retrievable by calls to
+ * {@link ProfilingIdGenerator#getCurrent()} and removable by calls to
+ * {@link ProfilingIdGenerator#remove()} from the same thread. The id for one thread has to be equal
+ * for all calls to {@link ProfilingIdGenerator#getCurrent()} between an initial call to
+ * {@link ProfilingIdGenerator#create()} and a call to {@link ProfilingIdGenerator#remove()}. Ids
+ * should be unique within a reasonable amount of time.
+ * 
+ */
+public interface ProfilingIdGenerator {
+
+    /**
+     * Creates and returns a new id for the current thread.
+     * 
+     * @return the newly created id.
+     */
+    String create();
+
+    /**
+     * Get the current id for the current thread.
+     * 
+     * @return the current id for the current thread, or null if none has been created or remove was
+     *         called.
+     */
+    String getCurrent();
+
+    /**
+     * Discard the id for the current thread.
+     */
+    void remove();
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingIdGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingIdGenerator.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/ProfilingIdGenerator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/UUIDProfilingIdGenerator.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/UUIDProfilingIdGenerator.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/UUIDProfilingIdGenerator.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/UUIDProfilingIdGenerator.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,52 @@
+/*
+ * 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.cocoon.profiling.data;
+
+import java.util.UUID;
+
+/**
+ * The {@link UUIDProfilingIdGenerator} uses {@link ThreadLocal} to separate the id management for
+ * different threads and generates ids based on {@link UUID} objects created by
+ * {@link UUID#randomUUID()}, which should be reasonably unique for profiling purposes.
+ */
+public class UUIDProfilingIdGenerator implements ProfilingIdGenerator {
+
+    private ThreadLocal<String> currentId = new ThreadLocal<String>();;
+
+    /**
+     * {@inheritDoc}
+     */
+    public String create() {
+        String id = UUID.randomUUID().toString();
+        this.currentId.set(id);
+        return id;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public String getCurrent() {
+        return this.currentId.get();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void remove() {
+        this.currentId.remove();
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/UUIDProfilingIdGenerator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/UUIDProfilingIdGenerator.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/UUIDProfilingIdGenerator.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/package-info.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/package-info.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/package-info.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/package-info.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+/**
+ * Contains classes and interfaces for the storage and the construction of data structures of profiling data.
+ *  
+ */
+package org.apache.cocoon.profiling.data;
+

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/data/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagement.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagement.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagement.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagement.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,41 @@
+/*
+ * 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.cocoon.profiling.jmx;
+
+/**
+ * 
+ * This MBean provides management functionality for cocoon-profiling and offers a possibility to
+ * enable/disable cocoon profiling.
+ * 
+ * If you want to test this, simply run cocoon-sample and connect with jconsole
+ */
+public class ProfilingManagement implements ProfilingManagementMBean {
+
+    private boolean enabled = true;
+
+    public boolean isEnabled() {
+        return this.enabled;
+    }
+
+    public void enable() {
+        this.enabled = true;
+    }
+
+    public void disable() {
+        this.enabled = false;
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagement.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagement.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagement.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagementMBean.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagementMBean.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagementMBean.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagementMBean.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,30 @@
+/*
+ * 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.cocoon.profiling.jmx;
+
+/**
+ * This is the interface for an MBean that makes it possible to manage (enable/disable) cocoon
+ * profiling.
+ */
+public interface ProfilingManagementMBean {
+
+    public boolean isEnabled();
+
+    public void enable();
+
+    public void disable();
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagementMBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagementMBean.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/ProfilingManagementMBean.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/package-info.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/package-info.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/package-info.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/package-info.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+/**
+ * Provides JMX support for cocoon-profiling.
+ */
+package org.apache.cocoon.profiling.jmx;
+

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/jmx/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/package-info.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/package-info.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/package-info.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/package-info.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+/**
+ * The main package for cocoon-profiling.
+ */
+package org.apache.cocoon.profiling;
+

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/GenerateNodeProfiler.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/GenerateNodeProfiler.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/GenerateNodeProfiler.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/GenerateNodeProfiler.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,58 @@
+/*
+ * 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.cocoon.profiling.profiler;
+
+import java.lang.reflect.Field;
+
+import org.apache.cocoon.profiling.ProfileMethod;
+import org.apache.cocoon.profiling.data.ProfilingData;
+import org.apache.cocoon.sitemap.node.GenerateNode;
+
+public class GenerateNodeProfiler extends Profiler<GenerateNode> {
+
+    public GenerateNodeProfiler() {
+        super(GenerateNode.class);
+    }
+
+    @ProfileMethod(name = "invoke")
+    public void beforeInvoke(ProfilingData data, GenerateNode component, Object[] args) {
+        try {
+            Field srcField = GenerateNode.class.getDeclaredField("src");
+
+            srcField.setAccessible(true);
+            String src = (String) srcField.get(component);
+
+            if (src != null) {
+                data.addData("src", src);
+            }
+
+            Field typeField = GenerateNode.class.getDeclaredField("type");
+
+            typeField.setAccessible(true);
+            String type = (String) typeField.get(component);
+
+            if (type != null) {
+                data.addData("type", type);
+
+                String simpleName = component.getClass().getSimpleName();
+                data.setDisplayName(String.format("%s (%s=%s)", simpleName, "type", type));
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("Error reading private fields from GenerateNode", e);
+        }
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/GenerateNodeProfiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/GenerateNodeProfiler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/GenerateNodeProfiler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/MatchNodeProfiler.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/MatchNodeProfiler.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/MatchNodeProfiler.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/MatchNodeProfiler.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,54 @@
+/*
+ * 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.cocoon.profiling.profiler;
+
+import java.lang.reflect.Field;
+
+import org.apache.cocoon.profiling.ProfileMethod;
+import org.apache.cocoon.profiling.data.ProfilingData;
+import org.apache.cocoon.sitemap.node.MatchNode;
+
+public class MatchNodeProfiler extends Profiler<MatchNode> {
+
+    private final String[] fields = {"pattern", "regexp", "equals", "contains", "wildcard", "startsWith", "endsWith"};
+
+    public MatchNodeProfiler() {
+        super(MatchNode.class);
+    }
+
+    @ProfileMethod(name = "invoke")
+    public void beforeInvoke(ProfilingData data, MatchNode component, Object[] args) {
+        try {
+            for (String fieldname : this.fields) {
+                Field field = MatchNode.class.getDeclaredField(fieldname);
+
+                field.setAccessible(true);
+                String value = (String) field.get(component);
+
+                if (value != null) {
+                    data.addData(fieldname, value);
+
+                    String simpleName = component.getClass().getSimpleName();
+                    data.setDisplayName(String.format("%s (%s=%s)", simpleName, fieldname, value));
+                    return;
+                }
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("Error reading pattern from MatchNode", e);
+        }
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/MatchNodeProfiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/MatchNodeProfiler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/MatchNodeProfiler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineComponentProfiler.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineComponentProfiler.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineComponentProfiler.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineComponentProfiler.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,26 @@
+/*
+ * 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.cocoon.profiling.profiler;
+
+import org.apache.cocoon.pipeline.component.PipelineComponent;
+
+public class PipelineComponentProfiler extends Profiler<PipelineComponent> {
+
+    public PipelineComponentProfiler() {
+        super(PipelineComponent.class);
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineComponentProfiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineComponentProfiler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineComponentProfiler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineNodeProfiler.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineNodeProfiler.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineNodeProfiler.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineNodeProfiler.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,50 @@
+/*
+ * 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.cocoon.profiling.profiler;
+
+import java.lang.reflect.Field;
+
+import org.apache.cocoon.profiling.ProfileMethod;
+import org.apache.cocoon.profiling.data.ProfilingData;
+import org.apache.cocoon.sitemap.node.PipelineNode;
+
+public class PipelineNodeProfiler extends Profiler<PipelineNode> {
+
+    public PipelineNodeProfiler() {
+        super(PipelineNode.class);
+    }
+
+    @ProfileMethod(name = "invoke")
+    public void beforeInvoke(ProfilingData data, PipelineNode component, Object[] args) {
+        try {
+            Field field = PipelineNode.class.getDeclaredField("type");
+
+            field.setAccessible(true);
+            String value = (String) field.get(component);
+
+            if (value != null) {
+                data.addData("type", value);
+
+                String simpleName = component.getClass().getSimpleName();
+                data.setDisplayName(String.format("%s (%s=%s)", simpleName, "type", value));
+                return;
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("Error reading type from PipelineNode", e);
+        }
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineNodeProfiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineNodeProfiler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineNodeProfiler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineProfiler.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineProfiler.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineProfiler.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineProfiler.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,27 @@
+/*
+ * 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.cocoon.profiling.profiler;
+
+import org.apache.cocoon.pipeline.Pipeline;
+
+@SuppressWarnings("unchecked")
+public class PipelineProfiler extends Profiler<Pipeline> {
+
+    public PipelineProfiler() {
+        super(Pipeline.class);
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineProfiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineProfiler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/PipelineProfiler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/Profiler.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/Profiler.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/Profiler.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/Profiler.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,292 @@
+/*
+ * 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.cocoon.profiling.profiler;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cocoon.callstack.CallStack;
+import org.apache.cocoon.profiling.ProfileMethod;
+import org.apache.cocoon.profiling.ProfileMethodType;
+import org.apache.cocoon.profiling.data.ProfilingData;
+import org.apache.cocoon.profiling.data.ProfilingDataManager;
+import org.apache.cocoon.profiling.data.ProfilingIdGenerator;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Base class for all profiling data handlers. A new instance is created for each method invocation
+ * and the methods before and after/exception are called.
+ *
+ * It stores invocation time and end time of the invocation.
+ *
+ * Implementors of subclasses can provide methods annotated with {@link ProfileMethod}. Depending on
+ * the {@link ProfileMethodType} the method has to have a specific signature:
+ *
+ * <ul>
+ * <li>ProfileMethodType.BEFORE_INVOCATION: (ProfilingData data, T target, Object[] args)</li>
+ * <li>ProfileMethodType.AFTER_INVOCATION: (ProfilingData data, Object returnValue)</li>
+ * <li>ProfileMethodType.ON_EXCEPTION: (ProfilingData data, Exception exception)</li>
+ * </ul>
+ *
+ * If in the {@link ProfileMethod} annotation no method name is specified, the profile method will
+ * be installed as default and called for all method invocations.
+ */
+public abstract class Profiler<T> {
+
+    private static ThreadLocal<Integer> depth = new ThreadLocal<Integer>() {
+
+        @Override
+        protected Integer initialValue() {
+            return 0;
+        }
+    };
+
+    protected final Log logger = LogFactory.getLog(this.getClass());
+
+    private ProfilingDataManager dataManager;
+
+    private Map<ProfileMethodType, List<Method>> defaultProfileMethods;
+
+    private ProfilingIdGenerator idGenerator;
+
+    private Map<ProfileMethodType, Map<String, List<Method>>> profileMethods;
+
+    private Class<? extends T> targetClass;
+
+    /**
+     * @param targetClass class for which this profiler should be registered
+     */
+    public Profiler(Class<? extends T> targetClass) {
+        this.targetClass = targetClass;
+        this.profileMethods = new HashMap<ProfileMethodType, Map<String, List<Method>>>();
+        this.defaultProfileMethods = new HashMap<ProfileMethodType, List<Method>>();
+
+        for (ProfileMethodType type : ProfileMethodType.values()) {
+            this.profileMethods.put(type, new HashMap<String, List<Method>>());
+        }
+
+        this.findProfilingMethods();
+    }
+
+    /**
+     * This method is called after the invocation was successfully finished.
+     *
+     * @param data the {@link ProfilingData} object used to store the profiling information for this
+     *            invocation.
+     * @param methodName the name of the method that was intercepted.
+     * @param returnValue the return value of the method that was intercepted
+     */
+    public final void after(ProfilingData data, String methodName, Object returnValue) {
+        data.setInvocationEndTime(System.nanoTime());
+
+        this.invokeSpecificMethods(ProfileMethodType.AFTER_INVOCATION, methodName, data, returnValue);
+        this.invokeDefaultMethods(ProfileMethodType.AFTER_INVOCATION, data, returnValue);
+
+        data.setReturnValue(returnValue);
+
+        this.postProcessInvocation(data);
+    }
+
+    /**
+     * This method is called before the invocation takes place on the given target object.
+     *
+     * @param data the {@link ProfilingData} object used to store the profiling information for this
+     *            invocation.
+     * @param target the object on which the intercepted invocation is performed.
+     * @param methodName the name of the method that has been intercepted.
+     * @param args the arguments of the intercepted method.
+     */
+    public final void before(ProfilingData data, Object target, String methodName, Object[] args) {
+        String id = this.idGenerator.getCurrent();
+
+        if (id == null) {
+            data.setRoot(true);
+            id = this.idGenerator.create();
+        }
+
+        data.setProfilingId(id);
+        data.setInvocationDepth(depth.get());
+        depth.set(depth.get() + 1);
+        data.setTarget(target);
+        data.setProfiler(this.getClass().getName());
+        data.setMethod(methodName);
+        data.setArguments(args);
+        data.setCallFrameId(System.identityHashCode(CallStack.getCurrentFrame()));
+
+        this.invokeSpecificMethods(ProfileMethodType.BEFORE_INVOCATION, methodName, data, target, args);
+        this.invokeDefaultMethods(ProfileMethodType.BEFORE_INVOCATION, data, target, args);
+
+        data.setInvocationStartTime(System.nanoTime());
+    }
+
+    /**
+     * This method is called after the invocation was successfully finished.
+     *
+     * @param data the {@link ProfilingData} object used to store the profiling information for this
+     *            invocation.
+     * @param methodName the name of the method that was intercepted.
+     * @param exception the exception that was thrown by the method that was intercepted
+     */
+    public final void exception(ProfilingData data, String methodName, Exception exception) {
+        data.setInvocationEndTime(System.nanoTime());
+        data.setException(exception);
+
+        this.invokeSpecificMethods(ProfileMethodType.ON_EXCEPTION, methodName, data, exception);
+        this.invokeDefaultMethods(ProfileMethodType.ON_EXCEPTION, data, exception);
+
+        this.postProcessInvocation(data);
+    }
+
+    /**
+     * @return The {@link Class}, whose instances will be profiled by this profiler.
+     */
+    public final Class<? extends T> getTargetClass() {
+        return this.targetClass;
+    }
+
+    public void setProfilingDataManager(ProfilingDataManager dataManager) {
+        this.dataManager = dataManager;
+    }
+
+    public void setProfilingIdGenerator(ProfilingIdGenerator idGenerator) {
+        this.idGenerator = idGenerator;
+    }
+
+    private void checkProfileMethodSignature(Method method, String name, ProfileMethodType type) {
+        Class<?>[] pt = method.getParameterTypes();
+
+        switch (type) {
+        case BEFORE_INVOCATION:
+            if (pt.length != 3 || pt[0] != ProfilingData.class || !pt[1].isAssignableFrom(this.targetClass)
+                    || pt[2] != Object[].class) {
+                throw new RuntimeException("Signature of method " + method.getName()
+                        + " does not conform to (ProfilingData, " + this.targetClass.getName() + ", Object[])");
+            }
+            break;
+
+        case AFTER_INVOCATION:
+            if (pt.length != 2 || pt[0] != ProfilingData.class || pt[1] != Object.class) {
+                throw new RuntimeException("Signature of method " + method.getName()
+                        + " does not conform to (ProfilingData, Object)");
+            }
+            break;
+
+        case ON_EXCEPTION:
+            if (pt.length != 2 || pt[0] != ProfilingData.class || pt[1] != Exception.class) {
+                throw new RuntimeException("Signature of method " + method.getName()
+                        + " does not conform to (ProfilingData, Exception)");
+            }
+            break;
+
+        default:
+            throw new AssertionError("Unknown ProfileMethodType");
+        }
+    }
+
+    private void findProfilingMethods() {
+        Class<?> clazz = this.getClass();
+        Method[] methods = clazz.getMethods();
+
+        for (Method method : methods) {
+            this.processMethod(method);
+        }
+    }
+
+    private void installDefaultMethod(Method method, ProfileMethodType type) {
+        List<Method> list = this.defaultProfileMethods.get(type);
+
+        if (list == null) {
+            list = new ArrayList<Method>();
+            this.defaultProfileMethods.put(type, list);
+        }
+
+        list.add(method);
+
+        if (this.logger.isInfoEnabled()) {
+            this.logger.info(String.format("Installed '%s' as default %s method", method.getName(), type));
+        }
+    }
+
+    private void installProfileMethod(Method method, String name, ProfileMethodType type) {
+        if (name.equals(ProfileMethod.DEFAULT_NAME)) {
+            this.installDefaultMethod(method, type);
+            return;
+        }
+
+        List<Method> list = this.profileMethods.get(type).get(name);
+        if (list == null) {
+            list = new ArrayList<Method>();
+            this.profileMethods.get(type).put(name, list);
+        }
+
+        list.add(method);
+
+        if (this.logger.isInfoEnabled()) {
+            this.logger.info(String.format("Installed '%s' for '%s'/%s", method.getName(), name, type));
+        }
+    }
+
+    private void invokeDefaultMethods(ProfileMethodType type, Object... args) {
+        this.invokeMethods(this.defaultProfileMethods.get(type), args);
+    }
+
+    private void invokeMethods(List<Method> methods, Object... args) {
+        if (methods == null) {
+            return;
+        }
+
+        for (Method m : methods) {
+            try {
+                m.invoke(this, args);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    private void invokeSpecificMethods(ProfileMethodType type, String methodName, Object... args) {
+        this.invokeMethods(this.profileMethods.get(type).get(methodName), args);
+    }
+
+    private void postProcessInvocation(ProfilingData data) {
+        depth.set(depth.get() - 1);
+
+        this.dataManager.add(data);
+
+        if (data.isRoot()) {
+            this.idGenerator.remove();
+        }
+    }
+
+    private void processMethod(Method method) {
+        ProfileMethod profileMethod = method.getAnnotation(ProfileMethod.class);
+
+        if (profileMethod == null) {
+            return;
+        }
+
+        String name = profileMethod.name();
+        ProfileMethodType type = profileMethod.type();
+
+        this.checkProfileMethodSignature(method, name, type);
+        this.installProfileMethod(method, name, type);
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/Profiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/Profiler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/Profiler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/ServletProfiler.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/ServletProfiler.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/ServletProfiler.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/ServletProfiler.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,107 @@
+/*
+ * 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.cocoon.profiling.profiler;
+
+import javax.servlet.Servlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.cocoon.profiling.ProfileMethod;
+import org.apache.cocoon.profiling.ProfileMethodType;
+import org.apache.cocoon.profiling.data.ProfilingData;
+
+/**
+ * The profiler for {@link Servlet}, which intercepts the service method to add the profiling id
+ * information to the HTTP header.
+ */
+public class ServletProfiler extends Profiler<Servlet> {
+
+    private final static String PROFILING_CONTROLLER_PATH = "controller/profiling/";
+    private final static String PROFILING_ID_HEADER = "X-Cocoon-Profiling-ID";
+    private final static String PROFILING_URL_HEADER = "X-Cocoon-Profiling-URL";
+    private String mountPath;
+
+    public ServletProfiler() {
+        this(Servlet.class);
+    }
+
+    protected ServletProfiler(Class<? extends Servlet> clazz) {
+        super(clazz);
+        this.setMountPath("/");// TODO
+    }
+
+    @ProfileMethod(name = "service", type = ProfileMethodType.BEFORE_INVOCATION)
+    public final void beforeService(ProfilingData data, Servlet component, Object[] args) {
+        if (data.isRoot()) {
+            HttpServletRequest request = (HttpServletRequest) args[0];
+            HttpServletResponse response = (HttpServletResponse) args[1];
+            String profilingId = data.getProfilingId();
+            String requestUrl = request.getRequestURL().toString();
+            response.addHeader(PROFILING_ID_HEADER, profilingId);
+            response.addHeader(PROFILING_URL_HEADER, this.createRelativeUrl(requestUrl, profilingId));
+        }
+
+        HttpServletRequest request = (HttpServletRequest) args[0];
+        String requestURI = request.getRequestURI();
+        String className = component.getClass().getSimpleName();
+
+        data.setDisplayName(String.format("%s (request=%s)", className, requestURI));
+    }
+
+    public String createRelativeUrl(String inputUrl, String profilingId) {
+        String mountPath = this.getMountPath();
+
+        int questionMarkIndex = inputUrl.indexOf('?');
+        if (questionMarkIndex != -1) {
+            // ignore parameters (could contain slashes)
+            inputUrl = inputUrl.substring(0, questionMarkIndex);
+        }
+
+        // Don't count the slashes of http://
+        int inputUrlSlashes = this.countOccurenceOfCharacter('/', inputUrl) - 2;
+        int mountPathSlashes = this.countOccurenceOfCharacter('/', mountPath);
+
+        StringBuilder sb = new StringBuilder();
+
+        for (int i = mountPathSlashes; i < inputUrlSlashes; i++) {
+            sb.append("../");
+        }
+
+        sb.append(PROFILING_CONTROLLER_PATH);
+        sb.append(profilingId);
+
+        return sb.toString();
+    }
+
+    public String getMountPath() {
+        return this.mountPath;
+    }
+
+    public void setMountPath(String mountPath) {
+        this.mountPath = mountPath;
+    }
+
+    private int countOccurenceOfCharacter(char c, String s) {
+        int count = 0;
+        for (int i = 0; i < s.length(); i++) {
+            if (s.charAt(i) == c) {
+                count++;
+            }
+        }
+        return count;
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/ServletProfiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/ServletProfiler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/ServletProfiler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/SitemapNodeProfiler.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/SitemapNodeProfiler.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/SitemapNodeProfiler.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/SitemapNodeProfiler.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,26 @@
+/*
+ * 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.cocoon.profiling.profiler;
+
+import org.apache.cocoon.sitemap.node.SitemapNode;
+
+public class SitemapNodeProfiler extends Profiler<SitemapNode> {
+
+    public SitemapNodeProfiler() {
+        super(SitemapNode.class);
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/SitemapNodeProfiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/SitemapNodeProfiler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/SitemapNodeProfiler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/TransformNodeProfiler.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/TransformNodeProfiler.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/TransformNodeProfiler.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/TransformNodeProfiler.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,58 @@
+/*
+ * 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.cocoon.profiling.profiler;
+
+import java.lang.reflect.Field;
+
+import org.apache.cocoon.profiling.ProfileMethod;
+import org.apache.cocoon.profiling.data.ProfilingData;
+import org.apache.cocoon.sitemap.node.TransformNode;
+
+public class TransformNodeProfiler extends Profiler<TransformNode> {
+
+    public TransformNodeProfiler() {
+        super(TransformNode.class);
+    }
+
+    @ProfileMethod(name = "invoke")
+    public void beforeInvoke(ProfilingData data, TransformNode component, Object[] args) {
+        try {
+            Field srcField = TransformNode.class.getDeclaredField("src");
+
+            srcField.setAccessible(true);
+            String src = (String) srcField.get(component);
+
+            if (src != null) {
+                data.addData("src", src);
+            }
+
+            Field typeField = TransformNode.class.getDeclaredField("type");
+
+            typeField.setAccessible(true);
+            String type = (String) typeField.get(component);
+
+            if (type != null) {
+                data.addData("type", type);
+
+                String simpleName = component.getClass().getSimpleName();
+                data.setDisplayName(String.format("%s (%s=%s)", simpleName, "type", type));
+            }
+        } catch (Exception e) {
+            throw new RuntimeException("Error reading private fields from TransformNode", e);
+        }
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/TransformNodeProfiler.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/TransformNodeProfiler.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/TransformNodeProfiler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/package-info.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/package-info.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/package-info.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/package-info.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+/**
+ *  Provides the abstract base class {@link org.apache.cocoon.profiling.profiler.Profiler} and some specific
+ *  implementations.
+ */
+package org.apache.cocoon.profiling.profiler;
+

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/profiler/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/AutomaticProfilerInstaller.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/AutomaticProfilerInstaller.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/AutomaticProfilerInstaller.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/AutomaticProfilerInstaller.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,146 @@
+/*
+ * 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.cocoon.profiling.spring;
+
+import java.util.Map;
+
+import javax.servlet.Servlet;
+
+import org.apache.cocoon.pipeline.Pipeline;
+import org.apache.cocoon.pipeline.component.PipelineComponent;
+import org.apache.cocoon.profiling.aspects.InvocationDispatcher;
+import org.apache.cocoon.profiling.data.ProfilingDataManager;
+import org.apache.cocoon.profiling.data.ProfilingIdGenerator;
+import org.apache.cocoon.profiling.profiler.Profiler;
+import org.apache.cocoon.sitemap.node.SitemapNode;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * This class is used to install {@link Profiler} to the correct {@link InvocationDispatcher}. The
+ * dependencies that all {@link Profiler} share are also managed by this class.
+ * <p>
+ * This class is especially useful in combination with spring, which can be configured to inject all
+ * {@link Profiler} that are declared as Spring-Managed beans into this class. So additional
+ * Profilers can be registered simply by defining them as Spring-bean.
+ * </p>
+ */
+public class AutomaticProfilerInstaller {
+
+    private final Log logger = LogFactory.getLog(this.getClass());
+
+    private InvocationDispatcher pipelineComponentInvocationDispatcher;
+
+    private InvocationDispatcher pipelineInvocationDispatcher;
+
+    private Map<String, Profiler<?>> profilers;
+
+    private ProfilingDataManager profilingDataManager;
+
+    private ProfilingIdGenerator profilingIdGenerator;
+
+    private InvocationDispatcher servletInvocationDispatcher;
+
+    private InvocationDispatcher sitemapNodeInvocationDispatcher;
+
+    /**
+     * Install all profilers. {@link AutomaticProfilerInstaller#setProfilers(Map)} has to be called
+     * first.
+     */
+    public void installProfilers() {
+        for (Profiler<?> p : this.profilers.values()) {
+            this.install(p);
+        }
+    }
+
+    public void setPipelineComponentInvocationDispatcher(InvocationDispatcher pipelineComponentInvocationDispatcher) {
+        this.pipelineComponentInvocationDispatcher = pipelineComponentInvocationDispatcher;
+    }
+
+    public void setPipelineInvocationDispatcher(InvocationDispatcher pipelineInvocationDispatcher) {
+        this.pipelineInvocationDispatcher = pipelineInvocationDispatcher;
+    }
+
+    public void setProfilers(Map<String, Profiler<?>> profilers) {
+        this.profilers = profilers;
+    }
+
+    public void setProfilingDataManager(ProfilingDataManager profilingDataManager) {
+        this.profilingDataManager = profilingDataManager;
+    }
+
+    public void setProfilingIdGenerator(ProfilingIdGenerator profilingIdGenerator) {
+        this.profilingIdGenerator = profilingIdGenerator;
+    }
+
+    public void setServletInvocationDispatcher(InvocationDispatcher servletInvocationDispatcher) {
+        this.servletInvocationDispatcher = servletInvocationDispatcher;
+    }
+
+    public void setSitemapNodeInvocationDispatcher(InvocationDispatcher sitemapNodeInvocationDispatcher) {
+        this.sitemapNodeInvocationDispatcher = sitemapNodeInvocationDispatcher;
+    }
+
+    private void install(Profiler<?> profiler) {
+        profiler.setProfilingDataManager(this.profilingDataManager);
+        profiler.setProfilingIdGenerator(this.profilingIdGenerator);
+
+        if (Servlet.class.isAssignableFrom(profiler.getTargetClass())) {
+            this.installServletProfiler(profiler);
+        }
+
+        if (SitemapNode.class.isAssignableFrom(profiler.getTargetClass())) {
+            this.installSitemapNodeProfiler(profiler);
+        }
+
+        if (PipelineComponent.class.isAssignableFrom(profiler.getTargetClass())) {
+            this.installPipelineComponentProfiler(profiler);
+        }
+
+        if (Pipeline.class.isAssignableFrom(profiler.getTargetClass())) {
+            this.installPipelineProfiler(profiler);
+        }
+    }
+
+    private void installPipelineComponentProfiler(Profiler<?> profiler) {
+        if (this.logger.isInfoEnabled()) {
+            this.logger.info("Installing PipelineComponent Profiler: " + profiler);
+        }
+        this.pipelineComponentInvocationDispatcher.installProfiler(profiler);
+    }
+
+    private void installPipelineProfiler(Profiler<?> profiler) {
+        if (this.logger.isInfoEnabled()) {
+            this.logger.info("Installing Pipeline Profiler: " + profiler);
+        }
+        this.pipelineInvocationDispatcher.installProfiler(profiler);
+    }
+
+    private void installServletProfiler(Profiler<?> profiler) {
+        if (this.logger.isInfoEnabled()) {
+            this.logger.info("Installing Servlet Profiler: " + profiler);
+        }
+        this.servletInvocationDispatcher.installProfiler(profiler);
+    }
+
+    private void installSitemapNodeProfiler(Profiler<?> profiler) {
+        if (this.logger.isInfoEnabled()) {
+            this.logger.info("Installing SitemapNode Profiler: " + profiler);
+        }
+        this.sitemapNodeInvocationDispatcher.installProfiler(profiler);
+    }
+}

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/AutomaticProfilerInstaller.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/AutomaticProfilerInstaller.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/AutomaticProfilerInstaller.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/package-info.java
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/package-info.java?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/package-info.java (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/package-info.java Thu Aug 20 20:43:20 2009
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+/**
+ * Provides components to interact with Spring.
+ */
+package org.apache.cocoon.profiling.spring;
+

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/package-info.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/package-info.java
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/java/org/apache/cocoon/profiling/spring/package-info.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: cocoon/cocoon3/trunk/cocoon-profiling/src/main/resources/COB-INF/sitemap.xmap
URL: http://svn.apache.org/viewvc/cocoon/cocoon3/trunk/cocoon-profiling/src/main/resources/COB-INF/sitemap.xmap?rev=806346&view=auto
==============================================================================
--- cocoon/cocoon3/trunk/cocoon-profiling/src/main/resources/COB-INF/sitemap.xmap (added)
+++ cocoon/cocoon3/trunk/cocoon-profiling/src/main/resources/COB-INF/sitemap.xmap Thu Aug 20 20:43:20 2009
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+ -->
+<map:sitemap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:map="http://apache.org/cocoon/sitemap"
+  xmlns:servlet="http://apache.org/cocoon/servlet" xmlns:controller="http://apache.org/cocoon/controller">
+
+  <map:pipelines>
+
+    <!-- ~~~~~~~~~~~~~~~~ profiling controller ~~~~~~~~~~~~~~~ -->
+    <map:pipeline>
+      <map:match pattern="controller/profiling/{id}.png">
+        <map:serialize type="profilingpng" id="{map:id}" />
+      </map:match>
+      <map:match pattern="controller/profiling/{id}">
+        <map:generate type="profiling" id="{map:id}" />
+        <map:serialize type="xml" />
+      </map:match>
+    </map:pipeline>
+
+  </map:pipelines>
+</map:sitemap>

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/resources/COB-INF/sitemap.xmap
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/resources/COB-INF/sitemap.xmap
------------------------------------------------------------------------------
    svn:keywords = Id

Propchange: cocoon/cocoon3/trunk/cocoon-profiling/src/main/resources/COB-INF/sitemap.xmap
------------------------------------------------------------------------------
    svn:mime-type = text/xml