import static org.argeo.util.LocaleChoice.asLocaleList;
import static org.osgi.framework.Constants.FRAMEWORK_UUID;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Locale;
import java.util.Map;
+import javax.jcr.ImportUUIDBehavior;
import javax.jcr.Repository;
import javax.jcr.RepositoryFactory;
+import javax.jcr.Session;
+import javax.jcr.SimpleCredentials;
import javax.security.auth.Subject;
import javax.transaction.TransactionManager;
import javax.transaction.TransactionSynchronizationRegistry;
import org.argeo.cms.CmsException;
import org.argeo.jackrabbit.OsgiJackrabbitRepositoryFactory;
import org.argeo.jcr.ArgeoJcrConstants;
+import org.argeo.jcr.ArgeoJcrUtils;
import org.eclipse.equinox.http.jetty.JettyConfigurator;
import org.eclipse.equinox.http.jetty.JettyConstants;
import org.eclipse.equinox.http.servlet.ExtendedHttpService;
private final BundleContext bc = Activator.getBundleContext();
private final NodeSecurity nodeSecurity;
private DataHttp dataHttp;
+ private NodeHttp nodeHttp;
private KernelThread kernelThread;
private Locale defaultLocale = null;
// Initialise services
initTransactionManager();
- repository = new NodeRepository();
- repositoryFactory = new OsgiJackrabbitRepositoryFactory();
+ if (repository == null)
+ repository = new NodeRepository();
+ if (repositoryFactory == null)
+ repositoryFactory = new OsgiJackrabbitRepositoryFactory();
userAdmin = new NodeUserAdmin(transactionManager, repository);
// HTTP
String nodeInit = getFrameworkProp(NODE_INIT);
if (nodeInit == null)
nodeInit = "../../init";
+ if (nodeInit.startsWith("http")) {
+ remoteFirstInit(nodeInit);
+ return;
+ }
File initDir;
if (nodeInit.startsWith("."))
initDir = KernelUtils.getExecutionDir(nodeInit);
}
}
+ private void remoteFirstInit(String uri) {
+ try {
+ repository = new NodeRepository();
+ repositoryFactory = new OsgiJackrabbitRepositoryFactory();
+ Repository remoteRepository = ArgeoJcrUtils.getRepositoryByUri(
+ repositoryFactory, uri);
+ Session remoteSession = remoteRepository
+ .login(new SimpleCredentials("root", "demo".toCharArray()),
+ "main");
+ Session localSession = this.repository.login();
+ // FIXME register node type
+ // if (false)
+ // CndImporter.registerNodeTypes(null, localSession);
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ remoteSession.exportSystemView("/", out, true, false);
+ ByteArrayInputStream in = new ByteArrayInputStream(
+ out.toByteArray());
+ localSession.importXML("/", in,
+ ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW);
+ // JcrUtils.copy(remoteSession.getRootNode(),
+ // localSession.getRootNode());
+ } catch (Exception e) {
+ throw new CmsException("Cannot first init from " + uri, e);
+ }
+ }
+
/** Can be null */
private ConfigurationAdmin findConfigurationAdmin() {
configurationAdmin = bc.getServiceReference(ConfigurationAdmin.class);
if (dataHttp != null)
dataHttp.destroy();
+ if (nodeHttp != null)
+ nodeHttp.destroy();
if (userAdmin != null)
userAdmin.destroy();
if (repository != null)
Object httpPort = sr.getProperty("http.port");
Object httpsPort = sr.getProperty("https.port");
dataHttp = new DataHttp(httpService, repository);
+ nodeHttp = new NodeHttp(httpService);
if (log.isDebugEnabled())
log.debug(httpPortsMsg(httpPort, httpsPort));
}
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
* Intercepts and enriches http access, mainly focusing on security and
* transactionality.
*/
-@Deprecated
class NodeHttp implements KernelConstants, ArgeoJcrConstants {
private final static Log log = LogFactory.getLog(NodeHttp.class);
// Filters
- private final RootFilter rootFilter;
+ // private final RootFilter rootFilter;
// private final DoSFilter dosFilter;
// private final QoSFilter qosFilter;
NodeHttp(ExtendedHttpService httpService) {
- rootFilter = new RootFilter();
+ // rootFilter = new RootFilter();
// dosFilter = new CustomDosFilter();
// qosFilter = new QoSFilter();
try {
- httpService.registerFilter("/", rootFilter, null, null);
+ httpService.registerServlet("/!", new LinkServlet(), null, null);
+ // httpService.registerFilter("/", rootFilter, null, null);
} catch (Exception e) {
throw new CmsException("Cannot register filters", e);
}
public void destroy() {
}
+ class LinkServlet extends HttpServlet {
+ private static final long serialVersionUID = 3749990143146845708L;
+
+ @Override
+ protected void service(HttpServletRequest request,
+ HttpServletResponse response) throws ServletException,
+ IOException {
+ String path = request.getPathInfo();
+ String userAgent = request.getHeader("User-Agent").toLowerCase();
+ boolean isBot = false;
+ boolean isCompatibleBrowser = false;
+ if (userAgent.contains("bot")) {
+ isBot = true;
+ } else if (userAgent.contains("webkit")
+ || userAgent.contains("gecko")
+ || userAgent.contains("firefox")
+ || userAgent.contains("msie")
+ || userAgent.contains("chrome")
+ || userAgent.contains("chromium")
+ || userAgent.contains("opera")
+ || userAgent.contains("browser")) {
+ isCompatibleBrowser = true;
+ }
+
+ if (isCompatibleBrowser) {// redirect
+ response.setHeader("Location", "/#" + path);
+ response.setStatus(HttpServletResponse.SC_FOUND);
+ } else {
+ if (isBot && log.isDebugEnabled())
+ log.debug(request.getHeader("User-Agent") + " is a bot");
+ // TODO pure html
+ throw new UnsupportedOperationException();
+ }
+ }
+ }
+
/** Intercepts all requests. Authenticates. */
class RootFilter extends HttpFilter {