diff --git a/.openshift/config.mysql.yml b/.openshift/config.mysql.yml
index 3cefeb46..04be9c88 100644
--- a/.openshift/config.mysql.yml
+++ b/.openshift/config.mysql.yml
@@ -1,9 +1,6 @@
# CommaFeed settings
# ------------------
app:
- # context path of the application
- contextPath: /
-
# url used to access commafeed
publicUrl: https://@OPENSHIFT_APP_DNS@/
diff --git a/CHANGELOG b/CHANGELOG
index d714369d..62228987 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+v 2.1.0
+ - dropwizard upgrade to 0.8.0
+ - you have to remove the "app.contextPath" setting from your yml file, you can optionnaly use server.applicationContextPath instead
v 2.0.3
- internet explorer ajax cache workaround
- categories are now deletable again
diff --git a/config.dev.yml b/config.dev.yml
index e2ddf666..8a77db95 100644
--- a/config.dev.yml
+++ b/config.dev.yml
@@ -1,9 +1,6 @@
# CommaFeed settings
# ------------------
app:
- # context path of the application
- contextPath: /
-
# url used to access commafeed
publicUrl: http://localhost:8082/
diff --git a/config.yml.example b/config.yml.example
index 9c7ae8c1..8c7bba8d 100644
--- a/config.yml.example
+++ b/config.yml.example
@@ -1,9 +1,6 @@
# CommaFeed settings
# ------------------
app:
- # context path of the application
- contextPath: /
-
# url used to access commafeed
publicUrl: http://localhost:8082/
diff --git a/pom.xml b/pom.xml
index 0b00a49f..43157dd6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.commafeed
commafeed
- 2.0.3
+ 2.1.0-SNAPSHOT
jar
CommaFeed
@@ -14,12 +14,25 @@
UTF-8
- 0.7.1
+ 0.8.0-SNAPSHOT
3.0
3.5.0
1.5.0
+
+
+ oss_snapshots
+ https://oss.sonatype.org/content/repositories/snapshots/
+
+ false
+
+
+ true
+
+
+
+
scm:git:https://github.com/Athou/commafeed.git
scm:git:https://github.com/Athou/commafeed.git
@@ -220,7 +233,7 @@
${dropwizard.version}
pom
-
+
com.wordnik
swagger-jaxrs_2.10
@@ -230,9 +243,13 @@
javax.ws.rs
jsr311-api
+
+ commons-lang
+ commons-lang
+
-
+
com.mysema.querydsl
querydsl-apt
@@ -245,7 +262,7 @@
querydsl-jpa
${querydsl.version}
-
+
commons-io
commons-io
@@ -266,7 +283,7 @@
commons-math3
3.3
-
+
redis.clients
jedis
@@ -277,7 +294,7 @@
javax.mail
1.5.2
-
+
com.rometools
rome
diff --git a/src/main/java/com/commafeed/CommaFeedApplication.java b/src/main/java/com/commafeed/CommaFeedApplication.java
index 41018307..13aff766 100644
--- a/src/main/java/com/commafeed/CommaFeedApplication.java
+++ b/src/main/java/com/commafeed/CommaFeedApplication.java
@@ -5,6 +5,7 @@ import io.dropwizard.assets.AssetsBundle;
import io.dropwizard.db.DataSourceFactory;
import io.dropwizard.hibernate.HibernateBundle;
import io.dropwizard.migrations.MigrationsBundle;
+import io.dropwizard.server.DefaultServerFactory;
import io.dropwizard.servlets.CacheBustingFilter;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
@@ -22,6 +23,7 @@ import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.eclipse.jetty.server.session.SessionHandler;
+import org.glassfish.jersey.media.multipart.MultiPartFeature;
import com.commafeed.backend.feed.FeedRefreshTaskGiver;
import com.commafeed.backend.feed.FeedRefreshUpdater;
@@ -41,8 +43,7 @@ import com.commafeed.backend.service.StartupService;
import com.commafeed.backend.service.UserService;
import com.commafeed.backend.task.OldStatusesCleanupTask;
import com.commafeed.backend.task.OrphansCleanupTask;
-import com.commafeed.frontend.auth.SecurityCheckProvider;
-import com.commafeed.frontend.auth.SecurityCheckProvider.SecurityCheckUserServiceProvider;
+import com.commafeed.frontend.auth.SecurityCheckFactoryProvider;
import com.commafeed.frontend.resource.AdminREST;
import com.commafeed.frontend.resource.CategoryREST;
import com.commafeed.frontend.resource.EntryREST;
@@ -54,10 +55,9 @@ import com.commafeed.frontend.servlet.AnalyticsServlet;
import com.commafeed.frontend.servlet.CustomCssServlet;
import com.commafeed.frontend.servlet.LogoutServlet;
import com.commafeed.frontend.servlet.NextUnreadServlet;
-import com.commafeed.frontend.session.SessionHelperProvider;
+import com.commafeed.frontend.session.SessionHelperFactoryProvider;
import com.google.inject.Guice;
import com.google.inject.Injector;
-import com.sun.jersey.api.core.ResourceConfig;
import com.wordnik.swagger.config.ConfigFactory;
import com.wordnik.swagger.config.ScannerFactory;
import com.wordnik.swagger.config.SwaggerConfig;
@@ -105,20 +105,20 @@ public class CommaFeedApplication extends Application {
@Override
public void run(CommaFeedConfiguration config, Environment environment) throws Exception {
- // configure context path
- environment.getApplicationContext().setContextPath(config.getApplicationSettings().getContextPath());
-
// guice init
Injector injector = Guice.createInjector(new CommaFeedModule(hibernateBundle.getSessionFactory(), config, environment.metrics()));
- // Auth/session management
+ // session management
environment.servlets().setSessionHandler(new SessionHandler(config.getSessionManagerFactory().build()));
- environment.jersey().register(new SecurityCheckUserServiceProvider(injector.getInstance(UserService.class)));
- environment.jersey().register(SecurityCheckProvider.class);
- environment.jersey().register(SessionHelperProvider.class);
+
+ // support for "@SecurityCheck User user" intection
+ environment.jersey().register(new SecurityCheckFactoryProvider.Binder(injector.getInstance(UserService.class)));
+ // support for "@COntext SessionHelper sessionHelper" intection
+ environment.jersey().register(new SessionHelperFactoryProvider.Binder());
// REST resources
environment.jersey().setUrlPattern("/rest/*");
+ ((DefaultServerFactory) config.getServerFactory()).setJerseyRootPath("/rest/*");
environment.jersey().register(injector.getInstance(AdminREST.class));
environment.jersey().register(injector.getInstance(CategoryREST.class));
environment.jersey().register(injector.getInstance(EntryREST.class));
@@ -127,6 +127,9 @@ public class CommaFeedApplication extends Application {
environment.jersey().register(injector.getInstance(ServerREST.class));
environment.jersey().register(injector.getInstance(UserREST.class));
+ // @FormDataParam support
+ environment.jersey().register(MultiPartFeature.class);
+
// Servlets
environment.servlets().addServlet("next", injector.getInstance(NextUnreadServlet.class)).addMapping("/next");
environment.servlets().addServlet("logout", injector.getInstance(LogoutServlet.class)).addMapping("/logout");
@@ -170,8 +173,6 @@ public class CommaFeedApplication extends Application {
}
}).addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/rest/*");
- // enable wadl
- environment.jersey().disable(ResourceConfig.FEATURE_DISABLE_WADL);
}
public static void main(String[] args) throws Exception {
diff --git a/src/main/java/com/commafeed/CommaFeedConfiguration.java b/src/main/java/com/commafeed/CommaFeedConfiguration.java
index 5e8fc163..e67d76ab 100644
--- a/src/main/java/com/commafeed/CommaFeedConfiguration.java
+++ b/src/main/java/com/commafeed/CommaFeedConfiguration.java
@@ -12,7 +12,7 @@ import javax.validation.constraints.NotNull;
import lombok.Getter;
-import org.apache.commons.lang.time.DateUtils;
+import org.apache.commons.lang3.time.DateUtils;
import org.hibernate.validator.constraints.NotBlank;
import com.commafeed.backend.cache.RedisPoolFactory;
@@ -62,10 +62,6 @@ public class CommaFeedConfiguration extends Configuration {
@Getter
public static class ApplicationSettings {
- @NotNull
- @NotBlank
- private String contextPath;
-
@NotNull
@NotBlank
private String publicUrl;
diff --git a/src/main/java/com/commafeed/CommaFeedModule.java b/src/main/java/com/commafeed/CommaFeedModule.java
index a18b0be3..62d3911d 100644
--- a/src/main/java/com/commafeed/CommaFeedModule.java
+++ b/src/main/java/com/commafeed/CommaFeedModule.java
@@ -11,8 +11,8 @@ import com.commafeed.CommaFeedConfiguration.CacheType;
import com.commafeed.backend.cache.CacheService;
import com.commafeed.backend.cache.NoopCacheService;
import com.commafeed.backend.cache.RedisCacheService;
-import com.commafeed.backend.favicon.DefaultFaviconFetcher;
import com.commafeed.backend.favicon.AbstractFaviconFetcher;
+import com.commafeed.backend.favicon.DefaultFaviconFetcher;
import com.commafeed.backend.favicon.YoutubeFaviconFetcher;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
diff --git a/src/main/java/com/commafeed/backend/HttpGetter.java b/src/main/java/com/commafeed/backend/HttpGetter.java
index bca16f9f..78921ae8 100644
--- a/src/main/java/com/commafeed/backend/HttpGetter.java
+++ b/src/main/java/com/commafeed/backend/HttpGetter.java
@@ -17,7 +17,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
@@ -53,7 +53,7 @@ public class HttpGetter {
private static final String ACCEPT_LANGUAGE = "en";
private static final String PRAGMA_NO_CACHE = "No-cache";
private static final String CACHE_CONTROL_NO_CACHE = "no-cache";
-
+
private static final HttpResponseInterceptor REMOVE_INCORRECT_CONTENT_ENCODING = new ContentEncodingInterceptor();
private static SSLContext SSL_CONTEXT = null;
diff --git a/src/main/java/com/commafeed/backend/cache/RedisPoolFactory.java b/src/main/java/com/commafeed/backend/cache/RedisPoolFactory.java
index 302a2793..9cdb6671 100644
--- a/src/main/java/com/commafeed/backend/cache/RedisPoolFactory.java
+++ b/src/main/java/com/commafeed/backend/cache/RedisPoolFactory.java
@@ -2,7 +2,7 @@ package com.commafeed.backend.cache;
import lombok.Getter;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
diff --git a/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java b/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java
index d8e94817..7b5aac2d 100644
--- a/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java
+++ b/src/main/java/com/commafeed/backend/dao/FeedCategoryDAO.java
@@ -1,11 +1,11 @@
package com.commafeed.backend.dao;
import java.util.List;
+import java.util.Objects;
import javax.inject.Inject;
import javax.inject.Singleton;
-import org.apache.commons.lang.ObjectUtils;
import org.hibernate.SessionFactory;
import com.commafeed.backend.model.FeedCategory;
@@ -70,7 +70,7 @@ public class FeedCategoryDAO extends GenericDAO {
}
boolean isChild = false;
while (child != null) {
- if (ObjectUtils.equals(child.getId(), parent.getId())) {
+ if (Objects.equals(child.getId(), parent.getId())) {
isChild = true;
break;
}
diff --git a/src/main/java/com/commafeed/backend/dao/FeedDAO.java b/src/main/java/com/commafeed/backend/dao/FeedDAO.java
index f8dad975..bd1ebeb8 100644
--- a/src/main/java/com/commafeed/backend/dao/FeedDAO.java
+++ b/src/main/java/com/commafeed/backend/dao/FeedDAO.java
@@ -7,7 +7,7 @@ import javax.inject.Inject;
import javax.inject.Singleton;
import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.hibernate.SessionFactory;
import com.commafeed.backend.model.Feed;
diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java
index a349c8ed..2472912b 100644
--- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java
+++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusDAO.java
@@ -7,8 +7,8 @@ import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.builder.CompareToBuilder;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.builder.CompareToBuilder;
import org.hibernate.SessionFactory;
import com.commafeed.CommaFeedConfiguration;
diff --git a/src/main/java/com/commafeed/backend/favicon/AbstractFaviconFetcher.java b/src/main/java/com/commafeed/backend/favicon/AbstractFaviconFetcher.java
index bd10f197..ff71535c 100644
--- a/src/main/java/com/commafeed/backend/favicon/AbstractFaviconFetcher.java
+++ b/src/main/java/com/commafeed/backend/favicon/AbstractFaviconFetcher.java
@@ -5,7 +5,7 @@ import java.util.List;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.commafeed.backend.model.Feed;
diff --git a/src/main/java/com/commafeed/backend/favicon/DefaultFaviconFetcher.java b/src/main/java/com/commafeed/backend/favicon/DefaultFaviconFetcher.java
index d6b90f8b..b4e3da67 100644
--- a/src/main/java/com/commafeed/backend/favicon/DefaultFaviconFetcher.java
+++ b/src/main/java/com/commafeed/backend/favicon/DefaultFaviconFetcher.java
@@ -6,7 +6,7 @@ import javax.inject.Singleton;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
diff --git a/src/main/java/com/commafeed/backend/feed/FeedFetcher.java b/src/main/java/com/commafeed/backend/feed/FeedFetcher.java
index c492f7f3..0929b72f 100644
--- a/src/main/java/com/commafeed/backend/feed/FeedFetcher.java
+++ b/src/main/java/com/commafeed/backend/feed/FeedFetcher.java
@@ -45,7 +45,7 @@ public class FeedFetcher {
} catch (FeedException e) {
if (extractFeedUrlFromHtml) {
String extractedUrl = extractFeedUrl(StringUtils.newStringUtf8(result.getContent()), feedUrl);
- if (org.apache.commons.lang.StringUtils.isNotBlank(extractedUrl)) {
+ if (org.apache.commons.lang3.StringUtils.isNotBlank(extractedUrl)) {
feedUrl = extractedUrl;
result = getter.getBinary(extractedUrl, lastModified, eTag, timeout);
diff --git a/src/main/java/com/commafeed/backend/feed/FeedParser.java b/src/main/java/com/commafeed/backend/feed/FeedParser.java
index baf87413..2e0f807f 100644
--- a/src/main/java/com/commafeed/backend/feed/FeedParser.java
+++ b/src/main/java/com/commafeed/backend/feed/FeedParser.java
@@ -11,8 +11,7 @@ import javax.inject.Singleton;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.SystemUtils;
+import org.apache.commons.lang3.StringUtils;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.xml.sax.InputSource;
@@ -173,7 +172,7 @@ public class FeedParser {
if (item.getContents().isEmpty()) {
content = item.getDescription() == null ? null : item.getDescription().getValue();
} else {
- content = StringUtils.join(Collections2.transform(item.getContents(), CONTENT_TO_STRING), SystemUtils.LINE_SEPARATOR);
+ content = StringUtils.join(Collections2.transform(item.getContents(), CONTENT_TO_STRING), System.lineSeparator());
}
return StringUtils.trimToNull(content);
}
diff --git a/src/main/java/com/commafeed/backend/feed/FeedQueues.java b/src/main/java/com/commafeed/backend/feed/FeedQueues.java
index c3c90bc8..288e4f2f 100644
--- a/src/main/java/com/commafeed/backend/feed/FeedQueues.java
+++ b/src/main/java/com/commafeed/backend/feed/FeedQueues.java
@@ -9,7 +9,7 @@ import javax.inject.Inject;
import javax.inject.Singleton;
import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang.time.DateUtils;
+import org.apache.commons.lang3.time.DateUtils;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.Meter;
diff --git a/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java b/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java
index e526a0a1..b80de7c0 100644
--- a/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java
+++ b/src/main/java/com/commafeed/backend/feed/FeedRefreshUpdater.java
@@ -16,8 +16,8 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.time.DateUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
import org.hibernate.SessionFactory;
import com.codahale.metrics.Meter;
diff --git a/src/main/java/com/commafeed/backend/feed/FeedRefreshWorker.java b/src/main/java/com/commafeed/backend/feed/FeedRefreshWorker.java
index 4192d3f1..70c66cae 100644
--- a/src/main/java/com/commafeed/backend/feed/FeedRefreshWorker.java
+++ b/src/main/java/com/commafeed/backend/feed/FeedRefreshWorker.java
@@ -11,8 +11,8 @@ import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.time.DateUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
import com.codahale.metrics.MetricRegistry;
import com.commafeed.CommaFeedConfiguration;
diff --git a/src/main/java/com/commafeed/backend/feed/FeedUtils.java b/src/main/java/com/commafeed/backend/feed/FeedUtils.java
index c722a2b9..a8a8d2f1 100644
--- a/src/main/java/com/commafeed/backend/feed/FeedUtils.java
+++ b/src/main/java/com/commafeed/backend/feed/FeedUtils.java
@@ -13,9 +13,9 @@ import java.util.regex.Pattern;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.time.DateUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
import org.apache.commons.math3.stat.descriptive.SummaryStatistics;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
@@ -517,4 +517,5 @@ public class FeedUtils {
}
}
}
+
}
diff --git a/src/main/java/com/commafeed/backend/model/User.java b/src/main/java/com/commafeed/backend/model/User.java
index ddd3fab5..3b8a5126 100644
--- a/src/main/java/com/commafeed/backend/model/User.java
+++ b/src/main/java/com/commafeed/backend/model/User.java
@@ -15,7 +15,7 @@ import javax.persistence.TemporalType;
import lombok.Getter;
import lombok.Setter;
-import org.apache.commons.lang.time.DateUtils;
+import org.apache.commons.lang3.time.DateUtils;
import org.hibernate.annotations.Cascade;
import com.commafeed.backend.model.UserRole.Role;
@@ -78,7 +78,7 @@ public class User extends AbstractModel {
}
return false;
}
-
+
public boolean shouldRefreshFeedsAt(Date when) {
return (lastFullRefresh == null || lastFullRefreshMoreThan30MinutesBefore(when));
}
diff --git a/src/main/java/com/commafeed/backend/opml/OPMLImporter.java b/src/main/java/com/commafeed/backend/opml/OPMLImporter.java
index 6ff2ddff..3084f5b1 100644
--- a/src/main/java/com/commafeed/backend/opml/OPMLImporter.java
+++ b/src/main/java/com/commafeed/backend/opml/OPMLImporter.java
@@ -10,7 +10,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.commafeed.backend.cache.CacheService;
import com.commafeed.backend.dao.FeedCategoryDAO;
diff --git a/src/main/java/com/commafeed/backend/service/FeedEntryContentService.java b/src/main/java/com/commafeed/backend/service/FeedEntryContentService.java
index 2a4e1011..d7bc7fdf 100644
--- a/src/main/java/com/commafeed/backend/service/FeedEntryContentService.java
+++ b/src/main/java/com/commafeed/backend/service/FeedEntryContentService.java
@@ -6,7 +6,7 @@ import javax.inject.Singleton;
import lombok.RequiredArgsConstructor;
import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.commafeed.backend.dao.FeedEntryContentDAO;
import com.commafeed.backend.feed.FeedUtils;
diff --git a/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java b/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java
index dbe6b542..950a7632 100644
--- a/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java
+++ b/src/main/java/com/commafeed/backend/service/FeedSubscriptionService.java
@@ -9,7 +9,7 @@ import javax.inject.Singleton;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.commafeed.CommaFeedConfiguration;
import com.commafeed.backend.cache.CacheService;
diff --git a/src/main/java/com/commafeed/backend/service/PasswordEncryptionService.java b/src/main/java/com/commafeed/backend/service/PasswordEncryptionService.java
index 2a61b3c8..c387a271 100644
--- a/src/main/java/com/commafeed/backend/service/PasswordEncryptionService.java
+++ b/src/main/java/com/commafeed/backend/service/PasswordEncryptionService.java
@@ -15,7 +15,7 @@ import javax.inject.Singleton;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
// taken from http://www.javacodegeeks.com/2012/05/secure-password-storage-donts-dos-and.html
@SuppressWarnings("serial")
diff --git a/src/main/java/com/commafeed/backend/service/PubSubService.java b/src/main/java/com/commafeed/backend/service/PubSubService.java
index 0a93240d..d05bd2b5 100644
--- a/src/main/java/com/commafeed/backend/service/PubSubService.java
+++ b/src/main/java/com/commafeed/backend/service/PubSubService.java
@@ -10,7 +10,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpHeaders;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
diff --git a/src/main/java/com/commafeed/backend/service/UserService.java b/src/main/java/com/commafeed/backend/service/UserService.java
index 747de4fb..4a67461a 100644
--- a/src/main/java/com/commafeed/backend/service/UserService.java
+++ b/src/main/java/com/commafeed/backend/service/UserService.java
@@ -10,7 +10,7 @@ import javax.inject.Singleton;
import lombok.RequiredArgsConstructor;
import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.commafeed.CommaFeedConfiguration;
import com.commafeed.backend.dao.FeedCategoryDAO;
@@ -33,7 +33,7 @@ public class UserService {
private final PasswordEncryptionService encryptionService;
private final CommaFeedConfiguration config;
-
+
private final PostLoginActivities postLoginActivities;
/**
@@ -56,7 +56,7 @@ public class UserService {
}
}
return Optional.absent();
- }
+ }
/**
* try to log in with given api key
diff --git a/src/main/java/com/commafeed/backend/service/internal/PostLoginActivities.java b/src/main/java/com/commafeed/backend/service/internal/PostLoginActivities.java
index 0466cb99..69f8042e 100644
--- a/src/main/java/com/commafeed/backend/service/internal/PostLoginActivities.java
+++ b/src/main/java/com/commafeed/backend/service/internal/PostLoginActivities.java
@@ -7,7 +7,7 @@ import javax.inject.Singleton;
import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang.time.DateUtils;
+import org.apache.commons.lang3.time.DateUtils;
import com.commafeed.CommaFeedConfiguration;
import com.commafeed.backend.dao.UserDAO;
@@ -17,11 +17,11 @@ import com.commafeed.backend.service.FeedSubscriptionService;
@RequiredArgsConstructor(onConstructor = @__({ @Inject }))
@Singleton
public class PostLoginActivities {
-
+
private final UserDAO userDAO;
private final FeedSubscriptionService feedSubscriptionService;
private final CommaFeedConfiguration config;
-
+
public void executeFor(User user) {
Date lastLogin = user.getLastLogin();
Date now = new Date();
diff --git a/src/main/java/com/commafeed/frontend/auth/SecurityCheckFactory.java b/src/main/java/com/commafeed/frontend/auth/SecurityCheckFactory.java
new file mode 100644
index 00000000..6f4dd3c9
--- /dev/null
+++ b/src/main/java/com/commafeed/frontend/auth/SecurityCheckFactory.java
@@ -0,0 +1,96 @@
+package com.commafeed.frontend.auth;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+
+import lombok.RequiredArgsConstructor;
+
+import org.eclipse.jetty.util.B64Code;
+import org.eclipse.jetty.util.StringUtil;
+import org.glassfish.jersey.server.internal.inject.AbstractContainerRequestValueFactory;
+
+import com.commafeed.backend.model.User;
+import com.commafeed.backend.model.UserRole.Role;
+import com.commafeed.backend.service.UserService;
+import com.commafeed.frontend.session.SessionHelper;
+import com.google.common.base.Optional;
+
+@RequiredArgsConstructor
+public class SecurityCheckFactory extends AbstractContainerRequestValueFactory {
+
+ private static final String PREFIX = "Basic";
+
+ @Context
+ HttpServletRequest request;
+
+ @Inject
+ UserService userService;
+
+ private final Role role;
+ private final boolean apiKeyAllowed;
+
+ @Override
+ public User provide() {
+ Optional user = apiKeyLogin();
+ if (!user.isPresent()) {
+ user = basicAuthenticationLogin();
+ }
+ if (!user.isPresent()) {
+ user = cookieSessionLogin(new SessionHelper(request));
+ }
+
+ if (user.isPresent()) {
+ if (user.get().hasRole(role)) {
+ return user.get();
+ } else {
+ throw new WebApplicationException(Response.status(Response.Status.FORBIDDEN)
+ .entity("You don't have the required role to access this resource.").type(MediaType.TEXT_PLAIN_TYPE).build());
+ }
+ } else {
+ throw new WebApplicationException(Response.status(Response.Status.UNAUTHORIZED)
+ .entity("Credentials are required to access this resource.").type(MediaType.TEXT_PLAIN_TYPE).build());
+ }
+ }
+
+ Optional cookieSessionLogin(SessionHelper sessionHelper) {
+ Optional loggedInUser = sessionHelper.getLoggedInUser();
+ if (loggedInUser.isPresent()) {
+ userService.performPostLoginActivities(loggedInUser.get());
+ }
+ return loggedInUser;
+ }
+
+ private Optional basicAuthenticationLogin() {
+ String header = request.getHeader(HttpHeaders.AUTHORIZATION);
+ if (header != null) {
+ int space = header.indexOf(' ');
+ if (space > 0) {
+ String method = header.substring(0, space);
+ if (PREFIX.equalsIgnoreCase(method)) {
+ String decoded = B64Code.decode(header.substring(space + 1), StringUtil.__ISO_8859_1);
+ int i = decoded.indexOf(':');
+ if (i > 0) {
+ String username = decoded.substring(0, i);
+ String password = decoded.substring(i + 1);
+ return userService.login(username, password);
+ }
+ }
+ }
+ }
+ return Optional.absent();
+ }
+
+ private Optional apiKeyLogin() {
+ String apiKey = request.getParameter("apiKey");
+ if (apiKey != null && apiKeyAllowed) {
+ return userService.login(apiKey);
+ }
+ return Optional.absent();
+ }
+
+}
diff --git a/src/main/java/com/commafeed/frontend/auth/SecurityCheckFactoryProvider.java b/src/main/java/com/commafeed/frontend/auth/SecurityCheckFactoryProvider.java
new file mode 100644
index 00000000..8d389c00
--- /dev/null
+++ b/src/main/java/com/commafeed/frontend/auth/SecurityCheckFactoryProvider.java
@@ -0,0 +1,64 @@
+package com.commafeed.frontend.auth;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import lombok.RequiredArgsConstructor;
+
+import org.glassfish.hk2.api.Factory;
+import org.glassfish.hk2.api.InjectionResolver;
+import org.glassfish.hk2.api.ServiceLocator;
+import org.glassfish.hk2.api.TypeLiteral;
+import org.glassfish.hk2.utilities.binding.AbstractBinder;
+import org.glassfish.jersey.server.internal.inject.AbstractValueFactoryProvider;
+import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider;
+import org.glassfish.jersey.server.internal.inject.ParamInjectionResolver;
+import org.glassfish.jersey.server.model.Parameter;
+import org.glassfish.jersey.server.spi.internal.ValueFactoryProvider;
+
+import com.commafeed.backend.model.User;
+import com.commafeed.backend.service.UserService;
+
+@Singleton
+public class SecurityCheckFactoryProvider extends AbstractValueFactoryProvider {
+
+ @Inject
+ public SecurityCheckFactoryProvider(final MultivaluedParameterExtractorProvider extractorProvider, final ServiceLocator injector) {
+ super(extractorProvider, injector, Parameter.Source.UNKNOWN);
+ }
+
+ @Override
+ protected Factory> createValueFactory(final Parameter parameter) {
+ final Class> classType = parameter.getRawType();
+
+ SecurityCheck securityCheck = parameter.getAnnotation(SecurityCheck.class);
+ if (securityCheck == null)
+ return null;
+
+ if (classType.isAssignableFrom(User.class)) {
+ return new SecurityCheckFactory(securityCheck.value(), securityCheck.apiKeyAllowed());
+ } else {
+ return null;
+ }
+ }
+
+ public static class SecurityCheckInjectionResolver extends ParamInjectionResolver {
+ public SecurityCheckInjectionResolver() {
+ super(SecurityCheckFactoryProvider.class);
+ }
+ }
+
+ @RequiredArgsConstructor
+ public static class Binder extends AbstractBinder {
+
+ private final UserService userService;
+
+ @Override
+ protected void configure() {
+ bind(SecurityCheckFactoryProvider.class).to(ValueFactoryProvider.class).in(Singleton.class);
+ bind(SecurityCheckInjectionResolver.class).to(new TypeLiteral>() {
+ }).in(Singleton.class);
+ bind(userService).to(UserService.class);
+ }
+ }
+}
diff --git a/src/main/java/com/commafeed/frontend/auth/SecurityCheckProvider.java b/src/main/java/com/commafeed/frontend/auth/SecurityCheckProvider.java
deleted file mode 100644
index 030187e7..00000000
--- a/src/main/java/com/commafeed/frontend/auth/SecurityCheckProvider.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package com.commafeed.frontend.auth;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.WebApplicationException;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import lombok.RequiredArgsConstructor;
-
-import org.eclipse.jetty.util.B64Code;
-import org.eclipse.jetty.util.StringUtil;
-
-import com.commafeed.backend.model.User;
-import com.commafeed.backend.model.UserRole.Role;
-import com.commafeed.backend.service.UserService;
-import com.commafeed.frontend.session.SessionHelper;
-import com.google.common.base.Optional;
-import com.sun.jersey.api.core.HttpContext;
-import com.sun.jersey.api.model.Parameter;
-import com.sun.jersey.core.spi.component.ComponentContext;
-import com.sun.jersey.core.spi.component.ComponentScope;
-import com.sun.jersey.server.impl.inject.AbstractHttpContextInjectable;
-import com.sun.jersey.spi.inject.Injectable;
-import com.sun.jersey.spi.inject.InjectableProvider;
-import com.sun.jersey.spi.inject.SingletonTypeInjectableProvider;
-
-public class SecurityCheckProvider implements InjectableProvider {
-
- public static class SecurityCheckUserServiceProvider extends SingletonTypeInjectableProvider {
-
- public SecurityCheckUserServiceProvider(UserService userService) {
- super(UserService.class, userService);
- }
- }
-
- @RequiredArgsConstructor
- static class SecurityCheckInjectable extends AbstractHttpContextInjectable {
- private static final String PREFIX = "Basic";
-
- private final SessionHelper sessionHelper;
- private final UserService userService;
- private final Role role;
- private final boolean apiKeyAllowed;
-
- @Override
- public User getValue(HttpContext c) {
- Optional user = apiKeyLogin(c);
- if (!user.isPresent()) {
- user = basicAuthenticationLogin(c);
- }
- if (!user.isPresent()) {
- user = cookieSessionLogin();
- }
-
- if (user.isPresent()) {
- if (user.get().hasRole(role)) {
- return user.get();
- } else {
- throw new WebApplicationException(Response.status(Response.Status.FORBIDDEN)
- .entity("You don't have the required role to access this resource.").type(MediaType.TEXT_PLAIN_TYPE).build());
- }
- } else {
- throw new WebApplicationException(Response.status(Response.Status.UNAUTHORIZED)
- .entity("Credentials are required to access this resource.").type(MediaType.TEXT_PLAIN_TYPE).build());
- }
- }
-
- Optional cookieSessionLogin() {
- Optional loggedInUser = sessionHelper.getLoggedInUser();
- if (loggedInUser.isPresent()) {
- userService.performPostLoginActivities(loggedInUser.get());
- }
- return loggedInUser;
- }
-
- private Optional basicAuthenticationLogin(HttpContext c) {
- String header = c.getRequest().getHeaderValue(HttpHeaders.AUTHORIZATION);
- if (header != null) {
- int space = header.indexOf(' ');
- if (space > 0) {
- String method = header.substring(0, space);
- if (PREFIX.equalsIgnoreCase(method)) {
- String decoded = B64Code.decode(header.substring(space + 1), StringUtil.__ISO_8859_1);
- int i = decoded.indexOf(':');
- if (i > 0) {
- String username = decoded.substring(0, i);
- String password = decoded.substring(i + 1);
- return userService.login(username, password);
- }
- }
- }
- }
- return Optional.absent();
- }
-
- private Optional apiKeyLogin(HttpContext c) {
- String apiKey = c.getUriInfo().getQueryParameters().getFirst("apiKey");
- if (apiKey != null && apiKeyAllowed) {
- return userService.login(apiKey);
- }
- return Optional.absent();
- }
- }
-
- private SessionHelper sessionHelper;
- private UserService userService;
-
- public SecurityCheckProvider(@Context HttpServletRequest req, @Context UserService userService) {
- this.sessionHelper = new SessionHelper(req);
- this.userService = userService;
- }
-
- @Override
- public ComponentScope getScope() {
- return ComponentScope.PerRequest;
- }
-
- @Override
- public Injectable> getInjectable(ComponentContext ic, SecurityCheck sc, Parameter c) {
- return new SecurityCheckInjectable(sessionHelper, userService, sc.value(), sc.apiKeyAllowed());
- }
-}
diff --git a/src/main/java/com/commafeed/frontend/resource/AdminREST.java b/src/main/java/com/commafeed/frontend/resource/AdminREST.java
index 08e43ba5..96d30184 100644
--- a/src/main/java/com/commafeed/frontend/resource/AdminREST.java
+++ b/src/main/java/com/commafeed/frontend/resource/AdminREST.java
@@ -19,7 +19,7 @@ import javax.ws.rs.core.Response.Status;
import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.codahale.metrics.MetricRegistry;
import com.commafeed.CommaFeedApplication;
diff --git a/src/main/java/com/commafeed/frontend/resource/CategoryREST.java b/src/main/java/com/commafeed/frontend/resource/CategoryREST.java
index 82996b58..9ad593c4 100644
--- a/src/main/java/com/commafeed/frontend/resource/CategoryREST.java
+++ b/src/main/java/com/commafeed/frontend/resource/CategoryREST.java
@@ -9,6 +9,7 @@ import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -27,8 +28,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.ObjectUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
import com.commafeed.CommaFeedConfiguration;
import com.commafeed.backend.cache.CacheService;
@@ -360,7 +361,7 @@ public class CategoryREST {
int existingIndex = -1;
for (int i = 0; i < categories.size(); i++) {
- if (ObjectUtils.equals(categories.get(i).getId(), category.getId())) {
+ if (Objects.equals(categories.get(i).getId(), category.getId())) {
existingIndex = i;
}
}
@@ -437,7 +438,7 @@ public class CategoryREST {
category.setExpanded(true);
for (FeedCategory c : categories) {
- if ((id == null && c.getParent() == null) || (c.getParent() != null && ObjectUtils.equals(c.getParent().getId(), id))) {
+ if ((id == null && c.getParent() == null) || (c.getParent() != null && Objects.equals(c.getParent().getId(), id))) {
Category child = buildCategory(c.getId(), categories, subscriptions, unreadCount);
child.setId(String.valueOf(c.getId()));
child.setName(c.getName());
@@ -458,7 +459,7 @@ public class CategoryREST {
for (FeedSubscription subscription : subscriptions) {
if ((id == null && subscription.getCategory() == null)
- || (subscription.getCategory() != null && ObjectUtils.equals(subscription.getCategory().getId(), id))) {
+ || (subscription.getCategory() != null && Objects.equals(subscription.getCategory().getId(), id))) {
UnreadCount uc = unreadCount.get(subscription.getId());
Subscription sub = Subscription.build(subscription, config.getApplicationSettings().getPublicUrl(), uc);
category.getFeeds().add(sub);
diff --git a/src/main/java/com/commafeed/frontend/resource/FeedREST.java b/src/main/java/com/commafeed/frontend/resource/FeedREST.java
index bb794661..cd29b06d 100644
--- a/src/main/java/com/commafeed/frontend/resource/FeedREST.java
+++ b/src/main/java/com/commafeed/frontend/resource/FeedREST.java
@@ -11,6 +11,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
+import java.util.Objects;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -33,8 +34,9 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.ObjectUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.glassfish.jersey.media.multipart.FormDataParam;
import com.commafeed.CommaFeedApplication;
import com.commafeed.CommaFeedConfiguration;
@@ -78,7 +80,6 @@ import com.rometools.rome.feed.synd.SyndFeed;
import com.rometools.rome.feed.synd.SyndFeedImpl;
import com.rometools.rome.io.SyndFeedOutput;
import com.rometools.rome.io.WireFeedOutput;
-import com.sun.jersey.multipart.FormDataParam;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
@@ -440,7 +441,7 @@ public class FeedREST {
int existingIndex = -1;
for (int i = 0; i < subs.size(); i++) {
- if (ObjectUtils.equals(subs.get(i).getId(), subscription.getId())) {
+ if (Objects.equals(subs.get(i).getId(), subscription.getId())) {
existingIndex = i;
}
}
diff --git a/src/main/java/com/commafeed/frontend/resource/PubSubHubbubCallbackREST.java b/src/main/java/com/commafeed/frontend/resource/PubSubHubbubCallbackREST.java
index cf6750ca..716fde4b 100644
--- a/src/main/java/com/commafeed/frontend/resource/PubSubHubbubCallbackREST.java
+++ b/src/main/java/com/commafeed/frontend/resource/PubSubHubbubCallbackREST.java
@@ -23,8 +23,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
import com.codahale.metrics.MetricRegistry;
import com.commafeed.CommaFeedConfiguration;
diff --git a/src/main/java/com/commafeed/frontend/resource/ServerREST.java b/src/main/java/com/commafeed/frontend/resource/ServerREST.java
index e3623f5e..2407973d 100644
--- a/src/main/java/com/commafeed/frontend/resource/ServerREST.java
+++ b/src/main/java/com/commafeed/frontend/resource/ServerREST.java
@@ -15,7 +15,7 @@ import javax.ws.rs.core.Response.Status;
import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.commafeed.CommaFeedConfiguration;
import com.commafeed.backend.HttpGetter;
diff --git a/src/main/java/com/commafeed/frontend/resource/UserREST.java b/src/main/java/com/commafeed/frontend/resource/UserREST.java
index cbc450e0..54c9da3d 100644
--- a/src/main/java/com/commafeed/frontend/resource/UserREST.java
+++ b/src/main/java/com/commafeed/frontend/resource/UserREST.java
@@ -27,9 +27,9 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang.RandomStringUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.time.DateUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
import org.apache.http.client.utils.URIBuilder;
import com.commafeed.CommaFeedApplication;
diff --git a/src/main/java/com/commafeed/frontend/servlet/AnalyticsServlet.java b/src/main/java/com/commafeed/frontend/servlet/AnalyticsServlet.java
index da51d07d..787576e6 100644
--- a/src/main/java/com/commafeed/frontend/servlet/AnalyticsServlet.java
+++ b/src/main/java/com/commafeed/frontend/servlet/AnalyticsServlet.java
@@ -9,7 +9,7 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import com.commafeed.CommaFeedConfiguration;
diff --git a/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java b/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java
index fe743b5f..a2c3f29f 100644
--- a/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java
+++ b/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java
@@ -12,7 +12,7 @@ import javax.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.hibernate.SessionFactory;
import com.commafeed.CommaFeedConfiguration;
diff --git a/src/main/java/com/commafeed/frontend/session/SessionHelperFactory.java b/src/main/java/com/commafeed/frontend/session/SessionHelperFactory.java
new file mode 100644
index 00000000..a6ecad6b
--- /dev/null
+++ b/src/main/java/com/commafeed/frontend/session/SessionHelperFactory.java
@@ -0,0 +1,17 @@
+package com.commafeed.frontend.session;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+
+import org.glassfish.jersey.server.internal.inject.AbstractContainerRequestValueFactory;
+
+public class SessionHelperFactory extends AbstractContainerRequestValueFactory {
+
+ @Context
+ HttpServletRequest request;
+
+ @Override
+ public SessionHelper provide() {
+ return new SessionHelper(request);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/commafeed/frontend/session/SessionHelperFactoryProvider.java b/src/main/java/com/commafeed/frontend/session/SessionHelperFactoryProvider.java
new file mode 100644
index 00000000..7eb0cbe9
--- /dev/null
+++ b/src/main/java/com/commafeed/frontend/session/SessionHelperFactoryProvider.java
@@ -0,0 +1,56 @@
+package com.commafeed.frontend.session;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import javax.ws.rs.core.Context;
+
+import org.glassfish.hk2.api.Factory;
+import org.glassfish.hk2.api.InjectionResolver;
+import org.glassfish.hk2.api.ServiceLocator;
+import org.glassfish.hk2.api.TypeLiteral;
+import org.glassfish.hk2.utilities.binding.AbstractBinder;
+import org.glassfish.jersey.server.internal.inject.AbstractValueFactoryProvider;
+import org.glassfish.jersey.server.internal.inject.MultivaluedParameterExtractorProvider;
+import org.glassfish.jersey.server.internal.inject.ParamInjectionResolver;
+import org.glassfish.jersey.server.model.Parameter;
+import org.glassfish.jersey.server.spi.internal.ValueFactoryProvider;
+
+@Singleton
+public class SessionHelperFactoryProvider extends AbstractValueFactoryProvider {
+
+ @Inject
+ public SessionHelperFactoryProvider(final MultivaluedParameterExtractorProvider extractorProvider, final ServiceLocator injector) {
+ super(extractorProvider, injector, Parameter.Source.CONTEXT);
+ }
+
+ @Override
+ protected Factory> createValueFactory(final Parameter parameter) {
+ final Class> classType = parameter.getRawType();
+
+ Context context = parameter.getAnnotation(Context.class);
+ if (context == null)
+ return null;
+
+ if (classType.isAssignableFrom(SessionHelper.class)) {
+ return new SessionHelperFactory();
+ } else {
+ return null;
+ }
+ }
+
+ public static class SessionHelperInjectionResolver extends ParamInjectionResolver {
+ public SessionHelperInjectionResolver() {
+ super(SessionHelperFactoryProvider.class);
+ }
+ }
+
+ public static class Binder extends AbstractBinder {
+
+ @Override
+ protected void configure() {
+ bind(SessionHelperFactoryProvider.class).to(ValueFactoryProvider.class).in(Singleton.class);
+ bind(SessionHelperInjectionResolver.class).to(new TypeLiteral>() {
+ }).in(Singleton.class);
+ }
+ }
+}
diff --git a/src/main/java/com/commafeed/frontend/session/SessionHelperProvider.java b/src/main/java/com/commafeed/frontend/session/SessionHelperProvider.java
deleted file mode 100644
index aba77faf..00000000
--- a/src/main/java/com/commafeed/frontend/session/SessionHelperProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.commafeed.frontend.session;
-
-import java.lang.reflect.Type;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.ext.Provider;
-
-import com.sun.jersey.core.spi.component.ComponentContext;
-import com.sun.jersey.core.spi.component.ComponentScope;
-import com.sun.jersey.spi.inject.Injectable;
-import com.sun.jersey.spi.inject.InjectableProvider;
-
-@Provider
-public class SessionHelperProvider implements InjectableProvider {
-
- private final ThreadLocal request;
-
- public SessionHelperProvider(@Context ThreadLocal request) {
- this.request = request;
- }
-
- @Override
- public ComponentScope getScope() {
- return ComponentScope.PerRequest;
- }
-
- @Override
- public Injectable> getInjectable(ComponentContext ic, final Context session, Type type) {
- if (type.equals(SessionHelper.class)) {
- return new Injectable() {
- @Override
- public SessionHelper getValue() {
- final HttpServletRequest req = request.get();
- if (req != null) {
- return new SessionHelper(req);
- }
- return null;
- }
- };
- }
- return null;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/edu/uci/ics/crawler4j/url/URLCanonicalizer.java b/src/main/java/edu/uci/ics/crawler4j/url/URLCanonicalizer.java
index d78502d6..ba2ff26a 100644
--- a/src/main/java/edu/uci/ics/crawler4j/url/URLCanonicalizer.java
+++ b/src/main/java/edu/uci/ics/crawler4j/url/URLCanonicalizer.java
@@ -28,11 +28,11 @@ import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
/**
- * See http://en.wikipedia.org/wiki/URL_normalization for a reference Note: some
- * parts of the code are adapted from: http://stackoverflow.com/a/4057470/405418
+ * See http://en.wikipedia.org/wiki/URL_normalization for a reference Note: some parts of the code are adapted from:
+ * http://stackoverflow.com/a/4057470/405418
*
* @author Yasser Ganjisaffar
*/
@@ -46,7 +46,7 @@ public class URLCanonicalizer {
try {
URL canonicalURL = new URL(UrlResolver.resolveUrl(context == null ? "" : context, href));
-
+
String host = canonicalURL.getHost().toLowerCase();
if (StringUtils.isBlank(host)) {
// This is an invalid Url.
@@ -113,7 +113,7 @@ public class URLCanonicalizer {
URL result = new URL(protocol, host, port, pathAndQueryString);
return result.toExternalForm();
-
+
} catch (MalformedURLException ex) {
return null;
} catch (URISyntaxException ex) {
@@ -122,8 +122,7 @@ public class URLCanonicalizer {
}
/**
- * Takes a query string, separates the constituent name-value pairs, and
- * stores them in a SortedMap ordered by lexicographical order.
+ * Takes a query string, separates the constituent name-value pairs, and stores them in a SortedMap ordered by lexicographical order.
*
* @return Null if there is no query string.
*/
@@ -149,7 +148,7 @@ public class URLCanonicalizer {
params.put(tokens[0], "");
}
break;
- case 2:
+ case 2:
params.put(tokens[0], tokens[1]);
break;
}
@@ -188,8 +187,7 @@ public class URLCanonicalizer {
}
/**
- * Percent-encode values according the RFC 3986. The built-in Java
- * URLEncoder does not encode according to the RFC, so we make the extra
+ * Percent-encode values according the RFC 3986. The built-in Java URLEncoder does not encode according to the RFC, so we make the extra
* replacements.
*
* @param string
diff --git a/src/main/resources/changelogs/db.changelog-1.2.xml b/src/main/resources/changelogs/db.changelog-1.2.xml
index 2139d0ce..8beb4a23 100644
--- a/src/main/resources/changelogs/db.changelog-1.2.xml
+++ b/src/main/resources/changelogs/db.changelog-1.2.xml
@@ -44,6 +44,7 @@
+ 7:9bf9357b47d8666dc7916f9a318138ad
diff --git a/src/test/java/com/commafeed/backend/FixedSizeSortedSetTest.java b/src/test/java/com/commafeed/backend/FixedSizeSortedSetTest.java
index 5a81d395..7af2aff8 100644
--- a/src/test/java/com/commafeed/backend/FixedSizeSortedSetTest.java
+++ b/src/test/java/com/commafeed/backend/FixedSizeSortedSetTest.java
@@ -2,7 +2,7 @@ package com.commafeed.backend;
import java.util.Comparator;
-import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang3.ObjectUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
diff --git a/src/test/java/com/commafeed/frontend/auth/SecurityCheckInjectableTest.java b/src/test/java/com/commafeed/frontend/auth/SecurityCheckFactoryTest.java
similarity index 78%
rename from src/test/java/com/commafeed/frontend/auth/SecurityCheckInjectableTest.java
rename to src/test/java/com/commafeed/frontend/auth/SecurityCheckFactoryTest.java
index 429b055d..5c5f5861 100644
--- a/src/test/java/com/commafeed/frontend/auth/SecurityCheckInjectableTest.java
+++ b/src/test/java/com/commafeed/frontend/auth/SecurityCheckFactoryTest.java
@@ -9,11 +9,10 @@ import org.junit.Test;
import com.commafeed.backend.model.User;
import com.commafeed.backend.service.UserService;
import com.commafeed.backend.service.internal.PostLoginActivities;
-import com.commafeed.frontend.auth.SecurityCheckProvider.SecurityCheckInjectable;
import com.commafeed.frontend.session.SessionHelper;
import com.google.common.base.Optional;
-public class SecurityCheckInjectableTest {
+public class SecurityCheckFactoryTest {
@Test
public void cookie_login_should_perform_post_login_activities_if_user_is_logged_in() {
@@ -26,8 +25,9 @@ public class SecurityCheckInjectableTest {
UserService service = new UserService(null, null, null, null, null, postLoginActivities);
- SecurityCheckInjectable injectable = new SecurityCheckInjectable(sessionHelper, service, null, false);
- injectable.cookieSessionLogin();
+ SecurityCheckFactory factory = new SecurityCheckFactory(null, false);
+ factory.userService = service;
+ factory.cookieSessionLogin(sessionHelper);
verify(postLoginActivities).executeFor(userInSession);
}