A Domain Specific Language For A Distributed Social

Transcription

A Domain Specific Language For A Distributed Social
A Domain Specic Language For
A Distributed Social Networking
System
Ólafur Tor Yngvason
Kongens Lyngby 2010
IMM-MSC-2010-93
Technical University of Denmark
Informatics and Mathematical Modelling
Building 321, DK-2800 Kongens Lyngby, Denmark
Phone +45 45253351, Fax +45 45882673
[email protected]
www.imm.dtu.dk
IMM-MSC
i
ii
Contents
Contents
1 Introduction
1.1 Privacy concerns . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Lack of exibility . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 This thesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Current Social Network Analysis
2.1
2.2
2.3
2.4
Short historical overview . . . . . . . . .
Denition . . . . . . . . . . . . . . . . .
Value of Social Networking Services . .
Current Social Networking Site Analysis
3 SNS Analysis
3.1
3.2
3.3
3.4
Common functionality . . . . .
Current Situation . . . . . . . .
Appeal of the distributed SNS .
Facebook API . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4 Conceptual Distributed Social Network Design
4.1
4.2
4.3
4.4
4.5
4.6
System . . . . . . . . . . .
Functional Requirements .
Account Management . .
Data Sharing . . . . . . .
Networking . . . . . . . .
Summary . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 Design and Languages Used for Prototype
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
3
5
5
6
7
8
15
15
17
23
24
25
26
30
40
44
46
49
51
5.1 The specication language . . . . . . . . . . . . . . . . . . . . . . 51
5.2 The Klaim Project . . . . . . . . . . . . . . . . . . . . . . . . . . 55
5.3 m4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
iv
CONTENTS
5.4 Java Server Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6 Prototype
6.1
6.2
6.3
6.4
X-Klaim web server engine . . . . . . . . .
Alternative Framework . . . . . . . . . . . .
Web server engine using Java Swing Applet
m4 . . . . . . . . . . . . . . . . . . . . . . .
7 Summary, Conclusions and Future Work
7.1
7.2
7.3
7.4
The Distributed Social Networking System
The Specication Language . . . . . . . . .
Conclusions . . . . . . . . . . . . . . . . . .
Future Work . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
63
63
67
67
70
73
73
74
74
75
A Prototype Tests
77
B User Manual
79
C Sequence Diagrams and Use cases for functionalities.
81
D The private social networking site class diagram
E Code Listings
E.1
E.2
E.3
E.4
E.5
E.6
E.7
E.8
User.xklaim .
Server.xklaim
CompileAll.sh
MakeBlog.m4
GetBlogs.m4
swingJApplet
Server.m4 . .
BlogK.m4 . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
119
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
125
127
131
136
137
143
150
159
160
Chapter
1
Introduction
Social networks are gaining more and more importance in sharing information
with ones peers. They come in many dierent avors, but all of them oer
similar core functionalities, even though sometimes in dierent disguises, and
add-on functionality that may dier between networks.
1.1 Privacy concerns
With users posting all sorts of informations onto social networking services(SNS),
concerns over what happens with this information and who is accessing them
is bound to be an issue. User privacy settings, allowing users to control access
to personal material published on a prole has become a focus area of current
SNSs.
But the fact remains, that SNS providers control all data users put there, such
as demographic information, sent messages or even photos. They are in full
control of using this data for any advertising, marketing or other commercial
purposes they choose to see t. Mostly the data is used for data mining, giving
the user personalized advertisements to increase the value of the advertisements
for both parties. But not all users are comfortable with sharing their usage data
with corporations, or anybody for that matter.
2
Introduction
Another important, and often under-valued risk with these networks, is that the
user hierarchy is at, meaning one can not distinguish between dierent friend
groups, such as co-workers, family, or friends. This leads to often unwanted
information ows.
1.2 Lack of exibility
Most SNSs on the market today oer the same or extremely similar services.
What separates these sites is mostly their user base and not the services oered.
Of course their interest is serving their users to keep them happy, whilst still
satisfying their customers. But users develop their accounts with use, adding
what friends they nd to their friend-lists, posting information and personal
data as well as getting used to using the site.
This makes changing from one site to another a hard task, which means that it
is hard for very big social networking services to serve niche groups, since their
focus is serving the general public with mainstream features. And due to their
size these niche groups are not being satised since they will put up with a lot,
simply because of the fact that their friends are on that site, and that's where
they interact with them.
1.2.1 Photo sharing
An example of a big unsatised niche group is the people who don't like the
quality of photos shared on social networks. Besides the obvious disadvantage
previously mentioned, of SNSs claiming ownership over all photos a user publishes there and are able to use them for whatever purpose they want. Meaning
that users wanting to share photos with their friends, are also sharing the information with a third party that has permission to share it with the rest of the
world.
For the users of social networks, the SNSs are becoming the norm in photo
sharing. This applies not only to photo based social networks such as Flickr.
In general, in SNSs, the user has no control, or in many cases awareness, of the
loss in picture quality when sharing the photo using any of the existing SNSs,
leading to dissatisfaction among the niche people who want to be able to share
their photos in full quality.
1.3 This thesis
3
1.3 This thesis
This thesis describes social networking services an analyses the current market
of social networks, identifying their functionalities, leading to the design of a
distributed social networking system emulating the core functions of the current
social networking service market. To spark the creation of such a distributed
networking system, a domain-specic language that paves the way for users
to create social networking services, while fullling the requirements needed
for participation in the distributed network is designed, and a prototype for it
created.
4
Introduction
Chapter
2
Current Social Network
Analysis
2.1 Short historical overview
With our denition of a social network, social networks rst started popping
up in the beginning of the 21st century. But it has value to investigate shortly
what lead to their development.
As we move into the digital age, the web begins to take a bigger and bigger part
in peoples' need to communicate and socialize with their peers. Social networks
facilitate the environment to fulll those needs.
In the early 1990's Internet rst started to become publicly accessible. The rst
sites that can in the most general sense be described as a social network were
forums, where people could post messages into certain categories and receive
comments.
The big commercial success Match.com, a dating website, was launched in 1995
and in 2009 it had approximately 1,3 million paying customers, reecting over
250m.usd income from sales revenue [3], and over 15 million users.
6
Current Social Network Analysis
In 1997 Jorn Barger coined the term "blog" from the term "web log". Blogs
very quickly gained enormous popularity as a great way for people to express
themselves, their opinions or news from their daily lives.
Throughout the blog boom, people came to realize the value of social networks.
And in the early/mid 2000's social networks such as Friendster, Last.fm, Hi5,
MySpace, Orkut, Facebook and Bebo popped up, capturing the attention of
millions upon millions of users. Being Facebook and its user-base growth, by
far, the most popular and the fastest, respectively.
2.2 Denition
A social network, in its most general sense, is just connections among people. In
real life, your social network is just the people you know, are around you or you
are somehow in contact with. Denotatively, is your direct social environment's
activity.
Sticking to the more practical semantics, computer-science-wise, we would include almost all non-static websites in the concept since they basically just need
to facilitate any kind of communication among users or people. This includes
e-mail servers, blogs, forums, dating websites, torrent sites, any kind of sharing
website such as Youtube and the list goes on. Therefore the term social network
would become nearly meaningless.
A well known article written by Danah m. Boyd and Nicole B. Ellison [1] denes
a social network as a web-based services that allow individuals to
1. Construct a public or semi-public prole within a bounded system.
2. Articulate a list of other users with whom they share a connection.
3. View and traverse their list of connections and those made by others within
the system. The nature and nomenclature of these connections may vary
from site to site.
In our search for an existing denition of what a social network is, we ran into
this very same denition time and time again. The denition seems to all right,
but seems to be aimed at excluding web-sites rather than capturing the term
itself.
2.3 Value of Social Networking Services
7
Firstly, there is no apparent reason for it to be a requirement to allow users
to traverse lists of others, except that it excludes a lot of sites, like forums, for
falling under the denition of "social network".
Secondly the denition does not presume any kind of communication between
the users, except the information shown on the users' prole.
Coming up with a denite denition of what a social network is not easy, but
the aim is to capture as objectively as possible its implications in terms of a
web-based service. A social network is a web-based service that has the following
properties
1. Public or semi-public proles within a bounded system.
2. Find, access and interact with other users and set relationship status with
them.
3. Publish material privately, publicly and semi-publicly with other users.
Obviously a social network can have other functionalities too, but as we dene
those as the core ones, only sites or applications that fulll these requirements
will qualify as a social network. There is no reason why forums, and sites
alike, should not be considered a social network. In the absence of what is
today considered a social networking service, much of its functionalities could
be achieved through the usage of forums. The dierence mainly being that what
are considered social networks oer the standardized user interface that most
social networks share. Most likely since sites may be afraid to overly dierentiate
and risk loosing their users.
2.3 Value of Social Networking Services
In real life, one's social network is restricted by one's physical barriers. A webbased social networking service helps breaking down these barriers, allowing
people to reconnect with lost friends, keep connected with friends physically
located far away and sharing information at once to a large group.
8
Current Social Network Analysis
2.4 Current Social Networking Site Analysis
In this section, we will briey have a look at which Social Networking sites
are available on the market today, which features they oer as well as their
demographical targets. As we will notice, most social networks have the same
or similar features and their popularity at rst approach seems to be somewhat
coincidental. Meaning that putting the nger in what seems to be the decisive
factor in their success is not so easy. Many factors come to play, such as ease
of usage, privacy, site focus and general approach, application availability, sitename and the list goes on.
But the trend appears to be that the biggest motivation for joining the site is
where they are most likely to nd their friends. For this reason, even though
dierent sites gained popularity in specic regions, people are slowly moving
towards Facebook through international communities and, as Facebook takes
over the Social Networking site scene, it will become more and more dicult for
other commercial sites to compete with it.
2.4.1 Basic Features
All social networks discussed in this chapter t with our denition of a social
network, you can make a prole consisting of picture(s), demographic information and self-description. You can list your friends. You can write testimonials
about your friends and write private messages to other users. All those things
except the private messages, are by default visible on the users prole, but the
user can restrict users from seeing it. Facebook for an example has three levels
of access controls, information can be visible to friends only, friends of friends
or to everyone.
2.4.2 Friendster, www.friendster.com
2.4.2.1 History
Friendster is a social network created in 2002, and set to compete Match.com. It
is based upon the assumption that friends of friends are more likely to be good
dates than strangers [1]. It can be considered the rst really successful social
network, but started loosing its user base in the western world through bad site
focus[1]. Although it remains popular in south-eastern Asia and Indonesia.
2.4 Current Social Networking Site Analysis
9
2.4.2.2 Specialization
Friendster separates itself from most other social networks by oering "Fan
Proles" and free text messages, where public gures can create proles that are
accessible without authentication. The free text messaging service is currently
only available in a few countries in south-eastern Asia and Indonesia. But it
allows users to receive updates from their friends on Friendster via sms'.
Furthermore Friendster oers mobile access and API giving external access to
the site content.
2.4.3 Couch Surng, www.couchsurfing.com
2.4.3.1 History
Couchsurng is the world's largest hospitality exchange network. Users have a
prole sorted mainly by their location in the globe and it is based on trust among
strangers who share their homes and a piece of their culture. Couchsurng was
launched in 2003 but had a slow increase ratio in its early years. In 2006, due
to a major database breakdown, it almost vanished, being relaunched due to
its users' pressure. Today it counts with 2,2 million users in 237 countries and
territories.
2.4.3.2 Specialization
Couchsurng stands out from a lot of other social networks for actually enabling
people to meet each other, hence being very easy to sort people very specically
through location almost anywhere in the world, as well as age and language.
2.4.4 LinkedIn, www.linkedin.com
Being a business-oriented social networking site, interaction among LinkedIn's
users is more formal and mostly professional. Launched in May 2003, it counts
with more than 80 million registered users and grows at the rate of one user per
second. [6]
10
Current Social Network Analysis
2.4.4.1 Specialization
LinkedIn is based on a mutual and trusted contact with someone you have a
limited degree of acquaintanceship with. Employers can list jobs and assess
potential candidates, whilst job seekers are able to check the prole of hiring
crew as well as their common network in an attempt for a recommendation,
being also able to bookmark jobs for later applications.
2.4.5 MySpace, www.myspace.com
2.4.5.1 History
MySpace was launched in 2003 and quickly became a huge success. In 2005 it
had become the fth most viewed internet domain in the US, and was sold to
News Corp for the hefty sum of 580 million usd. [2]. For a long time it opposed
to Facebook growth in the US. People get to get in touch with bands, artists and
interpreters from all over the world, as famous and unreachable as they might
be and with other people sharing the same musical taste. It is moreover a mean
for amateur musicians to promote their amateur projects to a larger public.[7]
2.4.5.2 Specialization
MySpace terms themselves as a social entertainment network, focusing on the
13-35 year old demographic. It connects its users with the music artists, movies
and videos, having unique joint venture content deals with studios. Users of
my space can really easily nd a network of people sharing common musical
interest.[27]
2.4.6 Last.fm, www.lastfm.com
2.4.6.1 History
Lastfm is an interactive music database site founded in the United Kingdom
in 2002. It has more than 40 million users in 200 countries. However, it has
been target of many controversies. For example the removal of the entire track
preview feature, preventing smaller artists to disseminate their projects.
2.4 Current Social Networking Site Analysis
11
2.4.6.2 Specialization
Building up a prole in Lastfm can be an active process, like most of the fore
mentioned networks, by listening to personal music on an Audioscrobbler plugin,
or a passive one, listening to the Lastfm internet radio service, which customizes
a prole automatically. After this is done, Lastfm's main aim is to amalgamate
random users with the same tastes in music, adding new artists and recommendations. This happens either when the user asks to get to know other similar
users, to listen to similar artists or when a common background group is created.
2.4.7 Bebo, www.bebo.com
2.4.7.1 History
Bebo was launched in 2005 by a british couple after they observed the rise of
Friendster and took some general hints from its site structure to apply to their
own networking website. It stands for "Blog Early, Blog Often" and focuses
largely on blogging and sharing music. It is mostly famous in the UK and it
counts with over 36 million users worldwide.[8]
2.4.7.2 Specialization
Bebo is an early entry stage social network, oering general social networking
features such as Facebook. It has nice pre-made prole skins as well as 3rd party
applications.
2.4.8 Orkut, www.orkut.com
2.4.8.1 History [9]
Orkut was one of the early sites launched in early 2004. It was a google project
but somehow only managed to gain regional popularity with a vast majority
of its users in India and Brazil. It was also very popular in Iran until it was
blocked by the government in order to avoid rapid messages spread due to
national security reasons. It also goes against Islamic ethics regarding dating
and matching.
12
Current Social Network Analysis
2.4.8.2 Specialization
Apart from common features that are seen in other general social networks, such
as proles with demographic information, photo albums coming with interaction
with friends, blogging and vlogging, orkut allows high management of friends'
hierarchy while enjoying the aforementioned features. Users are able to create
groups of friends with dierent privileges of access to information, such as photo
albums and blog posts. This hierarchy is implemented to imitate the "real life
social network" described in [10].
2.4.9 Flickr, www.flickr.com
2.4.9.1 History, [11]
Flickr is an image and video hosting website created by an American couple,
launched in 2004 and later on bought by the giant Yahoo. It is reported to
host more than 5 billion images nowadays. Flicker's has been kept very low
prole, aiming to be proliferated by mouth to mouth publicity, with no huge
advertisements but with a hip and stylish picture display.
2.4.9.2 Specialization
It stands out from most photo-sharing websites by its snazzy sharing features.
Friends can reach pictures much easier by searching and making their own notes
on them, or bloggers can simultaneously post photos on their own blogs and
ickr, for example. However, it is not as easy to navigate as other homologous sites. It has a lot of own terminology and has the deliberate omission of
restraining sharing via e-mail due to lack of potential in their server.
2.4.10 Facebook, www.facebook.com
2.4.10.1 History[12]
Facebook was launched in 2004 by famous Mark Zuckerberg, a Harvard student
at the time, initially as an internal social website within the University. The
adhesion was so auent that in some months it was opened to other faculties,
including Europe, by the end of the year to high schools, one year after to public
2.4 Current Social Networking Site Analysis
13
internet users and today it counts with 500 million users worldwide, being the
most used social network used worldwide. It is general social network, despite
having become famous for extra features like online games and quizzes.
2.4.10.2 Specialization
The focus of Facebook has developed severely, to begin with it was mostly
based on 3rd party software/widgets on user's proles. To become a very general
social network, focusing on its "news feed", which is essentially a micro blogging
service. Facebooks most recent development is introducing the Facebook email
service [13].
2.4.11 Twitter
2.4.11.1 History [14]
Twitter was founded in 2006 and is the fastest growing micro-blogging software.
It has foot-printed a neologism in contemporary pop-culture with the term tweet,
a "140 maximum character messages posted on Twitter", following the new verbs
"to google" or "to text". Twitter is a very alternative way of communication,
even for social networks' standards, for being very fast paced. However, its
popularity has been growing astonishingly since the messages are short and
users can divide their attention to even more numerous users and activities.
2.4.11.2 Specialization
Being dierent from the majority of social networks, Twitter created some additional features to help people getting used to a new format of communication.
BigTweet, a plugin for your Web browser for instance, is a Twitter tool that
allows the user to instantaneously post a tweet by selecting the text extract
to be quoted and pressing the bigTweet button. Also Tweet Later, a Twitter
management application, accomplish basic twitter tasks like sending welcoming
messages to new friends (called followers) or following followers back (being able
to check their blogging).
14
Current Social Network Analysis
Chapter
3
SNS Analysis
In this chapter, the functionalities of the current SNSs described in Chapter 2
will be analyzed, leading to a suggestion of a problem along with a solution to
that problem. Often Facebook is given special focus, but in this writer's opinion
such focus is just due to the overwhelming size of Facebook on the SNS scene.
3.1 Common functionality
Almost all current SNSs seem to have the same functionalities. Some variation
exist in for example what information that appear on the prole, and how the
site handles 3rd party software. But some of the most common functionalities
are:
•
Create a prole. Normally contains demographic information and some
•
Upload photo(s). An important factor of networking online is sharing
form of self-description, though details on what kind of self-description it
is may vary.
images, every big SNS allows photo uploading, though the quality of the
photos may vary.
16
SNS Analysis
•
Tag photos. Tagging photos is a great way of increasing relevance of
•
Listing friends. Listing friends was dened as one of the requirements
•
Send private messages to other users. Hardly needs further explain-
•
Write testimonial. Messages to other users visible on their prole are
•
Add applications/widgets to the prole. Most of the bigger SNSs
•
Customize prole appearance. Weather it is pre-made skins, HTML,
•
Access controls. Privacy has become one of the main concerns of SNSs.
•
Create and join special interest groups. Joining groups and creating
•
Post blogs and videos. Posting status updates or videos for your friends
to see is an option most SNSs have.
•
Search for other users or material. How the search engines work and
•
Friend Hierarchy. Most sites have at user hierarchy. All blogs posted
photos. Most but not all sites oer tagging.
of a social networks, so all networks have that functionality. All current
sites also allow traversing the list of friends.
ing. As the purpose of SNSs is communication, all SNSs oer users to
send private messages to each other.
a feature available on most sites. Facebook calls it a "wall", Friendster
calls it a testimonial, we'll stick to that name in this paper, although the
meaning is essentially the same.
have a number of applications available on their site to enhance the user
experience of the SNS. Many have a set of supplied application to select
from, while others oer 3rd parties opportunity to publish their applications on their site. 3rd party applications were to a high degree the source
of Facebooks success.
CSS or any combination there of. Most sites oer some form of customizing prole appearance. Facebook being an/the exception as it oers no
customization of prole looks.
Therefor they all oer some tools to limit the group of people that can
view the prole or contact the user.
events is an excellent way to reach people and organize activities with
friends or others. All sites have some form of functionality for groups or
events.
how eective they are may vary, but all sites have them.
go out to all friends following you, except for Orkut, which lets you split
your friends into groups and post your material visibly only to specic
groups. as explained in Section 2.4.8.
3.2 Current Situation
•
17
Mobile Access. Users are able to access most of the existing popular so-
cial networks through their mobile browsers or smart-phone applications.
3.2 Current Situation
As the SNS market looks today, it seems to be that few sites focused on networking spread regionally, which ts with the theory that the main attraction of an
SNS is its user-base. This can be seen with Friendsters popularity in South-east
Asia and Indonesia and Orkuts popularity in India and Brazil. These communities have a large part of their population already using these sites, which drives
other users in that region to use them as well. Not only because of users becoming aware of their existence through other users in the region, but because
they go there because thats where their friends are.
Figure 3.1: Map of highest ranking Social Networks in the world in Oct 2008,
by country [20]
As one can see in Figure 3.1, in October 2008 it is seemingly random which social
network gets popular in each country. The maps shows the highest ranking social
network for each country based on network trac [20].
The map of the world has changed signicantly in the last two years, and it seems
Facebook is slowly taking over, as it's users have gone from being 100million
to 500million since then [21]. Despite Facebooks recent popularity, some sites
have managed to retain their popularity in their region, such as Friendster in
Indonesia and Orkut in India and Brazil. Other sites have changed their focus
from being general SNSs to becoming niche sites. An example of this is MySpace
18
SNS Analysis
which has according to its CEO Michael Jones become a social entertainment
website instead of an SNS [27], and is no longer contending with Facebook in
the race for users on the SNS scene.
There are more niche sites which aim to serve smaller groups. Other examples of
these sites are BlackPlanet, CouchSurng and several other sites with millions of
users. These sites appeal to niche groups or oer some additional functionality
that other more general SNSs fail to oer. Many of its users also have an account
on a more general site such as Facebook, where they interact with their other
friends in a more general way. Yet others are unsatised with all existing SNSs
and the market needs to bend further to meet their needs. The issue remains,
Figure 3.2: User satisfaction venn diagram
the SNS market is inexible since the usage of a site is based on the usage of
others. And it's hard for users to simultaneously switch to a new service in spite
of that new service oered being better than the previous one. The niche sites
on the market manage to cover some of the niche groups but many more users
are unsatised.
3.2.1 What could be improved?
If social networks could interact with each other, this would mean that all users
on all sites could be treated as one big user base, making it possible for users
to choose the SNS that best meets his needs or wishes and then interact from
there with other users on other SNSs.
If it could be made even easier to create a social network, easy enough for a
common user, that added with the fact that all previous users of a social network
being in a big user base, would make it extremely much easier for social networks
to enter and leave the SNS market, since the user base is the same for every
site.
3.2 Current Situation
19
If instead of being able to share only photos, users could share any data they
see t peer to peer.
3.2.2 How could this be done?
Creating a distributed social networking system, where the SNSs let users communicate with other users on dierent sites through their service. This needs a
method of sharing data, as well as agreeing on what data needs to be shared. It
would be a colossal task to get all social networking sites to work together, but
some of them, such as Facebook and Twitter, already oer API that gives access
to almost any of the information and functionalities the sites have to oer. The
Facebook API will be discussed later.
The solution is to design a distributed social networking system, that uses the
API of existing SNSs to allow users to view and communicate with friends on
existing SNSs, and combining it with paving the way for the creation of SNSs
on this distributed network.
This could be done by creating a specication language that allows people to
create their own SNS fairly easily. Making a SNS creation possible, even for
private people. Two ways should be considered when designing a language for
making these private social networking systems (PSNS).
1. Single person social networking site (SPSNS) Where a user would
use the specication language to create a social network for only himself.
2. Small social networking service (SSNS) A social network, aimed at
being small in scale to allow small groups to run a social networking service
together.
Ideally both ways could be implemented and communicate with each other.
Soon we will have a look at, and analyze these two dierent kinds of SNSs. But
it is clear that having these kinds of networks, allowing as much exibility for
the site creator plus the benet of scale would make it much easier for social
networks to cater to the needs and desires of all dierent sorts of niche groups.
And it would also give the social networking scene leeway to develop even faster
in any direction based on the shared functionality of all the sites.
Another possible advantage could be, that with the sites creators' permission
these sites could be used for other distributed applications such as distributed
computing.
20
SNS Analysis
A disadvantage to this distributed system described is, that a big part of the
social networking experience such as browsing photos, proles, friendlists could
be compromised, or at least encumbered since information would have to pass
through more channels.
Another thing is that the shared functionalities between sites would possibly be
taken down to a basic level to meet the functionality or aimed for functionality
of as many sites as possible.
Yet another thing to be considered is that with the running of a service such as a
social network belonging to big commercial corporations, in-spite of signicant
hacker interest in manipulating the site. The corporations can make sure that
enormous amounts of resources go into updating and maintaining security and
xing bugs.
To add on that, in a distributed social networking system, such as the one
being presented, information is being shared from multiple dierent sources,
new sources coming and going, giving attackers a number of additional entry
points, and this is likely to lead to security problems. And to even add on top
of that updating the various sites on the network is not necessarily an easy task.
So should such a system be released, security will become a dicult task to
handle.
Security should also be of the utmost importance because a PSNS on the network
is sharing its users information with the rest of the network, believing it is in full
control of its access. Thus the framework needs to be trusted. Breach of such
trust will have dire consequences. And as silly as it sounds, the importance of
the trust gives script kiddies and terrorist hackers even more incentive to attack
the site, making security even more important.
Yet another thing to be considered is that even though this API exists for sites
such as Facebook and Twitter, the distributed social networking system is fairly
reliant on it, at least to begin with. Thus if these existing sites change the API
or decide to stop oering it, it could have detrimental eects on the distributed
social networking system.
3.2.3 Single Person Social Networking Site
As said, this would be a site where a user would use the specication language
to create a social network for only himself.
3.2 Current Situation
21
3.2.3.1 Advantages
A person controlling his own SPSNS, would mean that he himself is the administrator of his own data and assuming security holds, he would be in total control
it. He would also be in complete control of what his site could do (beside the
shared functionality of all SNSs on the distributed social networking system).
3.2.3.2 Disadvantages
Obviously not all users will resort to these private sites, for several reasons. Not
to the least the lack of technical knowledge, cost and ease of use. And since
these sites would have small or very small user data bases, they would be based
on interaction with other social networks or similar sites, and this interaction
would form the social network.
Even with a specication language that would ease the creation of a SPSNS
signicantly, customization and administration would still require signicant
eort and skill. Especially if one would wish to customize the site to a high
degree to meet his exact needs and wishes.
Extremely many networks would exist, spreading data needed to be accessed
by a user of a social network widely over the internet, making operations work
slower.
3.2.4 Small, private social networking system
These small sites aimed at allowing smaller groups to run their SNS together,
such as a family, a workplace or a school faculty.
3.2.4.1 Advantages
Most people are a part of one group or another that would be capable of creating
and hosting such a site. That would make it easy for mainstream users to nd
one network or another to join and enjoy its benets. No unknown party is in
control of your information, and the chances of your data being used for any
marketing or commercial reason would be signicantly decreased as it could
even be illegal.
22
SNS Analysis
3.2.4.2 Disadvantages
Even though no unknown party is in control of your information, it might be
considered worse that a known party is controlling it, even with implemented
user hierarchy and great access controls. The site controller could still view all
of the users' data, and it is easy to see circumstances where a user would prefer
not to let a site controller have access to his data, especially if it is a family
member, a co-worker or even boss.
This could possibly be solved with a system of access controls, or yet another
layer of distribution. One such solution could be to have an application on the
user-side, where he would have to access the social networking service through.
This application would come from a trusted third party, and would control the
data handling and communication between the user and the social network.
Allowing the user for example to categorize his information, locally on his computer and then send them peer to peer to users with permission to access them.
This would bring about the problem of relying on the user's internet connection
for sharing the data making his information not being accessible all the time and
encumber the users connection itself. But considering the speed of development,
who knows if users will still be using hard disks in the future, and not just relying
completely or almost completely on online storage spaces.
3.2.5 The Global Server
A problem with this system is that the private networks do not necessarily
know of the existence of the other private networks, where they are and who
is on them. They can start with the knowledge of a number of existing SNSs,
but some kind of system where new sites could publish their location, existence,
friendlists etc. could be useful. This system would also be essential for updating
the system software in order to update the shared functionalities.
One solution to this problem could be to have a specialized server for these
private networks. All new private networks would register their location as well
as other specic information about the network on this global server. Besides the
before mentioned functionalities of the global server, it could also co-ordinate
and generally help communication between networks, enforce standardization
in shared functionalities and facilitate system updates. This will be further
described in the following chapters.
3.3 Appeal of the distributed SNS
23
3.2.6 Ideal Social networking scene presented
The ideal SNS scene displayed in gure 3.3 displays visually the system being
described. A number of PSNSs communicating between themselves and a GS,
as well as communicating with the other CSNSs to combine the user bases of
all the networks.
Figure 3.3: Social networking scene with distributed SNSs
3.3 Appeal of the distributed SNS
The biggest appeal will probably be for smaller groups such as work-places,
family or friend groups. Where someone keeps a small PSNS running. With
the addition of a capability le sharing system as discussed in [26]. Allowing
people to access additional storage space through virtual storage spaces as will
be discussed later.
The beauty of creating this kind of a specication language paving the way
24
SNS Analysis
for anyone making their own PSNSs on a distributed social network. Is that
anyone will have the oppertunity to put their creativity to the test, nd what
what people desire and need and create the site servicing those needs. Designing
a site who it appeals the most to can be left up to these designers of the PSNSs,
a form of distributed creativity. Let the market decide, even though in the initial
design it is intended for those smaller groups.
3.4 Facebook API
As Facebook is the SNS with by far the biggest user base and is showing no sign
of stagnating in it's growth, the API oered by Facebook is the most important
for the success of a distributed social network such as the one discussed in this
thesis. Facebooks API consists of its open graph protocol [24], social plugins
[25], authentication and authorization [22]. Social plugins will not be discussed
here since they are not relevant since they merely add features to a web page
through HTML. Taking advantage of that is the task of the PSNS developer, if
he wishes so.
3.4.1 Authentication and authorization [22]
Access to essentially all of what has become the core features of Facebook can be
acquired through its API, even access to user's photos and management of his
pages. The user will need to authorize the application using the API explicitly
to access these features. Without explicit authorization the application can have
access to basic prole information, such as friends and prole pictures.
3.4.2 Graph API [23]
The Graph API is a new term, and is only oered by Facebook. It uniformly
represents objects (Users, pages, events,groups, applications, status messages,
photos, photo albums, prole pictures, videos, notes and check-ins). And their
connections (Friends, news feed, prole feed, likes, movies, books, notes, photo
tags, photo albums, video tags, video uploads, events, groups and check-ins).
Coupled with authentication FBGraph can allow the distributed SNS access to
any of users information it needs to transfer/duplicate his account over to a new
PSNS.
Chapter
4
Conceptual Distributed
Social Network Design
In this chapter the design of a distributed social networking system will be
explained, along with most of the necessary functionalities needed for such a
system. These functionalities are split into functional and non-functional requirements.
The main challenge of designing a system like this, is making it as customizable as possible without it losing much simplicity or functionality. Every single
operation should be customizable without losing the inter-mutually shared functionality of social networks. Furthermore, an API could be made so that any
social network wanting to participate on the distributed social networking system could do so.
An example of this could be that you may want to customize blogs in a way that
one SNS has a maximum length of the blog is longer than is longer than that of
any other SNS, and the blog has a subject. To make the operation inter-mutual
and still allowing customization, all SNSs could always send data based on full
functionality (subject, blog). This would allow the SNSs to store the full blogs,
and then implement functionality allowing the users to read the rest of the blog
in case it came from a network with less length restriction on the blog.
26
Conceptual Distributed Social Network Design
Alternatively, a centralized server (such as the global server from Section 3.2.5)
could be used to distribute the blogs, to make sure that each SNS gets the
information they want (the server could cut o the subject and part of the blog
text body).
In this chapter, the functionalities of a distributed social networking system are
designed along with appropriate use case tables, sequence diagrams and class
diagrams. Use case tables and sequence diagrams for the functional requirements
of the system have been included in this chapter. The rest may be found in
Appendix C.
In the class diagrams presented in this chapter, classes contain properties and
operations needed for communication between PSNSs, users, CSNSs and the
GS.
4.1 System
As suggested in Chapter 3, the suggested distributed social networking system
design consists of a number of privately created social networking sites (PSNS)
and a global server (GS) co-ordinating the network. The PSNSs communicate
between themselves and the GS, as described later, using shared functionalities.
The communication with existing commercial social networking sites, such as
Facebook, occurs through their API, and to the extent the API allows. This
gives the PSNSs access to receive and post blogs, get friendlists and more, as
described in Section 3.4.
Each PSNS consists of a database, a user interface (UI) and a web server engine
as shown in Figure 4.1 The specication language designed in this thesis includes
automatic generation of all of these three parts of a PSNS.
The GS is the only one that should be able to edit/update the web server
engine and the database to keep standardization and eectiveness of shared
functionalities, but the creator/administrator of the PSNS can edit the UI to
add additional functionality as he pleases.
The external resources that communicate with the UI in Figure 4.1 represent any
3rd party application or other customization the creator of the PSNS may want
to use. This could also be a database managed by the creator/administrator of
the PSNS for other functionalities of the site.
When a new PSNS is instantiated, it registers itself with the GS. The GS stores
4.1 System
27
Figure 4.1: PSNS parts and related parties
various data, such as friendlists of all users as well as information about all
groups and events. It makes sure that all friendlists are updated correctly.
When a new user with another account on an existing commercial social networking site (CSNS) is added, the PSNS gets his entire friendlist from that site
and sends it to GS. To get this information from the CSNSs, the operation must
be explicitly authorized by the user, as explained in Section 3.4.1. The GS then
updates the friendlists of all the users that are on his CSNS friendlist and also
have a PSNS account, and sends updates to the corresponding PSNS.
Making a design like this is a long iterative process, one repeatedly discovers
new methods and functionalities that need to be included, adds them and then,
more often than not, needs to go back to rethinking many others. Therefore,
the list of methods and functions is not complete, but can be considered close
enough to a primitive design of a fully working distributed social networking
system. Some of the non-included functions are:
28
Conceptual Distributed Social Network Design
• Add/Conrm Friend on CSNS
• Join group/event on CSNS
• Modify access of permission group
• Mobile access support
4.1.1 Private Social Networking Services (PSNS)
The design of the PSNS is aimed at making it easy for small to medium groups
to create and run a service. Each account is partitioned a set amount of space,
and groups and events can be created on that.
Ideally this system would mainly be the basic building blocks for the distributed
networking system. The PSNSs would have to add as much customization on
top as possible to create a diverse a ora of PSNSs on the market, and to make
the focus of the distributed network the shared core functionalities. But to make
it as easy as possible for anyone to make a PSNS, this design will include all
or nearly all important features, in-spite of what could possibly be considered a
lack of necessity.
Each PSNS communicates with other CSNSs when user accounts are created, or
when new CSNS accounts are added to a users account, as well as communicating
with all other PSNSs and the GS. This means that operations for communicating
with all those parties need to be implemented.
4.1.1.1 PSNS Class diagram
The PSNS class diagram, as seen in Figure 4.2, portrays a design for a private
social network. It does not contain operations, as it would become too large. A
full class diagram can be seen in Appendix D. It goes together with the design
for the GS as later described in Section 4.1.2.
The functionalities later described in this chapter and how they are used clarify
the operations in the class diagram.
The functionalities later described in this chapter and how they are used clarify
the operations in the class diagram. Similar to Dropbox, the system design
should have a capability le name system, as described in [26]. However, the
class diagram only contains classes for handling photos and information related
to them.
4.1 System
Figure 4.2: Class diagram for a private social networking service
29
30
Conceptual Distributed Social Network Design
4.1.2 The Global Server (GS)
As said, the server we call the GS is a specialized server for the PSNSs. All
new private networks will have to register their location as well as other specic
information about the network on this global server. It also co-ordinates and
generally enables communication between networks.
This server would store the locations of all private networks, all users and their
friendlists as well, as well as information about groups and events. When the
private network adds a new user, it gets the user's friendlist from his other
existing network(s) and sends it to the server. The server then sends back
information about which private network(s) the friends of that user can be
found on, as well as what other identities that user is sharing so that he can
send information directly to that network.
All private networks would have to register with this server. It could send
information on the location of other PSNSs to PSNSs. The locations of other
PSNSs are also stored under every PersonReference in the friendlists of all users
on the PSNS. Perhaps, it would be enough to be kept only there, meaning that
a PSNS would only have the location of other PSNSs where a user on that PSNS
has friends. Seen as the PSNS uses the locations of its peers when its users use
the search engine (As it will be explained later), either the searches have to go
through the GS, or the PSNSs have to know the locations of their peers.
4.1.2.1 GS class diagram
The GS class diagram as seen in Figure 4.3, portrays a design for a global
server. It goes together with the design for PSNSs as described earlier. The
functionalities later described in this chapter help clarify the operations in this
class diagram and how they are used. It displays classes for user, group, event
and friendlist handling, which are the classes needed for the functionalities designed in this thesis. Other features of the GS, such as updating applications
on the PSNSs, are not included since they are not strictly a feature of a running
distributed SNS.
4.2 Functional Requirements
Some of the functional requirements are debatable about, as to whether or not
it is necessary to count them among functional requirements. But in accordance
4.2 Functional Requirements
31
Figure 4.3: Class diagram for the global server
with our denition of a social networking system in Section 2.2, the following
have been chosen as functional requirements:
•
Create an Account It is easy to imagine a site where the user does not
create his own account. And this is something that should be addressed in
the specications of the PSNS during its creation. Some form of accounts
are necessary, and they must be created somehow, so it is fair to assume
that even if a user is not creating his own account, then someone else is.
32
Conceptual Distributed Social Network Design
•
Add Friend As with creating an account, it is easy to imagine a site where
•
Send Message Some form of communication is needed for the system to
•
Blog Same as with sending private messages, one can imagine a social
•
Login/out Logging in and out needs no further explanation, it is some-
the user himself is not able to choose his friends (a system where everyone
is friends with everyone for example). But again it's fair to assume that
some form of friendships should be designed, and some form of customizing
friendlists should exist. Adding a friend is essential for that.
be dened as a SNS, whether it is simply a blog feature or a mail system.
Sending private messages is considered among functional requirements of
a SNS.
networking system without the blog feature, but it is the only functional
requirement that separates this system from a mail server should only the
functional requirements be implemented.
thing that PSNS creators or administrators could perhaps be allowed to
fully control. But having the GS in charge of login mechanisms would
bring more security since compromised PSNSs could lead to compromising the network. Amateur users are more likely to congure an unsafe
login mechanism. The same happens with the current CSNS, depending
on the level of their wanted integration, safe login mechanisms for their
API should be designed.
Since the functional requirements are mainly chosen for the site to be considered
a social networking site according to the denition in Section 2.2, a distributed
social networking system would be considered quite incomplete if these functionalities were the only shared ones. Thus the PSNS on the network should be
identied given their level of shared functionality services.
An example could be, a social network having only the functional requirements
being labeled as a "basic service" PSNS, a PSNS having all the functionalities
of Facebook being labeled as having "general service". And a PSNS oering all
shared functionality made available by the specication language be labeled as
a "full service".
4.2.1 Create Account
Creating an account involves the PSNS, where the account is being created,
the GS, a mail server of the user creating the account, a number of alternative
CSNSs, as well as all PSNS' that have accounts of users that are also on the
friendlist of the user creating the account on his other CSNS accounts.
4.2 Functional Requirements
33
The user sends the appropriate information to the PSNS when he creates an
account (user name, password, email address, prole information, login information for any alternative CSNS (if applicable)). The PSNS then checks if the
email address sent is in use by another user at that PSNS, and, if not, it sends
a verication email to that email address.
Once the owner has veried his address, the PSNS uses any CSNS login information given, to get the users friendlists o that CSNS and sends them to GS.
The GS then checks if the users friends have also registered for this or another
PSNS on the distributed network. If so, it updates the friendlists of those user's,
associating the users CSNS address with their friendlists, sending their PSNSs
an update, as well as associating the user's friendlist with his friends existing
account.
Use Case 1
Summary
Preconditions
Basic Scenario
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Alternate Path
2a.
.1
.2
6a.
.1
.2
Create Account
User wanting to create a prole on a private network. He
needs to be registered with the GS. And he may need to
get external information for other CSNS's and then register
them with the GS
User has access to PSNS and GS is online
Action
User submits name, password and email.
PSNS server checks database if email is registered
Verication email sent to email address
User veries email address, sending conrmation to PSNS
User enters login information for any other CSNS
PSNS gets friendlist at CSNS
PSNS registers user with his friendlist at GS
GS compares email from CSNS with other peoples
friendlists
GS associates new email address of with existing email address in friendlists
GS sends updates to PSNSs where information has been
changed.
Email already registered
PSNS sends error message to user.
Prole creation process ends
User has no login at other CSNS
PSNS registers user at GS
Process ends.
34
Conceptual Distributed Social Network Design
Figure 4.4: Sequence diagram for creating an account
4.2 Functional Requirements
35
4.2.1.1 Notes
The design for creating an account assumes that a user has only a single alternative CSNS account for simplication . No method is created for handling additional alternative accounts or allowing users to congure alternative accounts
at a later date. Thus it assumes that user is willing to submit this information when he makes his account. The user might not be willing to submit such
information immediately at account creation for several reasons:
1. He does not have an account already, but creates it later. Many
users create accounts on several networks to try them out and see what
they have to oer, but never use them until much later. By that time
much may have changed, and he may have new accounts he would like to
associate with his account on the distributed SNS.
2. He forgets or makes a mistake. The PSNS gets the CSNS information
after the account has been created. Thus a mistake like f.ex. a typing error
or mistaken password would result in failed authentication.
He may be in a hurry, just creating the account to try out the site, not
bothering with giving information about his alternative accounts right o
the bat.
3. He does not want to share his information on the network. Reasons for a users unwillingness to share his information on a social network
(or in this case migrate, information between social networks) can be several. One such reasons could be that he wants to learn how to manage the
access controls on the new SNS before he migrates the information.
4. He does not trust the network security. It does not take a big breech
in security to cause a great deal distrust from users. Users are often very
careful about their information and have every reason to be.
All the reasons counted above give full cause for designing a mechanism to
modify alternative accounts and to update the information from them.
User verication in steps 1. - 5. should also be customizable by the PSNS site
creator or administrator, to be able to control admittance requirements.
4.2.2 Add Friend
Adding a friend simply sends the PSNS of the target friend a friend request.
PSNS then checks if the adder is on the block list of the added. If not, the
36
Conceptual Distributed Social Network Design
notication is saved on the prole of the user being added.
Figure 4.5: Sequence diagram for adding a friend
Use Case 2
Summary
Precondition
Basic Scenario
1.
2.
3.
4.
Alternate Path
3a.
.1
Add Friend
Adding a friend is simply a request that is sent to the added,
no changes will be made to friendlist until conrmed
User is already viewing the subject so he knows his location
Action
User requests to add another User
Requester sends a friendship request to the requesteds
PSNS
Requesteds PSNS checks if requester is on requesteds
Blocked list
Requested requested for conrmation
User is on subjects blocked list
Terminate sending
4.2.2.1 Notes
The user who tries to add someone who previously blocked him, does not get a
message informing him about his message request being blocked. The function
of a blockedlist is pretty self explanatory, people on user's blockedlist cannot
communicate with that user.
4.2 Functional Requirements
37
Adding a friend on CSNSs should also be possible on some CSNSs such as
Facebook. It is not included in this design, but it would be one of the rst
things to be added if this design would be fully implemented.
4.2.3 Send Message
Sending a message works exactly in the same way as adding a friend, except
that instead of saving a notication, it saves a message. The dierence only
being the slight dierence on the sent content data (message and subject instead
of notication reason). Sending a message to friends on CSNSs is possible
too on some CSNSs. With Facebook API this can be done without explicit
authorization.
Figure 4.6: Sequence diagram for sending a message
38
Use Case 3
Summary
Preconditions
Basic Scenario
1.
2.
3.
4.
Alternate Path
2a.
.1
3a.
.1
Conceptual Distributed Social Network Design
Send Message
Sending another user on any network a private message
User is viewing subject so he already knows his location
Action
User submits a message to send to a subject
Users PSNS sends the message to subjects PSNS
Subjects PSNS checks if User is on subjects blocked list
Message is committed to subjects inbox
Subject is on a CSNS.
Message is sent as an email
User is on subjects blocked list
Terminate sending
4.2.3.1 Notes
Strictly speaking, sending a message does not need to be a functional requirement according to the denition made in Section 2.2, but a form of communicating is needed according to the denition. Sending messages to other users is
a basic feature no SNS should/could be without and is therefore included here
in the functional requirements.
4.2.4 Blog
The implementation of blogging is quite important since it is the most used
feature of social networks. There are many dierent ways to implement blogging
but in this design, blogs are stored on the accounts of the users that can read
them, to make them accessible faster.
When a blogger posts a blog, the blog is sent to all PSNSs where that user has
friends as well as all CSNSs, where that user has accounts, and the CSNSs oer
API for blogging such as Facebook does through its mini-blogging feature called
"NewsFeed".
The receiving PSNS checks if the blogger is on the receiving users blockedlist or
hidelist before it commits the blog to.
4.2 Functional Requirements
39
Figure 4.7: Sequence diagram for blogging
Use Case 4
Summary
Preconditions
Basic Scenario
1.
2.
3.
Notes
Blog
Blog is general term for what can be called a tweet on
twitter and news feed on Facebook. It is basicly a text
message visable to all users who are following you. These
will be posted on the CSNS as well as PSNS' but PSNS will
remove any repeated blogs
Action
User posts a message for his blog
PSNS, sends the message to all SNS the user is part of
PSNS goes through users list and sends the message to all
PSNSs where user has friends
4.2.4.1 Notes
To hide a user is only to block his blogs, f.ex. if that user is the friend of the
hider, but usually blogs in a dierent language and the hider does not want to
be bothered with the blogs.
40
Conceptual Distributed Social Network Design
4.3 Account Management
In this section some of the non-functionally required operations dealing with a
users account will be briey described. Used case tables, as well as sequence
diagrams for all of them, may be found in appendix.
4.3.1 Modify User Information
To modify one's account information, a user simply re-sends/updates all account
information and thus the modied ones will be included in the modication.
4.3.1.1 Notes
Account information to be updated is only username, password and information
strings. The information string can of course be as long as needed and contain
all user information. What is mostly missing here is a prole photo, but if
photos in photo albums/ data sharing had a unique identier, this identier
could be included in the information string.
4.3.2 Create Group/Event
Events and groups are very similar, the only dierence is that events have a time
and date. They both have a creator and a list of administrators and participants.
Those two groups have dierent access, and those accesses are set originally by
the creator and then depending on how the privileges are set. The group and
event are saved on the creator's own space on his PSNS.
Basic information about groups and events are also saved on the GS to aid
searching.
4.3.2.1 Notes
Actually having basic information about groups and events isn't necessary, but
in this implementation it is included to make it possible to have a search option
where you can search for groups, events and people without searching at all
4.3 Account Management
41
existing PSNS, as the number of PSNSs increased, the network trac due to
search requests would grow exponentially.
4.3.3 Join Group/Event
Groups and events can be open for all users, password protected or require
administrator conrmation. When a user requests to join group, a password is
always sent along with the request (it can be an empty string). If the group
is open, the user is simply added directly on participants list, if it is password
protected the password sent is compared with the password required and if it
requires conrmation a "joinRequest" is saved on the group and only users with
high enough privileges can accept such a request.
4.3.4 Group/Event Invitation
Similarly to adding a friend, after checking the blockedlist, a group or event
invitation is saved on a users account as a notication. When conrmed the
group or account is added on the user's group or account list and the user is
added on the groups or events participant list.
4.3.4.1 Notes
One can think of more options for groups or events. For example the new
Facebook group system where users are simply added to a group without any
conrmation required. But that option is not included in this design since such
a design is considered inferior. It is so since users do not want to be aliated
with all groups they get invited to. However, any variation in design should be
considered for designing customization options.
4.3.5 Conrm Request
When a friendship, group or event request is conrmed, both the adder and the
added are added to the the corresponding friendlists of the other.
42
Conceptual Distributed Social Network Design
4.3.5.1 Notes
This should happen not only on their PSNSs but also on any CSNS account they
might have, where API for conrming friends is oered. But just like adding a
friend on a CSNS isn't included in this design, conrming them is not either.
4.3.6 Modify Friend Information
Friend information consists of his name, location and email pertaining to the
PersonReference class, alternative account info from the Friend class, permission
group and degree of following in the FriendFull class. FriendFull objects are then
stored in the friendlist. The modiable information with "modifyFriend" is the
information in the Friend class and subclasses. This information is modied by
resending all the information.
4.3.6.1 Notes
Users can set permission for dierent groups through the permission group variable. This means that he could make a permission group called "family" which
would have read/write permission to some family photos. Whereas the permission group "friends" would not have. But how the PSNS handles permission
groups has not been included in the design, nor how the user controls which
permissions a permission group has.
4.3.7 Blocking/Hiding Users
Being able to block/hide or otherwise control incoming information is very important for the success of a social networking site. The purpose of blocking is
to prevent communication from another user entirely. The purpose of hiding is
if you do not want to remove a user from your friends or block him, but you
may still not want to read his blogs and see his pictures all the time, and still
wanting them to be able to see your blogs and photos.
Blocking, hiding, un-blocking or un-hiding a user does not require any conrmation, the user is simply placed on or removed from the corresponding list.
4.3 Account Management
43
4.3.7.1 Notes
Blocked or hidden users should never be notied that they are being blocked,
hidden, un-blocked or un-hidden.
4.3.8 Withdrawing information
A user may want to remove a prole, leave a group/event or remove a photo,
friend or blog. Simple versions of these methods have been included in this
design and may be found in the appendix.
Removing blogs can be slightly problematic since they are saved on all accounts
that were friends with the blogger at the time of the blogging. Since the friendlist
may have changed not all blogs may have been removed. Even so, one could
implement an operation for removing a blog where the blogs would be removed
based on the current friendlist, or having a form of logging the friendlist and
then removing the blogs of a subject based on when the friendship was removed,
the last of which probably being the easiest.
But as it is with speaking, once words leave your mouth someone might always
remember. The blog removal in this design only removes or attempts to remove
your blog from all users currently on the removers friendlist. A copy of the blog
could exist in multiple dierent places, such as search engines or disconnected
PSNSs. An improved blog removal mechanism could be added later but is likely
to be incomplete and considered unnecessary at this point.
Removing a prole simply removes all users data (including blogs if blog removal
mechanism is implemented), This data is and should be unrecoverable, since the
reason a person removes his account, as opposed to just staying inactive, is that
he wants to get rid of everything connected with his account. Removal is sent
to GS since user needs to be removed o all his friends' friendlists.
4.3.8.1 Notes
Methods for removing information are very repetitive and in theory quite unnecessary for achieving a working SNS. Therefor, discussing them is not done
in detail here.
44
Conceptual Distributed Social Network Design
4.4 Data Sharing
As discussed in Chapters 2 and 3, most SNSs give you the ability to upload
photos. For that they have various dierent applications but focus on photo
and video sharing. To make the PSNSs as wide a range of services as possible,
it could be built upon a complete le sharing system, the PSNSs then in their
design or specications can dene what data they would like to show and how.
For a user sharing photos and other data, a system such as Dropbox oers,
or a capability le system as is described and designed in [26] could be used,
where les are shared using a virtual hard disk, although it would need to be
implemented on all platforms, since the implementation presented in [26] is only
for Linux. As well as some form of partitioning to allocate a certain amount of
space to each user.
But since the les should ideally also be accessible in a browser as this is how
all social networks function, we implement methods for managing photos which
are sucient for imitating all current SNSs, the capability le system only being
a very useful addition, and especially applicable for smaller PSNSs.
4.4.1 Photo Albums
An photo album is an item that can contain pictures. The album functions as
a folder on the users virtual hard drive, two albums belonging to the same user
can not have the same name. Albums can be created and removed just like any
folder and methods for doing so through a browser have been included in this
design. But in the virtual space, only the owner of the virtual space can create
or remove albums in his space.
4.4.1.1 Notes
Inside this virtual space, albums should be identied by the user as photo albums
to create a photo album object and treat them as such when viewing them in a
browser. However, little features for this virtual space are implemented in this
thesis.
4.4 Data Sharing
45
4.4.2 Photo management
All SNSs investigated in chapter 2 had a size limit on photos, their own compression etc. In this system such functionality should be controllable in the
specications, thus the PSNS rst checks the size of the photo/le being uploaded, calculates if it will t in users free space and then compresses the photo
if needed/oered.
Each photo is saved along with a smaller thumbnail of that photo to be used
for other users browsing the album.
Only the owner can remove his photos. In the case of group/events, it depends
on access privileges. And these methods have been included.
4.4.2.1 Notes
Each photo object belongs to an album and contains tags, comments, taggedPeople, ags, description, name and a thumbnail. Therefore folders in the virtual
space should be dened as photo albums, and only contain photos so that they
can be added as a photo object and given this additional information for being
better viewable in a browser.
4.4.3 Browse photos
When a user browses a photo album in a web browser, he gets only the thumbnails of photos in that album, as well as a link to view the rest of the information
about the photo and the album information.
To view a full size photo, the owner of the photo should be able to entirely
control the view-ability save for the fact that users tagged in a photo should
always have viewing rights. In this design, the access to photos is done through
a permission group variable in owners friendlist.
4.4.3.1 Notes
How the thumbnails are sent has not been included in the design. As it is
already implemented in [26] and only needs to be combined with the specication
language.
46
Conceptual Distributed Social Network Design
4.5 Networking
Interacting with other users is the main purpose of social networks. The interactions with other user that have been designed and are not in functional
requirements or have to do with le sharing are described.
4.5.1 Tagging
Tagging photos is an excellent way to increase the eectiveness of photo browsing and improve the social networking experience through giving photos added
relevance when browsing since relevant photos become easier to nd and photos
become easier to analyze.
When a photo is tagged, the tagging request is sent to the PSNS where the
photo is located. Then if the user has privileges enough, the tag is saved. When
a photo has been successfully tagged, the subject, the photo owner and friends
of the tagged subject are notied of the tagging. The tagged subject is then
given viewing and tagging privileges to that photo if he hasn't already.
Who has un-tagging rights could also be specied in the specications, but
owner and tagged should always have un-tagging rights.
4.5.1.1 Notes
Tagging is saved in photo object and sent to users when they seek to view the
full size photo.
4.5.2 Search
A search engine needs to search a lot of material on dierent places. To make
it fast, the GS could keep a copy of some of the information most commonly
searched for, to decrease network trac between PSNSs. This is chosen to be
users, events and groups in this design. This is also done for being independent
on replies from PSNSs in case they are oine.
For a full search, the search has to take place on the PSNS where the search
is made as well as all other PSNSs. The search engine searches rst the PSNS
4.5 Networking
47
where the search is made, then the GS and nally all other PSNS. Results
appear in the order they are received.
4.5.2.1 Notes
As mentioned in Section 4.3.2, with the increasing size of the distributed networking system. Not only the amounts of searches done per time unit, but also
the amount of places where the search needs to be executed in case of a full
search will increase the network trac exponentially. However, one solution to
this problem could be to meet this exponentially increasing network trac by
making full searches only on the users PSNS, the GS and all PSNSs where the
user has friends.
4.5.3 View Prole
Viewing a prole of a person on another PSNS, standardized information is
sent to the home PSNS of the user to be displayed in the way the home PSNS
displays websites. A request is simply sent to the home PSNS of the prole
being requested to view. Permissions are checked and appropriate information
then sent to the user through the users PSNS.
4.5.3.1 Notes
This information sent with the prole request should be standardized as much
as possible with the information oered by the API of existing CSNSs.
4.5.4 Modify Event or Group Privileges
Group and event privileges are a bit dierent than user account privileges. This
can be a design choice, but in this design, we will apply role based access controls
with three levels of access: Creator, administrator and participant. Creator
will have full access to everything in the group or event and all participants
and administrators will have their permissions set separately as a group. The
permissions are fully customizable so, in theory, there is nothing stopping a
participant to have access to things an administrator does not have access to.
48
Conceptual Distributed Social Network Design
4.5.4.1 Notes
Nothing stops groups from having permissions congured in the same way a
user account does. However, this method is a simplication to ease usability.
4.5.5 Write Testimonial
Writing a Testimonial is a completely unnecessary addition and could be controlled in the specications. They are very similar to blogs, except they are
placed on the blog of the user who the testimonial is written to and not the
writer's blog. The testimonial is sent to the GS to nd which friends are mutual
between the writer and the users whose blog the testimonial is written on. Then,
the GS noties those mutual friends, as well as any user tagged or referred to
in the testimonial.
4.5.5.1 Notes
Inspite of being unnecessary, having the testimonial option is available at almost
all current SNSs, and was thus included in this design since some people might
miss it. It is a dierent variation of blogging as it is basically blogging on another
person's blog. The dierence being in who gets it sent to their prole.
4.5.6 Comment
Comments are saved on the item where they apply, to comment a user must not
be on the blockedlist of the owner of the item. The comment is sent through
the GS since it needs to be saved along with the item in every place where the
item is saved.
Comments can be applied to both blogs and photos. When a blog is removed,
the comment is removed with it since it "belongs" to the blog.
4.5.7 Reply to Message
Replying to a message is exactly the same as sending a message except that the
receiver and the message subject is pre-decided.
4.6 Summary
49
4.5.7.1 Notes
The sequence diagram and use case table for sending a message also applies for
replying to a message.
4.5.8 Flagging
Flagging is saved as a string, it can either be used to report oensive material
or to express xed opinions in a countable way. Such as "like" on Facebook, or
be a vote on a poll.
4.5.8.1 Notes
Here Facebooks social plugin API could be used to combine likes.
4.6 Summary
In this chapter we have described many of the needed operations for a distributed
SNS, but they are only the beginning. Many of the non-functional requirements
that have not been designed for this system, but would direly need to be addressed for a fully functional SNS, have been partly overlooked in this design.
Examples of such are performance requirements, security and reliability, but
knowing this design, they will be left aside.
50
Conceptual Distributed Social Network Design
Chapter
5
Design and Languages Used
for Prototype
5.1 The specication language
For a distributed social network like the one described in this thesis, it is vital
that it is very easily set up and maintain. For a user of the specication language
to create a customized SNS to meet their needs and desires, all he should have to
do is modify simple variables in one single le. Let's call this le specications.
5.1.1 Framework design
The skeleton for the framework of the specication language is seen in Figure
5.1. The skeleton around the framework itself is little more than a description
of steps taken in creating a working SNS. On top of that then comes what tools
were used to create a fully functional framework, which will be discussed later.
The specication language should be aimed at both giving the users the ability
to choose what functionality should be on his PSNS, as well as customizing it
as much as possible without compromising the shared functionality needed for
52
Design and Languages Used for Prototype
Figure 5.1: General framework for specication language
the distributed network. Thus the user will be allowed to specify some options
in the specication that modify the functionality of each operation.
An example can be seen in Figure 5.2. A choice of conguration can be made
from a number of variations of blogging, the basic functionality is the same,
the variations only extending it or specializing in some way. Same goes for
the group functionality. The red line outlines a possible selection specied for
a PSNS. In this particular selection the PSNS creator has chosen Blog with
variation1, basic group functionality as well as all functional requirements and
some other functionalities. The unimplemented "Other" operation variation he
will have to design himself since it's outside the implemented operations in the
specication language.
Of course the amount of variations and added functionalities is endless, so in
this thesis focus was given not to designing and implementing too many variations, but rather make more basic functionalities and show an example of how
5.1 The specication language
53
Figure 5.2: Options in the Specication language
a variation could be congured.
The tools to be used for the framework of the prototype are mostly chosen based
on simplicity, to get a fully working prototype for this thesis. Basic knowledge
of Java is assumed of the reader, and therefore we will not describe it in-spite
of it's use on many levels of the framework.
5.1.2 The Web Server Engine
To create the web server engine the Klaim project was chosen for its simplicity,
number of built in features such as the Klava network (Klava.Net), access
controls and security mechanisms.
The Klaim project is made up of two parts, X-Klaim [17] and KLAVA [18]. And
makes it fairly easy to use to create distributed mobile applications. The XKlaim framework as described in [17], X-Klaim programs are made which then
compile into Java programs, which then need the KLAVA package to compile
and run in the Java runtime environment as seen in Figure [?]. A missing
link between the Klava package and the Java Interpreter was added, as the
interpreter also needs the Klava package for running the application.
Instead of running the application, the Java code received from the X-Klaim
54
Design and Languages Used for Prototype
Figure 5.3: The Klaim project framework for using X-Klaim, corrected from
[17]
compiler, is then modied manually, combined with specications, JPS (HTML)
code and nally made into m4 code. m4 was also chosen for its power and ease
of use as will be explained later. m4 then compiles into the JSP and Java code
which is used for the server. The PSNS engine is run in Java using the Klava
package on the server, and the web application is published on the server using
the JSP.
The only document the user (of the specication language) edits for customizing
the functionality of his page, is the specications le, specications.m4. The Web
application using JSP code is the User Interface which uses the Klaim generated
Java les as the Web Server Engine. The auto generated Java code using Klava,
uses the memory as its database, therefore no database implementation needs
to be included in this prototype.
After compiling everything the user has a functioning web server, and can then
5.2 The Klaim Project
55
Figure 5.4: Specication language for creating a PSNS in a Distributed SNS.
edit the web application using JSP code to add any additional functionality to
the page or edit its looks, as long as he should not jeopardize the part of the JSP
code that deals with the Java application and the shared functionality (cannot
be assumed).
Several languages and tools are used in the making of this prototype. Let's now
move on to explain the underlying methods in order to familiarize the reader
with the tools used for this thesis.
5.2 The Klaim Project
The Klaim project consists of two parts. One is "X-Klaim: A Programming
Language for Object-Oriented Mobile Code"[17], and the second on is KLAVA,
which is a Java package for distributed and mobile applications[18]. X-Klaim
56
Design and Languages Used for Prototype
is built upon KLAIM [16] as an extension, to program distributed systems who
interact with each other through multiple tuple spaces. KLAIM is on the other
hand built on top of "Linda, the portable parallel"[19]. The X-Klaim code
compiles into java code that utilizes the Klava package, as shown in 5.3. But
before we further describe the KLAIM project, let us quickly introduce what
KLAIM and Linda are.
5.2.1 Linda [19]
Linda is a coordination language, created in the mid 80's, and since then there
have been a number of various articles and summaries written on it. In Linda
concurrent processes communicate with a shared memory called a tuple space.
It can contain two types of tuples, static data tuples and process tuples. There
are 6 dierent operations in Linda: in, inp, out, rd, rdp and eval. Each time
an operation is called, a process tuple is dropped into the tuple space where it
remains under active evaluation until it is removed from the tuple space.
•
in(s): Searches for a tuple t that matches s. If no tuple t matches s, the
•
inp(s): Searches for a tuple t that matches s. If it nds a match, it
•
out(t): Produces/executes a tuple t and writes it to tuple space.
•
rd(s): Searches for a tuple t that matches s. If it nds a match it reads
•
rdp(s): Searches for a tuple t that matches s. If it nds a match it will
•
eval(t): Creates a new parallel process to evaluate tuple t and write its
process suspends until it nds a match. If it nds a match, it reads and
removes tuple t from tuple space.
removes tuple t from tuple space and returns "true". Otherwise it returns
"false".
tuple t from tuple space (does not remove it). If no match is found the
process is suspended until it nds a match.
return "true" (does not remove tuple). If no match is found the process
returns "false"
result to tuple space.
A tuple space is an associative memory. Tuples can have any number of elds
and they are said to match if those elds are identical. The operations in, inp,
rd and rdp check if tuples match using pattern-matching, rst checking how
many elds a tuple has before matching the elds.
5.2 The Klaim Project
57
Furthermore formal parameters can be used for match-templates. In Linda these
parameters are represented with a question mark before the variable name. For
instance, if you have a tuple (1,"foo"), inp(1,?a) will return "true", and the
variable name a will be given the value "foo".
5.2.2 KLAIM: A Kernel Language for Agents Interaction
and Mobility
KLAIM [16] extends Linda by allowing multiple tuple spaces, they are placed
on specic sites of a net (nodes). And they are accessed through their locality.
Localities can be twofold.
•
S(s) is a set of sites (or physical localities). A site can be considered as
•
Loc(l) is a set of (logical) localities. A locality may be thought of as
the symbolic name for a site. Localities permit structuring programs over
distributed environments while ignoring their precise allocations. A distinguished locality self ( Loc) is assumed. Programs can use self to refer
to their execution site.
the address of a node where processes and tuple spaces are allocated.
With the introduction of localities, all operations in KLAIM are executed at a
locality, syntactically that is done by adding a "@<locality name or address>".
KLAIM implements all operations of Linda, except that it modies eval to have
processes as arguments instead of tuples, to allow for mobile agents. Additionally it has a newloc(u) operation. newloc() creates a new locality and binds it
to u. Furthermore KLAIM introduces simple data types to tuple elements.
5.2.3 "X-Klaim: A Programming Language for ObjectOriented Mobile Code"[17]
X-Klaim has the same operations as KLAIM and they can be executed at dierent locations <operation>(<tuple>)@<location> as in KLAIM. Important things
are added to X-Klaim. It provides the tools to dene subroutines, arguments,
variables, conditional testing, programming statements and arithmetic capabilities. Each running process is run from or within a node. A node starts with a
name and can have a mapping from a logical locality to a physical locality like
this.
58
Design and Languages Used for Prototype
example_node::{<logical locality variable> ~
<physical locality constant>}
Each node has one and only one "begin" and an "end". It functions much like
a "main" function in many other languages such as Java, wherein you can use
any number of external subroutines. Furthermore subroutines can be imported
to be used on a dierent node. An example of a node and subroutine could be:
rec StringRetriever[<locality name> : loc, <string name> : string]
declare
var <variable name> : <type>
begin
if inp(<string name>,!<variable name>)@<locality name> then
out(<variable name>)@self
endif
end
nodes
tupleBank::{}
port <tuple bank port>
begin
out("foo","tuple found")@self
end
endnodes
This node will simply write a tuple with two string elements to its tuple space.
When called, the subroutine will check if a tuple ("foo", <any variable of type
<type>>) exists on <locality name>. If it does, the variable <variable name>
will get the second element of the rst matching tuple it nds. That tuple will
then be removed from tuple space on <locality name>. Lastly before ending the
subroutine a tuple with the value of <variable name> will be dropped onto the
tuple speed of "self", which is the node where the subroutine is run from. It
could be dened on any node, and could be imported to another one using:
rec <subroutine name>[<parameters>] extern
To import more than one subroutine, all but the last one have to be followed by a
semi-colon, as is the case with most things in xklaim. In X-klaim separators are
only used between parameters, variables, lines of code and import statements.
5.2 The Klaim Project
59
An example of a node using a subroutine dened elsewhere, could look something
like this:
rec StringRetriever[<locality name> : loc] extern
nodes
caller::{tuple_bank ~ <physical address>:<tuple bank port>}
port <port number>
begin
eval(Example(tuple_bank, "foo"))@self
end
endnodes
Here the example subroutine is imported and the caller node calls it. The
subroutine will in this case nd a tuple with the rst element being "foo". If
found, it will output the second element into its tuple space, that element in
this case being the string "tuple found".
5.2.4 Klava [18]
The Java code received from compiling the X-Klaim code requires features not
supplied by Java, such as tuples, tuple spaces, localities and nodes. Klava is
a package containing a framework used by Java to compile and run the Java
program. Thus it is a middle ware between Xklaim and Java. Knowledge of
Klava is not needed when programming in Xklaim, but since the code received
from X-Klaim is manually customized before it is made into m4 code, some
knowledge of at least the data types and their handling is required. In this
thesis, Klava data types are mostly handled by converting them to basic data
types before using them in computation and then converting back to Klava data
types if needed. An example of Klava data type computation is as follows
timestamp = new KInteger() ;
in( new KString( "timestamp" ), timestamp, self ) ;
timestamp = new KInteger( timestamp.intValue() + 1 ) ;
out( new KString( "timestamp" ), timestamp, self ) ;
Lines 112-115 from MakeBlog.m4
60
Design and Languages Used for Prototype
Here you see a KInteger() (Klava object) being created, then the KLAIM operation in(s)@l is called, namely in("timestamp", timestamp)@self where "timestamp" is a KString and self is a logical locality expressing the node upon
which the process is being executed. Timestamp is then incremented before
it's dropped back into the tuple space of the logical locality where the process
is being executed.
5.3 m4
m4 is a general purpose macro processor and macro language. It provides features such as.
• arguments
• condition testing
• arithmetic capabilities
• string and substring functions
• le manipulation
In m4 # is used to mark the beginning of a comment and $<argument number>
is the number of an argument, passed to the macro in the order they are passed.
Quotations are used to manipulate how macros are expanded. The processor
removes one layer of quotes each time it processes the macro.
Inspite of its range, the built in commands used for this thesis, listed in the
order they appear are [15]:
•
changequote(left,right). Dene quote characters as left and right.
•
include(lename). Expand contents of lename.
•
dene(name,text). Denes the macro name to be text.
•
ifelse(text1,text2,ifeq,ifne). If text1 and text2 are equal strings, expand to ifeq. If not, expand to ifne.
To explain we can imagine two les, Definitions.m4 and Example.m4. Definitions.m4
could look something like this:
5.4 Java Server Pages
61
define(a,10)
And Example.m4, something like this:
changequote(þ,ð)
include(Definitions.m4)
ifelse(a,0,
þdefine(Execute,$1 * 2)ð
,
þdefine(Execute,þ $2 * 2 ð)ð
)
Execute(20,40)
If Example.m4 is compiled, it starts by changing quotation marks from being
single quotes to be "þ" to start quote and "ð" to close it. It expands the contents
of the le Definitions.m4, which dene a variable a to have the value 10. Then
it checks if the value of a is the same as the value 0 (the value of a being 10).
If it is, it denes Execute to multiply its rst argument by two. If it is not,
then it would dene Execute to display "verb|<|second parameter> * 2". It
would not compute the multiplication since the processing would only remove
the most outer layer of quotations. It then processes the macro Execute with
the parameters 20 and 40.
m4 is well suited for this project since it's very easy to use, it allows us to read
specication from the user from a separate le. In this specication le the user
denes the size of some control arguments (macros). These control arguments
are then expanded into other m4 les that generate customized java code.
5.4 Java Server Pages
Java Server Pages are a cross-platform method that dynamically generates web
pages based on HTML and Java. Java code is simply embedded into your web
page alongside your HTML code. JSP was chosen for its ease of use both for
the user and the maker of the specication language.
The method of inputing the Java into the JSP is extremely simple. There are
62
Design and Languages Used for Prototype
3 main methods of importing, you can import "page directives" by surrounding
the syntax like so:
<%@ -PAGE DIRECTIVE SYNTAX- %>
Similarly you can add declarations surrounding the declaration syntax like so:
<%! -DECLARATION SYNTAX- %>
And java expressions like so:
<%= -JAVA EXPRESSION SYNTAX- %>
And nally, you can place blocks of Java code like so:
<% -JAVA BLOOCK CODE SYNTAX- %>
As said, JSP code is the nal product the user receives and deploys to have a
working social networking site. Basic HTML code surrounding the JSP code
is supplied to the user when the m4 les are compiled, using simple forms to
get input from the visitors of the social networking site. This code can then be
modied by the user to obtain whatever outlook he seeks, or even congured
directly to extend an existing web service he has.
Core functionality needed by the distributed social networking system will be
kept as much as possible in the Java les to help ensure uniform functionality.
Although these les can easily be tampered with to corrupt the functionality or
even to make it malicious.
Chapter
6
Prototype
In this chapter we will explain the prototype system implemented. The prototype does not attempt to reach the full functionality of the system designed
in Chapter 4. It is merely to show how the designed framework designe creates a functional SNS. No functionality needed for a distributed SNS has been
implemented in this prototype.
6.1 X-Klaim web server engine
The X-Klaim program made consists of two les, Server.xklaim and User.xklaim.
They compile into a Server class as well as a set of other classes that contain
the Klava based java methods for the web server. These other classes are a set
of subroutines that function as the web service engine as displayed in Figure
4.1. The Server class is executable, and starts a Klava node on the the Klava
network. All activity on the PSNS, goes through the Klava network, and is
stored on the tuple space of either the Server node or the node created for the
active item (Account, Group or Event). Thus the Klava network along with the
Server node, function as the PSNS Database as it is displayed in Figure 4.1.
The Klava network Klava.Net, is built into the Klava package. It can in theory be run from anywhere as long as the Server class and all subroutine method
64
Prototype
classes are passed its location. The Java application aquired by compiling the Xklaim les Server.xklaim and \verbUser.xklaim| form a fully functional web
service. The web service is deployed by running Klava.Net and then creating
and running the Server node on it. Although no user interface has been developed at this stage, it would only be accessible by users running Klava based
Java applications.
To engage in any kind of activity on Klava.Net, the user must be registered
with Klava.Net with a node. This node has an address and a tuple space.
For engaging in any kind of activity on the server, the user is involved with
three dierent registered nodes: The Server Node, his account node as well as
the node with which he is registered at Klava.Net. For simplication let's call
these nodes: ServerNode (SN), YourNode (YN) and *Self.
6.1.1 Security
The server, that functions as the database for the web server can only be accessed
by a xed number of methods imported in the Server class. These methods have
to be located in the same folder as they are being run from. Should a method
try to access the SN tuple space from a dierent location, Klava.Net will deny
access and print a "untrusted thread:..." error message.
Furthermore the methods are serialized. Should they be modied and recompiled it will result in a runtime java.io.InvalidClassException, due to incompatible serialVersionUID.
No further security mechanisms than those built into the Klava package were
implemented due to time constraints.
6.1.2 Methods Implemented
Out of the many requirements described in chapter 4, only a few have been
chosen to be implemented for a X-Klaim prototype of a social networking system. All functional requirements were implemented along with a few other
non-functional requirements. The functional requirements implemented were
create account, login/out, add friend, send message and blog.
Non-functional requirements implemented were methods for creating a group or
event and inviting users to join groups or events. Events and groups are treated
6.1 X-Klaim web server engine
65
in exactly the same way as an account. A user even has to log into that event
or group to post and view things about that event.
6.1.2.1 Create Account, Authentication
As mentioned in chapter 3, you can have three kinds of accounts, User, Group
and Event accounts. These accounts are created in the same way. They are
passed a user/event/group-name, a password and the location where the request
is coming from. If the account name is available the account will be successfully
created. When a user logs in, the same information is sent for verication on
the Server node.
To use the methods a user needs to have the following information available at
*Self: User/Group/Event-name, SN address and YN address. This information
is outputted as a tuple to the tuple space at *Self. He is then taken to his
prole.
When an account is created, the account is assigned a unique node. The assigned
node stores all material posted on the network by that user in its tuple space.
When logging out, the information put on the tuple space on *Self is removed,
and the "Frontpage" method called with *Self as a parameter, resulting in no
messages, invites or blogs.
6.1.2.2 Prole
No mechanism viewing the proles of others was implemented. When viewing
your own prole, all that is done on the web service engine side is viewing new
messages, invites and the activity of friends (Blogs). This is done by executing
the Frontpage method on SN, with his YN as a parameter. The Frontpage
method checks invites, new messages and all blogs made by friends of the user.
•
Check Invites. Check Invites takes a YN as parameter, and checks if
that node has received any new invites or friend requests. It then calls the
"Conrm Friend/Group/Event" method which should request a conrmation from the user. But such a conrmation has not been implemented, so
the next time the invited User/Group/Event logs on, it will automatically
conrm the invite.
66
Prototype
A friendship is registered by putting a tuple containing information about
the other user on both parties' YN. A group or event membership is registered only on the users side, since the group or event has no interest in
reading the blogs of users.
•
Check New Messages. Checking new messages works similarly to check-
•
Get Blogs. Just as in checking invites and messages, getting blogs takes
YN as a parameter. It then reads every blog made by any user or group on
the SN, in the order they are made. For every blog, it checks if the blogger
is a Friend/Group/Event that he "follows". If it is, then it displays the
blog, along with username of the blogger and subject if available.
ing invites, all messages marked as "unread" are read from the YN passed
to it as a parameter. The messages are then placed back on the node as
"read".
No method is implemented in X-klaim for replying or for reading previously read messages. Although it would require very little tuning, as
replying to a message would simply be to send a message with a xed subject and sender. Reading previously read messages would be exactly the
same as reading new messages, except instead of the last element of the
tuple being searched for being "read", it would be changed to "unread".
6.1.2.3 Add Friend, Event/Group Invite
Adding a friend sends target node a friend request. The friend request consists
of a tuple with a string identifying the type of request, the username of the
adder and the node of the adder. This information is put there to pave the
way for implementing a friendship conrmation mechanism, but it has not been
implemented as explained in Section 6.1.2.2. Group or event invitations work
in exactly the same way as adding a friend.
Inviting to groups or events and sending messages works very similarly, except
that inviting to groups or events rst checks if the group or event exists before
dropping a tuple into the target users' tuple space. Sending a message just does
it outright.
6.1.2.4 Blog
Blogging is done with the "MakeBlog" method. Makeblog is the method that
will in the prototype example shown how its functionality can be changed using
m4. The variable functionality is blog length restriction (many sites have this
6.2 Alternative Framework
67
restriction, especially sites that oer sms message services), whether or not a
blog comes with a subject and subject length restriction.
MakeBlog takes the blog content (includes subject if applicable), YN and *Self
as parameters and outputs the blog into the YN tuple space. *Self is only taken
as parameter for debugging.
6.2 Alternative Framework
Implementing the system using the framework designed in chapter 5, using JSP
with Klava and X-Klaim proved problematic due to errors with access controls
on the server. These errors can most likely be traced back to built in access
controls in the Klava package. Fixing these errors turned out to be a dicult
task to overcome. Thus I gave up on implementing the framework using JSP,
and resorted instead to an alternative implementation.
This alternative implementation, uses a Java Swing Applet instead of JSP. This
changes the framework to become as displayed in gure 6.1.
The site creator still only has to edit the Specications le before deploying the
Java Applet. In essence, the functionality is the same as if it had used JSP, but
to customize the site, the site creator now has to edit the Java les. Furthermore
the Java Interpreter now runs on the user side, instead of the server.
6.3 Web server engine using Java Swing Applet
The methods used are still the Klava based Java methods. The database is the
same, i.e. a combination of Klava.Net and Server.class. The applet is mainly
the User interface. When the application starts, it is in the an idle state. From
there a user can take 4 actions, to log in or create an account/group/event.
6.3.1 Addresses
Each time a user logs in or creates an account/group/event a new node is logged
into Klava.Net. This node is made on the address "localhost:10000" in this
implementation. Some algorithm for nding an unused node when logging in
should be implemented, to avoid clashes with other users trying to log in with
68
Prototype
Figure 6.1: Framework for specication language using Java Applet
the same node. This node functions as the *Self node, YN is assigned using
newloc(), and SN is hard-coded to be 11000.
Due to the fact that an address assigning mechanism was not implemented,
two users logging into the Klava.Net can have problems because of the location
starting at "localhost/10000", and two nodes with the same location cannot be
logged into Klava.Net at the same time. To solve this, the physical location of
the user could be used, or using the newloc() operation to nd a free node.
6.3.2 User Interface
The UI as shown in Figure 6.2, consists of a number of JTextFields, JButtons
and a JTextArea. The JTextField are to enter information to submit. Information is submitted according to which JButton pressed. JTextArea is used to
6.3 Web server engine using Java Swing Applet
69
display output.
Figure 6.2: PSNS user interface in a Java Swing Applet
When a JButton event is triggered (Button pressed), a Klava process is created
and then started on YN. This process runs in a separate thread, therefore we
put the application to sleep for a second while the we wait for the process to
nish. The resulting text is then displayed on the JTextArea. Displaying the
result output was solved with a bit of a quick x. All output from any method
was modied to be written into a le test.txt, in addition to the command
line output.
6.3.3 State Machine
When the application is started, it starts in the idle state. A node is registered
with the Klava.Net environment with the Create Account/Group/Event and
Log in JButton events. This node is the *Self node. After those events the node
is stored until another one of those events occur, the application is terminated,
or if the Log out JButton event occurs. While this node is stored the user is
considered logged in, since all other JButton events are processed with that
node as *Self. This can be visualized in Figure 6.3
6.3.4 Scalability
Time constraints resulted in quick xes such as hard-coding localities and using
test.txt to display text. These quick xes result in the site having complete
lack of scalability. In fact using a le to display text means that the site can
give unwanted results if more than one user access it at the same time. Since
both users read and write to the same le.
70
Prototype
Figure 6.3: State machine diagram
6.4 m4
m4 is the language the user of the specication language deals with for deciding
which shared features he wants in his program. Our prototypes m4 code consists
of one m4 le for each le that needs to be created, plus the specifications.m4
le. Each le imports specifications.m4 and uses the macros dened there
as parameters for condition testing, to determine the code output.
The prototype specifications.m4 has the following macros dened.
define(BlogLengthRestriction, 2254)
define(BlogSubject,222)
Listing 1: Lines 1-2 from Specifications.m4
This denes the variable BlogLengthRestriction to have the value 2254, and the
BlogSubject to have the value 222.
BlogLengthRestriction denes the length of each blog users are able to make.
Since it is considered an essential part of a social network, not having it is not
an option. Should BlogLengthRestriction be set to 0, it will mean that there
6.4 m4
71
is no restriction on the length of a blog. If it is any other natural number, it
represents the length of the string the blog can be. Not having a blog possibility
is not given as an option, since blogs are considered a functional requirement.
Similarly BlogSubject represents the length of the string that can be used as
a subject of a blog, but here 0 represents that no Subject option is available.
Having subject without a length restriction is not an option.
6.4.1 Customization
As mentioned in Section 6.1.2.4, MakeBlog is the only method in this prototype,
where customization has been implemented using the specications le. Here is
a run-down on how it works.
changequote(þ,ð)
include(Specifications.m4)
ifelse(BlogSubject,0,
þdefine(MakeBlog,þþ
import java.io.* ;
import Klava.* ;
public class MakeBlog extends KlavaProcess {
... #Java code
textLength = new KInteger(\$1);
... #Java code
}
}
ðð)ð,
þdefine(MakeBlog,þþ
import java.io.* ;
... #Java code
72
Prototype
}
ðð)
ð)
MakeBlog(BlogLengthRestriction,BlogSubject)
Listing 2: Various lines from MakeBlog.m4
In listing 1 and 2 you see how the specications are included and used to determine the output code of the MakeBlog le when compiled. First it changes
quotes to ð and þ. Second it checks if the macro text BlogSubject equals 0.
Third it removes one set of quotations from the resulting text of the ifelse
condition. Fourth it denes the MakeBlog macro to be the code to be used
on the web server surrounded by quotations. And nally it calls the MakeBlog
macro with the Specifications.m4 dened macro texts as parameters. The
execution of MakeBlog.m4 is piped to MakeBlog.java, which is used directly on
the web server.
A simple .sh or .bat le is made to compile and pipe all .m4 les into the correct
corresponding les.
6.4.2 m4 security issues
Some issues may arise as to the safety of using m4 in the way it is used in
this prototype. The macros dened in Specifications.m4, don't have to be
a number, instead of dening one of the macros to be a number, an attacker
can dene it as any malicious Java code, which will be executed every time the
method is executed:
define(BlogLengthRestriction,þ25); <Malicious java code>ð)
The code can be any malicious Klava based Java code. Possible solutions to this
would be to generate the java method le remotely, and use input validation
to check if the dened macros are in fact numbers, along with serialization and
version control could help solve the problem. But the same as goes for all social
networks, the user has to trust the site administrator.
Chapter
7
Summary, Conclusions and
Future Work
Since their appearance in the beginning of the 21st century, internet sharing
trends are shifting fast towards social networking sites such as Facebook, Twitter and LinkedIn. Most of these sites are created or run with the same or similar
concepts. Their purpose is similar, and they oer similar features. What separates them is largely just their user-base. In this thesis we researched a great
deal of social networking services, designed a distributed social networking system, a specication language and nally made a prototype implemented on top
of the aforementioned things.
7.1 The Distributed Social Networking System
After researching and analyzing most of the largest general social networks available, a distributed social networking system was designed. This system would
be made up of many smaller social networking sites. All these smaller sites share
a number of common functionalities. These functionalities are chosen from functionalities oered by a specication language also designed in this thesis. The
functionalities designed are chosen from what common functionalities almost all
of the social networks investigated in this thesis had in common.
74
Summary, Conclusions and Future Work
All users of social networking sites on the distributed network, can access posted
material by other users on other sites on the network almost as if it was their
own. All functionality on the network are based on the common functionalities
shared between sites on the network.
7.2 The Specication Language
To help standardizing the functionality of the Smaller social networking sites,
as well as making it easier for people to create a social networking site. A
framework for a specication language was designed. The
A prototype for a specication language, using the framework designed was
created. Creating this prototype required considerable research of available
tools to aid the creation of this prototype. Finally a Java based solution was
approached. An attempt to use X-Klaim, Klava, m4 and JSP to create the
specication language was made, then deploying the site using tomcat. But
Klava built in access controls prevented the JSP Java code to access the Klava
methods created with X-Klaim. After considerable time spent on debugging,
this framework was abandoned.
Just in the nick of time, to present the functionality of the designed Specication
language prototype, a Java Swing Applet was used to create the necessary user
interface to present the Social Networking Site.
7.3 Conclusions
In this thesis, focus was put on researching and designing the distributed social
networking system. For a system as proposed in this thesis, it is imperative that
it is built on rm foundations. Especially since the developers of the Network
and the Specication language are not the same as the developers of the social
networking sites, that use their products. Thus the elaboration of the prototype
is only useful if the networking system is complete.
Nevertheless each step of the thesis was executed suciently. A nearly complete
distributed social networking system was designed. A framework for a specication language was designed (in fact two, since the rst couldn't be executed) as
well as a prototype using that framework implemented. That prototype showed
a functional social networking site, with all functional requirements dened in
the design implemented and working.
7.4 Future Work
75
In retrospect, perhaps it would have been a more handy solution to use straight
up Java classes or even enterprise Java beans (EJBs) to reach the same result.
The project would then have become more of a building block towards a well
scalable, functional social networking service.
7.4 Future Work
The distributed social networking system opens up a world of future work.
Besides nish creating the specication language for a PSNS on the design
distributed social networking system. The amount of possible functionalities
oered with the specication language are countless, even though not all of
them would have to be compulsory as a shared functionality.
Added use of existing social networks' API could be implemented to better
migrate information between them and networks on the distributed system.
The amount of entry points for information is likely to reveal countless security
vulnerabilities. These vulnerabilities can be investigated and perhaps prevented.
Creating API for all the functionalities, to give currently existing social networks
access to the distributed network.
Should this future work be concluded, not only would it greatly enhance peoples
online social networking experience, it could also be lucrative.
76
Summary, Conclusions and Future Work
Appendix
A
Prototype Tests
To test the prototype I created a SNS where blog length restrictions were 15
characters.
Then I tried creating 3 accounts. 2 of which had the same name. The two
successfully created account tried adding each other as friends, tried blogging,
sending messages and logging back in to receive those blogs and messages. This
included trying to send a blog too long for the length restrictions.
• Create Account with JTextField1:"username", and JTextField2:"password".
the JTextAerea returned
user username successfully created, with nodenumber 127.0.1.1:55434
No new invites
• Create Account with JTextField1:"blogger", and JTextField2:"password".
the JTextAerea returned
user blogger successfully created, with nodenumber 127.0.1.1:41398
No new invites
• Add Friend with JTextField6:"username". the JTextAerea returned
78
Appendix A
blogger has sent friend request to username
• Blog twice with JTextField5:"Blog text body", and password:"password".
the JTextAerea returned
user blogger successfully created, with nodenumber 127.0.1.1:41398
No new invites
• Blog with JTextField5:"Blog text body, but this time a really really long
one.", and password:"password". the JTextAerea returned
Blog too long
• Send Message with JTextField3:username, and JTextField4:Message text
body. the JTextAerea returned nothing
• Log in with JTextField1:"username", and JTextField2:"password". the
JTextAerea returned
blogger has sent you a friend invite
bloggerhas been added to your friendlist
No new invites
blogger wrote: Blog - Blog text body
blogger wrote: Blog - Blog text body
• Log in again with JTextField1:"username", and JTextField2:"password".
the JTextAerea returned
No new invites
blogger sent you the following message: Message text body
• Create Account with JTextField1:"username", and JTextField2:"password".
the JTextAerea returned
username taken
All test results turned out exactly as expected, except for the fact that the
logging did not return all awaiting information. Most likely because the tread
was not put to sleep long enough before it made the process terminate.
Appendix
B
User Manual
Here is a step by step introduction on how to compile and deploy the prototype.
This Prototype was made with NetBeans on Linux.
1. Download and extract the PSNS.zip le into your workspace. PSNS.zip
contains a working Java Swing Applet SNS.
2. Add klava-2b1.jar to you system CLASSPATH. klava-2b1.jar can be found
in .../PSNS/lib.
3. Modify Specications.m4 to customize your SNS.
4. Run the shell script CompileAll.sh. This will overwrite relevant java les
and recompile.
5. Open a terminal and navigate to your .../PSNS/src folder.
6. Run the following commands: java Klava.Net 9999 and java autogen.Server.
7. Open NetBeans, go to le menu and open existing project. Navigate to
the folder where you extracted PSNS.zip, and select the PSNS4 folder.
8. Recompile PSNS project and run the swingJApplet.java le.
9. SNS ready
80
Appendix B
Appendix
C
Sequence Diagrams and
Use cases for functionalities.
In this appendix you may nd sequence diagrams and use case tables for all
functionalities designed in Chapter 4. Many of the use case tables have been
split into two parts for better page tting.
Figure C.1: Block User
.
82
Use Case 5
Summary
Preconditions
Basic Scenario
1.
2.
.
Block User
A user is blocked by placing him on blockers blocked list
Blocker is viewing user
Action
Blocker requests to block a user to his own PSNS
User is placed on blockers blocked list
.
Use Case 6
Summary
Preconditions
Basic Scenario
1.
2.
3.
4.
5.
6.
Alternate Path
2a.
.1
5a.
.1
.2
.
Appendix C
Browse photos
When a user browsers through a friends photos he will view
thumbnails of the photo(s)
Action
User requests photos from a subject
User requests location of subject from GS
GS sends location of subject to user
User requests access to a photo album of subject
Subjects PSNS checks users access in subjects friendlist
Subjects PSNS sends user a number of thumbnails along
with photo info (tags, location and description)
User already has location of subject
Go directly to 4.
User does not have access to subjects photo album
Send error message to user
Terminate process
.
Use Case 7
Summary
Preconditions
Basic Scenario
1.
Conrm Friend Request
A conrmed friendship needs to be registered with both
PSNS and the GS
User has received a friend request from another user
Action
User accepts friend request from Requester
Sequence Diagrams and Use cases for functionalities.
Figure C.2: Browse Photos
.
83
84
Appendix C
Figure C.3: Conrm Friend Request
Use Case 7
2.
3.
4.
Notes
Conrm Friend Request - Continued
Conrmation sent to requesters PSNS and GS
Requester added to users friendlist at users PSNS and GS
User added to requesters friendlist at requesters PSNS and
GS
This is abstract, it does not take into account package loss
and thus inconsistencies in friendlists
Sequence Diagrams and Use cases for functionalities.
.
.
Figure C.4: Conrm Event Request
.
85
86
Appendix C
Figure C.5: Conrm Group Request
Sequence Diagrams and Use cases for functionalities.
Use Case 8
Summary
Preconditions
Basic Scenario
1.
2.
Conrm Group or Event invitation
Similarly to conrming a friend request, except conrmation not sent to sender of request but to the group or event.
User has received a invitation from another user
Action
User accepts invitation
Conrmation sent to group or event home PSNS.
.
Use Case 8
3.
4.
5.
.
87
Conrm Group or Event invitation - Continued
Requester added to group or events participantlist at home
PSNS
Conrmation sent to requester
User adds group or event to his grouplist or eventlist
.
Figure C.6: Create Album
88
Use Case 9
Summary
Preconditions
Basic Scenario
1.
2.
3.
Alternate Path
2a.
.1
Notes
.
Appendix C
Create Album
Sending another user on any network a private message
User is viewing subject so he already knows his location
Action
User requests to create a new album with a specic name
PSNS checks if album name already exists
Folder with requested name created in users space
Album with specic name already exists
Send error message
Creating an album and uploading photos through browsing
is an alternative method, to upload photos to their account
from not their own workstation. On their own workstation
they would have a system to Dropbox, where there would
be a home photo folder and they could manage their photos
there and they would upload automatically
.
Figure C.7: Create Event
.
Sequence Diagrams and Use cases for functionalities.
89
Figure C.8: Create Group
Use Case 10
Summary
Preconditions
Basic Scenario
1.
2.
3.
4.
Alternate Path
2a.
.1
.
.
Create Group/Event
A group shares many characteristics of a user, it
has blog/testimonials, photos and photo albums and a
userlist(friendlist), but also an adminlist. It is created at
the creators PSNS and how much space it is allowed and
such should be design choices of that particular PSNS. And
an event is exactly the same as a group except it also has
a date
Creator is logged into a PSNS
Action
User submits event name and password.
PSNS server checks database if event-name is registered
Event is created at PSNS
PSNS registers event at GS
Event-name already registered
PSNS sends error message to user
90
Appendix C
Figure C.9: Flag
Sequence Diagrams and Use cases for functionalities.
Use Case 11
Summary
Preconditions
Basic Scenario
1.
2.
Notes
.
91
Flag
Flagging is a bit of an alternate way to comment on an
item. It's fast and countable way to collect opinions
User has viewing permission to item
Action
User choses an item to ag, and ag(message, dislike or
text describing oense)
Users PSNS sends notication to owner(s)' (The writer
and/or the person whos account the item belongs to) PSNSs
Oensive agging should be monitored by the PSNSs and
perhaps even the GS as well
.
Figure C.10: Hide User
Use Case 12
Summary
Preconditions
Basic Scenario
1.
2.
.
.
.
Hide User
User is creator of group or has permission to modify permissions
Action
User sends in permission number to host PSNS
Host PSNS updates permission number
92
Appendix C
Figure C.11: Join Group
Use Case 13
Summary
Precondition
Basic Scenario
Join Group/Event
Since joining a group or event is treated in exactly the same
way, we will just make one use case for it. It's a design decision, but we decide groups and events can be open(requires
no conrmation), closed(require conrmation), password
protected(open but require password)
User is already viewing the subject so he knows his location
Action
Sequence Diagrams and Use cases for functionalities.
Figure C.12: Join Event
.
93
94
Use Case 13
1.
2.
Alternate Path
2a.
.1
.2
2b.
.1
.
Join Group/Event - Continued
User requests to join a group/event
Conrmation sent to group/event object
Event/group is open or password protected
User is added to event/group userlist
User adds group/event to his grouplist or eventlist
User entered wrong password
Send error message to user
.
Use Case 14
Summary
Basic Scenario
1.
2.
3.
4.
Notes
.
Appendix C
Leave Group
Leaving a group requires no permission or conrmation
Action
User requests to leave a group
a removal request is sent to the groups host PSNS
Group is removed from participation list
User is removed from admin or participant list at host PSNS
Group or event creator cannot leave group or event, but
only remove it, a problem with the host PSNS can cause
problems for users leaving a group as they would not be
removed from participant or admin lists. One way to solve
this could be to store those lists at GS.
.
Use Case 15
Summary
Preconditions
Basic Scenario
1.
2.
3.
Modify Event or Group Privileges
Action
User sets a class to a certain level of view-ability or accessibility at home PSNS
PSNS checks which userlist on group or event user belongs
to.
Privileges of that list are checked.
Sequence Diagrams and Use cases for functionalities.
Figure C.13: Leave Group or Event
.
95
96
Appendix C
Figure C.14: Modify Event or Group Privileges
Use Case 15
4.
Alternate Path
2a.
.1
3a.
.1
Notes
Modify Event or Group Privileges - Continued
Class' accessibility modied at home PSNS
User is not on any list.
Send error
User does not have privileges.
Send error
creators can only set items to be only viewable or editable
by creator
Sequence Diagrams and Use cases for functionalities.
.
.
Use Case 16
Summary
Preconditions
Basic Scenario
1.
2.
.
Preconditions
Basic Scenario
1.
2.
Notes
Action
User sets subjects access to item
subjects' access privileges are updated in Users friendlist
on PSNS
Modify User information
User may want to change his name, password or prole information. This is done by resending the new information.
Action
User sends updated name, password and information
Users PSNS updates users Account
Modifying Group info is done in exactly the same way.
.
Use Case 18
Summary
Basic Scenario
1.
2.
2.
.
Modify Friend Access
Access to pictures and other personal information needs
to be controlled. The actual implementation of this would
ideally be controlled by the PSNS, but let's assume it's done
by editing the individual permission
.
Use Case 17
Summary
.
97
.
Remove Album
Removing an album will remove all the photos inside that
album. Only the owner can remove albums. Except in the
case of groups/events where it depends on the privileges
Action
User sends request to remove album to PSNS
PSNS checks if user is creator of that album
PSNS removes album along with all photos
98
Appendix C
Figure C.15: Modify Friend Access
Sequence Diagrams and Use cases for functionalities.
Figure C.16: Modify User Information
Figure C.17: Remove Album
99
100
Appendix C
Figure C.18: Remove Blog or Testimonial
Sequence Diagrams and Use cases for functionalities.
Use Case 19
Summary
Preconditions
Basic Scenario
1.
2.
3.
Notes
.
101
Remove Blog or Testimonial
The writer of a blog or testimonial can remove it. So can
the user whos account a blog is written to. And so can technically anyone, depending on the designated access controls
of a group or event
User has permission to remove the blog
Action
User activates removal process
Users PSNS sends the id number of the blog to the GS,
along with a list of people referred to in the blog or testimonial
GS sends removal activation to all PSNS's where the blog
or testimonial would be sent sent
It can cause a problem with a blog being not completely
removed in all SNS' because of changes in peoples friendlists
and because the SNS' can manipulate the removal request.
.
Figure C.19: Remove Photo
Use Case 20
Summary
Preconditions
Basic Scenario
1.
2.
3.
.
Remove photo(s)
User has privileges to delete the specic photo(s)
Action
User selects photo(s) to delete
Photo(s) are removed from PSNS database
No guarantee that photo(s) or smaller versions of photo(s)
don't exist at friends' pages (nodes)
102
Appendix C
.
Figure C.20: Remove Prole
Use Case 21
Summary
Preconditions
Basic Scenario
1.
2.
3.
4.
5.
6.
.
.
Remove prole
A user wishes to remove his prole o a PSNS along with
all of it's contents
User has a prole at the PSNS
Action
User requests a removal of his prole
PSNS sends removal notication to GS
GS sends notication to all friends on users friendlist
GS and all users friends' PSNS remove user from his friends'
friendlist
GS removes users friendlist
Users PSNS removes all of users data
Sequence Diagrams and Use cases for functionalities.
103
Figure C.21: Remove Friend
Use Case 22
Summary
Preconditions
Basic Scenario
1.
2.
3.
4.
Remove Friend
Friendship removal requires no conrmation, the subject removed is removed from users friendlist and user is removed
o subject friendlist at corresponding PSNSs as well as GS.
Action
User removes a subject from his friendlist
Removal is sent to subjects PSNS and GS
User is removed from subjects friendlist at subjects PSNS
and GS
Subject is removed from Users friendlist at users PSNS and
GS
104
.
Appendix C
.
Figure C.22: Remove Group or Event
Use Case 23
Summary
Preconditions
Basic Scenario
1.
.
Remove Group or Event
A user wishes to remove a group o his PSNS along with
all of it's contents
User is group or event creator
Action
User requests a removal of the group or event
Sequence Diagrams and Use cases for functionalities.
Use Case 23
2.
3.
4.
Notes
105
Remove Group or Event - Continued
GS sends notication to all users on groups or events participation or admin lists
GS and all users friends' PSNS remove group or event from
their participation list
host PSNS removes all of groups or events data
An alternate possibility here would be to oer users in the
group being removed to become it's host, and then moving
it to one of their PSNSs for hosting
.
Use Case 24
Summary
Preconditions
Basic Scenario
1.
2.
3.
4.
Alternate Path
3a.
.1
Notes
.
User is on subjects blocked list
Terminate sending
identical to sending a message, only dierence is that user
does not modify receiver and subject of the message
.
Use Case 25
Summary
Preconditions
Basic Scenario
1.
2.
.
Reply To Message
Sending another user on any network a private message
User is viewing subject so he already knows his location
Action
User submits a message to send to a subject
Users PSNS sends the message to subjects PSNS
Subjects PSNS checks if User is on subjects blocked list
Message is committed to subjects inbox
.
Unblock
Unblocking takes a subject of users blockedlist
Action
User requests to block a subject to his own PSNS
Subject is removed from users blocked list
106
Appendix C
Figure C.23: Unblock
Figure C.24: Upload Photo
Sequence Diagrams and Use cases for functionalities.
Use Case 26
Summary
Preconditions
Basic Scenario
1.
2.
3.
4.
5.
6.
Alternate Path
2a.
.1
.2
.3
.4
.5
2a.3a.
.1
4a.
.1
Notes
.
107
Upload Photos
Uploading photos to PSNS, they will be stored in full or
near full quality at the PSNS, then also compiled to show
thumbnail at other PSNS
User is successfully logged into a PSNS
Action
User requests to upload photo(s) to PSNS
PSNS checks size of photo(s)
PSNS checks if there is available space on users PSNS space.
Space requirements met, conrmation given.
User uploads photo(s)
PSNS saves the photo(s) along with a compressed thumbnail
PSNS has size limitations(s)
PSNS calculates how much space photos will take after
compilation
PSNS checks if there is available space on users PSNS space
User uploads photo(s)
PSNS checks if there is available space on users PSNS space
PSNS compresses the photo(s) and saves them in the
database along with a even more compressed thumbnail
Not enaugh space on PSNS space
Error message sent to user
Not enaugh space on PSNS space
Error message sent to user
Also only an alternative method for uploading photos (See
create album). Size limitation(see alternate path 2a, is
judged uneccesary to implement right away so will be left
out of sequence and class diagrams
108
Use Case 27
Summary
Preconditions
Basic Scenario
1.
2.
3.
Alternate Path
2a.
.1
.2
.
View photo
User select a photo from subject to view in full quality
User already has the location of subject because he's already viewing the thumbnail photo
Action
User sends view request to subjects PSNS
Subjects PSNS checks for view permission
Subject PSNS sends photo to user
User does not have access to subjects photo
Send error message to user
Terminate process
.
Use Case 28
Summary
Preconditions
Basic Scenario
1.
2.
3.
Notes
.
Appendix C
Untag
User has viewing and tagging privileges to the photo
Action
User untags a photo or blog
Users PSNS removes tag in item
Item owner, tagged subject and friends of tagged subject
are notied of tagging
People that don't have viewing privileges to the photo
should perhaps not be notied of tagging.
.
Use Case 29
Summary
Basic Scenario
1.
2.
3.
4.
5.
Search
Basic keyword search, the search should be done in two
places, on the PSNS and on the GS
Action
User Searches for some keywords
Search engine searches data available to the user on the
PSNS
Search engine displays search results
Search engine sends search keywords to GS
GS searches through data available in its database
Sequence Diagrams and Use cases for functionalities.
Figure C.25: Untag
.
109
110
Appendix C
Figure C.26: Search
Use Case 29
6.
7.
8.
9.
10
Notes
.
.
Search - Continued
GS sends search results to PSNS
PSNS displays search results
GS sends keywords to other PSNSs as well as address of
PSNS where the search came from
Other PSNSs send search results to PSNS
PSNS displays results on the y
This means that having prole information or picture information that are only available on other PSNSs in the
search keywords will not give wanted results as the search
engine never searches other PSNSs as it is congured in this
example.
Sequence Diagrams and Use cases for functionalities.
111
Figure C.27: Tag Person
Use Case 30
Summary
Preconditions
Basic Scenario
1.
2.
3.
4.
Notes
Tag Person
Tagging items really helps users nding relevant item. All
relevant parties being tagged must be notied of tagging. A
subject tagged in a photo will be given viewing and tagging
privileges to that photo. User on tagged subjects' friend list
will be notied about tagging.
User has viewing and tagging privileges to the photo
Action
User tags a photo or blog
Users PSNS saves tag in items class
Items owner, tagged subject and friends of tagged subject
are notied of tagging
Tagged subject is given viewing and tagging privileges to
the photo if it does not have it already.
People that don't have viewing privileges to the photo
should perhaps not be notied of tagging.
112
.
Appendix C
.
Figure C.28: Testimonials
Use Case 31
Summary
Preconditions
Basic Scenario
1.
2.
.
Write Testimonial
A testimonial is something a user writes on a subjects prole page. In our system it is treated in every way the same
as a blog, except the owner is not the just the subject but
the user writing it as well. So both can remove it
User has viewing privileges to subjects wall
Action
User posts a testimonial message for a subjects blog
Subjects PSNS checks if user is on subjects blockedlist
Sequence Diagrams and Use cases for functionalities.
Use Case 31
3.
4.
Alternate Path
2a.
.1
Notes
.
Write Testimonial - Continued
Users PSNS saves and sends the entire blog to GS along
with user and subject references and a list of all people
who are referred to in the blog.
GS chompares friendlists of user and subject and sends the
blog to all PSNS' where they have a mutual friend or where
they are in the list of people referred to in the blog
User is on subjects blocked list
Terminate blogging
It is a design choice that this a notifaction is only sent
to mutual friends. It is also not posted on the "wall" or
"prole" of the subject on any CSNS as the user may not
have an account on that specic CSNS
.
Use Case 32
Summary
Basic Scenario
1.
2.
3.
4.
5.
6.
Alternate Path
2a.
.1
.
113
View Prole
Information on a requested prole is stored at that requested users' PSNS, when requester requests to view the
requesteds prole, and the requested is not on the requesters PSNS. The requester must get the location of the
requested from the GS, before the requester can request
the prole information of the requested, from the requesteds PSNS
Action
User requests to view the prole of another user
Requestee user is not on the requesters PSNS
Requester requests the prole information from requestees
PSNS
Requestees PSNS checks if/what prole information requester has privileges to view
Requestees PSNS sends requesters PSNS appropriate information
Requesters PSNS displays the information in its own way.
Requestee is on the requesters PSNS
Go straight to steps 4. and then 6.
114
Appendix C
Figure C.29: View Prole
.
Sequence Diagrams and Use cases for functionalities.
Figure C.30: Write Comment
115
116
Use Case 33
Summary
Preconditions
Basic Scenario
1.
2.
3.
4.
Alternate Path
2a.
.1
Notes
Appendix C
Comment
A comment can be written on blogs, testimonials
User has viewing privileges to a subjects blog or testimonial
Action
User sends a comment for a subjects item
Subjects PSNS checks if user is on subjects blockedlist
Users PSNS sends the comment to GS along with user and
subject references, along with a list of all people who are
referred to in the item
GS compares friendlists of user and subject, and user and
the list of people referred to in the item. It then sends the
comment to all PSNS' where the item is stored at, and a
notication to where those compared have a mutual friend,
and those directly referred to in the item.
User is on subjects blocked list
Terminate blogging
It is a design choice that this a notifaction is only sent
to mutual friends. It is also not posted on the "wall" or
"prole" of the subject on any CSNS as the user may not
have an account on that specic CSNS
117
118
Appendix
D
The private social
networking site class
diagram
This is a more detailed version of Figure 4.2. showing a Private Social Networking site's class diagram.
Figure D.1: The Search Results Data Type
120
Appendix D
Figure D.2: The Account Class on PSNS
The private social networking site class diagram
Figure D.3: Upper Left part of PSNS Class diagram
121
122
Appendix D
Figure D.4: Upper Right part of PSNS Class diagram
The private social networking site class diagram
Figure D.5: Lower left part of PSNS Class diagram
123
124
Appendix D
Figure D.6: Upperleft part of PSNS Class diagram
Appendix
E
Code Listings
In this chapter you will nd most of the code used for this project, a big part
of it is repetitive since it is rst made from compiling Server.xklaim and
User.xklaim. Then they are edited to be used in the Java Swing Applet. The
m4 les contain all the code for the java les used in the applet. They become
Java les when compiled, therefore the java les are not included in the code
listing.
The listing package does not display icelandic letters, therefore Ã◦ is displayed
instead of ð and Ã3/4 instead of þ.
• Both X-Klaim programs. Since they contain the web server engine in very
easily readable code.
• The CompileAll.sh script used to compile the m4 les into java les in the
appropriate place, and then compile the java les.
• MakeBlog.m4 and GetBlogs.m4, since they are modied based on Speci-
cations.m4, and also contain some minor tweaks displaying the output.
• swingJApplet.m4 since it compiles into the UI code.
• Server.m4 since it compiles into the auto-generated java le by X-Klaim.
Used as a database in this project, and shows how xklaim makes Klava
executable nodes.
126
Appendix E
• BlogK.m4 since it is one example of a hand made Klava process that is
executed on JButton events.
r e c ConfirmGroup [ adder : s t r , groupName : s t r , groupNode : l o c ]
declare
var myNode : l o c
begin
r e a d ( " yourNode " , ! myNode ) @ s e l f ;
p r i n t adder + " has i n v i t e d you t o j o i n t h e " + groupName + " e v e n t . " ;
out ( groupName , groupNode )@myNode
p r i n t " your node number wasn ' t found . "
endif ;
r e a d ( "yourName" , ! myName) @ s e l f ;
r e a d ( " yourNode " , ! myNode ) @ s e l f ;
p r i n t adder + " has added you a s a f r i e n d " ;
out ( adder , adderNode , " f o l l o w " )@myNode ;
out (myName, myNode , " f o l l o w " ) @adderNode
end ;
else
r e c ConfirmFriend [ adder : s t r , adderNode : l o c ]
declare
var myNode : l o c ;
var myName : s t r
begin
i f readp ( " yourNode " , ! myNode ) @ s e l f then
p r i n t " t h i s i s your node number− " + myNode
r e c ConfirmEvent [ adder : s t r , eventName : s t r , eventNode : l o c ]
declare
var myNode : l o c
begin
r e a d ( " yourNode " , ! myNode ) @ s e l f ;
p r i n t adder + " has i n v i t e d you t o j o i n t h e " + eventName + " e v e n t . " ;
out ( eventName , eventNode )@myNode
#i n s t e a d o f f o l l o w i t c o u l d be , " b l o c k " o r " not f o l l o w "
end ;
E.1 User.xklaim
E.1 User.xklaim
127
r e c CheckNewMessages [ myNode : l o c , r e c e i v e d : b o o l ]
declare
var message : s t r ;
var senderNode : l o c ;
p r i n t "No new i n v i t e s : ) "
endif
endif
endif
end ;
else
e v a l ( ConfirmGroup ( anyAdder , anyName , anyNode ) ) @myNode ;
e v a l ( C h e c k I n v i t e s ( myNode ) ) @ s e l f
else
i f i n p ( " group i n v i t e " , ! anyAdder , ! anyName , ! anyNode )@myNode then
e v a l ( ConfirmEvent ( anyAdder , anyName , anyNode ) ) @myNode ;
e v a l ( C h e c k I n v i t e s ( myNode ) ) @ s e l f
else
i f i n p ( " e v e n t i n v i t e " , ! anyAdder , ! anyName , ! anyNode )@myNode then
#s i n c e check i n v i t e s e x i s t s i n both u s e r s g r o u p s and e v e n t s ,
#you can i n v i t e gr o u p s t o g r o u p s e t c . . .
r e c C h e c k I n v i t e s [ myNode : l o c ]
declare
var anyAdder : s t r ;
var anyNode : l o c ;
var anyName : s t r
begin
i f i n p ( " f r i e n d r e q u e s t " , ! anyAdder , ! anyNode )@myNode then
p r i n t anyAdder + " has added you a s a f r i e n d " ;
e v a l ( ConfirmFriend ( anyAdder , anyNode ) ) @ s e l f ;
e v a l ( C h e c k I n v i t e s ( myNode ) ) @ s e l f
#A l l t h e i n f o r m a t i o n a r e about adder a r e g o t t e n h e r e
#a l r e a d y , even though you c o u l d j u s t add h i s name and then
#ask t h e s e r v e r l a t e r for t h e r e s t
end ;
128
Appendix E
#This GetBlogs s i m p l y g e t ' s a l l b l o g s t h e u s e r i s f o l l o w i n g from t h e s e r v e r
r e c GetBlogs [ myNode : l o c ]
declare
var s e r v e r I P : l o c ;
var timestampNow : i n t ;
var timestampLast : i n t ;
r e c CreateAccount [ userName : s t r , password : s t r , i p : l o c ] e x t e r n ;
r e c GiveTimestamp [ i p : l o c ] e x t e r n ;
r e c Frontpage [ node : l o c ]
begin
e v a l ( C h e c k I n v i t e s ( node ) ) @ s e l f ;
e v a l ( CheckNewMessages ( node , true ) ) @ s e l f ;
e v a l ( GetBlogs ( node ) ) @ s e l f
end ;
rec DisplayError [ error : s t r ]
begin
print error
end ;
p r i n t "No new messages . . . . . . . . . . "
endif
endif
end ;
else
i f not r e c e i v e d then
var s e n d e r : s t r
begin
i f readp ( ! message , ! senderNode , " unread " )@myNode and readp ( ! s e n d e r , senderNode , " f o l l o w " )@myNode then
out ( message , senderNode , " r e a d " )@myNode ;
i n ( message , senderNode , " unread " )@myNode ;
p r i n t s e n d e r + " s e n t you t h e f o l l o w i n g message : " + message ;
e v a l ( CheckNewMessages ( myNode , true ) ) @ s e l f
E.1 User.xklaim
129
nodes
User : : { s e r v e r I P ~ l o c a l h o s t : 1 1 0 0 0 }
p o r t 10000
declare
var myNode : l o c ;
var blogNumber : i n t
begin
var blogDispCount : i n t ;
var blogNumber : i n t ;
var anyUser : s t r ;
var anyBlog : s t r ;
var anyNode : l o c ;
var a n y S u b j e c t : s t r
begin
blogDispCount := 0 ;
i f readp ( " s e r v e r I P " , ! s e r v e r I P ) @ s e l f then
p r i n t " t h i s i s t h e s e r v e r I P − " +s e r v e r I P
else
p r i n t "no s e r v e r I P found "
endif ;
p r i n t " t h i s i s your node ip − " + myNode ;
read (" serverIP " , ! serverIP ) @ s e l f ;
i n ( " blogNumber " , ! blogNumber )@myNode ;
e v a l ( GiveTimestamp ( myNode ) ) @serverIP ;
i n ( " timestamp " , ! timestampNow )@myNode ;
#readp ( " b l o g " , ! anyBlog , ! anyNode , ! timestampLast ) @serverIP ;
f o r a l l readp ( " b l o g " , ! anyBlog , ! anySubject , ! anyNode , ! timestampLast ) @serverIP do
p r i n t "now t r y t o s e e i f you and t h e b l o g g e r you found a r e f r i e n d s " ;
i f readp ( ! anyUser , anyNode , " f o l l o w " )@myNode then
p r i n t anyUser + " wrote − " + a n y S u b j e c t + " − " + anyBlog
else
p r i n t " you and t h i s b l o g g e r a r e not f r i e n d s "
endif
enddo
end
130
Appendix E
r e c CreateAccount [ userName : s t r , password : s t r , i p : l o c ]
declare
var anyUser : s t r ;
r e c Frontpage [ node : l o c ] e x t e r n ;
rec DisplayError [ error : s t r ] extern ;
p r i n t " u s e r " + added + " not found "
endif
end ;
else
#Some s m a r t e r way for a f r i e n d l i s t c o u l d be u s e f u l
r e c AddFriend [ adderNode : l o c , added : s t r ]
declare
var addedPass : s t r ;
var addedNode : l o c ;
var adder : s t r ;
var adderPass : s t r
begin
i f readp ( added , ! addedPass , ! addedNode ) @ s e l f then
r e a d ( ! adder , ! adderPass , adderNode ) @ s e l f ;
out ( " f r i e n d r e q u e s t " , adder , adderNode ) @addedNode ;
p r i n t adder+" − "+adderNode+" s u c c e s s f u l l y t r i e d t o add "+added+" − "+addedNode
E.2 Server.xklaim
e v a l ( CreateAccount ( " t e s t u s e r " , " t e s t p a s s w o r d " , ∗ s e l f ) ) @serverIP
#r e a d ( " yourNode " , ! myNode ) @ s e l f
#e v a l ( C h e c k I n v i t e s ( ) ) @myNode ;
#e v a l ( CheckNewMessages ( ) ) @myNode ;
#e v a l ( GetBlogs ( ) ) @myNode
end
endnodes
E.2 Server.xklaim
131
r e c CreateEvent [ eventName : s t r , password : s t r , i p : l o c ]
declare
var anyEvent : s t r ;
var anyPass : s t r ;
var anyNode : l o c ;
var newNode : l o c
begin
newloc ( newNode ) ;
i f readp ( eventName , ! anyPass , ! anyNode ) @ s e l f then
out ( userName , password , newNode ) @ s e l f ;
p r i n t " User : " + userName + " − has been s u c c e s s f u l l y c r e a t e d ! " ;
p r i n t " h i s node i s " + newNode ;
out ( " s e r v e r I P " , ∗ s e l f ) @newNode ;
out ( " blogNumber " , 0 ) @newNode ;
out ( " yourNode " , newNode ) @ip ;
e v a l ( Frontpage ( newNode ) ) @ip
#out ( " b l o g " , "Welcome t o D i g i t a l T o r f i " , " O l a f u r " , 0 , 0 ) @newNode
#u s e r made , u s e r i s l o g g e d i n o r taken t o a l o g i n page .
endif
endif
end ;
else
e v a l ( D i s p l a y E r r o r ( " This Should Not Happen , node i s taken " ) ) @ip ;
p r i n t " User : " + userName + " i s a l r e a d y taken "
else
i f readp ( ! anyUser , ! anyPass , newNode ) @ s e l f then
var anyPass : s t r ;
var anyNode : l o c ;
var newNode : l o c
#newloc i s used even when a c c o u n t not c r e a t e d
begin
#newNode := newloc ( ) ;
newloc ( newNode ) ;
i f readp ( userName , ! anyPass , ! anyNode ) @ s e l f then
e v a l ( D i s p l a y E r r o r ( " username taken " ) ) @ip
132
Appendix E
r e c E v e n t I n v i t e [ adder : s t r , eventName : s t r , added : s t r ]
out ( groupName , password , newNode ) @ s e l f ;
e v a l ( Frontpage ( newNode ) ) @ip ;
#e v e n t made , u s e r i s l o g g e d i n o r taken t o a l o g i n page .
out ( " groupNode " , newNode ) @ip ;
i f readp ( ! anyGroup , ! anyPass , newNode ) @ s e l f then
e v a l ( D i s p l a y E r r o r ( " This Should Not Happen , node i s taken " ) ) @ip
endif
endif
end ;
else
r e c CreateGroup [ groupName : s t r , password : s t r , i p : l o c ]
declare
var anyGroup : s t r ;
var anyPass : s t r ;
var anyNode : l o c ;
var newNode : l o c
begin
newloc ( newNode ) ;
i f readp ( groupName , ! anyPass , ! anyNode ) @ s e l f then
e v a l ( D i s p l a y E r r o r ( " groupname i s taken " ) ) @ip
#groupName i s taken − some d i s p l a y e v e n t
out ( eventName , password , newNode ) @ s e l f ;
e v a l ( Frontpage ( newNode ) ) @ip ;
#e v e n t made , u s e r i s l o g g e d i n o r taken t o a l o g i n page .
out ( " eventNode " , newNode ) @ip ;
i f readp ( ! anyEvent , ! anyPass , newNode ) @ s e l f then
e v a l ( D i s p l a y E r r o r ( " This Should Not Happen , node i s taken " ) ) @ip
endif
endif
end ;
else
e v a l ( D i s p l a y E r r o r ( " eventname i s taken " ) ) @ip
#eventName i s taken − some d i s p l a y e v e n t
E.2 Server.xklaim
133
r e c LoginUser [ name : s t r , password : s t r , i p : l o c ]
declare
var anyNode : l o c
begin
i f readp ( name , password , ! anyNode ) @ s e l f then
r e c G r o u p I n v i t e [ adder : s t r , groupName : s t r , added : s t r ]
declare
var addedPass : s t r ;
var addedNode : l o c ;
var groupPass : s t r ;
var groupNode : l o c
begin
i f readp ( added , ! addedPass , ! addedNode ) @ s e l f and readp ( groupName , ! groupPass , ! groupNode ) @ s e l f then
out ( " group i n v i t e " , adder , groupName , groupNode ) @addedNode
endif
end ;
r e c GiveTimestamp [ i p : l o c ]
declare
var timestamp : int
begin
r e a d ( " timestamp " , ! timestamp ) @ s e l f ;
out ( " timestamp " , timestamp ) @ip
end ;
declare
var addedPass : s t r ;
var addedNode : l o c ;
var e v e n t P a s s : s t r ;
var eventNode : l o c
begin
i f readp ( added , ! addedPass , ! addedNode ) @ s e l f and readp ( eventName , ! eventPass , ! eventNode ) @ s e l f then
out ( " e v e n t i n v i t e " , adder , eventName , eventNode ) @addedNode
endif
end ;
134
Appendix E
r e c SendMessage [ s e n d e r : l o c , r e c e i v e r : s t r , message : s t r ]
declare
r e c MakeBlog [ senderNode : l o c , b l o g : s t r , s e n d e r : l o c ]
declare
var timestamp : int
begin
i n ( " timestamp " , ! timestamp ) @ s e l f ;
timestamp := timestamp + 1 ;
out ( " timestamp " , timestamp ) @ s e l f ;
out ( " b l o g " , blog , senderNode , timestamp ) @ s e l f ;
e v a l ( D i s p l a y E r r o r ( " d i s p l a y e r r o r t o t a l l y works wohoo" ) ) @sender
end ;
r e c LogoutUser [ i p : l o c ]
declare
var anyNode : l o c ;
var name : s t r ;
var s e r v e r N o d e : l o c
begin
in ( " serverIP " , ! serverNode ) @self ;
i n ( " yourNode " , ! anyNode ) @ s e l f ;
i n ( "yourName" , ! name ) @ s e l f ;
e v a l ( Frontpage ( ∗ s e l f ) ) @ip
end ;
e v a l ( D i s p l a y E r r o r ( "Wrong username o r password . " ) ) @ip
endif
end ;
else
out ( " s e r v e r I P " , ∗ s e l f ) @ip ;
p r i n t ∗ s e l f + " put on " + i p ;
out ( " yourNode " , anyNode ) @ip ;
p r i n t anyNode + " put on " + i p ;
out ( "yourName" , name ) @ip ;
e v a l ( Frontpage ( anyNode ) ) @ip
E.2 Server.xklaim
135
m4
m4
m4
m4
m4
m4
m4
m4
m4
m4
m4
AddFriend . m4 > s r c / autogen / AddFriend . j a v a
C h e c k I n v i t e s . m4 > s r c / autogen / C h e c k I n v i t e s . j a v a
CheckNewMessages . m4 > s r c / autogen / CheckNewMessages . j a v a
ConfirmEvent . m4 > s r c / autogen / ConfirmEvent . j a v a
ConfirmGroup . m4 > s r c / autogen / ConfirmGroup . j a v a
ConfirmFriend . m4 > s r c / autogen / ConfirmFriend . j a v a
CreateAccount . m4 > s r c / autogen / CreateAccount . j a v a
CreateEvent . m4 > s r c / autogen / CreateEvent . j a v a
CreateGroup . m4 > s r c / autogen / CreateGroup . j a v a
D i s p l a y E r r o r . m4 > s r c / autogen / D i s p l a y E r r o r . j a v a
E v e n t I n v i t e . m4 > s r c / autogen / E v e n t I n v i t e . j a v a
E.3 CompileAll.sh
nodes
server ::{}
p o r t 11000
declare
var timestamp : int ;
var b l o g : s t r ;
var senderNode : s t r
begin
timestamp := 0 ; #i t would be n i c e t o r e p l a c e this with a r e a l timestamp
out ( " timestamp " , timestamp ) @ s e l f
end
endnodes
var anyNode : l o c ;
var anyPass : s t r
begin
i f readp ( r e c e i v e r , ! anyPass , ! anyNode ) @ s e l f then
out ( message , s e n d e r , " unread " ) @anyNode
endif
end
136
Appendix E
Frontpage . m4 > s r c / autogen / Frontpage . j a v a
GetBlogs . m4 > s r c / autogen / GetBlogs . j a v a
GiveTimestamp . m4 > s r c / autogen / GiveTimestamp . j a v a
G r o u p I n v i t e . m4 > s r c / autogen / G r o u p I n v i t e . j a v a
LoginUser . m4 > s r c / autogen / LoginUser . j a v a
LogoutUser . m4 > s r c / autogen / LogoutUser . j a v a
MakeBlog . m4 > s r c / autogen /MakeBlog . j a v a
SendMessage . m4 > s r c / autogen / SendMessage . j a v a
AddFriendK . m4 > s r c / methods /AddFriendK . j a v a
BlogK . m4 > s r c / methods /BlogK . j a v a
CreateAccountK . m4 > s r c / methods / CreateAccountK . j a v a
CreateEventK . m4 > s r c / methods / CreateEventK . j a v a
CreateGroupK . m4 > s r c / methods / CreateGroupK . j a v a
LoginK . m4 > s r c / methods / LoginK . j a v a
SendMessageK . m4 > s r c / methods / SendMessageK . j a v a
changequote (Ã 43 , Ã◦ )
i n c l u d e ( S p e c i f i c a t i o n s . m4)
E.4 MakeBlog.m4
j a v a c s r c / autogen / AddFriend . j a v a s r c / autogen / C h e c k I n v i t e s . j a v a s r c / autogen / CheckNewMessages . j a v a
s r c / autogen / ConfirmEvent . j a v a s r c / autogen / ConfirmFriend . j a v a s r c / autogen / ConfirmGroup . j a v a
s r c / autogen / CreateAccount . j a v a s r c / autogen / CreateEvent . j a v a s r c / autogen / CreateGroup . j a v a
s r c / autogen / D i s p l a y E r r o r . j a v a s r c / autogen / E v e n t I n v i t e . j a v a s r c / autogen / Frontpage . j a v a
s r c / autogen / GetBlogs . j a v a s r c / autogen / GiveTimestamp . j a v a s r c / autogen / G r o u p I n v i t e . j a v a
s r c / autogen / LoginUser . j a v a s r c / autogen / LogoutUser . j a v a s r c / autogen /MakeBlog . j a v a
s r c / autogen / SendMessage . j a v a s r c / autogen / S e r v e r . j a v a
m4 SwingJApplet . m4 > s r c / t h e A p p l e t / SwingJApplet . j a v a
m4
m4
m4
m4
m4
m4
m4
m4 S e r v e r . m4 > s r c / autogen / S e r v e r . j a v a
m4
m4
m4
m4
m4
m4
m4
m4
E.4 MakeBlog.m4
137
// parameters
protected L o c a l i t y senderNode ;
protected KString b l o g ;
protected L o c a l i t y s e n d e r ;
protected KString b l o g S u b j e c t ;
// v a r i a b l e s
protected K I n t e g e r timestamp ;
// used d e f i n i t i o n names
protected D i s p l a y E r r o r __dummy_DisplayError ;
protected Tuple myTuple ;
//−−−−−−−−−−−−−−−−
protected K I n t e g e r blogLength ;
protected K I n t e g e r s u b j e c t L e n g t h ;
// temporary s t r i n g f o r c o n c a t i n a t i o n
S t r i n g output ;
// p r o t e c t e d K i n t e g e r s u b j e c t L e n g t h
//−−−−−−−−−−−−−−−−
public MakeBlog (
L o c a l i t y senderNode ,
KString b l o g S u b j e c t ,
KString blog ,
Locality sender
//
KInteger s u b j e c t L e n g t h
) {
// parameters
public c l a s s MakeBlog extends K l a v a P r o c e s s {
import j a v a . i o . ∗ ;
import Klava . ∗ ;
import methods . S t r i n g T o F i l e ;
package autogen ;
i f e l s e ( $2 , 0 ,
à 34 define ( MakeBlog ,à 34 à 34
138
Appendix E
t e x t L e n g t h = new K I n t e g e r ( $1 ) ;
i f ( ! ( t e x t L e n g t h == null ) && ! ( b l o g . t o S t r i n g ( ) . l e n g t h ( ) == 0 ) ) {
i f ( b l o g . t o S t r i n g ( ) . l e n g t h ( ) >t e x t L e n g t h . i n t V a l u e ( ) ) {
e v a l ( new D i s p l a y E r r o r ( new KString ( " Blog t o o l o n g " ) ) , s e n d e r ) ;
}
else {
timestamp = new K I n t e g e r ( ) ;
i n ( new KString ( " timestamp " ) , timestamp , s e l f ) ;
timestamp = new K I n t e g e r ( timestamp . i n t V a l u e ( ) + 1 ) ;
out ( new KString ( " timestamp " ) , timestamp , s e l f ) ;
out ( new KString ( " b l o g " ) , blog , senderNode , timestamp , s e l f ) ;
output = b l o g . t o S t r i n g ( ) ;
w r i t e . S t r i n g T o F i l e ( output ) ;
}
}
else {
i f ( t e x t L e n g t h == null ) {
timestamp = new K I n t e g e r ( ) ;
i n ( new KString ( " timestamp " ) , timestamp , s e l f ) ;
timestamp = new K I n t e g e r ( timestamp . i n t V a l u e ( ) + 1 ) ;
out ( new KString ( " timestamp " ) , timestamp , s e l f ) ;
out ( new KString ( " b l o g " ) , blog , senderNode , timestamp , s e l f ) ;
output = b l o g S u b j e c t . t o S t r i n g ( ) + " − " + b l o g . t o S t r i n g ( ) ;
w r i t e . S t r i n g T o F i l e ( output ) ;
}
else {
S t r i n g T o F i l e w r i t e = new methods . S t r i n g T o F i l e ( ) ;
public void e x e c u t e ( ) throws KlavaException {
}
this . senderNode = senderNode ;
this . b l o g S u b j e c t = b l o g S u b j e c t ;
this . b l o g = b l o g ;
this . s e n d e r = s e n d e r ;
E.4 MakeBlog.m4
139
eval (
new D i s p l a y E r r o r ( new KString ( " you can ' t b l o g with n o t h i n g " ) ) , s e n d e r ) ;
// parameters
protected L o c a l i t y senderNode ;
protected KString b l o g ;
protected L o c a l i t y s e n d e r ;
protected KString b l o g S u b j e c t ;
// v a r i a b l e s
protected K I n t e g e r timestamp ;
// used d e f i n i t i o n names
protected D i s p l a y E r r o r __dummy_DisplayError ;
protected Tuple myTuple ;
//−−−−−−−−−−−−−−−−
protected K I n t e g e r blogLength ;
protected K I n t e g e r s u b j e c t L e n g t h ;
// temporary s t r i n g f o r c o n c a t i n a t i o n
S t r i n g output ;
// p r o t e c t e d K i n t e g e r s u b j e c t L e n g t h
//−−−−−−−−−−−−−−−−
public MakeBlog (
public c l a s s MakeBlog extends K l a v a P r o c e s s {
import j a v a . i o . ∗ ;
import Klava . ∗ ;
import methods . S t r i n g T o F i l e ;
package autogen ;
}Ã◦ Ã◦ )Ã◦ ,
à 34 define ( MakeBlog ,à 34 à 34
}
}
}
140
Appendix E
timestamp = new K I n t e g e r ( ) ;
i n ( new KString ( " timestamp " ) , timestamp , s e l f ) ;
timestamp = new K I n t e g e r ( timestamp . i n t V a l u e ( ) + 1 ) ;
out ( new KString ( " timestamp " ) , timestamp , s e l f ) ;
myTuple = new Tuple ( ) ;
myTuple . add ( new KString ( " b l o g " ) ) ;
myTuple . add ( b l o g S u b j e c t ) ;
myTuple . add ( b l o g ) ;
else {
}
else i f ( blogSubject . toString ( ) . length () > subjectLength . intValue ()){
e v a l ( new D i s p l a y E r r o r ( new KString ( " S u b j e c t t o o l o n g " ) ) , s e n d e r ) ;
}
//−−−−−−−−−−−−−−−−
blogLength = new K I n t e g e r ( $1 ) ;
s u b j e c t L e n g t h = new K I n t e g e r ( $2 ) ;
i f ( ! ( blogLength==null ) && ! ( b l o g . t o S t r i n g ( ) . l e n g t h ()==0) &&
! ( s u b j e c t L e n g t h==null ) && ! ( b l o g S u b j e c t . t o S t r i n g ( ) . l e n g t h ()==0)){
i f ( b l o g . t o S t r i n g ( ) . l e n g t h ( ) >blogLength . i n t V a l u e ( ) ) {
e v a l ( new D i s p l a y E r r o r ( new KString ( " Blog t o o l o n g " ) ) , s e n d e r ) ;
public void e x e c u t e ( ) throws KlavaException {
S t r i n g T o F i l e w r i t e = new methods . S t r i n g T o F i l e ( ) ;
L o c a l i t y senderNode ,
KString b l o g S u b j e c t ,
KString blog ,
Locality sender
//
KInteger s u b j e c t L e n g t h
) {
// parameters
this . senderNode = senderNode ;
this . b l o g S u b j e c t = b l o g S u b j e c t ;
this . b l o g = b l o g ;
this . s e n d e r = s e n d e r ;
}
E.4 MakeBlog.m4
141
}
}
e v a l ( new D i s p l a y E r r o r ( new KString ( " you can ' t b l o g with no t e x t body o r s u b j e c t " ) ) , s e n d e r ) ;
else {
}
myTuple . add ( b l o g S u b j e c t ) ;
myTuple . add ( b l o g ) ;
myTuple . add ( senderNode ) ;
myTuple . add ( timestamp ) ;
out ( myTuple , s e l f ) ;
output = b l o g S u b j e c t . t o S t r i n g ( ) + " − " + b l o g . t o S t r i n g ( ) ;
w r i t e . S t r i n g T o F i l e ( output ) ;
MakeBlog ( B l o g L e n g t h R e s t r i c t i o n , B l o g S u b j e c t )
Ã◦ Ã◦ )Ã◦
)
}
}
}
else {
i f ( ( blogLength == null ) | | ( s u b j e c t L e n g t h == null ) ) {
timestamp = new K I n t e g e r ( ) ;
i n ( new KString ( " timestamp " ) , timestamp , s e l f ) ;
timestamp = new K I n t e g e r ( timestamp . i n t V a l u e ( ) + 1 ) ;
out ( new KString ( " timestamp " ) , timestamp , s e l f ) ;
myTuple = new Tuple ( ) ;
myTuple . add ( new KString ( " b l o g " ) ) ;
myTuple . add ( senderNode ) ;
myTuple . add ( timestamp ) ;
out ( myTuple , s e l f ) ;
output = b l o g S u b j e c t . t o S t r i n g ( ) + " − " + b l o g . t o S t r i n g ( ) ;
w r i t e . S t r i n g T o F i l e ( output ) ;
}
142
Appendix E
// parameters
protected L o c a l i t y myNode ;
// v a r i a b l e s
protected L o c a l i t y s e r v e r I P ;
protected K I n t e g e r timestampNow ;
protected K I n t e g e r timestampLast ;
protected K I n t e g e r blogDispCount ;
protected K I n t e g e r blogNumber ;
protected KString anyUser ;
protected KString anyBlog ;
protected L o c a l i t y anyNode ;
protected KString a n y S u b j e c t ;
protected Tuple __tuple_7 ;
protected L o c a l i t y __backup_8_serverIP ;
protected KBoolean __to_7 ;
protected Tuple __tuple_8 ;
protected KString __backup_9_anySubject ;
protected KString __backup_10_anyBlog ;
protected L o c a l i t y __backup_11_anyNode ;
protected K I n t e g e r __backup_12_timestampLast ;
protected KBoolean __to_8 ;
public c l a s s GetBlogs extends K l a v a P r o c e s s {
import j a v a . i o . ∗ ;
import Klava . ∗ ;
import methods . S t r i n g T o F i l e ;
i f e l s e ( $2 , 0 ,
à 34 define ( GetBlogs ,à 34 à 43
package autogen ;
changequote (Ã 34 , Ã◦ )
i n c l u d e ( S p e c i f i c a t i o n s . m4)
E.5 GetBlogs.m4
E.5 GetBlogs.m4
143
__backup_8_serverIP = s e r v e r I P ;
s e r v e r I P = new P h y s i c a l L o c a l i t y ( ) ;
__tuple_7 . add ( s e r v e r I P ) ;
__to_7 = new KBoolean ( read_nb ( __tuple_7 , s e l f ) ) ;
i f ( ! __to_7 . b o o l e a n V a l u e ( ) ) {
s e r v e r I P = __backup_8_serverIP ;
}
i f ( __to_7 . b o o l e a n V a l u e ( ) ) {
P r i n t ( new KString ( " t h i s i s t h e s e r v e r I P − " . c o n c a t ( s e r v e r I P . t o S t r i n g ( ) . t o S t r i n g ( ) ) ) ) ;
} else {
P r i n t ( new KString ( "no s e r v e r I P found " ) ) ;
}
P r i n t ( new KString ( " t h i s i s your node ip − " . c o n c a t ( myNode . t o S t r i n g ( ) . t o S t r i n g ( ) ) ) ) ;
s e r v e r I P = new P h y s i c a l L o c a l i t y ( ) ;
r e a d ( new KString ( " s e r v e r I P " ) , s e r v e r I P , s e l f ) ;
public void e x e c u t e ( ) throws KlavaException {
S t r i n g T o F i l e w r i t e = new methods . S t r i n g T o F i l e ( ) ;
blogDispCount = new K I n t e g e r ( 0 ) ;
__tuple_7 = new Tuple ( ) ;
__tuple_7 . add ( new KString ( " s e r v e r I P " ) ) ;
L o c a l i t y myNode
) {
// parameters
this . myNode = myNode ;
}
public GetBlogs (
KBoolean _forall_exp_1 ;
Tuple __tuple_9 ;
KString __backup_13_anyUser ;
KBoolean __to_9 ;
// used d e f i n i t i o n names
protected GiveTimestamp __dummy_GiveTimestamp ;
// temporary s t r i n g f o r c o n c a t i n a t i o n
S t r i n g output ;
protected
protected
protected
protected
144
Appendix E
blogNumber = new K I n t e g e r ( ) ;
i n ( new KString ( " blogNumber " ) , blogNumber , myNode ) ;
e v a l ( new GiveTimestamp ( myNode ) , s e r v e r I P ) ;
timestampNow = new K I n t e g e r ( ) ;
i n ( new KString ( " timestamp " ) , timestampNow , myNode ) ;
__tuple_8 = new Tuple ( ) ;
__tuple_8 . s e t H a n d l e R e t r i e v e d ( true ) ;
__tuple_8 . add ( new KString ( " b l o g " ) ) ;
__backup_9_anyBlog = anyBlog ;
anyBlog = new KString ( ) ;
__tuple_8 . add ( anyBlog ) ;
__backup_10_anyNode = anyNode ;
anyNode = new P h y s i c a l L o c a l i t y ( ) ;
__tuple_8 . add ( anyNode ) ;
__backup_11_timestampLast = timestampLast ;
timestampLast = new K I n t e g e r ( ) ;
__tuple_8 . add ( timestampLast ) ;
__to_8 = new KBoolean ( read_nb ( __tuple_8 , s e r v e r I P ) ) ;
i f ( ! __to_8 . b o o l e a n V a l u e ( ) ) {
anyBlog = __backup_9_anyBlog ;
anyNode = __backup_10_anyNode ;
timestampLast = __backup_11_timestampLast ;
}
_forall_exp_1 = __to_8 ;
while ( _forall_exp_1 . b o o l e a n V a l u e ( ) ) {
P r i n t ( new KString ( "now t r y t o s e e i f you and t h e b l o g g e r you found a r e f r i e n d s " ) ) ;
__tuple_9 = new Tuple ( ) ;
__backup_12_anyUser = anyUser ;
anyUser = new KString ( ) ;
__tuple_9 . add ( anyUser ) ;
__tuple_9 . add ( anyNode ) ;
__tuple_9 . add ( new KString ( " f o l l o w " ) ) ;
__to_9 = new KBoolean ( read_nb ( __tuple_9 , myNode ) ) ;
i f ( ! __to_9 . b o o l e a n V a l u e ( ) ) {
anyUser = __backup_12_anyUser ;
}
E.5 GetBlogs.m4
145
import j a v a . i o . ∗ ;
import Klava . ∗ ;
import methods . S t r i n g T o F i l e ;
package autogen ;
à 43 define ( GetBlogs ,à 34 à 34
}
}
}Ã◦ Ã◦ )Ã◦ ,
output = anyUser . t o S t r i n g ( ) + " wrote : " + anyBlog . t o S t r i n g ( ) ;
w r i t e . S t r i n g T o F i l e ( output ) ;
} else {
P r i n t ( new KString ( " you and t h i s b l o g g e r a r e not f r i e n d s " ) ) ;
}
__tuple_8 . r e s e t ( ) ;
__tuple_8 . add ( new KString ( " b l o g " ) ) ;
__backup_9_anyBlog = anyBlog ;
anyBlog = new KString ( ) ;
__tuple_8 . add ( anyBlog ) ;
__backup_10_anyNode = anyNode ;
anyNode = new P h y s i c a l L o c a l i t y ( ) ;
__tuple_8 . add ( anyNode ) ;
__backup_11_timestampLast = timestampLast ;
timestampLast = new K I n t e g e r ( ) ;
__tuple_8 . add ( timestampLast ) ;
__to_8 = new KBoolean ( read_nb ( __tuple_8 , s e r v e r I P ) ) ;
i f ( ! __to_8 . b o o l e a n V a l u e ( ) ) {
anyBlog = __backup_9_anyBlog ;
anyNode = __backup_10_anyNode ;
timestampLast = __backup_11_timestampLast ;
}
_forall_exp_1 = __to_8 ;
i f ( __to_9 . b o o l e a n V a l u e ( ) ) {
P r i n t ( new KString ( anyUser . c o n c a t ( " wrote − " . t o S t r i n g ( ) ) . c o n c a t ( anyBlog . t o S t r i n g ( ) ) ) ) ;
146
Appendix E
L o c a l i t y myNode
) {
// parameters
public GetBlogs (
// parameters
protected L o c a l i t y myNode ;
// v a r i a b l e s
protected L o c a l i t y s e r v e r I P ;
protected K I n t e g e r timestampNow ;
protected K I n t e g e r timestampLast ;
protected K I n t e g e r blogDispCount ;
protected K I n t e g e r blogNumber ;
protected KString anyUser ;
protected KString anyBlog ;
protected L o c a l i t y anyNode ;
protected KString a n y S u b j e c t ;
protected Tuple __tuple_7 ;
protected L o c a l i t y __backup_8_serverIP ;
protected KBoolean __to_7 ;
protected Tuple __tuple_8 ;
protected KString __backup_9_anySubject ;
protected KString __backup_10_anyBlog ;
protected L o c a l i t y __backup_11_anyNode ;
protected K I n t e g e r __backup_12_timestampLast ;
protected KBoolean __to_8 ;
protected KBoolean _forall_exp_1 ;
protected Tuple __tuple_9 ;
protected KString __backup_13_anyUser ;
protected KBoolean __to_9 ;
// used d e f i n i t i o n names
protected GiveTimestamp __dummy_GiveTimestamp ;
// temporary s t r i n g f o r c o n c a t i n a t i o n
S t r i n g output ;
public c l a s s GetBlogs extends K l a v a P r o c e s s {
E.5 GetBlogs.m4
147
this . myNode = myNode ;
__backup_8_serverIP = s e r v e r I P ;
s e r v e r I P = new P h y s i c a l L o c a l i t y ( ) ;
__tuple_7 . add ( s e r v e r I P ) ;
__to_7 = new KBoolean ( read_nb ( __tuple_7 , s e l f ) ) ;
i f ( ! __to_7 . b o o l e a n V a l u e ( ) ) {
s e r v e r I P = __backup_8_serverIP ;
}
i f ( __to_7 . b o o l e a n V a l u e ( ) ) {
P r i n t ( new KString ( " t h i s i s t h e s e r v e r I P − " . c o n c a t ( s e r v e r I P . t o S t r i n g ( ) . t o S t r i n g ( ) ) ) ) ;
} else {
P r i n t ( new KString ( "no s e r v e r I P found " ) ) ;
}
P r i n t ( new KString ( " t h i s i s your node ip − " . c o n c a t ( myNode . t o S t r i n g ( ) . t o S t r i n g ( ) ) ) ) ;
s e r v e r I P = new P h y s i c a l L o c a l i t y ( ) ;
r e a d ( new KString ( " s e r v e r I P " ) , s e r v e r I P , s e l f ) ;
blogNumber = new K I n t e g e r ( ) ;
i n ( new KString ( " blogNumber " ) , blogNumber , myNode ) ;
e v a l ( new GiveTimestamp ( myNode ) , s e r v e r I P ) ;
timestampNow = new K I n t e g e r ( ) ;
i n ( new KString ( " timestamp " ) , timestampNow , myNode ) ;
__tuple_8 = new Tuple ( ) ;
__tuple_8 . s e t H a n d l e R e t r i e v e d ( true ) ;
__tuple_8 . add ( new KString ( " b l o g " ) ) ;
__backup_9_anySubject = a n y S u b j e c t ;
a n y S u b j e c t = new KString ( ) ;
__tuple_8 . add ( a n y S u b j e c t ) ;
__backup_10_anyBlog = anyBlog ;
anyBlog = new KString ( ) ;
public void e x e c u t e ( ) throws KlavaException {
S t r i n g T o F i l e w r i t e = new methods . S t r i n g T o F i l e ( ) ;
blogDispCount = new K I n t e g e r ( 0 ) ;
__tuple_7 = new Tuple ( ) ;
__tuple_7 . add ( new KString ( " s e r v e r I P " ) ) ;
}
148
Appendix E
__tuple_8 . add ( anyBlog ) ;
__backup_11_anyNode = anyNode ;
anyNode = new P h y s i c a l L o c a l i t y ( ) ;
__tuple_8 . add ( anyNode ) ;
__backup_12_timestampLast = timestampLast ;
timestampLast = new K I n t e g e r ( ) ;
__tuple_8 . add ( timestampLast ) ;
__to_8 = new KBoolean ( read_nb ( __tuple_8 , s e r v e r I P ) ) ;
i f ( ! __to_8 . b o o l e a n V a l u e ( ) ) {
a n y S u b j e c t = __backup_9_anySubject ;
anyBlog = __backup_10_anyBlog ;
anyNode = __backup_11_anyNode ;
timestampLast = __backup_12_timestampLast ;
}
_forall_exp_1 = __to_8 ;
while ( _forall_exp_1 . b o o l e a n V a l u e ( ) ) {
P r i n t ( new KString ( "now t r y t o s e e i f you and t h e b l o g g e r you found a r e f r i e n d s " ) ) ;
__tuple_9 = new Tuple ( ) ;
__backup_13_anyUser = anyUser ;
anyUser = new KString ( ) ;
__tuple_9 . add ( anyUser ) ;
__tuple_9 . add ( anyNode ) ;
__tuple_9 . add ( new KString ( " f o l l o w " ) ) ;
__to_9 = new KBoolean ( read_nb ( __tuple_9 , myNode ) ) ;
i f ( ! __to_9 . b o o l e a n V a l u e ( ) ) {
anyUser = __backup_13_anyUser ;
}
i f ( __to_9 . b o o l e a n V a l u e ( ) ) {
P r i n t ( new KString ( anyUser . c o n c a t ( " wrote − " . t o S t r i n g ( ) ) . c o n c a t ( a n y S u b j e c t . t o S t r i n g ( )
) . c o n c a t ( " − " . t o S t r i n g ( ) ) . c o n c a t ( anyBlog . t o S t r i n g ( ) ) ) ) ;
output = anyUser . t o S t r i n g ( ) + " wrote : " + a n y S u b j e c t . t o S t r i n g ( ) + " − " + anyBlog . t o S t r i n g ( ) ;
w r i t e . S t r i n g T o F i l e ( output ) ;
} else {
P r i n t ( new KString ( " you and t h i s b l o g g e r a r e not f r i e n d s " ) ) ;
}
__tuple_8 . r e s e t ( ) ;
E.5 GetBlogs.m4
149
}
changequote (Ã 34 , Ã◦ )
i n c l u d e ( S p e c i f i c a t i o n s . m4)
E.6 swingJApplet
GetBlogs ( B l o g L e n g t h R e s t r i c t i o n , B l o g S u b j e c t )
}
Ã◦ Ã◦ )Ã◦
)
}
__tuple_8 . add ( new KString ( " b l o g " ) ) ;
__backup_9_anySubject = a n y S u b j e c t ;
a n y S u b j e c t = new KString ( ) ;
__tuple_8 . add ( a n y S u b j e c t ) ;
__backup_10_anyBlog = anyBlog ;
anyBlog = new KString ( ) ;
__tuple_8 . add ( anyBlog ) ;
__backup_11_anyNode = anyNode ;
anyNode = new P h y s i c a l L o c a l i t y ( ) ;
__tuple_8 . add ( anyNode ) ;
__backup_12_timestampLast = timestampLast ;
timestampLast = new K I n t e g e r ( ) ;
__tuple_8 . add ( timestampLast ) ;
__to_8 = new KBoolean ( read_nb ( __tuple_8 , s e r v e r I P ) ) ;
i f ( ! __to_8 . b o o l e a n V a l u e ( ) ) {
a n y S u b j e c t = __backup_9_anySubject ;
anyBlog = __backup_10_anyBlog ;
anyNode = __backup_11_anyNode ;
timestampLast = __backup_12_timestampLast ;
}
_forall_exp_1 = __to_8 ;
150
Appendix E
Klava . KString ;
Klava . K l a v a A p p l i c a t i o n ;
j a v a . i o . FileNotFoundException ;
j a v a . i o . IOException ;
Klava . KlavaException ;
Klava . N e t U t i l s ;
Klava . Node ;
java . io . F i l e ;
java . io . FileInputStream ;
j a v a . u t i l . Scanner ;
java . u t i l . logging . Level ;
j a v a . u t i l . l o g g i n g . Logger ;
methods . AddFriendK ;
methods . BlogK ;
methods . CreateAccountK ;
methods . CreateEventK ;
methods . CreateGroupK ;
methods . LoginK ;
methods . SendMessageK ;
methods . S t r i n g T o F i l e ;
// V a r i a b l e s
int yourLoginNode = 0 ;
public c l a s s swingJApplet extends j a v a x . swing . JApplet {
∗
∗ @author O l a f u r
∗/
/∗ ∗
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
∗
∗ Created on 1 0 . 1 1 . 2 0 1 0 , 2 0 : 3 4 : 1 4
∗/
d e f i n e ( SwingJApplet ,Ã 34 Ã 34
package t h e A p p l e t ;
/∗
∗ swingJApplet . java
E.6 swingJApplet
151
j a v a . awt . EventQueue . invokeAndWait ( new Runnable ( ) {
public void run ( ) {
initComponents ( ) ;
}
});
} catch ( E x c e p t i o n ex ) {
public void i n i t ( ) {
try {
// t e s t methods and c l a s s e s
public void d i s p l a y t e x t ( ) {
try {
S t r i n g B u i l d e r t e x t = new S t r i n g B u i l d e r ( ) ;
S t r i n g NL = System . g e t P r o p e r t y ( " l i n e . s e p a r a t o r " ) ;
Scanner s c a n n e r = new Scanner ( new F i l e I n p u t S t r e a m ( f i l e ) ) ;
try {
while ( s c a n n e r . hasNextLine ( ) ) {
t e x t . append ( s c a n n e r . n e x t L i n e ( ) ) . append (NL ) ;
}
jTextArea1 . append ( t e x t . t o S t r i n g ( ) ) ;
} finally {
scanner . c l o s e ( ) ;
}
f i l e . delete ();
F i l e f i l e = new F i l e ( " t e s t . t x t " ) ;
S t r i n g T o F i l e w r i t e = new methods . S t r i n g T o F i l e ( ) ;
w r i t e . S t r i n g T o F i l e ( "" ) ;
} catch ( FileNotFoundException ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
}
}
/∗ ∗ I n i t i a l i z e s t h e a p p l e t s w i n g J A p p l e t ∗/
int nodeNum = 1 0 0 0 0 ;
private Node yourNode ;
public S t r i n g monitored = "" ;
F i l e f i l e = new F i l e ( " t e s t . t x t " ) ;
152
Appendix E
ex . p r i n t S t a c k T r a c e ( ) ;
} catch ( I n t e r r u p t e d E x c e p t i o n ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
} catch ( IOException ex ) {
System . out . p r i n t l n ( ex ) ;
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
} catch ( KlavaException ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
// Create Account
try {
S t r i n g userName = j T e x t F i e l d 1 . getText ( ) ;
S t r i n g password = j T e x t F i e l d 2 . getText ( ) ;
K l a v a A p p l i c a t i o n app = new K l a v a A p p l i c a t i o n ( ) ;
nodeNum++;
Node User = new Node ( " User " , nodeNum , " l o c a l h o s t " , I n t e g e r . p a r s e I n t ( " 9999 " ) ) ;
yourNode = User ;
yourNode . addToEnv ( " s e r v e r I P " , N e t U t i l s . c r e a t e N o d e A d d r e s s ( " l o c a l h o s t : 1 1 0 0 0 " ) ) ;
app . addNode ( yourNode ) ;
yourNode . a d d P r o c e s s ( new CreateAccountK ( new KString ( userName ) , new KString ( password ) ) ) ;
app . s t a r t N o d e s ( ) ;
Thread . s l e e p ( 1 0 0 0 ) ;
System . out . p r i n t l n ( " I have now s l e p t l o n g enough f o r you t o c o n t i n u e " ) ;
app . removeNode ( yourNode ) ;
displaytext ();
private void j B u t t o n 1 A c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent e v t ) {
\∗
∗
∗ Here was code needed for i n i t ( )
∗ i t was a u t o m a t i c a l l y g e n e r a t e d and un− n e c c e s a r y t o show h e r e .
∗
∗/
}
}
E.6 swingJApplet
153
// Log i n
try {
S t r i n g userName = j T e x t F i e l d 1 . getText ( ) ;
S t r i n g password = j T e x t F i e l d 2 . getText ( ) ;
K l a v a A p p l i c a t i o n app = new K l a v a A p p l i c a t i o n ( ) ;
nodeNum++;
Node Login = new Node ( " Login " , nodeNum , " l o c a l h o s t " , I n t e g e r . p a r s e I n t ( " 9999 " ) ) ;
yourNode = Login ;
yourNode . addToEnv ( " s e r v e r I P " , N e t U t i l s . c r e a t e N o d e A d d r e s s ( " l o c a l h o s t : 1 1 0 0 0 " ) ) ;
app . addNode ( yourNode ) ;
yourNode . a d d P r o c e s s ( new LoginK ( new KString ( userName ) , new KString ( password ) ) ) ;
app . s t a r t N o d e s ( ) ;
Thread . s l e e p ( 1 5 0 0 ) ;
System . out . p r i n t l n ( " I have now s l e p t l o n g enough f o r you t o c o n t i n u e " ) ;
app . removeNode ( yourNode ) ;
displaytext ();
// Make Blog
try {
private void j B u t t o n 3 A c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent e v t ) {
}
} catch ( I n t e r r u p t e d E x c e p t i o n ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
} catch ( IOException ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
} catch ( KlavaException ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
}
private void j B u t t o n 2 A c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent e v t ) {
}
}
154
Appendix E
// Add Friend
try {
S t r i n g friendName = j T e x t F i e l d 6 . getText ( ) ;
K l a v a A p p l i c a t i o n app = new K l a v a A p p l i c a t i o n ( ) ;
// app . addNode ( yourNode ) ;
yourNode . a d d P r o c e s s ( new AddFriendK ( new KString ( friendName ) ) ) ;
app . s t a r t N o d e s ( ) ;
Thread . s l e e p ( 1 0 0 0 ) ;
System . out . p r i n t l n ( " I have now s l e p t l o n g enough f o r you t o c o n t i n u e " ) ;
app . removeNode ( yourNode ) ;
displaytext ();
} catch ( I n t e r r u p t e d E x c e p t i o n ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
}
}
// LOG OUT:
nodeNum++;
yourNode = null ;
private void j T o g g l e B u t t o n 4 A c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent e v t ) {
}
private void j B u t t o n 4 A c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent e v t ) {
}
S t r i n g blogBody = j T e x t F i e l d 5 . getText ( ) ;
K l a v a A p p l i c a t i o n app = new K l a v a A p p l i c a t i o n ( ) ;
yourNode . a d d P r o c e s s ( new BlogK ( new KString ( blogBody ) ) ) ;
app . s t a r t N o d e s ( ) ;
Thread . s l e e p ( 1 0 0 0 ) ;
System . out . p r i n t l n ( " I have now s l e p t l o n g enough f o r you t o c o n t i n u e " ) ;
app . removeNode ( yourNode ) ;
displaytext ();
} catch ( I n t e r r u p t e d E x c e p t i o n ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
}
E.6 swingJApplet
155
// Create Group
try {
S t r i n g userName = j T e x t F i e l d 1 . getText ( ) ;
S t r i n g password = j T e x t F i e l d 2 . getText ( ) ;
K l a v a A p p l i c a t i o n app = new K l a v a A p p l i c a t i o n ( ) ;
nodeNum++;
Node User = new Node ( " User " , nodeNum , " l o c a l h o s t " , I n t e g e r . p a r s e I n t ( " 9999 " ) ) ;
yourNode = User ;
yourNode . addToEnv ( " s e r v e r I P " , N e t U t i l s . c r e a t e N o d e A d d r e s s ( " l o c a l h o s t : 1 1 0 0 0 " ) ) ;
app . addNode ( yourNode ) ;
yourNode . a d d P r o c e s s ( new CreateGroupK ( new KString ( userName ) , new KString ( password ) ) ) ;
app . s t a r t N o d e s ( ) ;
Thread . s l e e p ( 1 0 0 0 ) ;
System . out . p r i n t l n ( " I have now s l e p t l o n g enough f o r you t o c o n t i n u e " ) ;
app . removeNode ( yourNode ) ;
displaytext ();
private void j T o g g l e B u t t o n 2 A c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent e v t ) {
}
// SEND MESSAGE:
try {
S t r i n g userName = j T e x t F i e l d 3 . getText ( ) ;
S t r i n g message = j T e x t F i e l d 4 . getText ( ) ;
K l a v a A p p l i c a t i o n app = new K l a v a A p p l i c a t i o n ( ) ;
// app . addNode ( yourNode ) ;
yourNode . a d d P r o c e s s ( new SendMessageK ( new KString ( userName ) , new KString ( message ) ) ) ;
app . s t a r t N o d e s ( ) ;
Thread . s l e e p ( 1 0 0 0 ) ;
System . out . p r i n t l n ( " I have now s l e p t l o n g enough f o r you t o c o n t i n u e " ) ;
app . removeNode ( yourNode ) ;
displaytext ();
} catch ( I n t e r r u p t e d E x c e p t i o n ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
}
private void j T o g g l e B u t t o n 3 A c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent e v t ) {
156
Appendix E
} catch ( I n t e r r u p t e d E x c e p t i o n ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
} catch ( IOException ex ) {
System . out . p r i n t l n ( ex ) ;
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
// Create Event
try {
// jTextArea1 . removeAll ( ) ;
// F i l e f i l e = new F i l e (" t e s t . t x t " ) ;
S t r i n g userName = j T e x t F i e l d 1 . getText ( ) ;
S t r i n g password = j T e x t F i e l d 2 . getText ( ) ;
K l a v a A p p l i c a t i o n app = new K l a v a A p p l i c a t i o n ( ) ;
nodeNum++;
Node User = new Node ( " User " , nodeNum , " l o c a l h o s t " , I n t e g e r . p a r s e I n t ( " 9999 " ) ) ;
yourNode = User ;
yourNode . addToEnv ( " s e r v e r I P " , N e t U t i l s . c r e a t e N o d e A d d r e s s ( " l o c a l h o s t : 1 1 0 0 0 " ) ) ;
app . addNode ( yourNode ) ;
yourNode . a d d P r o c e s s ( new CreateEventK ( new KString ( userName ) , new KString ( password ) ) ) ;
app . s t a r t N o d e s ( ) ;
Thread . s l e e p ( 1 0 0 0 ) ;
System . out . p r i n t l n ( " I have now s l e p t l o n g enough f o r you t o c o n t i n u e " ) ;
app . removeNode ( yourNode ) ;
displaytext ();
private void j T o g g l e B u t t o n 1 A c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent e v t ) {
}
} catch ( I n t e r r u p t e d E x c e p t i o n ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
} catch ( IOException ex ) {
System . out . p r i n t l n ( ex ) ;
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
} catch ( KlavaException ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
}
E.6 swingJApplet
157
SwingJApplet ( )
Ã◦ Ã◦ )
}
// V a r i a b l e s d e c l a r a t i o n − do not modify
private j a v a x . swing . JButton jButton1 ;
private j a v a x . swing . JButton jButton2 ;
private j a v a x . swing . JButton jButton3 ;
private j a v a x . swing . JButton jButton4 ;
private j a v a x . swing . JLabel j L a b e l 1 ;
private j a v a x . swing . JLabel j L a b e l 2 ;
private j a v a x . swing . JLabel j L a b e l 3 ;
private j a v a x . swing . JLabel j L a b e l 4 ;
private j a v a x . swing . J S c r o l l P a n e j S c r o l l P a n e 1 ;
private j a v a x . swing . JTextArea jTextArea1 ;
private j a v a x . swing . J T e x t F i e l d j T e x t F i e l d 1 ;
private j a v a x . swing . J T e x t F i e l d j T e x t F i e l d 2 ;
private j a v a x . swing . J T e x t F i e l d j T e x t F i e l d 3 ;
private j a v a x . swing . J T e x t F i e l d j T e x t F i e l d 4 ;
private j a v a x . swing . J T e x t F i e l d j T e x t F i e l d 5 ;
private j a v a x . swing . J T e x t F i e l d j T e x t F i e l d 6 ;
private j a v a x . swing . JToggleButton j T o g g l e B u t t o n 1 ;
private j a v a x . swing . JToggleButton j T o g g l e B u t t o n 2 ;
private j a v a x . swing . JToggleButton j T o g g l e B u t t o n 3 ;
private j a v a x . swing . JToggleButton j T o g g l e B u t t o n 4 ;
// End o f v a r i a b l e s d e c l a r a t i o n
}
} catch ( KlavaException ex ) {
Logger . g e t L o g g e r ( swingJApplet . c l a s s . getName ( ) ) . l o g ( L e v e l . SEVERE, null , ex ) ;
}
158
Appendix E
}
app . addNode ( s e r v e r ) ;
s e r v e r . a d d P r o c e s s ( new __server_1 ( ) ) ;
app . s t a r t N o d e s ( ) ;
app . waitForNodesAndTerminate ( ) ;
public c l a s s S e r v e r {
s t a t i c public void main ( S t r i n g a r g s [ ] ) throws IOException , KlavaException {
K l a v a A p p l i c a t i o n app = new K l a v a A p p l i c a t i o n ( ) ;
Node s e r v e r = new Node ( " s e r v e r " , 1 1 0 0 0 , " l o c a l h o s t " , I n t e g e r . p a r s e I n t ( " 9999 " ) ) ;
}
}
// main c l a s s
public void e x e c u t e ( ) throws KlavaException {
timestamp = new K I n t e g e r ( 0 ) ;
out ( new KString ( " timestamp " ) , timestamp , s e l f ) ;
public __server_1 ( ) {}
// v a r i a b l e s
protected K I n t e g e r timestamp ;
protected KString b l o g ;
protected KString senderNode ;
// used d e f i n i t i o n names
c l a s s __server_1 extends K l a v a P r o c e s s {
import j a v a . i o . ∗ ;
import Klava . ∗ ;
package autogen ;
changequote (Ã 34 , Ã◦ )
i n c l u d e ( S p e c i f i c a t i o n s . m4)
d e f i n e ( S e r v e r ,Ã 34 Ã 34
E.7 Server.m4
E.7 Server.m4
159
// parameters
protected KString blogBody ;
protected K I n t e g e r l o g i n N o d e ;
// v a r i a b l e s
protected L o c a l i t y myNode ;
protected K I n t e g e r blogNumber ;
protected L o g i c a l L o c a l i t y s e r v e r I P = new L o g i c a l L o c a l i t y ( " s e r v e r I P " ) ;
// used d e f i n i t i o n names
protected CreateAccount __dummy_CreateAccount ;
protected MakeBlog __dummy_MakeBlog ;
protected SendMessage __dummy_SendMessage ;
public c l a s s BlogK extends K l a v a P r o c e s s {
∗
∗ @author o l a f u r
∗/
/∗ ∗
import Klava . ∗ ;
import autogen . ∗ ;
package methods ;
changequote (Ã 43 , Ã◦ )
i n c l u d e ( S p e c i f i c a t i o n s . m4)
d e f i n e ( BlogK ,Ã 34 Ã 34
E.8 BlogK.m4
Server ()
Ã◦ Ã◦ )
}
160
Appendix E
}
KString blogBody / ∗ ,
KInteger l o g i n N o d e ∗ /
) {
// parameters
this . blogBody = blogBody ;
t h i s . loginNode = loginNode ;
}
public void e x e c u t e ( ) throws KlavaException {
myNode = new P h y s i c a l L o c a l i t y ( ) ;
r e a d ( new KString ( " yourNode " ) , myNode , s e l f ) ;
e v a l ( new MakeBlog ( myNode , new KString ( " Blog " ) , blogBody ,
new P h y s i c a l L o c a l i t y ( g e t P h y s i c a l L o c a l i t y ( s e l f ) ) ) , s e r v e r I P ) ;
BlogK ( )
Ã◦ Ã◦ )
}
//
public BlogK (
protected AddFriend __dummy_AddFriend ;
E.8 BlogK.m4
161
162
Appendix E
Bibliography
[1] danah m. boyd, Nicole B. Ellison. Social network sites: Denition, history, and scholarship. Journal of Computer-Mediated Communication Article, 2007, available at http://jcmc.indiana.edu/vol13/issue1/boyd.
ellison.html
[2] News Corp in 580m.usd. internet buy. 2005, available at http://news.bbc.
co.uk/2/hi/business/4695495.stm
[3] IAC Annual Report. United States, securities and exchange commission, 2010 available at http://ir.iac.com/secfiling.cfm?filingID=
1047469-10-1538
[4] Christopher
Nickson.
2009,
available
at
The
History
of
Social
Networking.
http://www.digitaltrends.com/features/
the-history-of-social-networking
[5] Gary Rivlin. YourMoneyArticle, 2006, available at http://www.nytimes.
com/2006/10/15/business/yourmoney/15friend.html?_r=1
[6] Je
2009,
Weiner, LinkedIn:
available
at
[7] The
History
50
million
professionals
worldwide,
http://blog.linkedin.com/2009/10/14/
linkedin-50-million-professionals-worldwide/
Of
Myspace,
2010,
available
webhostingreport.com/learn/myspace.html
at
http://www.
[8] Paul Glazowski, Bebo Founders Talk History Of Network And Past Web Efforts, 2008, available at http://mashable.com/2008/03/16/bebo-history/
164
BIBLIOGRAPHY
[9] Askwiki, History of Orkut, 2006, available at http://askwiki.blogspot.
com/2006/09/history-of-orkut.html
[10] Paul Adams, The Real Life Social Network v2 2010, available at http:
//www.slideshare.net/padday/the-real-life-social-network-v2
[11] USA Today, Flickr of idea on a gaming project led to photo
website, 2006, available at http://www.usatoday.com/tech/products/
2006-02-27-flickr_x.htm
[12] Linda Roeder, Where Did Facebook Come From?, About.com, 2007,
available at http://personalweb.about.com/od/makefriendsonfacebook/
a/whatisfacebook_5.htm
[13] John
Hudson,
Will
Facebook's
E-Mail
Service
Demolish Gmail and Hotmail?,
AtlanticWire, 2010, available at
http://news.yahoo.com/s/atlantic/20101112/cm_atlantic/
willfacebooksemailservicedemolishgmailandhotmail5782
[14] Jerry L Work, The History of Twitter and What it Means to Tweet EzineArticles, 2009, available at [?]
[15] Kenneth J. Turner, Exploiting the m4 Macro Language, University of Stirling, Department of Computing Science and Mathematics 1994, available at
http://www.bloomberg.com/video/64042122/
[16] Rocco De Nicola, Gian Luigi Ferrari, and Rosario Pugliese. KLAIM: A
Kernel Language for Agents Interaction and Mobility, IEEE Transactions
on Software Engineering, Vol.24, No.5. 1998. Available at http://www.cs.
unicam.it/merelli/Calcolo/TSE98-Klaim.pdf
[17] Lorenzo Bettini. X-KLAIM: A Programming Language for Object-Oriented
Mobile Code, Universitá di Firenze, Dipartimento di Sistemi e Infor-matica,
2004, available at http://music.dsi.unifi.it/download/xklaim.pdf
[18] BettiniLorenzo Bettini. KLAVA: a Java package for distributed and mobile
applications, Universitá di Firenze, Dipartimento di Sistemi e Informatica,
2004, available at http://music.dsi.unifi.it/download/klava.pdf
[19] Robert Björnson, Nicholas Carriero, David Gelernter and Jerrold Leichter Linda, the Portable Parallel, Yale University, Department of Computer Science, 1988, available at http://www.cs.yale.edu/publications/
techreports/tr520.pdf
[20] oxyweb.co.uk/blog, available at http://francisanderson.wordpress.
com/2008/11/01/\social-media-world-map-of-social-nets-\
blogs-are-over-craigslist-crime-qik-tribesmart/
BIBLIOGRAPHY
165
[21] Facebook company timeline, available at http://www.facebook.com/
press/info.php?timeline
[22] Facebook Developers, Authentication, available at http://developers.
facebook.com/docs/authentication/
[23] Facebook Developers, Graph API Overview, available at http://
developers.facebook.com/docs/api
[24] Facebook Developers, Open Graph Protocol, available at http://
developers.facebook.com/docs/opengraph
[25] Facebook Developers, Social Plugins, available at http://developers.
facebook.com/plugins
[26] Fahad Owais Capability File Names over HTTP, Technical University of Denmark, 2010, available at http://orbit.dtu.dk/getResource?
recordId=266178&objectId=1&versionId=1
[27] Bloomberg, Article: MySpace's Michael Jones Interview About Site Relaunch 2010, available at http://www.bloomberg.com/video/64042122/