Archive for the ‘eBayOpenSource’ Category

It’s been a while since I posted my last note over here. It is a year with changes in my work life. As you may know Ebay has decided to minimize the effort dedicated to its open source platform, at least to TurmericSOA. As a consequence, the permanent staff they had assigned to TurmericSOA were extremely downsized to 1 resource.

Although Turmeric was an open source project, and as most of the Open Source initiatives, the developers were salaried, and full time dedicated. Due to the above taken decision, the coworkers in this project , me included, have bound in looking for new horizons.

TurmericSOA is still alive, is there….in Git repo, in forums, in IRC channel, all these resources are still alive, in fact, I do my humble contributions from time to time.
Some months ago I read an article from my friend Dave talking about the rod for measuring success. I totally agree with dave that success is not popularity neither viceversa, but we can’t avoid that outside doors work is a critical leverage, letting know the industry what you can offer them, namely the project broadcast strategy. That strategy takes its time,  depending on what your product is, this “time” could extend from one month to several years, in particular if we’re dealing with open source projects. If we only consider the TurmericSOA’s “broadcast strategy time”, in my opinion is was to early to leave that project adrift the open source community, but who knows, big company decisions have been always a Pandora’s box, and naturally, there must be some upper management decision that we’ll never know.
I honestly wish the best to TurmericSOA project and off course to each of whom collaborate with us. People from Jetty, Intalio and eBay itself, WSO2, MuleSoft guys, in particular to Manuel Chinea, Dave “kingargyle” Carver, Adam Lieber, Tiago Espinha, Jan Bartel, Michael Govoroy and Sastry Mallady

see you soon….

Advertisements

ebayOpenSource FLOSS show

Posted: February 28, 2012 in eBayOpenSource, Turmeric, VJET

“Netcasts you love from people you trust”, the FLOSS site bring us a new talk with our colleague Sastry Mallady, the eBay’s Technical Architect. Sastry comments about the ebayopensource and also mentions the 3 “open sourced” projects, Turmeric, ql.io and VJET.

Enjoy this weekly episode http://twit.tv/show/floss-weekly/201

c u!

Googleplex 2011

Posted: November 23, 2011 in eBayOpenSource, Eclipse, Turmeric, VJET

A new “googol” event is coming son, Nov 30th, the GooglePlex takes place at Olympus Mons Tech Talk Room,  Building CL4 in Mountain View, CA.

“Googleplex is a 1-day event for developers to learn about different Eclipse projects and related technologies. You are invited to attend and listen as experts from the Eclipse projects and Google share their experiences of using Eclipse. It’s also a great opportunity for you to meet and network with other Eclipse enthusiasts”

There you can learn about two projects under the EbayOpenSource ecosystem, VJET, an Eclipse plugin for javascript development by Justin Early (eBay) and TurmericSOA, the open source version of eBay’s SOA engine, by Dave Carver (Intalio)

Another interesting talks:
NASA Ames uses Eclipse RCP
Xtext success story: Google’s protobuf-dt
EGit_and_JGit_New_and_Noteworthy

Enjoy the devs party 🙂

 

 


Hi, I’m back. It has been a long time I don’t have the chance to write some lines over here. It has been a pretty working hard month focused in last release, btw, it is coming in next days.  Today I’m writing these few lines to invite you to the next Turmeric SOA show. I’ll will be there, showing an introduction of TurmericSOA to my Argentinean mates. Yes, this time Turmeric lands in Argentina. November 1st, at the Argentinean Java User Group annual event at ITBA, Buenos Aires.

Will be some other interesting talks during the event, such us “Challenges creating a iPaaS,scalability in MongoDB , pros & cons around ElasticSearch/Fume”  by Dan Diephouse from MuleSoft; “Uses and guidelines around Kanban development method” by Paulo Caroli from Thoughtworks.

I hope you have the chance to participate in this annual event. For more information surf in the Argentinean Java User Group home page . Also if you are interested in participate as presenter/attendee, do not hesitate to contact me

See you soon!!

Hi, when coding under Eclipse IDE v3.5 or above you can’t miss this extra for Turmeric development. It bring us some aditional support for the eBay Open Source Turmeric SOA project’s configuration files. Here we have a screenshot:

The project is looking for contributions, please feel free to fork the project on github

