@ -0,0 +1,41 @@
|
|||||||
|
package VeraxFeather.authentification;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.security.authentication.AuthenticationManager;
|
||||||
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||||
|
import org.springframework.security.core.Authentication;
|
||||||
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||||
|
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
public class AuthController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private AuthenticationManager authenticationManager;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private JwtUtil jwtTokenUtil;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserDetailsService userDetailsService;
|
||||||
|
|
||||||
|
@PostMapping("/authenticate")
|
||||||
|
public AuthenticationResponse createAuthenticationToken(@RequestBody AuthenticationRequest authenticationRequest) {
|
||||||
|
Authentication authenticate = authenticationManager.authenticate(
|
||||||
|
new UsernamePasswordAuthenticationToken(authenticationRequest.getUsername(), authenticationRequest.getPassword())
|
||||||
|
);
|
||||||
|
|
||||||
|
SecurityContextHolder.getContext().setAuthentication(authenticate);
|
||||||
|
|
||||||
|
final UserDetails userDetails = userDetailsService.loadUserByUsername(authenticationRequest.getUsername());
|
||||||
|
final String jwt = jwtTokenUtil.generateToken(userDetails);
|
||||||
|
|
||||||
|
return new AuthenticationResponse(jwt);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
package VeraxFeather.authentification;
|
||||||
|
|
||||||
|
public class AuthenticationRequest {
|
||||||
|
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
// Getters et setters
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
package VeraxFeather.authentification;
|
||||||
|
|
||||||
|
public class AuthenticationResponse {
|
||||||
|
|
||||||
|
private final String jwt;
|
||||||
|
|
||||||
|
public AuthenticationResponse(String jwt) {
|
||||||
|
this.jwt = jwt;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getJwt() {
|
||||||
|
return jwt;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
package VeraxFeather.authentification;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
|
||||||
|
import org.springframework.security.core.context.SecurityContextHolder;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||||
|
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
|
||||||
|
import org.springframework.util.StringUtils;
|
||||||
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
|
|
||||||
|
import javax.servlet.FilterChain;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class JwtRequestFilter extends OncePerRequestFilter {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private UserDetailsService userDetailsService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private JwtUtil jwtUtil;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doFilterInternal(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, jakarta.servlet.FilterChain filterChain) throws jakarta.servlet.ServletException, IOException {
|
||||||
|
|
||||||
|
final String authorizationHeader = request.getHeader("Authorization");
|
||||||
|
|
||||||
|
String username = null;
|
||||||
|
String jwt = null;
|
||||||
|
|
||||||
|
if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
|
||||||
|
jwt = authorizationHeader.substring(7);
|
||||||
|
username = jwtUtil.extractUsername(jwt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
|
||||||
|
UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);
|
||||||
|
|
||||||
|
if (jwtUtil.validateToken(jwt, userDetails)) {
|
||||||
|
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
|
||||||
|
userDetails, null, userDetails.getAuthorities());
|
||||||
|
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
|
||||||
|
SecurityContextHolder.getContext().setAuthentication(authentication);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filterChain.doFilter(request, response);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package VeraxFeather.authentification;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import io.jsonwebtoken.Claims;
|
||||||
|
import io.jsonwebtoken.Jwts;
|
||||||
|
import io.jsonwebtoken.SignatureAlgorithm;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class JwtUtil {
|
||||||
|
|
||||||
|
@Value("${jwt.secret}")
|
||||||
|
private String secretKey;
|
||||||
|
|
||||||
|
@Value("${jwt.expiration}")
|
||||||
|
private Long expirationTime;
|
||||||
|
|
||||||
|
public String extractUsername(String token) {
|
||||||
|
return extractClaim(token, Claims::getSubject);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date extractExpiration(String token) {
|
||||||
|
return extractClaim(token, Claims::getExpiration);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
|
||||||
|
final Claims claims = extractAllClaims(token);
|
||||||
|
return claimsResolver.apply(claims);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Claims extractAllClaims(String token) {
|
||||||
|
return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean isTokenExpired(String token) {
|
||||||
|
return extractExpiration(token).before(new Date());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean validateToken(String token, UserDetails userDetails) {
|
||||||
|
final String username = extractUsername(token);
|
||||||
|
return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String generateToken(UserDetails userDetails) {
|
||||||
|
Map<String, Object> claims = new HashMap<>();
|
||||||
|
return createToken(claims, userDetails.getUsername());
|
||||||
|
}
|
||||||
|
|
||||||
|
private String createToken(Map<String, Object> claims, String subject) {
|
||||||
|
return Jwts.builder()
|
||||||
|
.setClaims(claims)
|
||||||
|
.setSubject(subject)
|
||||||
|
.setIssuedAt(new Date(System.currentTimeMillis()))
|
||||||
|
.setExpiration(new Date(System.currentTimeMillis() + expirationTime * 1000)) // Expiration time en secondes
|
||||||
|
.signWith(SignatureAlgorithm.HS256, secretKey).compact();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package VeraxFeather.authentification;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.security.authentication.AuthenticationManager;
|
||||||
|
import org.springframework.security.config.Customizer;
|
||||||
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||||
|
import org.springframework.security.config.http.SessionCreationPolicy;
|
||||||
|
import org.springframework.security.core.userdetails.User;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
||||||
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||||
|
import org.springframework.security.oauth2.jose.jws.MacAlgorithm;
|
||||||
|
import org.springframework.security.oauth2.jwt.JwtDecoder;
|
||||||
|
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
|
||||||
|
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
||||||
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
|
|
||||||
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableWebSecurity
|
||||||
|
public class SpringSecurityConfig {
|
||||||
|
|
||||||
|
private String jwtKey = "laclegeneree256….";
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
||||||
|
return http
|
||||||
|
.csrf(csrf -> csrf.disable())
|
||||||
|
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
|
||||||
|
.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
|
||||||
|
.httpBasic(Customizer.withDefaults())
|
||||||
|
.oauth2ResourceServer((oauth2) -> oauth2.jwt(Customizer.withDefaults()))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public JwtDecoder jwtDecoder() {
|
||||||
|
// SecretKeySpec secretKey = new SecretKeySpec(this.jwtKey.getBytes(), "HmacSHA256");
|
||||||
|
// return NimbusJwtDecoder.withSecretKey(secretKey).macAlgorithm(MacAlgorithm.HS256).build();
|
||||||
|
|
||||||
|
return NimbusJwtDecoder.withSecretKey(new SecretKeySpec(jwtKey.getBytes(), "HmacSHA256"))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public UserDetailsService users() {
|
||||||
|
UserDetails user = User.builder().username("user").password(passwordEncoder().encode("password")).roles("USER")
|
||||||
|
.build();
|
||||||
|
return new InMemoryUserDetailsManager(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public BCryptPasswordEncoder passwordEncoder() {
|
||||||
|
return new BCryptPasswordEncoder();
|
||||||
|
}
|
||||||
|
}
|
@ -1 +1,3 @@
|
|||||||
|
jwt.secret=superclesecrete
|
||||||
|
jwt.expiration=604800 # 604800 secondes équivalent à 7 jours
|
||||||
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
artifactId=demo
|
|
||||||
groupId=tp2
|
|
||||||
version=0.0.1-SNAPSHOT
|
|
@ -1,5 +1,4 @@
|
|||||||
tp2\demo\Exception\LivreException.class
|
VeraxFeather\modele\articles\Article.class
|
||||||
tp2\demo\Model\Livre.class
|
VeraxFeather\modele\articles\contenus\Contenu.class
|
||||||
tp2\demo\Exception\LivreExceptionForbidden.class
|
VeraxFeather\modele\articles\IArticlesDataManager.class
|
||||||
tp2\demo\Controller\LivreController.class
|
VeraxFeather\modele\articles\stub\StubArticles.class
|
||||||
tp2\demo\DemoApplication.class
|
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
C:\Users\jeanm\OneDrive\Documents\BUT\cours_s4\servicesWeb\tp2\demo\src\main\java\tp2\demo\Model\Livre.java
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\authentification\JwtRequestFilter.java
|
||||||
C:\Users\jeanm\OneDrive\Documents\BUT\cours_s4\servicesWeb\tp2\demo\src\main\java\tp2\demo\Exception\LivreException.java
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\authentification\SpringSecurityConfig.java
|
||||||
C:\Users\jeanm\OneDrive\Documents\BUT\cours_s4\servicesWeb\tp2\demo\src\main\java\tp2\demo\DemoApplication.java
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\VeraxFeatherApi.java
|
||||||
C:\Users\jeanm\OneDrive\Documents\BUT\cours_s4\servicesWeb\tp2\demo\src\main\java\tp2\demo\Controller\LivreController.java
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\controleurs\ArticlesControleur.java
|
||||||
C:\Users\jeanm\OneDrive\Documents\BUT\cours_s4\servicesWeb\tp2\demo\src\main\java\tp2\demo\Exception\LivreExceptionForbidden.java
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\modele\articles\contenus\ContenuMedia.java
|
||||||
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\modele\articles\Article.java
|
||||||
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\modele\articles\contenus\ContenuParagraphe.java
|
||||||
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\authentification\JwtUtil.java
|
||||||
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\modele\articles\stub\StubArticles.java
|
||||||
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\modele\articles\contenus\Contenu.java
|
||||||
|
C:\Users\jeanm\OneDrive\Documents\BUT\VeraxFeather\src\main\java\VeraxFeather\modele\articles\IArticlesDataManager.java
|
||||||
|
@ -1 +0,0 @@
|
|||||||
tp2\demo\DemoApplicationTests.class
|
|
@ -1 +0,0 @@
|
|||||||
C:\Users\jeanm\OneDrive\Documents\BUT\cours_s4\servicesWeb\tp2\demo\src\test\java\tp2\demo\DemoApplicationTests.java
|
|
@ -1,34 +0,0 @@
|
|||||||
<!--
|
|
||||||
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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
|
|
||||||
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
|
|
||||||
version="3.1">
|
|
||||||
<filter>
|
|
||||||
<filter-name>doxia</filter-name>
|
|
||||||
<filter-class>org.apache.maven.plugins.site.run.DoxiaFilter</filter-class>
|
|
||||||
</filter>
|
|
||||||
|
|
||||||
<filter-mapping>
|
|
||||||
<filter-name>doxia</filter-name>
|
|
||||||
<url-pattern>/*</url-pattern>
|
|
||||||
</filter-mapping>
|
|
||||||
</web-app>
|
|
@ -1,168 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
body {
|
|
||||||
margin: 0px;
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
padding:0px;
|
|
||||||
width: 100%;
|
|
||||||
margin-left: -2px;
|
|
||||||
margin-right: -2px;
|
|
||||||
}
|
|
||||||
acronym {
|
|
||||||
cursor: help;
|
|
||||||
border-bottom: 1px dotted #feb;
|
|
||||||
}
|
|
||||||
table.bodyTable th, table.bodyTable td {
|
|
||||||
padding: 2px 4px 2px 4px;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
div.clear {
|
|
||||||
clear:both;
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
div.clear hr {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
#bannerLeft, #bannerRight {
|
|
||||||
font-size: xx-large;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
#bannerLeft img, #bannerRight img {
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
.xleft, #bannerLeft img {
|
|
||||||
float:left;
|
|
||||||
}
|
|
||||||
.xright, #bannerRight {
|
|
||||||
float:right;
|
|
||||||
}
|
|
||||||
#banner {
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
#breadcrumbs {
|
|
||||||
padding: 3px 10px 3px 10px;
|
|
||||||
}
|
|
||||||
#leftColumn {
|
|
||||||
width: 170px;
|
|
||||||
float:left;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
#bodyColumn {
|
|
||||||
margin-right: 1.5em;
|
|
||||||
margin-left: 197px;
|
|
||||||
}
|
|
||||||
#legend {
|
|
||||||
padding: 8px 0 8px 0;
|
|
||||||
}
|
|
||||||
#navcolumn {
|
|
||||||
padding: 8px 4px 0 8px;
|
|
||||||
}
|
|
||||||
#navcolumn h5 {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
font-size: small;
|
|
||||||
}
|
|
||||||
#navcolumn ul {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
font-size: small;
|
|
||||||
}
|
|
||||||
#navcolumn li {
|
|
||||||
list-style-type: none;
|
|
||||||
background-image: none;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: 0 0.4em;
|
|
||||||
padding-left: 16px;
|
|
||||||
list-style-position: outside;
|
|
||||||
line-height: 1.2em;
|
|
||||||
font-size: smaller;
|
|
||||||
}
|
|
||||||
#navcolumn li.expanded {
|
|
||||||
background-image: url(../images/expanded.gif);
|
|
||||||
}
|
|
||||||
#navcolumn li.collapsed {
|
|
||||||
background-image: url(../images/collapsed.gif);
|
|
||||||
}
|
|
||||||
#navcolumn li.none {
|
|
||||||
text-indent: -1em;
|
|
||||||
margin-left: 1em;
|
|
||||||
}
|
|
||||||
#poweredBy {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
#navcolumn img {
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-bottom: 3px;
|
|
||||||
}
|
|
||||||
#poweredBy img {
|
|
||||||
display:block;
|
|
||||||
margin: 20px 0 20px 17px;
|
|
||||||
}
|
|
||||||
#search img {
|
|
||||||
margin: 0px;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
#search #q, #search #btnG {
|
|
||||||
border: 1px solid #999;
|
|
||||||
margin-bottom:10px;
|
|
||||||
}
|
|
||||||
#search form {
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
#lastPublished {
|
|
||||||
font-size: x-small;
|
|
||||||
}
|
|
||||||
.navSection {
|
|
||||||
margin-bottom: 2px;
|
|
||||||
padding: 8px;
|
|
||||||
}
|
|
||||||
.navSectionHead {
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: x-small;
|
|
||||||
}
|
|
||||||
.section {
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
#footer {
|
|
||||||
padding: 3px 10px 3px 10px;
|
|
||||||
font-size: x-small;
|
|
||||||
}
|
|
||||||
#breadcrumbs {
|
|
||||||
font-size: x-small;
|
|
||||||
margin: 0pt;
|
|
||||||
}
|
|
||||||
.source {
|
|
||||||
padding: 12px;
|
|
||||||
margin: 1em 7px 1em 7px;
|
|
||||||
}
|
|
||||||
.source pre {
|
|
||||||
margin: 0px;
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
#navcolumn img.imageLink, .imageLink {
|
|
||||||
padding-left: 0px;
|
|
||||||
padding-bottom: 0px;
|
|
||||||
padding-top: 0px;
|
|
||||||
padding-right: 2px;
|
|
||||||
border: 0px;
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
@ -1,161 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
body {
|
|
||||||
padding: 0px 0px 10px 0px;
|
|
||||||
}
|
|
||||||
body, td, select, input, li{
|
|
||||||
font-family: Verdana, Helvetica, Arial, sans-serif;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
code{
|
|
||||||
font-family: Courier, monospace;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
a:link {
|
|
||||||
color:#36a;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color:#47a;
|
|
||||||
}
|
|
||||||
a:active, a:hover {
|
|
||||||
color:#69c;
|
|
||||||
}
|
|
||||||
#legend li.externalLink {
|
|
||||||
background: url(../images/external.png) left top no-repeat;
|
|
||||||
padding-left: 18px;
|
|
||||||
}
|
|
||||||
a.externalLink, a.externalLink:link, a.externalLink:visited, a.externalLink:active, a.externalLink:hover {
|
|
||||||
background: url(../images/external.png) right center no-repeat;
|
|
||||||
padding-right: 18px;
|
|
||||||
}
|
|
||||||
#legend li.newWindow {
|
|
||||||
background: url(../images/newwindow.png) left top no-repeat;
|
|
||||||
padding-left: 18px;
|
|
||||||
}
|
|
||||||
a.newWindow, a.newWindow:link, a.newWindow:visited, a.newWindow:active, a.newWindow:hover {
|
|
||||||
background: url(../images/newwindow.png) right center no-repeat;
|
|
||||||
padding-right: 18px;
|
|
||||||
}
|
|
||||||
h2 {
|
|
||||||
padding: 4px 4px 4px 6px;
|
|
||||||
border: 1px solid #999;
|
|
||||||
color: #900;
|
|
||||||
background-color: #ddd;
|
|
||||||
font-weight:900;
|
|
||||||
font-size: x-large;
|
|
||||||
}
|
|
||||||
h3 {
|
|
||||||
padding: 4px 4px 4px 6px;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
color: #900;
|
|
||||||
background-color: #eee;
|
|
||||||
font-weight: normal;
|
|
||||||
font-size: large;
|
|
||||||
}
|
|
||||||
h4 {
|
|
||||||
padding: 4px 4px 4px 6px;
|
|
||||||
border: 1px solid #bbb;
|
|
||||||
color: #900;
|
|
||||||
background-color: #fff;
|
|
||||||
font-weight: normal;
|
|
||||||
font-size: large;
|
|
||||||
}
|
|
||||||
h5 {
|
|
||||||
padding: 4px 4px 4px 6px;
|
|
||||||
color: #900;
|
|
||||||
font-size: medium;
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
line-height: 1.3em;
|
|
||||||
font-size: small;
|
|
||||||
}
|
|
||||||
#breadcrumbs {
|
|
||||||
border-top: 1px solid #aaa;
|
|
||||||
border-bottom: 1px solid #aaa;
|
|
||||||
background-color: #ccc;
|
|
||||||
}
|
|
||||||
#leftColumn {
|
|
||||||
margin: 10px 0 0 5px;
|
|
||||||
border: 1px solid #999;
|
|
||||||
background-color: #eee;
|
|
||||||
padding-bottom: 3px; /* IE-9 scrollbar-fix */
|
|
||||||
}
|
|
||||||
#navcolumn h5 {
|
|
||||||
font-size: smaller;
|
|
||||||
border-bottom: 1px solid #aaaaaa;
|
|
||||||
padding-top: 2px;
|
|
||||||
color: #000;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.bodyTable th {
|
|
||||||
color: white;
|
|
||||||
background-color: #bbb;
|
|
||||||
text-align: left;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.bodyTable th, table.bodyTable td {
|
|
||||||
font-size: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.bodyTable tr.a {
|
|
||||||
background-color: #ddd;
|
|
||||||
}
|
|
||||||
|
|
||||||
table.bodyTable tr.b {
|
|
||||||
background-color: #eee;
|
|
||||||
}
|
|
||||||
|
|
||||||
.source {
|
|
||||||
border: 1px solid #999;
|
|
||||||
}
|
|
||||||
dl {
|
|
||||||
padding: 4px 4px 4px 6px;
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
background-color: #ffc;
|
|
||||||
}
|
|
||||||
dt {
|
|
||||||
color: #900;
|
|
||||||
}
|
|
||||||
#organizationLogo img, #projectLogo img, #projectLogo span{
|
|
||||||
margin: 8px;
|
|
||||||
}
|
|
||||||
#banner {
|
|
||||||
border-bottom: 1px solid #fff;
|
|
||||||
}
|
|
||||||
.errormark, .warningmark, .donemark, .infomark {
|
|
||||||
background: url(../images/icon_error_sml.gif) no-repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
.warningmark {
|
|
||||||
background-image: url(../images/icon_warning_sml.gif);
|
|
||||||
}
|
|
||||||
|
|
||||||
.donemark {
|
|
||||||
background-image: url(../images/icon_success_sml.gif);
|
|
||||||
}
|
|
||||||
|
|
||||||
.infomark {
|
|
||||||
background-image: url(../images/icon_info_sml.gif);
|
|
||||||
}
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#banner, #footer, #leftcol, #breadcrumbs, .docs #toc, .docs .courtesylinks, #leftColumn, #navColumn {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
#bodyColumn, body.docs div.docs {
|
|
||||||
margin: 0 !important;
|
|
||||||
border: none !important
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
/* You can override this file with your own styles */
|
|
Before Width: | Height: | Size: 53 B |
Before Width: | Height: | Size: 52 B |
Before Width: | Height: | Size: 230 B |
Before Width: | Height: | Size: 1010 B |
Before Width: | Height: | Size: 606 B |
Before Width: | Height: | Size: 990 B |
Before Width: | Height: | Size: 576 B |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 220 B |
@ -1,4 +0,0 @@
|
|||||||
-------------------------------------------------------------------------------
|
|
||||||
Test set: tp2.demo.DemoApplicationTests
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.291 s -- in tp2.demo.DemoApplicationTests
|
|