Author: gk Date: Wed Aug 15 09:39:20 2018 New Revision: 1838075 URL: http://svn.apache.org/viewvc?rev=1838075&view=rev Log: - resolve includes in configuration file relative to configuration base - resolve log4j relative to provided configuration path (and allowing path to be relative) - adding tests for TurbineRequiredRole annotation and configuration - adding MultipartConfig annotation in Turbine.java to allow parser upload - adding plain JSON screen (TODO: integrate better as "First-class citizen") - use ArrayList in FormMessages replacing Vector - downgrading dependency-check version in pom.xml - adding Jeffrey Painter as dev in pom.xml
Added: turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONScreen.java (with props) turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONSecureAnnotatedScreen.java (with props) Modified: turbine/core/trunk/ (props changed) turbine/core/trunk/conf/test/CompleteTurbineResources.properties turbine/core/trunk/conf/test/ConfigurationBuilder.xml turbine/core/trunk/conf/test/TemplateService.properties turbine/core/trunk/conf/test/TestFulcrumComponents.properties turbine/core/trunk/conf/test/TurbineConfiguration.xml turbine/core/trunk/conf/test/TurbineNonPersistentSchedulerServiceTest.properties turbine/core/trunk/conf/test/usersettings.properties turbine/core/trunk/pom.xml turbine/core/trunk/src/changes/changes.xml turbine/core/trunk/src/java/org/apache/turbine/Turbine.java turbine/core/trunk/src/java/org/apache/turbine/modules/screens/JSONScreen.java turbine/core/trunk/src/java/org/apache/turbine/services/avaloncomponent/TurbineYaafiComponentService.java turbine/core/trunk/src/java/org/apache/turbine/util/BrowserDetector.java turbine/core/trunk/src/java/org/apache/turbine/util/FormMessages.java turbine/core/trunk/src/test/org/apache/turbine/ConfigurationTest.java turbine/core/trunk/src/test/org/apache/turbine/annotation/AnnotationProcessorTest.java turbine/core/trunk/src/test/org/apache/turbine/services/LoadingComponentsTest.java Propchange: turbine/core/trunk/ ------------------------------------------------------------------------------ --- svn:ignore (original) +++ svn:ignore Wed Aug 15 09:39:20 2018 @@ -1,20 +1,21 @@ -target -cactus_client.log -cactus_server.log -maven.log -velocity.log* +*.ser *~ .classpath -.project +.deployment .externalToolBuilders -logs -junit*.properties -turbine-pom-snapshot-version -*.ser +.idea +.project .settings Deployment -.deployment +cactus_client.log +cactus_server.log +junit*.properties +logs maven-eclipse.xml +maven.log +target +turbine-pom-snapshot-version turbine.iml turbine.ipr turbine.iws +velocity.log* Modified: turbine/core/trunk/conf/test/CompleteTurbineResources.properties URL: http://svn.apache.org/viewvc/turbine/core/trunk/conf/test/CompleteTurbineResources.properties?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/conf/test/CompleteTurbineResources.properties (original) +++ turbine/core/trunk/conf/test/CompleteTurbineResources.properties Wed Aug 15 09:39:20 2018 @@ -23,7 +23,7 @@ pipeline.default.descriptor = /conf/turb # # ------------------------------------------------------------------- -log4j.file = /conf/test/Log4j.properties +log4j.file = Log4j.properties # ------------------------------------------------------------------- # Modified: turbine/core/trunk/conf/test/ConfigurationBuilder.xml URL: http://svn.apache.org/viewvc/turbine/core/trunk/conf/test/ConfigurationBuilder.xml?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/conf/test/ConfigurationBuilder.xml (original) +++ turbine/core/trunk/conf/test/ConfigurationBuilder.xml Wed Aug 15 09:39:20 2018 @@ -5,9 +5,9 @@ <!-- Meta data about the resulting combined configuration --> </header> <override><!-- only allowed configurations are user and turbine, relative paths --> - <properties config-name="user" fileName="conf/test/usersettings.properties" config-optional="true" config-forceCreate="true"/> - <xml fileName="conf/test/TurbineResources.xml"/> - <properties config-name="turbine" fileName="conf/test/TemplateService.properties" throwExceptionOnMissing="true"/> + <properties config-name="user" fileName="usersettings.properties" config-optional="true" config-forceCreate="true"/> + <xml fileName="TurbineResources.xml"/> + <properties config-name="turbine" fileName="TemplateService.properties" throwExceptionOnMissing="true"/> </override> <additional> <!-- Configuration declarations that form a union configuration, always provide a unique config-name attribute --> Modified: turbine/core/trunk/conf/test/TemplateService.properties URL: http://svn.apache.org/viewvc/turbine/core/trunk/conf/test/TemplateService.properties?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/conf/test/TemplateService.properties (original) +++ turbine/core/trunk/conf/test/TemplateService.properties Wed Aug 15 09:39:20 2018 @@ -15,7 +15,10 @@ # specific language governing permissions and limitations # under the License. -log4j.file = /conf/test/Log4j.properties +log4j.file = Log4j.properties +#log4j.file = none +# or resolve relatively e.g. +#log4j.file = ../../conf/Log4j.properties pipeline.default.descriptor = conf/turbine-classic-pipeline.xml module.cache=false Modified: turbine/core/trunk/conf/test/TestFulcrumComponents.properties URL: http://svn.apache.org/viewvc/turbine/core/trunk/conf/test/TestFulcrumComponents.properties?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/conf/test/TestFulcrumComponents.properties (original) +++ turbine/core/trunk/conf/test/TestFulcrumComponents.properties Wed Aug 15 09:39:20 2018 @@ -21,7 +21,8 @@ # # ------------------------------------------------------------------- -log4j.file = /conf/test/Log4j.properties +log4j.file = Log4j.properties +# context path: cft. javax.servlet.ServletContext.getResource(String) pipeline.default.descriptor = conf/turbine-classic-pipeline.xml Modified: turbine/core/trunk/conf/test/TurbineConfiguration.xml URL: http://svn.apache.org/viewvc/turbine/core/trunk/conf/test/TurbineConfiguration.xml?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/conf/test/TurbineConfiguration.xml (original) +++ turbine/core/trunk/conf/test/TurbineConfiguration.xml Wed Aug 15 09:39:20 2018 @@ -19,8 +19,8 @@ --> <configuration> - <xml fileName="conf/test/TurbineResources.xml"/> - <properties fileName="conf/test/TemplateService.properties"/> + <xml fileName="TurbineResources.xml"/> + <properties fileName="TemplateService.properties"/> </configuration> Modified: turbine/core/trunk/conf/test/TurbineNonPersistentSchedulerServiceTest.properties URL: http://svn.apache.org/viewvc/turbine/core/trunk/conf/test/TurbineNonPersistentSchedulerServiceTest.properties?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/conf/test/TurbineNonPersistentSchedulerServiceTest.properties (original) +++ turbine/core/trunk/conf/test/TurbineNonPersistentSchedulerServiceTest.properties Wed Aug 15 09:39:20 2018 @@ -21,7 +21,7 @@ # # ------------------------------------------------------------------- -log4j.file = /conf/test/Log4j.properties +log4j.file = Log4j.properties # resource relative to context pipeline.default.descriptor = /conf/turbine-classic-pipeline.xml Modified: turbine/core/trunk/conf/test/usersettings.properties URL: http://svn.apache.org/viewvc/turbine/core/trunk/conf/test/usersettings.properties?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/conf/test/usersettings.properties (original) +++ turbine/core/trunk/conf/test/usersettings.properties Wed Aug 15 09:39:20 2018 @@ -1,3 +1,6 @@ +log4j.file = Log4j.properties +# or resolve relatively +#log4j.file = ../../conf/Log4j.properties module.cache=false -include = conf/test/testinclude.properties +include = testinclude.properties Modified: turbine/core/trunk/pom.xml URL: http://svn.apache.org/viewvc/turbine/core/trunk/pom.xml?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/pom.xml (original) +++ turbine/core/trunk/pom.xml Wed Aug 15 09:39:20 2018 @@ -123,6 +123,14 @@ <timezone /> </developer> <developer> + <id>painter</id> + <name>Jeffery Painter</name> + <email>j...@jivecast.com</email> + <url /> + <organization /> + <timezone /> + </developer> + <developer> <id>mpoeschl</id> <name>Martin Poeschl</name> <email>mpoes...@marmot.at</email> @@ -516,7 +524,7 @@ <plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> - <version>3.3.0</version><!-- requires mvn version > 3.3! For older version try to check v 3.2.1 or 3.1.2 --> + <version>3.1.2</version><!-- requires mvn version > 3.3! For older version try to check v 3.2.1 or 3.1.2 --> <executions> <execution> <goals> Modified: turbine/core/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/changes/changes.xml?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/src/changes/changes.xml (original) +++ turbine/core/trunk/src/changes/changes.xml Wed Aug 15 09:39:20 2018 @@ -25,6 +25,10 @@ <body> <release version="5.0" date="in Subversion"> + <action type="update" dev="gk"> + Configuration pathes and log4j path are now all relative to base configuration file (included from). + Adding screens for plain JSON + </action> <action type="update" dev="tv"> Update dependency commons-configuration to 2.2 Configuration pathes are now all relative to application root. Modified: turbine/core/trunk/src/java/org/apache/turbine/Turbine.java URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/java/org/apache/turbine/Turbine.java?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/src/java/org/apache/turbine/Turbine.java (original) +++ turbine/core/trunk/src/java/org/apache/turbine/Turbine.java Wed Aug 15 09:39:20 2018 @@ -24,6 +24,9 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -32,6 +35,7 @@ import java.util.Properties; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; +import javax.servlet.annotation.MultipartConfig; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; @@ -42,13 +46,13 @@ import javax.xml.bind.Unmarshaller; import javax.xml.parsers.FactoryConfigurationError; import org.apache.commons.configuration2.Configuration; -import org.apache.commons.configuration2.FileBasedConfiguration; import org.apache.commons.configuration2.PropertiesConfiguration; import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder; import org.apache.commons.configuration2.builder.combined.CombinedConfigurationBuilder; import org.apache.commons.configuration2.builder.fluent.Parameters; import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler; import org.apache.commons.configuration2.io.HomeDirectoryLocationStrategy; +import org.apache.commons.lang.NotImplementedException; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.exception.ExceptionUtils; import org.apache.commons.logging.Log; @@ -117,7 +121,7 @@ import org.apache.turbine.util.uri.URICo value = TurbineConstants.LOGGING_ROOT_DEFAULT), @WebInitParam(name = TurbineConfig.PROPERTIES_PATH_KEY, value = TurbineConfig.PROPERTIES_PATH_DEFAULT) } ) - +@MultipartConfig public class Turbine extends HttpServlet { /** Serial version */ @@ -184,6 +188,8 @@ public class Turbine extends HttpServlet { XML, PROPERTIES, + JSON, + YAML, UNSET } @@ -343,34 +349,44 @@ public class Turbine extends HttpServlet // now begin loading Parameters params = new Parameters(); - String confPath = new File(getApplicationRoot()).getCanonicalPath(); - + File confPath = new File(getApplicationRoot()); //.getCanonicalPath(); + + if (confFile.startsWith( "/" )) + { + confFile = confFile.substring( 1 ); // cft. RFC2396 should not start with a slash, if not absolute path + } + + Path confFileRelativePath = Paths.get( confFile );// relative to later join + Path targetPath = Paths.get( confPath.toURI() ); + targetPath = targetPath.resolve( confFileRelativePath ); + + confPath = targetPath.getParent().normalize().toFile();// base part, normally conf folder + confFile = targetPath.getFileName().toString(); + switch (confStyle) { case XML: - if (confFile.startsWith( "/" )) - { - confFile = confFile.substring( 1 ); // cft. RFC2396 should not start with a slash, if not absolute path - } - // relative base path used for this and child configuration files CombinedConfigurationBuilder combinedBuilder = new CombinedConfigurationBuilder() .configure(params.fileBased() .setFileName(confFile) .setListDelimiterHandler(new DefaultListDelimiterHandler(',')) - .setLocationStrategy(new HomeDirectoryLocationStrategy(confPath, false))); + .setLocationStrategy(new HomeDirectoryLocationStrategy(confPath.getCanonicalPath(), false))); configuration = combinedBuilder.getConfiguration(); break; case PROPERTIES: - FileBasedConfigurationBuilder<FileBasedConfiguration> propertiesBuilder = - new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class) + FileBasedConfigurationBuilder<PropertiesConfiguration> propertiesBuilder = + new FileBasedConfigurationBuilder<>( + PropertiesConfiguration.class) .configure(params.properties() .setFileName(confFile) .setListDelimiterHandler(new DefaultListDelimiterHandler(',')) - .setLocationStrategy(new HomeDirectoryLocationStrategy(confPath, false))); + .setLocationStrategy(new HomeDirectoryLocationStrategy(confPath.getCanonicalPath(), false))); configuration = propertiesBuilder.getConfiguration(); break; + case JSON: case YAML: + throw new NotImplementedException("JSON or XAML configuration style not yet implemented!"); default: break; @@ -378,7 +394,7 @@ public class Turbine extends HttpServlet // // Set up logging as soon as possible // - configureLogging(); + configureLogging(targetPath); // Now report our successful configuration to the world log.info("Loaded configuration (" + confStyle + ") from " + confFile + " style: " + configuration.toString()); @@ -436,18 +452,27 @@ public class Turbine extends HttpServlet /** * Configure the logging facilities of Turbine + * @param targetPath * * @throws IOException if the configuration file handling fails. */ - protected void configureLogging() throws IOException + protected void configureLogging(Path targetPath) throws IOException { String log4jFile = configuration.getString(TurbineConstants.LOG4J_CONFIG_FILE, TurbineConstants.LOG4J_CONFIG_FILE_DEFAULT); + + if (log4jFile.startsWith( "/" )) + { + log4jFile = log4jFile.substring( 1 ); + } + // log4j must either share path with configuration path or resolved relatively + Path log4jTarget = targetPath.getParent().resolve( log4jFile ).normalize(); if (StringUtils.isNotEmpty(log4jFile) && - !log4jFile.equalsIgnoreCase("none")) + !log4jFile.equalsIgnoreCase("none") && Files.exists( log4jTarget )) { - log4jFile = getRealPath(log4jFile); + log4jFile = log4jTarget.toFile().getAbsolutePath(); + boolean success = false; if (log4jFile.endsWith(".xml")) Modified: turbine/core/trunk/src/java/org/apache/turbine/modules/screens/JSONScreen.java URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/java/org/apache/turbine/modules/screens/JSONScreen.java?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/src/java/org/apache/turbine/modules/screens/JSONScreen.java (original) +++ turbine/core/trunk/src/java/org/apache/turbine/modules/screens/JSONScreen.java Wed Aug 15 09:39:20 2018 @@ -99,7 +99,7 @@ public class JSONScreen extends RawScree /** * Output the dynamic content. * - * Encodign is UTF-8. @{@link #JSONRPC_CONTENT_TYPE}: {@value #JSONRPC_CONTENT_TYPE}. + * Encoding is UTF-8. @{@link #JSONRPC_CONTENT_TYPE}: {@value #JSONRPC_CONTENT_TYPE}. * * @param pipelineData The PipelineData object. */ Added: turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONScreen.java URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONScreen.java?rev=1838075&view=auto ============================================================================== --- turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONScreen.java (added) +++ turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONScreen.java Wed Aug 15 09:39:20 2018 @@ -0,0 +1,99 @@ +package org.apache.turbine.modules.screens; + +import java.io.OutputStreamWriter; +import java.io.PrintWriter; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.turbine.pipeline.PipelineData; +import org.apache.turbine.util.RunData; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +/** + * A Screen class for dealing with JSON requests. Typically you would + * extend this class and override the doOutput() method to use it by setting the JSON output into + * rundata.setMessage( serialized ). + * As convenience you may use inject in your extended class the Turbine service JsonService + * Use {@link PlainJSONSecureAnnotatedScreen} if you need the user to be + * logged in or having a special role in prior to executing the functions you provide. + * + * <p>Here is an example from a subclass: + * + * <code> + * + * + * public void doOutput(PipelineData pipelineData) throws Exception + * { + * RunData data = getRunData(pipelineData); + * JSONStrategy strategy = null; + * + * try + * { + * strategy = new XYStrategy(); + * // the result goes into rundata.message + * strategy.execute(data, jsonService); + * } + * catch ( Exception e ) + * { + * log.error( "init failed for "+strategy , e); + * String msg = new JSONObject().put("error", e.getMessage()).toString(); + * data.setMessage( msg ); + * } + * + * super.doOutput(data); + * } + * </code> + * + * + * @author gk + * @version $Id$ + */ +public class PlainJSONScreen extends RawScreen +{ + protected static final String JSON_TYPE = "application/json;charset=utf-8"; + + protected final static int BUFFER_SIZE = 4096; + + static final Logger log = LoggerFactory.getLogger(PlainJSONScreen.class); + + /** Injected service instance */ + //@TurbineService + //protected JsonService jsonService; + + /** + * @see org.apache.turbine.modules.screens.RawScreen#getContentType(org.apache.turbine.pipeline.PipelineData) + */ + @Override + protected String getContentType(PipelineData pipelineData) + { + return JSON_TYPE; + } + + /** + * Output JSON content set into {@link RunData#getMessage()}. + * + * Encoding is UTF-8. @{@link #JSON_TYPE}: {@value #JSON_TYPE}. + * + * @param pipelineData The PipelineData object. + */ + @Override + protected void doOutput(PipelineData pipelineData) throws Exception + { + RunData data = getRunData(pipelineData); + + HttpServletRequest request = data.getRequest(); + // read in json! + String charset = "UTF-8"; //request.getCharacterEncoding(); + + String json_res =data.getMessage(); + + log.debug( "json_res output:" +json_res ); + PrintWriter out = new PrintWriter( + new OutputStreamWriter(data.getResponse().getOutputStream(),charset)); + out.print(json_res.toString()); + out.flush(); + out.close(); + } +} Propchange: turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONScreen.java ------------------------------------------------------------------------------ svn:eol-style = native Added: turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONSecureAnnotatedScreen.java URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONSecureAnnotatedScreen.java?rev=1838075&view=auto ============================================================================== --- turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONSecureAnnotatedScreen.java (added) +++ turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONSecureAnnotatedScreen.java Wed Aug 15 09:39:20 2018 @@ -0,0 +1,51 @@ +package org.apache.turbine.modules.screens; + +import java.lang.reflect.Method; + +import org.apache.fulcrum.security.model.turbine.TurbineAccessControlList; +import org.apache.turbine.annotation.AnnotationProcessor; +import org.apache.turbine.annotation.AnnotationProcessor.ConditionType; +import org.apache.turbine.annotation.TurbineRequiredRole; +import org.apache.turbine.pipeline.PipelineData; +import org.apache.turbine.util.RunData; + +public class PlainJSONSecureAnnotatedScreen extends PlainJSONScreen +{ + + /** + * This method overrides the method in JSONScreen to perform a security + * check prior to producing the output. + * + * @param pipelineData Turbine information. + * @throws Exception a generic exception. + */ + @Override + public void doOutput(PipelineData pipelineData) throws Exception + { + if (isAuthorized(pipelineData)) + { + super.doOutput(pipelineData); + } + } + + /** + * Use this method to perform the necessary security check with Turbine annotations {@link TurbineRequiredRole} in + * a newly overridden {@link #doOutput(PipelineData)} method. + * + * @param pipelineData Turbine information. + * @return <code>true</code> if the user is authorized to access the screen, by default it is required ACL is populated. + * If {@link TurbineRequiredRole} is not set, it is allowed by default + * @throws Exception A generic exception. + */ + protected boolean isAuthorized(PipelineData pipelineData) throws Exception { + RunData data = getRunData(pipelineData); + Method[] methods = getClass().getMethods(); + for (Method m : methods) { + if (m.getName().equals( "doOutput" )) { + if ((TurbineAccessControlList)data.getACL() == null) return false; + return AnnotationProcessor.isAuthorized( m, (TurbineAccessControlList)data.getACL(), ConditionType.ANY ); + } + } + return false; + } +} Propchange: turbine/core/trunk/src/java/org/apache/turbine/modules/screens/PlainJSONSecureAnnotatedScreen.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: turbine/core/trunk/src/java/org/apache/turbine/services/avaloncomponent/TurbineYaafiComponentService.java URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/java/org/apache/turbine/services/avaloncomponent/TurbineYaafiComponentService.java?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/src/java/org/apache/turbine/services/avaloncomponent/TurbineYaafiComponentService.java (original) +++ turbine/core/trunk/src/java/org/apache/turbine/services/avaloncomponent/TurbineYaafiComponentService.java Wed Aug 15 09:39:20 2018 @@ -135,6 +135,7 @@ public class TurbineYaafiComponentServic this.container = ServiceContainerFactory.create( config ); + //this.container .service( manager ); } catch (Exception e) { Modified: turbine/core/trunk/src/java/org/apache/turbine/util/BrowserDetector.java URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/java/org/apache/turbine/util/BrowserDetector.java?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/src/java/org/apache/turbine/util/BrowserDetector.java (original) +++ turbine/core/trunk/src/java/org/apache/turbine/util/BrowserDetector.java Wed Aug 15 09:39:20 2018 @@ -1,14 +1,5 @@ package org.apache.turbine.util; -import java.util.HashMap; -import java.util.Map; - -import net.sf.uadetector.OperatingSystem; -import net.sf.uadetector.ReadableUserAgent; -import net.sf.uadetector.UserAgentStringParser; -import net.sf.uadetector.VersionNumber; -import net.sf.uadetector.service.UADetectorServiceFactory; - /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -28,6 +19,14 @@ import net.sf.uadetector.service.UADetec * under the License. */ +import java.util.HashMap; +import java.util.Map; + +import net.sf.uadetector.OperatingSystem; +import net.sf.uadetector.ReadableUserAgent; +import net.sf.uadetector.UserAgentStringParser; +import net.sf.uadetector.VersionNumber; +import net.sf.uadetector.service.UADetectorServiceFactory; /** * This class parses the user agent string and provides getters for * its parts. It uses UADetector (http://uadetector.sourceforge.net/) Modified: turbine/core/trunk/src/java/org/apache/turbine/util/FormMessages.java URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/java/org/apache/turbine/util/FormMessages.java?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/src/java/org/apache/turbine/util/FormMessages.java (original) +++ turbine/core/trunk/src/java/org/apache/turbine/util/FormMessages.java Wed Aug 15 09:39:20 2018 @@ -1,6 +1,5 @@ package org.apache.turbine.util; - /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -20,97 +19,89 @@ package org.apache.turbine.util; * under the License. */ - import java.util.Hashtable; import java.util.Iterator; import java.util.List; -import java.util.Vector; +import java.util.ArrayList; /** - * Used for adding and accessing messages that relate to a specific - * form and field. Allows to query for messages by form name and - * field name. Used together with FormMessage class. + * Used for adding and accessing messages that relate to a specific form and field. Allows to query for messages by form + * name and field name. Used together with FormMessage class. * * @author <a href="mailto:ne...@one.lv">Neeme Praks</a> * @version $Id$ */ public class FormMessages { - private final Hashtable<String, Vector<String>> forms_messages; - private final Hashtable<String, Vector<String>> fields_messages; - private final Hashtable<String, Vector<String>> messages_fields; - private final Hashtable<String, Vector<String>> forms_fields; + private final Hashtable<String, List<String>> forms_messages; + + private final Hashtable<String, List<String>> fields_messages; + + private final Hashtable<String, List<String>> messages_fields; + + private final Hashtable<String, List<String>> forms_fields; /** * Constructor. */ public FormMessages() { - forms_messages = new Hashtable<String, Vector<String>>(); - fields_messages = new Hashtable<String, Vector<String>>(); - messages_fields = new Hashtable<String, Vector<String>>(); - forms_fields = new Hashtable<String, Vector<String>>(); + forms_messages = new Hashtable<String, List<String>>(); + fields_messages = new Hashtable<String, List<String>>(); + messages_fields = new Hashtable<String, List<String>>(); + forms_fields = new Hashtable<String, List<String>>(); } /** - * Sets a message for a field of a form. The message is given as - * a long representing a return code. + * Sets a message for a field of a form. The message is given as a long representing a return code. * * @param formName A String with the form name. * @param fieldName A String with the field name. * @param returnCode A long with the return code. */ - public void setMessage(String formName, - String fieldName, - long returnCode) + public void setMessage( String formName, String fieldName, long returnCode ) { - setMessage(formName, fieldName, String.valueOf(returnCode)); + setMessage( formName, fieldName, String.valueOf( returnCode ) ); } /** - * Sets a message for a field of a form. The message is given as - * a String. + * Sets a message for a field of a form. The message is given as a String. * * @param formName A String with the form name. * @param fieldName A String with the field name. * @param messageName A String with the message. */ - public void setMessage(String formName, - String fieldName, - String messageName) + public void setMessage( String formName, String fieldName, String messageName ) { fieldName = formName + "-" + fieldName; - addValue(forms_messages, formName, messageName); - addValue(fields_messages, fieldName, messageName); - addValue(messages_fields, messageName, fieldName); - addValue(forms_fields, formName, fieldName); + addValue( forms_messages, formName, messageName ); + addValue( fields_messages, fieldName, messageName ); + addValue( messages_fields, messageName, fieldName ); + addValue( forms_fields, formName, fieldName ); } /** - * Adds a pair key/value to a table, making sure not to add - * duplicate keys. + * Adds a pair key/value to a table, making sure not to add duplicate keys. * * @param table A Hashtable. * @param key A String with the key. * @param value A String with value. */ - private void addValue(Hashtable<String, Vector<String>> table, - String key, - String value) + private void addValue( Hashtable<String, List<String>> table, String key, String value ) { - Vector<String> values; + List<String> values; - if (!table.containsKey(key)) + if ( !table.containsKey( key ) ) { - values = new Vector<String>(); - values.addElement(value); - table.put(key, values); + values = new ArrayList<String>(); + values.add( value ); + table.put( key, values ); } else { - values = table.get(key); - if (!values.contains(value)) - values.addElement(value); + values = table.get( key ); + if ( !values.contains( value ) ) + values.add( value ); } } @@ -119,11 +110,11 @@ public class FormMessages * * @param table A Hashtable. * @param key A String with the key. - * @return A Vector with the pair key/value, or null. + * @return A List with the pair key/value, or null. */ - private final Vector<String> getValues(Hashtable<String, Vector<String>> table, String key) + private final List<String> getValues( Hashtable<String, List<String>> table, String key ) { - return table.get(key); + return table.get( key ); } /** @@ -132,26 +123,26 @@ public class FormMessages * @param formName A String with the form name. * @return A FormMessage[]. */ - public FormMessage[] getFormMessages(String formName) + public FormMessage[] getFormMessages( String formName ) { - Vector<String> messages, fields; + List<String> messages, fields; String messageName, fieldName; - messages = getValues(forms_messages, formName); - if (messages != null) + messages = getValues( forms_messages, formName ); + if ( messages != null ) { FormMessage[] result = new FormMessage[messages.size()]; - for (int i = 0; i < messages.size(); i++) + for ( int i = 0; i < messages.size(); i++ ) { - result[i] = new FormMessage(formName); - messageName = messages.elementAt(i); - result[i].setMessage(messageName); - fields = getValues(messages_fields, messageName); - for (int j = 0; j < fields.size(); j++) + result[i] = new FormMessage( formName ); + messageName = messages.get( i ); + result[i].setMessage( messageName ); + fields = getValues( messages_fields, messageName ); + for ( int j = 0; j < fields.size(); j++ ) { - fieldName = fields.elementAt(j); - if (formHasField(formName, fieldName)) + fieldName = fields.get( j ); + if ( formHasField( formName, fieldName ) ) { - result[i].setFieldName(fieldName); + result[i].setFieldName( fieldName ); } } } @@ -167,21 +158,21 @@ public class FormMessages * @param fieldName A String with the field name. * @return A FormMessage[]. */ - public FormMessage[] getFormMessages(String formName, String fieldName) + public FormMessage[] getFormMessages( String formName, String fieldName ) { String key = formName + "-" + fieldName; - Vector<String> messages = getValues(fields_messages, key); + List<String> messages = getValues( fields_messages, key ); String messageName; - if (messages != null) + if ( messages != null ) { FormMessage[] result = new FormMessage[messages.size()]; - for (int i = 0; i < messages.size(); i++) + for ( int i = 0; i < messages.size(); i++ ) { - result[i] = new FormMessage(formName, fieldName); - messageName = messages.elementAt(i); - result[i].setMessage(messageName); + result[i] = new FormMessage( formName, fieldName ); + messageName = messages.get( i ); + result[i].setMessage( messageName ); } return result; } @@ -195,13 +186,12 @@ public class FormMessages * @param fieldName A String with the field name. * @return True if form has the field. */ - private boolean formHasField(String formName, - String fieldName) + private boolean formHasField( String formName, String fieldName ) { - List<String> fields = getValues(forms_fields, formName); - for (Iterator<String> iter = fields.iterator(); iter.hasNext();) + List<String> fields = getValues( forms_fields, formName ); + for ( Iterator<String> iter = fields.iterator(); iter.hasNext(); ) { - if (fieldName.equals(iter.next().toString())) + if ( fieldName.equals( iter.next().toString() ) ) { return true; } Modified: turbine/core/trunk/src/test/org/apache/turbine/ConfigurationTest.java URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/test/org/apache/turbine/ConfigurationTest.java?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/src/test/org/apache/turbine/ConfigurationTest.java (original) +++ turbine/core/trunk/src/test/org/apache/turbine/ConfigurationTest.java Wed Aug 15 09:39:20 2018 @@ -34,6 +34,7 @@ import org.apache.commons.configuration2 import org.apache.turbine.test.BaseTestCase; import org.apache.turbine.util.TurbineConfig; import org.apache.turbine.util.TurbineXmlConfig; +import org.junit.After; import org.junit.Test; /** @@ -55,6 +56,12 @@ public class ConfigurationTest extends B private TurbineConfig tc = null; private TurbineXmlConfig txc = null; + + @After + public void close() { + if (tc != null) tc.dispose(); + if (txc != null) txc.dispose(); + } @Test public void testCreateTurbineWithConfigurationXML() throws Exception @@ -114,7 +121,7 @@ public class ConfigurationTest extends B } @Test - public void testCreateTurbineWithIncludedConfiguration() throws Exception + public void testCreateConfigurationWithIncludedConfiguration() throws Exception { String confPath = Turbine.getRealPath( "/conf/test/usersettings.properties" ); try @@ -133,6 +140,32 @@ public class ConfigurationTest extends B throw e; } } + + @Test + public void testCreateTurbineWithIncludedConfiguration() throws Exception + { + tc = new TurbineConfig(".", "/conf/test/usersettings.properties"); + try + { + tc.initialize(); + + Configuration configuration = Turbine.getConfiguration(); + assertNotNull("No Configuration Object found!", configuration); + assertFalse("Make sure we have values", configuration.isEmpty()); + + String key = "scheduledjob.cache.size"; + assertEquals("Read a config value " + key + ", received:" + configuration.getString(key), "100", configuration.getString(key)); + String key2 ="module.cache"; + assertEquals("Read a config value " + key2 + ", received:" + configuration.getString(key2), "false", configuration.getString(key2)); + } + catch (Exception e) + { + throw e; + } finally + { + tc.dispose(); + } + } @SuppressWarnings("boxing") @Test Modified: turbine/core/trunk/src/test/org/apache/turbine/annotation/AnnotationProcessorTest.java URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/test/org/apache/turbine/annotation/AnnotationProcessorTest.java?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/src/test/org/apache/turbine/annotation/AnnotationProcessorTest.java (original) +++ turbine/core/trunk/src/test/org/apache/turbine/annotation/AnnotationProcessorTest.java Wed Aug 15 09:39:20 2018 @@ -18,21 +18,31 @@ package org.apache.turbine.annotation; * specific language governing permissions and limitations * under the License. */ - +import static org.hamcrest.CoreMatchers.any; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import java.lang.reflect.Method; import java.util.List; import org.apache.commons.configuration2.Configuration; import org.apache.fulcrum.factory.FactoryService; +import org.apache.fulcrum.security.entity.Group; +import org.apache.fulcrum.security.entity.Role; +import org.apache.fulcrum.security.model.turbine.TurbineAccessControlList; +import org.apache.turbine.annotation.AnnotationProcessor.ConditionType; import org.apache.turbine.modules.Screen; import org.apache.turbine.modules.ScreenLoader; import org.apache.turbine.services.assemblerbroker.AssemblerBrokerService; +import org.apache.turbine.util.RunData; import org.apache.turbine.util.TurbineConfig; import org.apache.turbine.util.TurbineException; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; @@ -89,9 +99,14 @@ public class AnnotationProcessorTest { tc.dispose(); } + + @Before + public void setUpBefore() throws Exception + { + } @Test - public void testProcess() throws TurbineException + public void testProcess() throws Exception { AnnotationProcessor.process(this); @@ -112,6 +127,80 @@ public class AnnotationProcessorTest assertNotNull(screenLoader); assertNotNull(asb); assertNotNull(factory); + + } + + @TurbineRequiredRole({"user","admin"}) + public void guardedMethoded() { + + } + + @Test + public void testRequiredRoleMethodProcess() throws Exception + { + RunData data = mock(RunData.class); + TurbineAccessControlList acl = mock(TurbineAccessControlList.class); + Role role = mock(Role.class); + when(role.getName()).thenReturn( "user" ); + Group group = mock(Group.class); + when(acl.hasRole( role.getName() )).thenReturn( true ); + when(data.getACL()).thenReturn(acl ); + + Method[] methods = getClass().getMethods(); + for (Method m : methods) { + if (m.getName().equals( "guardedMethoded" )) { + assertTrue( AnnotationProcessor.isAuthorized( m, (TurbineAccessControlList)data.getACL(), ConditionType.ANY )); + assertFalse( AnnotationProcessor.isAuthorized( m, (TurbineAccessControlList)data.getACL(), ConditionType.COMPOUND )); + } + } + } + + @TurbineRequiredRole({"admin"}) + public void guardedMethodedAdmin() { + + } + + @Test + public void testRequiredRoleAdminMethodProcess() throws Exception + { + RunData data = mock(RunData.class); + TurbineAccessControlList acl = mock(TurbineAccessControlList.class); + Role role = mock(Role.class); + when(role.getName()).thenReturn( "user" ); + Group group = mock(Group.class); + when(acl.hasRole( role.getName() )).thenReturn( true ); + when(data.getACL()).thenReturn(acl ); + + Method[] methods = getClass().getMethods(); + for (Method m : methods) { + if (m.getName().equals( "guardedMethodedAdmin" )) { + assertFalse( AnnotationProcessor.isAuthorized( m, (TurbineAccessControlList)data.getACL(), ConditionType.ANY )); + } + } + } + + public void unguardedMethoded() { + + } + + @Test + public void testUnguardedMethodWProcessDefault() throws Exception + { + RunData data = mock(RunData.class); + TurbineAccessControlList acl = mock(TurbineAccessControlList.class); + Role role = mock(Role.class); + when(role.getName()).thenReturn( "user" ); + Group group = mock(Group.class); + when(acl.hasRole( role.getName() )).thenReturn( false ); + when(data.getACL()).thenReturn(acl ); + + Method[] methods = getClass().getMethods(); + for (Method m : methods) { + if (m.getName().equals( "unguardedMethoded" )) { + // default is true, if not annotated + assertTrue( AnnotationProcessor.isAuthorized( m, (TurbineAccessControlList)data.getACL(), ConditionType.ANY )); + } + } } @Ignore("For performance tests only") @Test Modified: turbine/core/trunk/src/test/org/apache/turbine/services/LoadingComponentsTest.java URL: http://svn.apache.org/viewvc/turbine/core/trunk/src/test/org/apache/turbine/services/LoadingComponentsTest.java?rev=1838075&r1=1838074&r2=1838075&view=diff ============================================================================== --- turbine/core/trunk/src/test/org/apache/turbine/services/LoadingComponentsTest.java (original) +++ turbine/core/trunk/src/test/org/apache/turbine/services/LoadingComponentsTest.java Wed Aug 15 09:39:20 2018 @@ -51,6 +51,20 @@ public class LoadingComponentsTest exten { private static TurbineConfig tc = null; + @BeforeClass + public static void setUp() throws Exception + { + tc = new TurbineConfig(".", "/conf/test/TestFulcrumComponents.properties"); + tc.initialize(); + } + @AfterClass + public static void tearDown() throws Exception + { + if (tc != null) + { + tc.dispose(); + } + } /** * Test to load a couple of Avalon services directly by the @@ -149,19 +163,4 @@ public class LoadingComponentsTest exten assertEquals("ISO-8859-1", s); } - @BeforeClass - public static void setUp() throws Exception - { - tc = new TurbineConfig(".", "/conf/test/TestFulcrumComponents.properties"); - tc.initialize(); - } - @AfterClass - public static void tearDown() throws Exception - { - if (tc != null) - { - tc.dispose(); - } - } - }