Working with GWT has a number of benefits but in the other hand we could get some cons and troubles that you’ll need to solve by yourself. That’s the case for a user Session Timeout, for example. While in an ordinary JSP servlet you could have total control of a user session and its actions, due to the client resident feature of GWT, things turns a bit complicated….

Last Friday I was working on a Session Timeout feature for Turmeric, an eBay Open Source platform. In the next lines I’m gonna show you how I did it , anyways you can surf these updates at my git-hub home.

Based on GWT RPC call mechanism and a few timers, I added a new service into Policy Admin UI (the web project to manage policies in Turmeric), called SessionServiceImpl, which implements RemoteServiceServlet and extends my service. This servlet instance, as usual will reside in the server side of my app.  Then I added the two interfaces needed for RPC calls, SessionInterface and SessionInterfaceAsync, and its implementation.

public class SessionServiceImpl extends RemoteServiceServlet implements
SessionInterface {

private static final long serialVersionUID = 1L;

private int timeout;

@Override
public Integer getUserSessionTimeout() {

timeout = getThreadLocalRequest().getSession().getMaxInactiveInterval() * 1000;
return timeout;
}

@Override
public Boolean isSessionAlive() {

return new Boolean((System.currentTimeMillis() - getThreadLocalRequest().getSession()
.getLastAccessedTime()) < timeout);
}

@Override
public void ping() {

}

}

This Servlet has its own time counters for user logged. Why I had to create a specific time member instead of using the HTTPSession ones? Since  of GWT genned code resides on client machines, the server session is not updated until a new RPC call be made by user, ie FindByXXXX, createXXX methods and so on… So, in the user does some clicks on the left side tree menu, the last accessed time at HTTPSession will not be automatically updated. Now since in our GWT  app a common dispatcher should be the selectPresenter method under the Controller, I preferred to use it as a common entry point to notify the session updates, just calling to a ping method. .

the SessionService interface:


public interface SessionInterface extends RemoteService {
Integer getUserSessionTimeout();
Boolean isSessionAlive();
void ping();
}
<pre>

the asyncronous one, at your client side. Our  code will call the sessionService but it will not wait for a reply as in synch way. The response will came later…who knows…

public interface SessionInterfaceAsync  {
void getUserSessionTimeout(AsyncCallback<Integer> callback);
void isSessionAlive(AsyncCallback<Boolean> callback);
void ping(AsyncCallback callback);
}

Later, since GWT 1.6, if I recall correctly, you could add your servlets into your *.gwt.xml file instead of your web.xml file. I’m on GWT 2.2 so I added these lines into our PolicyAdminUI.gwt.xml file:

<servlet path="/sessionService" class="org.ebayopensource.turmeric.policy.adminui.server.SessionServiceImpl"/>

and finally in the web.xml a new property to set the timeout configurable:

<!--  session timeout in minutes -->
<session-config>
    <session-timeout>15</session-timeout>
 </session-config>

and here is how my appController looks like:

//this method is called when the controller starts and bind...
private void initSessionTimers() {
sessionService.getUserSessionTimeout(new AsyncCallback<Integer>() {
public void onSuccess(Integer timeout) {
timeoutCicle = timeout;
sessionTimeoutResponseTimer = new Timer() {
@Override
public void run() {
isSessionAlive();
}
};
sessionTimeoutResponseTimer.schedule(timeout);
}

public void onFailure(Throwable caught) {
               //throw custom errors
}
});

}

private void isSessionAlive() {
sessionService.isSessionAlive(new AsyncCallback<Boolean>() {
public void onSuccess(Boolean alive) {
if (alive.booleanValue()) {
sessionTimeoutResponseTimer.cancel();
sessionTimeoutResponseTimer.scheduleRepeating(timeoutCicle);
} else {
displaySessionTimedOut();
}

}

public void onFailure(Throwable caught) {
//throw custom errors
}
});

}

private void displaySessionTimedOut() {
Window.alert(PolicyAdminUIUtil.messages
.expiredSession());
Window.Location.reload();

}

private void updateSessionLastAccessedTime() {
sessionService.ping(new AsyncCallback<Object>() {
public void onSuccess(Object paramT) {
//do nothing
}

public void onFailure(Throwable caught) {
//throw custom errors
}

});

}

that’s all folks,
hope it helps somebody….

