/* * Copyright 2002-2006 the original author or authors. * * Licensed 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.openuap.cms.engine.profile; import java.lang.reflect.Constructor; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openuap.cms.config.CMSConfig; import org.openuap.runtime.profile.ProfileInfoHolder; import org.springframework.util.ReflectionUtils; /** * <p> * 发布侦测维持器. * </p> * * <p> * $Id: PublishProfileInfoHolder.java 3924 2010-10-26 11:53:36Z orangeforjava $ * </p> * * @author Joseph * @version 1.0 */ public class PublishProfileInfoHolder { private static Log logger = LogFactory .getLog(PublishProfileInfoHolder.class); public static final String MODE_THREADLOCAL = "MODE_THREADLOCAL"; public static final String SYSTEM_PROPERTY = "publish.profile.strategy"; public static final String MODE_INHERITABLETHREADLOCAL = "MODE_INHERITABLETHREADLOCAL"; public static final String MODE_GLOBAL = "MODE_GLOBAL"; private static String strategyName = System.getProperty(SYSTEM_PROPERTY); private static int initializeCount = 0; private static PublishProfileHolderStrategy strategy; static { initialize(); } public static int getInitializeCount() { return initializeCount; } private static void initialize() { if ((strategyName == null) || "".equals(strategyName)) { // Set default strategyName = MODE_THREADLOCAL; } if (strategyName.equals(MODE_THREADLOCAL)) { strategy = new PublishThreadLocalProfileHolderStrategy(); } else if (strategyName.equals(MODE_INHERITABLETHREADLOCAL)) { strategy = new PublishInheritableThreadLocalProfileHolderStrategy(); } else if (strategyName.equals(MODE_GLOBAL)) { strategy = new PublishGlobalProfileHolderStrategy(); } else { // Try to load a custom strategy try { Class clazz = Class.forName(strategyName); Constructor customStrategy = clazz .getConstructor(new Class[] {}); strategy = (PublishProfileHolderStrategy) customStrategy .newInstance(new Object[] {}); } catch (Exception ex) { ReflectionUtils.handleReflectionException(ex); } } initializeCount++; } public static void setStrategyName(String strategyName) { PublishProfileInfoHolder.strategyName = strategyName; initialize(); } public static void clearProfile() { strategy.clearProfile(); } public static PublishActionProfile getProfile() { return strategy.getProfile(); } public static void setProfile(PublishActionProfile profile) { strategy.setProfile(profile); } public static boolean isEnableProfile() { return CMSConfig.getInstance().getBooleanProperty("cms.publish.profile", true); } /** * 把分析信息记录到日志内 */ public static void logProfile() { PublishActionProfile ap = getProfile(); if (ap != null) { // System.out .println("//--------------------------profile start-------------------"); System.out.println("request URL=" + ap.getActionURI()); System.out.println("request Action=" + ap.getActionName()); System.out.println("locatorActionTimes=" + ap.getLocatorActionTimes() + " ms"); System.out.println("ProcessActionTimes=" + ap.getProcessActionTimes() + " ms"); System.out.println("RenderTimes=" + ap.getRenderTimes() + " ms"); System.out.println("---------------Operation start-------------"); List dbs = ap.getAllPublishOperations(); int size = dbs.size(); System.out.println("total publish operation=" + size + " times"); int totalDbTimes = 0; for (int i = 0; i < size; i++) { PublishOperationProfile db = (PublishOperationProfile) dbs.get(i); System.out.println(" publish operation[" + i + "]=(" + db.getOperation() + ") spare " + db.getProccessTimes() + " ms"); Exception ex = db.getException(); if (ex != null) { System.out.println(" exception publish operation[" + i + "]=" + ex.getMessage()); } totalDbTimes += db.getProccessTimes(); } System.out.println("total publish operationy spare=" + totalDbTimes + " ms"); System.out.println("---------------Operation end -------------"); if (ProfileInfoHolder.isEnableProfile()) { ProfileInfoHolder.logDBProfile(); } System.out .println("//--------------------------profile end -------------------"); } } }