Calling Active-x object from Javascript inside Java code - java

I'm trying to get windows username from liferay portlet in java code using javascript and active-x.
When I run the code only with javascript and acitive-x on plain HTML it works.
But when I put it in java, it doesn't work.
Here is my code:
String script = "function getUser() {return ((new ActiveXObject('WScript.NetWork')).UserName); }";
try {
engine.eval(script);
} catch (ScriptException e) {
e.printStackTrace();
}
Invocable inv = (Invocable) engine;
try {
log.info("try invoke script");
String teste = (String) inv.invokeFunction("getUser");
log.info("meu teste " +teste);
} catch (ScriptException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
When I change the content on function for somthing else like returning string it prints the result.

Java-s JavaScript doesn't have Active X capabilities, but you don't have to use JavaScript to get the running machines users username.
Get login username in java
If you want to know client-s OS-s username then one approach would be to use client side JavaScript to find it out and submit this information to server side via AJAX.

Related

Jsoup not connecting to webpage in Android Studio

I am working on a project right now where I use jsoup in a class with the function retrieveMedia in order to return an ArrayList filled with data from the webpage. I run it in a thread since you shouldn't be connecting to URLs from the main thread. I run it and join it. However, it doesn't work (I tested the same code in Eclipse separate from Android Studio and it worked fine). It seems that no matter what I do I can't get jsoup to connect to the webpage. Below is my class MediaRetriever.
public class MediaRetreiever {
public ArrayList<Media> retrieveMedia() {
ArrayList<Media> mediaOutput = new ArrayList<Media>(); //Store each scraped post
Thread downloadThread = new Thread(new Runnable() {
public void run() {
Document doc = null;
try {
doc = Jsoup.connect(<Website Im connecting to>).timeout(20000).get();
} catch (IOException e) {
System.out.println("Failed to connect to webpage.");
mediaOutput.add(new Media("Failed to connect", "oops", "", "oh well"));
return;
}
Elements mediaFeed = doc.getElementById("main").getElementsByClass("node");
for (Element e : mediaFeed) {
String title, author, imageUrl, content;
title=e.getElementsByClass("title").text().trim();
author=e.getElementsByClass("content").tagName("p").select("em").text().trim();
content=e.getElementsByClass("content").text().replace(author,"").trim();
Media media = new Media(title, author, "", content);
mediaOutput.add(media);
}
}
});
downloadThread.start();
try {
downloadThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
return mediaOutput;
}
}
Running this class's method from another class and it doesn't ever connect. Any ideas?
Since you say that the problem persists only in Android, it looks like that you should add the user agent string to your request - first get the user agent string of a browser that displays correctly the site, and then add it to the request:
doc = Jsoup.connect(<Website Im connecting to>)
.userAgent("your-user-agent-string")
.timeout(20000).get();
And as a sidenote - if you are catching exception, don't print your own error message - print the original message, it may be very useful.

How do I create an Alfresco site programmatically from a repository webscript?

I've implemented an Alfresco repository webscript (in Java) to programmatically create a new site.
I notice that there's a SiteService interface which I thought could be used to do this -
SiteInfo site = siteService.createSite("site-dashboard", "mySite",
"mySite", "", SiteVisibility.PUBLIC);
However, this results in the creation of a non-functional site, and although it's visible within the Alfresco Share dashboard, I'm not able to use it.
I then came across this code sample, which is doing exactly what I want. BUT the code includes a section to do authentication, involving sending the user's login and password details to a dologin web service. Don't really want to do this.
But as the user has already logged in via Alfresco Share, they should already be authenticated.
If I call the create-site webscript from my code, as shown in the example (without the initial call to dologin), I'm getting a 401 (unauthorised) return code.
So my question is, how do I tell the create-site webscript about my authentication?
I read about using an authentication ticket here. Is this ticket stored in the session, and if so, how do I access it within my Java code? If I could get the ticket, then this would be sufficient to invoke the create-site webscript.
Update: I've added the alf_ticket parameter as suggested by the comment, but I'm still getting a 401 response.
My current code is:
public NodeRef createServiceChange(String serviceChangeName) {
HttpClient client = new HttpClient();
String ticket = authService.getCurrentTicket();
PostMethod createSitePost = new PostMethod("http://localhost:8081/share/service/modules/create-site");
JSONObject siteObject = new JSONObject();
try {
siteObject.put("shortName", serviceChangeName);
siteObject.put("visiblity", "Public");
siteObject.put("sitePreset", "site-dashboard");
siteObject.put("title", serviceChangeName);
siteObject.put("description", serviceChangeName);
siteObject.put("alf_ticket", ticket);
createSitePost.setRequestHeader("Content-Type", "application/json");
createSitePost.setRequestHeader("Accept", "application/json");
createSitePost.setRequestEntity(new StringRequestEntity(siteObject.toString(), "application/json", "UTF-8"));
int status = client.executeMethod(createSitePost);
System.out.println("create a site script status :: " + status);
if (status == HttpStatus.SC_OK) {
System.out.println("Site created OK");
}
else{
System.out.println("There is error in site creation");
}
} catch (JSONException err) {
err.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
So I've managed to successfully create a site, programmatically, and here's what I did:
First, forget about writing a repository (platform) webscript. Creation of sites in Alfresco is done by invoking a Share module, so you'll need to implement either a page, or custom menu item to create a site. I was also getting a lot of problems with authentication, but if you log in to the system via Alfresco Share, and in your Javascript, use the provided Alfresco Ajax request, then authentication shouldn't be a problem.
Here are the components I used:-
Create a Share page to create your site. In the Freemarker template (.ftl) add a form to collect the site details.
Attach a button on the form to the following Javascript function. Note that I cobbled this together from various code fragments on the web, so it could use some cleaning up. But it basically works for me -
function create_site()
{
var sc_form = document.forms.namedItem('sc_form');
var name = sc_form.elements.namedItem('name').value;
var url = Alfresco.constants.URL_CONTEXT + "service/modules/create-site";
Alfresco.util.Ajax.request({
method : Alfresco.util.Ajax.POST,
url : url,
dataObj: {
sitePreset: "site-dashboard",
visibility: "PUBLIC",
title: name,
shortName: name,
description: name
},
requestContentType: Alfresco.util.Ajax.JSON,
successCallback:
{
fn: function(res){
alert("success");
alert(res.responseText);
},
scope: this
},
failureCallback:
{
fn: function(response)
{
Alfresco.util.PopupManager.displayPrompt(
{
title: Alfresco.util.message("message.failure", this.name),
text: "search failed"
});
},
scope: this
}
});
}

How to use SOAP web service in User Interface?

I am doing web service now, and already succeed installing SOAP in my web service..
It is working perfectly when i "run as java application".. (I use eclipse as my environment)
Here is my client method:
public static void main(String[] args) {
LogbookSOAPServiceLocator locator = new LogbookSOAPServiceLocator();
try {
LogbookSOAP logbookSOAP = locator.getLogbookSOAPPort();
System.out.println(logbookSOAP.fetchLog("21").getDriverName());
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
This succesfully work in console, can i use it anywhre in my user interface? like .jsp file?
Thanks!
Sure you can. At first you need to install web container to deploy your application. Then create web project. Step by step tutorial by Oracle based on Oracle WebLogic Server but you can use other one.
The simpliest way to using JSP Scriptlets and put all our logic in JSP page.
<%#page import="your imports here"%>
........
<%
LogbookSOAPServiceLocator locator = new LogbookSOAPServiceLocator();
try {
LogbookSOAP logbookSOAP = locator.getLogbookSOAPPort();
System.out.println(logbookSOAP.fetchLog("21").getDriverName());
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
%>
But it is not really good way because as your know best practice is to avod code logic in JSP pages especially Scriptets JSP coding conventions. Better code it in java wrapper class which you can call from JSP and after executing it will return result to the page.

Theming support in Play Framework 2.0

How can i implement theming support in Play Framework 2?
I want to create directory structure like:
views/default <- default template directory
views/site1 <- template for site 1
views/site2 <- template for site 2
If template doesn`t exist (ie. views/site1/home) it should render template from default directory.
I have tried cls = Class.forName("views.html.home); But I get class not found exception.
SOLUTION:
Maybe someone will find this useful:
protected static String renderTemplate(final String template, final String action,final ViewData templateParams) {
Class<?> cls = null;
String ret = "Template not found";
try {
cls = Class.forName(template);
} catch (ClassNotFoundException e) {
ret = e.toString();
}
if (cls == null) {
try {
cls = Class.forName("views.html.default."+action);
} catch (ClassNotFoundException e) {
ret = e.toString();
}
}
if (cls != null) {
Method htmlRender;
try {
htmlRender = cls.getMethod("render", ViewData.class);
ret = htmlRender.invoke("",templateParams).toString();
} catch (NoSuchMethodException e) {
ret = "Method not found"+e.toString();
} catch (IllegalAccessException e) {
ret = "illegal access exception";
} catch (InvocationTargetException e) {
ret = "InvocationTargetException";
}
}
return ret;
}
ViewData vd=new ViewData();
renderTemplate("views.html.custom."+viewname, actionname, vd)
You have to implement it yourself, as a reference, check the Play Authenticate usage sample, it allows to send ie. validation emails basing on Play's template and depending on the client's language, so for an instance, if your main language is Polish it will render the verify_email_pl.scala.html otherwise if your browser uses language not supported by PA, it will silently fallback to: verify_email_en.scala.html.
Check the usage and declaration of the method.
For your case it will be good solution, of course just criteria of the choice will be different.
This process is called "Branding". What you have to do is following.
Create a table in db by name "BRANDING" and add theme names in it against each instance of website.
Now you will make folders hierarchy as you mentioned and in jsp pages where load css files you will do that like this <link rel="stylesheet" type="text/css" href="/views/${themeName}.css">
where themeName would be a server side variable that you will program in your controller to be fetched from db or first time you will fetch it and then cache it.

Using the content handler API (JSR 211) to open applications

I want to be able to launch native and J2ME applications through my application using the content handler API (JSR 211) on a Nokia 6212.
At the moment, I am unable to do so, as it always states that there is "No Content Handler Found" and throws a javax.microedition.content.ContentHandlerException.
At the moment, I am trying to get the phone to launch its browser and go to a certain website, just to test that I can use the framework. I have tried many different Invocation objects:
//throw exceptions
new Invocation("http://www.somesite.com/index.html",
"application/internet-shortcut");
new Invocation("http://www.google.co.uk","text/html");
// a long shot, I know
new Invocation("http://www.somesite.com/text.txt","text/plain");
// massive long shot
new Invocation("http://www.google.co.uk","application/browser");
//appears to download the link and content (and definitely does in the Nokia
// emulator) and then throws an exception
new Invocation("http://www.google.co.uk");
new Invocation("http://www.somesite.com/index.html");
Below is the code that I have been using, please bear in mind the parameters often changed to generate the different Invocation objects.
/*
* Invokes an application using the Content Handler API
*/
public void doInvoke(String url, String mime, String payload){
Registry register = Registry.getRegistry(this.getClass().getName());
Invocation invoke = new Invocation(url, mime, null, false,
ContentHandler.ACTION_OPEN);
boolean mustQuit = false;
try {
mustQuit = register.invoke(invoke);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (ContentHandlerException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if(mustQuit){
this.quit();
}
}
Try this:
Registry register = Registry.getRegistry(this.getClass().getName());
You must call Registry.getRegistry for the MIDlet inheritor. Just use your MIDlet for getting the class name.

Categories