During last days I’ve suffered some Internet connection troubles, sometimes connections goes, other it turns very slow, similar at the 56kb modems in the early stages of internet. BTW, thanks to Movistar.

Those ones, can become (or not) in serious issues for an isolated developer or web page designer who could upload his advances once a day, or a week…but it turns critical for this developer who works together a multi-country team in an Open Source project.

For instance, in my daily labor I run maven builds, some days several of them…as you may know these maven builds look for and downloads huge quantities of files, artifacts, or dependencies…off course according your configurations, at least, I have to…….So, the need of an enhancement in this process arose me during these days. Does not take much time to decide one of the better and well-known tools that bring you the ability to manage the provisioning artifacts during development, mainly based on the its simply installation and configuration process. Welcome Nexus to my laptop. Nexus Open Source is available under the GNU Affero General Public License version 3 (AGPLv3): http://opensource.org/licenses/agpl-v3.html.

Is not the intention of this post to tell you what Nexus is or does, for that purpose just surf on the adequate and, for sure more complete;  nexus site. Instead of that, I wrote this lines to let you know how to get Nexus working on your computers.

So, firstly some key aspects about nexus:

  • Nexus is a Jetty unzip and run tool
  • You can manage your repositories from different approaches, in my case I set them as Proxy Repos: “When you proxy a remote repository with Nexus Open source you can control all aspects of the connection to a remote repository including security parameters, HTTP proxy settings. You can configure which mirrors Nexus will download artifacts from, and you can control how long Nexus will store artifacts and how it will expire artifacts which are no longer referenced by your build….”
  • Nexus provides a JavaService wrapper for Windows. Just in case u prefer MS W rather than any linux OS

… for a better feature description here you have a copy of the Sonatype Nexus Feature Matrix:

OS: Open Source version  –  Pro: Professional version

Then, fisrt of all, go to download page, choose the last one. In this case, Release 1.9.1.1. There you can choose it from a list of formats, war, tar, zip, etc…I download the nexus-oss-webapp-1.9.1.1-bundle.tar.gz

Decompress this file into a folder that you selected as nexus home. This package contains 2 folders inside: nexus-oss-webapp-1.9.1.1, the nexus distribution itself and the sonatype-work, empty for now, that is the folder where your local repo will resid. You can assign different /home/.. folders for each of them, or you can decompress it in just one. I choose that way, both, nexus-oss-webapp-1.9.1.1 and sonatype-work, under a /home/jose/.nexus/ folder.  In case you are damning the two-folder structure, just think in upgrading the nexus distribution in your environment, your local repo will remain intact!

Now, under your …./.nexus/nexus-oss-webapp-1.9.1.1/bin/jsw/ folder you can see several distribution folders. I use a linux over 64 bits, so I’m going to work with linux-x86-64. Be sure to run the appropriate according your OS.

Then, let’s create a linux link for nexus path:

ln -s .nexus/nexus-oss-webapp-1.9.1.1/bin/jsw/linux-x86-64/ nexus

You can run nexus as a service or just manually, but you need to remember to run it prior to start you development day. I preferred to set as service., and these were the steps:

  1. Copy either ${NEXUS_HOME}/bin/jsw/linux-ppc-64/nexus, ${NEXUS_HOME}/bin/jsw/linux-x86-32/nexus, or ${NEXUS_HOME}/bin/jsw/linux-x86-64/nexus to /etc/init.d/nexus.
  2. Make the /etc/init.d/nexus script executable – chmod 755 /etc/init.d/nexus
  3. Edit this script changing the following variables:
    • Change APP_NAME to “nexus”
    • Change APP_LONG_NAME to “Sonatype Nexus”
    • Add a variable NEXUS_HOME which points to your Nexus installation directory
    • Add a variable PLATFORM which contains either linux-x86-32, linux-x86-64, or linux-ppc-64
    • Change WRAPPER_CMD to ${NEXUS_HOME}/bin/jsw/${PLATFORM}/wrapper
    • Change WRAPPER_CONF to ${NEXUS_HOME}/bin/jsw/conf/wrapper.conf
    • Change PIDDIR to /var/run.
    • Add a JAVA_HOME variable which points to your local Java installation
    • Add a ${JAVA_HOME}/bin to the PATH

another useful setting is edit plexus.properties in ${NEXUS_HOME}/conf. You’ll see an element named webapp-context-path. Change this value from “/nexus” to “/”

