http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/bf2e1dc9/core/src/flex/messaging/config/ServletResourceResolver.java ---------------------------------------------------------------------- diff --git a/core/src/flex/messaging/config/ServletResourceResolver.java b/core/src/flex/messaging/config/ServletResourceResolver.java new file mode 100644 index 0000000..b79bc27 --- /dev/null +++ b/core/src/flex/messaging/config/ServletResourceResolver.java @@ -0,0 +1,156 @@ +/* + * 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 flex.messaging.config; + +import flex.messaging.io.ArrayList; + +import javax.servlet.ServletContext; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.Stack; + +/** + * + */ +public class ServletResourceResolver implements ConfigurationFileResolver +{ + private ServletContext context; + private Stack configurationPathStack = new Stack(); + + /** + * Constructor. + * + * @param context servlet context + */ + public ServletResourceResolver(ServletContext context) + { + this.context = context; + } + + /** + * Is the configuration file available. + * + * @param path path to check + * @param throwError true if wmethod shold throw a ConfigurationException if path no found. + * @return true if path is available + * @throws ConfigurationException if throwError is true and path is not available + */ + public boolean isAvailable(String path, boolean throwError) throws ConfigurationException + { + boolean available = false; + InputStream is = context.getResourceAsStream(path); + if (is != null) + { + try { is.close(); } catch (IOException ignore) { /* ignore */} + pushConfigurationFile(path); + available = true; + } + else + { + if (throwError) + { + // Please specify a valid ''services.configuration.file'' in web.xml. + ConfigurationException e = new ConfigurationException(); + e.setMessage(11108, new Object[] {path}); + throw e; + } + } + + return available; + } + + public InputStream getConfigurationFile(String path) + { + InputStream is = context.getResourceAsStream(path); + if (is != null) + { + pushConfigurationFile(path); + return is; + } + else + { + // Please specify a valid ''services.configuration.file'' in web.xml. + ConfigurationException e = new ConfigurationException(); + e.setMessage(11108, new Object[] {path}); + throw e; + } + } + + public InputStream getIncludedFile(String src) + { + String path = configurationPathStack.peek() + "/" + src; + InputStream is = context.getResourceAsStream(path); + + if (is != null) + { + pushConfigurationFile(path); + return is; + } + else + { + // Please specify a valid include file. ''{0}'' is invalid. + ConfigurationException e = new ConfigurationException(); + e.setMessage(11107, new Object[] {path}); + throw e; + } + } + + public void popIncludedFile() + { + configurationPathStack.pop(); + } + + /** + * Returns the list of XML files (denoted by .xml extension) in the directory + * relative to the current configuration file. + */ + public List getFiles(String dir) + { + List result = new ArrayList(); + String prefix = configurationPathStack.peek() + "/"; + Set paths = context.getResourcePaths(prefix + dir); + if (paths != null) + { + for (Object entry : paths) + { + String path = (String) entry; + if (path.endsWith(".xml")) + { + result.add(path.substring(prefix.length())); + } + } + return result; + } + else + { + // Please specify a valid include directory. ''{0}'' is invalid. + ConfigurationException e = new ConfigurationException(); + e.setMessage(11113, new Object[]{dir}); + throw e; + } + } + + private void pushConfigurationFile(String path) + { + String topLevelPath = path.substring(0, path.lastIndexOf('/')); + configurationPathStack.push(topLevelPath); + } +}
http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/bf2e1dc9/core/src/flex/messaging/config/SharedServerSettings.java ---------------------------------------------------------------------- diff --git a/core/src/flex/messaging/config/SharedServerSettings.java b/core/src/flex/messaging/config/SharedServerSettings.java new file mode 100644 index 0000000..8fe815a --- /dev/null +++ b/core/src/flex/messaging/config/SharedServerSettings.java @@ -0,0 +1,65 @@ +/* + * 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 flex.messaging.config; + +/** + * Stores configuration settings for a shared server instance. + * <tt>ServerConfigurationParser</tt> will generate an instance for each shared server + * defined in the configuration file. + * The <tt>MessagingConfiguration</tt> instance using the parser will store these and + * use them to configure the <tt>MessageBroker</tt> with shared server instances. + * + * + */ +public class SharedServerSettings extends PropertiesSettings +{ + private String id; + + public String getId() + { + return id; + } + + public void setId(String value) + { + id = value; + } + + private String className; + + public String getClassName() + { + return className; + } + + public void setClassName(String value) + { + className = value; + } + + private String sourceFile; + + public String getSourceFile() + { + return sourceFile; + } + + public void setSourceFile(String value) + { + sourceFile = value; + } +} http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/bf2e1dc9/core/src/flex/messaging/config/SystemSettings.java ---------------------------------------------------------------------- diff --git a/core/src/flex/messaging/config/SystemSettings.java b/core/src/flex/messaging/config/SystemSettings.java new file mode 100644 index 0000000..cf4cd49 --- /dev/null +++ b/core/src/flex/messaging/config/SystemSettings.java @@ -0,0 +1,300 @@ +/* + * 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 flex.messaging.config; + +import flex.messaging.log.Log; +import flex.messaging.log.Logger; +import flex.messaging.util.PropertyStringResourceLoader; +import flex.messaging.util.ResourceLoader; +import flex.messaging.util.WatchedObject; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +import javax.servlet.ServletContext; + +/** + * + */ +public class SystemSettings +{ + private ResourceLoader resourceLoader; + private Locale defaultLocale; + private boolean enforceEndpointValidation; + private boolean manageable; + private boolean redeployEnabled; + private int watchInterval; + private List watches; + private List touches; + private String uuidGeneratorClassName; + private String dotNetFrameworkVersion; + + public SystemSettings() + { + enforceEndpointValidation = false; + manageable = true; + redeployEnabled = false; + resourceLoader = new PropertyStringResourceLoader(); + touches = new ArrayList(); + watches = new ArrayList(); + watchInterval = 20; + dotNetFrameworkVersion = null; + } + + public void setDefaultLocale(Locale locale) + { + defaultLocale = locale; + resourceLoader.setDefaultLocale(defaultLocale); + } + + public Locale getDefaultLocale() + { + return defaultLocale; + } + + public boolean isManageable() + { + return manageable; + } + + public void setManageable(String manageable) + { + manageable = manageable.toLowerCase(); + if (manageable.startsWith("f")) + this.manageable = false; + } + + public boolean isEnforceEndpointValidation() + { + return enforceEndpointValidation; + } + + public void setEnforceEndpointValidation(String enforceEndpointValidation) + { + if (enforceEndpointValidation == null || enforceEndpointValidation.length() == 0) + return; + if (enforceEndpointValidation.toLowerCase().startsWith("t")) + this.enforceEndpointValidation = true; + } + + public ResourceLoader getResourceLoader() + { + return resourceLoader; + } + + public void setResourceLoader(ResourceLoader resourceLoader) + { + this.resourceLoader = resourceLoader; + } + + public void setRedeployEnabled(String enabled) + { + enabled = enabled.toLowerCase(); + if (enabled.startsWith("t")) + this.redeployEnabled = true; + } + + public boolean getRedeployEnabled() + { + return redeployEnabled; + } + + public void setWatchInterval(String interval) + { + this.watchInterval = Integer.parseInt(interval); + } + + public int getWatchInterval() + { + return watchInterval; + } + + public void addWatchFile(String watch) + { + this.watches.add(watch); + } + + public List getWatchFiles() + { + return watches; + } + + public void addTouchFile(String touch) + { + this.touches.add(touch); + } + + public List getTouchFiles() + { + return touches; + } + + public void setPaths(ServletContext context) + { + if (redeployEnabled) + { + List resolvedWatches = new ArrayList(); + for (int i = 0; i < watches.size(); i++) + { + String path = (String)watches.get(i); + String resolvedPath = null; + if (path.startsWith("{context.root}") || path.startsWith("{context-root}")) + { + path = path.substring(14); + resolvedPath = context.getRealPath(path); + + if (resolvedPath != null) + { + try + { + resolvedWatches.add(new WatchedObject(resolvedPath)); + } + catch (FileNotFoundException fnfe) + { + Logger logger = Log.getLogger(ConfigurationManager.LOG_CATEGORY); + if (logger != null) + { + logger.warn("The watch-file, " + path + ", could not be found and will be ignored."); + } + } + } + else + { + Logger logger = Log.getLogger(ConfigurationManager.LOG_CATEGORY); + logger.warn("The watch-file, " + path + ", could not be resolved to a path and will be ignored."); + } + } + else + { + try + { + resolvedWatches.add(new WatchedObject(path)); + } + catch (FileNotFoundException fnfe) + { + Logger logger = Log.getLogger(ConfigurationManager.LOG_CATEGORY); + if (logger != null) + { + logger.warn("The watch-file, " + path + ", could not be found and will be ignored."); + } + } + } + } + watches = resolvedWatches; + + List resolvedTouches = new ArrayList(); + for (int i = 0; i < touches.size(); i++) + { + String path = (String)touches.get(i); + String resolvedPath = null; + if (path.startsWith("{context.root}") || path.startsWith("{context-root}")) + { + path = path.substring(14); + resolvedPath = context.getRealPath(path); + + if (resolvedPath != null) + { + File file = new File(resolvedPath); + if (!file.exists() || (!file.isFile() && !file.isDirectory()) || (!file.isAbsolute())) + { + Logger logger = Log.getLogger(ConfigurationManager.LOG_CATEGORY); + logger.warn("The touch-file, " + path + ", could not be found and will be ignored."); + } + else + { + resolvedTouches.add(resolvedPath); + } + } + else + { + Logger logger = Log.getLogger(ConfigurationManager.LOG_CATEGORY); + logger.warn("The touch-file, " + path + ", could not be resolved to a path and will be ignored."); + } + } + else + { + try + { + resolvedTouches.add(new WatchedObject(path)); + } + catch (FileNotFoundException fnfe) + { + Logger logger = Log.getLogger(ConfigurationManager.LOG_CATEGORY); + if (logger != null) + { + logger.warn("The touch-file, " + path + ", could not be found and will be ignored."); + } + } + } + } + touches = resolvedTouches; + } + } + + /** + * Returns the UUID generator class name. + * + * @return The UUID generator class name. + */ + public String getUUIDGeneratorClassName() + { + return uuidGeneratorClassName; + } + + /** + * Sets the UUID generator class name. + * + * @param value The UUID generator class name. + */ + public void setUUIDGeneratorClassName(String value) + { + uuidGeneratorClassName = value; + } + + /** + * Set the dotnet framework version to use. + * @param version the configured dotnet framework version + */ + public void setDotNetFrameworkVersion(String version) + { + dotNetFrameworkVersion = version; + } + + /** + * Get the dotnet framework version. + * @return String the dotnet framework version + */ + public String getDotNetFrameworkVersion() + { + return dotNetFrameworkVersion; + } + /** + * Clean up static member variables. + */ + public void clear() + { + resourceLoader = null; + defaultLocale = null; + watches = null; + touches = null; + dotNetFrameworkVersion = null; + } + +} http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/bf2e1dc9/core/src/flex/messaging/config/ThrottleSettings.java ---------------------------------------------------------------------- diff --git a/core/src/flex/messaging/config/ThrottleSettings.java b/core/src/flex/messaging/config/ThrottleSettings.java new file mode 100644 index 0000000..96b5a3b --- /dev/null +++ b/core/src/flex/messaging/config/ThrottleSettings.java @@ -0,0 +1,373 @@ +/* + * 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 flex.messaging.config; + +/** + * This configuration class is derived from optional properties that + * may be supplied in the <properties> section of a destination. + * It exists to capture properties related to message throttling in a way + * that simplifies the ThrottleManager's usage of the configuration. + */ +public class ThrottleSettings +{ + /** + * The Policy enum. + */ + public enum Policy + { + NONE, + ERROR, + IGNORE, + BUFFER, + CONFLATE + }; + + + public static final String ELEMENT_INBOUND = "throttle-inbound"; + + public static final String ELEMENT_OUTBOUND = "throttle-outbound"; + + public static final String ELEMENT_POLICY = "policy"; + + public static final String ELEMENT_DEST_FREQ = "max-frequency"; + + public static final String ELEMENT_CLIENT_FREQ = "max-client-frequency"; + + // Errors + private static final int ERR_MSG_INVALID_INBOUND_POLICY = 11130; + private static final int ERR_MSG_INVALID_INCOMING_CLENT_FREQ = 11131; + private static final int ERR_MSG_INVALID_INCOMING_DEST_FREQ = 11132; + private static final int ERR_MSG_INVALID_OUTGOING_CLIENT_FREQ = 11133; + private static final int ERR_MSG_INVALID_OUTGOING_DEST_FREQ = 11134; + private static final int ERR_MSG_INVALID_NEGATIVE_VALUE = 11135; + + private String destinationName; + private int inClientMessagesPerSec; + private int inDestinationMessagesPerSec; + private int outClientMessagesPerSec; + private int outDestinationMessagesPerSec; + private Policy inPolicy; + private Policy outPolicy; + + /** + * Creates a <code>ThrottleSettings</code> instance with default settings. + */ + public ThrottleSettings() + { + inPolicy = Policy.NONE; + outPolicy = Policy.NONE; + } + + /** + * Parses the throttle policy out of the given string. + * + * @param policy The string policy to parse. + * @return The Policy. + */ + public static Policy parsePolicy(String policy) + { + if (Policy.NONE.toString().equalsIgnoreCase(policy)) + return Policy.NONE; + else if (Policy.IGNORE.toString().equalsIgnoreCase(policy)) + return Policy.IGNORE; + else if (Policy.ERROR.toString().equalsIgnoreCase(policy)) + return Policy.ERROR; + else if (Policy.BUFFER.toString().equalsIgnoreCase(policy)) + return Policy.BUFFER; + else if (Policy.CONFLATE.toString().equalsIgnoreCase(policy)) + return Policy.CONFLATE; + + ConfigurationException ex = new ConfigurationException(); + // Message will be set by the caller. + throw ex; + } + + /** + * Returns true if inbound or outbound client throttling is enabled. + * + * @return True if the incoming client frequency or outgoing + * client frequency is enabled; otherwise false. + */ + public boolean isClientThrottleEnabled() + { + return isInboundClientThrottleEnabled() || isOutboundClientThrottleEnabled(); + } + + /** + * Returns true if inbound client throttling is enabled. + * + * @return True if the inbound client throttling is enabled. + */ + public boolean isInboundClientThrottleEnabled() + { + return inPolicy != Policy.NONE && getIncomingClientFrequency() > 0; + } + + /** + * Returns true if outbound client throttling is enabled. + * + * @return True if the outbound client throttling is enabled. + */ + public boolean isOutboundClientThrottleEnabled() + { + return outPolicy != Policy.NONE && getOutgoingClientFrequency() > 0; + } + + /** + * Returns true if inbound or outbound destination throttling is enabled. + * + * @return true if incoming or outbound destination throttling is enabled; + * otherwise false. + */ + public boolean isDestinationThrottleEnabled() + { + return isInboundDestinationThrottleEnabled() || isOutboundDestinationThrottleEnabled(); + } + + /** + * Returns true if inbound destination throttling is enabled. + * + * @return true if inbound destination throttling is enabled. + */ + public boolean isInboundDestinationThrottleEnabled() + { + return inPolicy != Policy.NONE && getIncomingDestinationFrequency() > 0; + } + + /** + * Returns true if outbound destination throttling is enabled. + * + * @return true if outbound destination throttling is enabled. + */ + public boolean isOutboundDestinationThrottleEnabled() + { + return outPolicy != Policy.NONE && getOutgoingDestinationFrequency() > 0; + } + + /** + * Returns the inbound throttle policy. + * + * @return the inbound throttle policy. + */ + public Policy getInboundPolicy() + { + return inPolicy; + } + + /** + * Sets inbound throttle policy. The inbound policy may be NONE, ERROR, or IGNORE. + * + * @param inPolicy The inbound policy. + */ + public void setInboundPolicy(Policy inPolicy) + { + if (inPolicy != Policy.NONE && inPolicy != Policy.ERROR && inPolicy != Policy.IGNORE) + { + ConfigurationException ex = new ConfigurationException(); + // Invalid inbound throttle policy ''{0}'' for destination ''{1}''. Valid values are 'NONE', 'ERROR', and 'IGNORE'. + ex.setMessage(ERR_MSG_INVALID_INBOUND_POLICY, new Object[]{inPolicy, destinationName}); + throw ex; + } + this.inPolicy = inPolicy; + } + + /** + * Returns the outbound throttle policy. + * + * @return the outbound throttle policy. + */ + public Policy getOutboundPolicy() + { + return outPolicy; + } + + /** + * Sets the outbound throttle policy. The outbound policy can be NONE, IGNORE, + * BUFFER, or CONFLATE. + * + * @param outPolicy The outbound policy. + */ + public void setOutboundPolicy(Policy outPolicy) + { + // Policy is checked at throttle manager. + this.outPolicy = outPolicy; + } + + /** + * Returns the destination name for <code>ThrottleSettings</code>. + * + * @return the destination name for <code>ThrottleSettings</code>. + */ + public String getDestinationName() + { + return destinationName; + } + + /** + * Sets the destination name for <code>ThrottleSettings</code>. This is set + * automatically when <code>NetworkSettings</code> is assigned to a destination. + * + * @param destinationName The destination name. + */ + public void setDestinationName(String destinationName) + { + this.destinationName = destinationName; + } + + /** + * Returns the incoming client frequency (max-client-frequency). + * + * @return The incoming client frequency (max-client-frequency). + */ + public int getIncomingClientFrequency() + { + return inClientMessagesPerSec; + } + + /** + * Sets the incoming client frequency (max-client-frequency). Optional and the + * default value is 0. Note that the incoming client frequency cannot be more + * than the incoming destination frequency. + * + * @param n The incoming client frequency. + */ + public void setIncomingClientFrequency(int n) + { + String name = "incoming client frequency"; + blockNegative(n, name); + + if (inDestinationMessagesPerSec > 0 && n > inDestinationMessagesPerSec) + { + ConfigurationException ex = new ConfigurationException(); + // Invalid {0} for destination ''{1}''. {0} ''{2}'' cannot be more than the incoming destination frequency ''{3}''. + ex.setMessage(ERR_MSG_INVALID_INCOMING_CLENT_FREQ, new Object[]{name, destinationName, + Integer.valueOf(n), Integer.valueOf(inDestinationMessagesPerSec)}); + throw ex; + } + this.inClientMessagesPerSec = n; + } + + /** + * Returns the incoming destination frequency (max-frequency). + * + * @return The incoming destination frequency (max-frequency). + */ + public int getIncomingDestinationFrequency() + { + return inDestinationMessagesPerSec; + } + + /** + * Sets the incoming destination frequency (max-frequency). Optional and the + * default value is 0. Note that the incoming destination frequency cannot be + * less than the incoming client frequency. + * + * @param n The incoming destination frequency. + */ + public void setIncomingDestinationFrequency(int n) + { + String name = "The incoming destination frequency"; + blockNegative(n, name); + + if (inClientMessagesPerSec > 0 && n < inClientMessagesPerSec) + { + ConfigurationException ex = new ConfigurationException(); + // Invalid {0} for destination ''{1}''. {0} ''{2}'' cannot be less than the incoming client frequency ''{3}''. + ex.setMessage(ERR_MSG_INVALID_INCOMING_DEST_FREQ, new Object[]{name, destinationName, + Integer.valueOf(n), Integer.valueOf(inClientMessagesPerSec)}); + throw ex; + } + this.inDestinationMessagesPerSec = n; + } + + /** + * Returns the outgoing client frequency (max-client-frequency). + * + * @return The outgoing client frequency (max-client-frequency). + */ + public int getOutgoingClientFrequency() + { + return outClientMessagesPerSec; + } + + /** + * Sets the outgoing client frequency (max-client-frequency). Optional and the + * default value is 0. Note that the outgoing client frequency cannot be + * more than the outgoing destination frequency. + * + * @param n The outgoing client frequency. + */ + public void setOutgoingClientFrequency(int n) + { + String name = "The outgoing client frequency"; + blockNegative(n, name); + + if (outDestinationMessagesPerSec > 0 && n > outDestinationMessagesPerSec) + { + ConfigurationException ex = new ConfigurationException(); + // Invalid {0} for destination ''{1}''. {0} ''{2}'' cannot be more than the outgoing destination frequency ''{3}''. + ex.setMessage(ERR_MSG_INVALID_OUTGOING_CLIENT_FREQ, new Object[]{name, destinationName, + Integer.valueOf(n), Integer.valueOf(outDestinationMessagesPerSec)}); + throw ex; + } + this.outClientMessagesPerSec = n; + } + + /** + * Returns the outgoing destination frequency (max-frequency). + * + * @return The outgoing destination frequency (max-frequency). + */ + public int getOutgoingDestinationFrequency() + { + return outDestinationMessagesPerSec; + } + + /** + * Sets the outgoing destination frequency (max-frequency). Optional and the + * default value is 0. Note that the outgoing destination frequency cannot + * be less than the outgoing client frequency. + * + * @param n The outgoing destination frequency. + */ + public void setOutgoingDestinationFrequency(int n) + { + String name = "The outgoing destination frequency"; + blockNegative(n, name); + + if (outClientMessagesPerSec > 0 && n < outClientMessagesPerSec) + { + ConfigurationException ex = new ConfigurationException(); + // Invalid {0} for destination ''{1}''. {0} ''{2}'' cannot be less than the outgoing client frequency ''{3}''. + ex.setMessage(ERR_MSG_INVALID_OUTGOING_DEST_FREQ, new Object[]{name, destinationName, Integer.valueOf(n), + Integer.valueOf(outClientMessagesPerSec)}); + throw ex; + } + this.outDestinationMessagesPerSec = n; + } + + protected void blockNegative(int n, String name) + { + if (n < 0) + { + ConfigurationException ex = new ConfigurationException(); + // Invalid {0} for destination ''{1}''. {0} cannot be negative. + ex.setMessage(ERR_MSG_INVALID_NEGATIVE_VALUE, new Object[]{name, destinationName}); + throw ex; + } + } +} http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/bf2e1dc9/core/src/flex/messaging/config/ValidatorSettings.java ---------------------------------------------------------------------- diff --git a/core/src/flex/messaging/config/ValidatorSettings.java b/core/src/flex/messaging/config/ValidatorSettings.java new file mode 100644 index 0000000..ed2ab75 --- /dev/null +++ b/core/src/flex/messaging/config/ValidatorSettings.java @@ -0,0 +1,68 @@ +/* + * 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 flex.messaging.config; + +import flex.messaging.validators.DeserializationValidator; + +/** + * Settings class for validators. + */ +public class ValidatorSettings extends PropertiesSettings +{ + private String className; + private String type = DeserializationValidator.class.getName(); + + /** + * Returns the class name. + * + * @return The class name. + */ + public String getClassName() + { + return className; + } + + /** + * Sets the class name. + * + * @param className The class name. + */ + public void setClassName(String className) + { + this.className = className; + } + + /** + * Returns the type of the validator. + * + * @return The type of the validator. + */ + public String getType() + { + return type; + } + + /** + * Sets the type of the validator. + * + * @param type The type of the validator. + */ + public void setType(String type) + { + this.type = type; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/bf2e1dc9/core/src/flex/messaging/config/XPathServerConfigurationParser.java ---------------------------------------------------------------------- diff --git a/core/src/flex/messaging/config/XPathServerConfigurationParser.java b/core/src/flex/messaging/config/XPathServerConfigurationParser.java new file mode 100644 index 0000000..c567f21 --- /dev/null +++ b/core/src/flex/messaging/config/XPathServerConfigurationParser.java @@ -0,0 +1,93 @@ +/* + * 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 flex.messaging.config; + +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +/** + * Uses Sun's JDK 1.5 XPath implementation on a DOM + * representation of a messaging configuration file. + * <p> + * Note: Since reference ids are used between elements, certain + * sections of the document need to be parsed first. + * </p> + * + * + */ +public class XPathServerConfigurationParser extends ServerConfigurationParser +{ + private XPath xpath; + + protected void initializeExpressionQuery() + { + this.xpath = XPathFactory.newInstance().newXPath(); + } + + protected Node selectSingleNode(Node source, String expression) + { + try + { + return (Node) xpath.evaluate + (expression, source, XPathConstants.NODE); + } + catch (XPathExpressionException expressionException) + { + throw wrapException(expressionException); + } + } + + protected NodeList selectNodeList(Node source, String expression) + { + try + { + return (NodeList) xpath.evaluate + (expression, source, XPathConstants.NODESET); + } + catch (XPathExpressionException expressionException) + { + throw wrapException(expressionException); + } + } + + protected Object evaluateExpression(Node source, String expression) + { + try + { + return xpath.evaluate(expression, source, XPathConstants.STRING); + } + catch (XPathExpressionException expressionException) + { + throw wrapException(expressionException); + } + } + + private ConfigurationException wrapException + (XPathExpressionException exception) + { + ConfigurationException result = new ConfigurationException(); + result.setDetails(PARSER_INTERNAL_ERROR); + result.setRootCause(exception); + return result; + } + +} http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/bf2e1dc9/core/src/flex/messaging/config/package-info.java ---------------------------------------------------------------------- diff --git a/core/src/flex/messaging/config/package-info.java b/core/src/flex/messaging/config/package-info.java new file mode 100644 index 0000000..266fd52 --- /dev/null +++ b/core/src/flex/messaging/config/package-info.java @@ -0,0 +1,18 @@ +/* + * 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 flex.messaging.config; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/flex-blazeds/blob/bf2e1dc9/core/src/flex/messaging/endpoints/AMFEndpoint.java ---------------------------------------------------------------------- diff --git a/core/src/flex/messaging/endpoints/AMFEndpoint.java b/core/src/flex/messaging/endpoints/AMFEndpoint.java new file mode 100644 index 0000000..1f94c4b --- /dev/null +++ b/core/src/flex/messaging/endpoints/AMFEndpoint.java @@ -0,0 +1,152 @@ +/* + * 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 flex.messaging.endpoints; + +import flex.management.runtime.messaging.endpoints.AMFEndpointControl; +import flex.messaging.MessageBroker; +import flex.messaging.io.MessageIOConstants; +import flex.messaging.endpoints.amf.AMFFilter; +import flex.messaging.endpoints.amf.BatchProcessFilter; +import flex.messaging.endpoints.amf.LegacyFilter; +import flex.messaging.endpoints.amf.MessageBrokerFilter; +import flex.messaging.endpoints.amf.SerializationFilter; +import flex.messaging.endpoints.amf.SessionFilter; +import flex.messaging.log.LogCategories; + +/** + * AMF based endpoint for Flex Messaging. Based on the Flash Remoting gateway servlet. + */ +public class AMFEndpoint extends BasePollingHTTPEndpoint +{ + /** + * The log category for this endpoint. + */ + public static final String LOG_CATEGORY = LogCategories.ENDPOINT_AMF; + + //-------------------------------------------------------------------------- + // + // Constructors + // + //-------------------------------------------------------------------------- + + /** + * Constructs an unmanaged <code>AMFEndpoint</code>. + */ + public AMFEndpoint() + { + this(false); + } + + /** + * Constructs an <code>AMFEndpoint</code> with the indicated management. + * + * @param enableManagement <code>true</code> if the <code>AMFEndpoint</code> + * is manageable; <code>false</code> otherwise. + */ + public AMFEndpoint(boolean enableManagement) + { + super(enableManagement); + } + + //-------------------------------------------------------------------------- + // + // Protected/Private Methods + // + //-------------------------------------------------------------------------- + + /** + * Create the gateway filters that transform action requests + * and responses. + */ + @Override protected AMFFilter createFilterChain() + { + AMFFilter serializationFilter = new SerializationFilter(getLogCategory()); + AMFFilter batchFilter = new BatchProcessFilter(); + AMFFilter sessionFilter = sessionRewritingEnabled? new SessionFilter() : null; + AMFFilter envelopeFilter = new LegacyFilter(this); + AMFFilter messageBrokerFilter = new MessageBrokerFilter(this); + + serializationFilter.setNext(batchFilter); + if (sessionFilter != null) + { + batchFilter.setNext(sessionFilter); + sessionFilter.setNext(envelopeFilter); + } + else + { + batchFilter.setNext(envelopeFilter); + } + envelopeFilter.setNext(messageBrokerFilter); + + return serializationFilter; + } + + /** + * Returns MessageIOConstants.AMF_CONTENT_TYPE. + * + * @return MessageIOConstants.AMF_CONTENT_TYPE + */ + @Override protected String getResponseContentType() + { + return MessageIOConstants.AMF_CONTENT_TYPE; + } + + /** + * Returns the log category of the endpoint. + * + * @return The log category of the endpoint. + */ + @Override protected String getLogCategory() + { + return LOG_CATEGORY; + } + + /** + * Returns the deserializer class name used by the endpoint. + * + * @return The deserializer class name used by the endpoint. + */ + @Override protected String getDeserializerClassName() + { + return "flex.messaging.io.amf.AmfMessageDeserializer"; + } + + /** + * Returns the serializer class name used by the endpoint. + * + * @return The serializer class name used by the endpoint. + */ + @Override protected String getSerializerClassName() + { + return "flex.messaging.io.amf.AmfMessageSerializer"; + } + + + /** + * Invoked automatically to allow the <code>AMFEndpoint</code> to setup its + * corresponding MBean control. + * + * @param broker The <code>MessageBroker</code> that manages this + * <code>AMFEndpoint</code>. + */ + @Override protected void setupEndpointControl(MessageBroker broker) + { + controller = new AMFEndpointControl(this, broker.getControl()); + controller.register(); + setControl(controller); + } +}
