1 \documentclass[tikz
]{standalone
}
2 \usetikzlibrary{positioning,shapes.geometric,shapes.symbols,shadows,fit
}
6 task/.style=
{regular polygon,regular polygon sides=
3,text width=
2.5em,draw
},
7 share/.style=
{cylinder,shape border rotate=
90,aspect=
.3,text width=
2.5em,text height=
1em,draw
},
8 client/.style=
{cloud,aspect=
2}
10 \node (C1)
[client,inner sep=
0pt,draw
] {Client
\textsubscript{1}};
11 \node (C2)
[client,inner sep=
0pt,draw,right=of C1
] {Client
\textsubscript{2}};
12 \node (CD)
[right=of C2
] {\ldots};
13 \node (CN)
[client,inner sep=
0pt,draw,right=of CD
] {Client
\textsubscript{n
}};
15 % line between server and browser
16 \draw [dotted
] (
[xshift=-
5em,yshift=-
.8em
]C1.south west) node
[left,above
]{browser
} node
[left,below
]{server(s)
} -- (
[xshift=
5em,yshift=-
.8em
]CN.south east);
18 \node[task,inner sep=-
4.5pt,below=of C1,fill=white,xshift=
6.5em,yshift=-
4.5em
] (Tn)
{Task
\textsubscript{n
}};
19 \node[task,inner sep=-
4.5pt,below=of C1,fill=white,xshift=
5em,yshift=-
3.0em
] (Td)
{\ldots};
20 \node[task,inner sep=-
4.5pt,below=of C1,fill=white,xshift=
3.5em,yshift=-
1.5em
] (T2)
{Task
\textsubscript{2}};
21 \node[task,inner sep=-
4.5pt,below=of C1,fill=white,xshift=
2em
] (
T1)
{Task
\textsubscript{1}};
23 \node[share,node distance=
6em,right=of
T1,fill=white,xshift=
4.5em,yshift=-
4.5em
] (Sn)
{SDS
\textsubscript{n
}};
24 \node[share,node distance=
6em,right=of
T1,fill=white,xshift=
3em,yshift=-
3.0em
] (Sd)
{\ldots};
25 \node[share,node distance=
6em,right=of
T1,fill=white,xshift=
1.5em,yshift=-
1.5em
] (S2)
{SDS
\textsubscript{2}};
26 \node[share,node distance=
6em,right=of
T1,fill=white
] (S1)
{SDS
\textsubscript{1}};
28 \node[fit=
{(
T1)(Sn)
},draw
] (TS)
{};
30 % line between client and server
31 \draw [dotted
] (
[xshift=-
5em,yshift=-
11em
]C1.south west) node
[left,above
]{server(s)
} node
[left,below
]{device(s)
} -- (
[xshift=
5em,yshift=-
11em
]CN.south east);
34 \node[task,text width=
1.5em,inner sep=-
4.5pt,node distance=
12em,below=of C1,double copy shadow=
{shadow xshift=
.4em,shadow yshift=-
.4em
},fill=white
] (D1T1)
{};
35 \node[share,text width=
.3em,text height=
.8ex,right=of D1T1,double copy shadow=
{shadow xshift=
.4em,shadow yshift=-
.4em
},fill=white
] (D1S1)
{};
37 \node[draw,fit=
{(D1S1)(D1T1)(
[shift=
{(
1.2em,-
1.2em)
}]D1S1.south east)
},label=below:
{\scriptsize mTask device
\textsubscript{1}}] (D1)
{};
40 \node[task,text width=
1.5em,inner sep=-
4.5pt,node distance=
12em,below=of C2,double copy shadow=
{shadow xshift=
.4em,shadow yshift=-
.4em
},fill=white
] (D2T1)
{};
41 \node[share,text width=
.3em,text height=
.8ex,right=of D2T1,double copy shadow=
{shadow xshift=
.4em,shadow yshift=-
.4em
},fill=white
] (D2S1)
{};
43 \node[draw,fit=
{(D2S1)(D2T1)(
[shift=
{(
1.2em,-
1.2em)
}]D2S1.south east)
},label=below:
{\scriptsize mTask device
\textsubscript{2}}] (D2)
{};
46 \node[right=of D2
] {\ldots};
49 \node[task,text width=
1.5em,inner sep=-
4.5pt,node distance=
12em,below=of CN,double copy shadow=
{shadow xshift=
.4em,shadow yshift=-
.4em
},fill=white
] (DNT1)
{};
50 \node[share,text width=
.3em,text height=
.8ex,right=of DNT1,double copy shadow=
{shadow xshift=
.4em,shadow yshift=-
.4em
},fill=white
] (DNS1)
{};
52 \node[draw,fit=
{(DNS1)(DNT1)(
[shift=
{(
1.2em,-
1.2em)
}]DNS1.south east)
},label=below:
{\scriptsize mTask device
\textsubscript{n
}}] (DN)
{};
55 \node[fit=
{(C1)(
[shift=
{(
1em,-
1.2em)
}]DN.south east)
},draw,label=
{iTask server
}] {};
58 \draw [<->
] (C1) -- (
T1);
59 \draw [<->
] (C2) -- (
T1);
60 \draw [<->
] (CN) -- (
T1);
62 \draw [<->
] (
T1) -- (S1);
63 % \draw [<->] (T1) -- (S2);
64 % \draw [<->] (T1) -- (Sn);
66 \draw [<->
] (Tn) -- node
[midway,above,fill=white
] {\small\texttt{liftmTask
}} (D2T1);
67 \draw [<->
] (Sn) -- node
[midway,above,fill=white
] {\small\texttt{liftsds
}} (D2S1);
69 \draw [<->
] (D1T1) -- (D1S1);
70 \draw [<->
] (D2T1) -- (D2S1);
71 \draw [<->
] (DNT1) -- (DNS1);
73 \draw [<->
] (D1.north) to
[in=
180,out=
135] node
[midway,above,fill=white
] {\small\texttt{withDevice
}} (TS.west);