cd /etc/init.d

update-rc.d nexus defaults

service nexus start

and finally…..

Starting Sonatype Nexus...

Sonatype Nexus will be running in your local and you can access to the admin console through you browser at. The defaults credentials are admin/admin123

So, once we have nexus already deployed we need to add some custom parameters and configuration in order to be useful during our maven deploys.

During these days I’m working with a project from eBayOpenSource community, so, let’s assign those repositories.

Basically for Turmeric we need to add two repositories:

Release repository:

and Snapshot Repository:

And, finally we need to update our .m2 settings file in order to run our maven build integrated with nexus. For a better HOW-TO explanation let me post my maven’s settings.xml file:

<?xml version="1.0" encoding="UTF-8"?>
<settings>
<!-- If you want to deploy content (SNAPSHOT or RELEASE) to the
Nexus instance at http://ph-0146.eva.ebay.com/nexus/
You'll need an account, and then you can enable this section.

To get an account, create an INFRA issue requesting the account.
Include your svn userid in the request.
<servers>
<server>
<id>ebayopensource-repo</id>
<username>{your.username}</username>
<password>{your.password}</password>
</server>
</servers>
-->

<!-- Search Order for Maven Plugins not configured in a project -->
<pluginGroups>
<pluginGroup>com.ebayopensource.plugins.maven</pluginGroup>
<pluginGroup>com.ebay.ebox.plugins</pluginGroup>
<pluginGroup>org.mortbay.jetty</pluginGroup>
<pluginGroup>org.codehaus.mojo</pluginGroup>
<pluginGroup>org.sonatype.maven.plugins</pluginGroup>
</pluginGroups>

<profiles>
<profile>
<id>turmeric</id>

<pluginRepositories>
<pluginRepository>
<id>ebayopensource-releases</id>
<name>eBayOpenSource Release Repository</name>
<url>http://127.0.0.1:8081/nexus/content/repositories/ebayopensource/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>ebayopensource-snapshots</id>
<name>eBayOpenSource Snapshots Repository</name>
<url>http://127.0.0.1:8081/nexus/content/repositories/ebayopensource-snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>interval:30</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
</pluginRepository>
</pluginRepositories>

<repositories>
<repository>
<id>ebayopensource-releases</id>
<name>eBayOpenSource Release Repository</name>
<url>http://127.0.0.1:8081/nexus/content/repositories/ebayopensource/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>ebayopensource-snapshots</id>
<name>eBayOpenSource Snapshots Repository</name>
<url>http://127.0.0.1:8081/nexus/content/repositories/ebayopensource-snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>interval:30</updatePolicy>
<checksumPolicy>warn</checksumPolicy>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>turmeric</activeProfile>
</activeProfiles>

<mirrors>
<mirror>
<id>Nexus</id>
<mirrorOf>central,eviware</mirrorOf>
<name>Nexus Public Mirror.</name>
<url>http://127.0.0.1:8081/nexus/content/groups/public</url>

</mirrors>

</settings>

Take care about the repositories id that you set, ie: ebayopensource-snapshots. These need to be the same as you defined in Nexus repo.

And….that’s all!!! now let’s do a maven build.
mvn clean package

During this process maven should attempt to download all your artifacts from http://localhost:8081&#8230;.. Of course first time you run your build, your nexus repo is empty so, the consuming time will not be decreased, but, try with your second build.

NOTE: If after your first maven build, maven is still getting some artifacts from any other external repository just review your Nexus Repositories looking for a wrong setup or just for a missing custom repository.

now, run your builds and enjoy your new Free Time.

An improvement of JAXB

Posted: April 25, 2011 in eBayOpenSource, JAXB, SOA, Turmeric

Highly Performance is one of the key aspects of Runtime Core within the eBay SOA Platform. Are you interested in how this platform deals with message protocol conversions??

I’m pretty sure you know (or at least someday you’ve googled) what JBI is.
This is a nice and complete definition about it: JBI (Java Business Integration) is a Java-based standard that defines a runtime architecture for plugins to interoperate via a mediated message exchange model. This mediated message exchange model was simply adopted from the WSDL 2.0 spec’s message exchange patterns (MEPs). Messages between components are mediated by the Normalized Message Router (NMR). The NMR serves as an intermediary for routing messages amongst plugins, no matter where that component resides. Plugins do not communicate directly with one another; they only communicate with the NMR. This provides location transparency for the plugins.

In other words, JBI receives the incoming messages, normalize them in a common protocol, sent it to a NMR and finally the inverse process, it dinormalize the messages in order to send it to the requester.

All this process naturally takes some time, but, there is any way to reduce this time without loose the polymorphism and flexibility?? We need to take a look at Turmeric Platform code to know the answer.

More than JBI; with the natively normalization and dinormalization the incoming messages do not need bridge conversions.

Data could be received in XML, it could be received in NV, JSON or Binary XML for attachments with the use of Message Transmission Optimization Mechanism, MTOM.

Turmeric uses an architecture based in JABX, Java Architecture for Binding XML.

JAXB implementation at Turmeric

JAXB performs it process of marshalling and unmarshaling by the use of the standard Stax Parses (Streaming API for XML), XMLStreamReader and XMLStreamWriter interfaces. So, in Turmeric there are specific stream readers and stream writers implementations for each protocol that Turmeric runtime supports. There is a JSON Stream Reader and Stream Writer, and the same for NV and for Binary XML.
So, once JAXB receives the events, it calls to the corresponding Reader and Writer. That is, when an incoming message is in JSON format for example it calls to JSONStreamReader and it will call the corresponding Writer as consumer service wants; if it wants in NV, then JAXB will call NVStreamWriter.

This is one of the tech secrets under Turmeric, which grant the ability to support multiple protocols and data formats with an overhead below of 10 millisecs

Hi,

Next April 27th and 28th the largest International Symposium on SOA and Cloud Computing will take place in Brasilia, Brazil. Click here to surf in the official site. On Wednesday 28th I’m going to present you the project in which we have been working during last months, Turmeric .

see u there..!

…. let’s resume  the Consumer creation process.

My first attempt to run the consumer throw an Server internal exception, as a result Error 500. WTF! I pasted the url at my FF browser and the answer appeared: “Missing SOA operation name header”. Browsing the eBay doco I found that I need to add at least 2 http headers to my request. (for eBay service interaction, I recommend you to take a look at eBay’s devzone site ). The headers are:

  • OPERATION-NAME: The name of the call you are using (for example, findItemsAdvanced or getHistograms).
  • SECURITY-APPNAME: This is the application ID (AppID) for the service consumer. You obtain an AppID by joining the eBay Developers Program.

As it request, I had to join the eBay program. Simple process with the exception of the fully complex password it requires, despite you want to play in his sandbox environment. Btw, do you remember when I added a new environment at Consumer creation wizard?? (part I).

Now, with a eBay sandbox user, let’s set the headers.

Under your META-INF/soa/client/config/FindingServiceV1Consumer/sandbox/ you will find the ClientConf.xml file. Here we could set any particular setting for the rpc, such us endpoints, protocol, headers, timeouts, retries, etc….and headers is what I need!!

FMI about header settings please refer to Transport Header Mapping and Configuring Custom Transport Headers.

In this case both end point in the call are SOA implementations we can avoid the header mappings. So, just added into my ClientConf.xml the following lines:

<transport name="HTTP11">
	<class-name>
		org.ebayopensource.turmeric.runtime.sif.impl.transport.http.HTTPSyncAsyncClientTransport
	</class-name>
	<header-options>
		<option name="X-EBAY-SOA-OPERATION-NAME">findItemsByKeywords</option>
		<option name="X-EBAY-SOA-SECURITY-APPNAME">xxxxxxxxxxxxxxxxxxxxxxxxx</option>   <!-- my sandbox appId -->
	</header-options>
</transport>

At this point of the game everything seems to be done, let’s press Run so…

and the response says:

New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
LG Chocolate Touch VX8575 Verizon Retail Box Cell Phone
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
SAMSUNG A837 RUGBY AT&T CAMERA PTT GSM PHONE BLACK
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
Palm Treo 700wx (Verizon)
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
NEW T MOBILE MOTO MOTOROLA CLIQ WIFI BLUR MB200 ANDRIOD
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
New unlocked FM mini Iphone KA09 GSM AT&T T-Mobile Cell
NEW SAMSUNG A887 SOLSTICE UNLOCKED 3G PHONE BLUE……..

In case you get in timeouts troubles please refer to TimeOuts settings