SlideShare a Scribd company logo
How We Brought Advanced
HTML5 Viewing To ADF
Sean Graham
Snowbound Software
Learn. Connect. Collaborate.
What is Snowbound?
• Over 20 years of document and imaging expertise
• Two main products:
– RasterMaster – Java and .NET document rendering and processing SDK
– VirtualViewer – Java and .NET viewer
Learn. Connect. Collaborate.
What is Snowbound?
• Over 20 years of document and imaging expertise
• Two main products:
– RasterMaster – Java and .NET document rendering and processing SDK
– VirtualViewer – Java and .NET viewer
Learn. Connect. Collaborate.
What is VirtualViewer
• VirtualViewer is a pure-browser document and image platform
– No plugins required
– Scores of formats
– Annotation, manipulation, redaction, etc.
• VirtualViewer has been integrated with Alfresco for years
• What would it take to integrate with ADF and Content App?
Learn. Connect. Collaborate.
What is VirtualViewer
• VirtualViewer is a pure-browser document and image platform
– No plugins required
– Scores of formats
– Annotation, manipulation, redaction, etc.
• VirtualViewer has been integrated with Alfresco for years
• What would it take to integrate with ADF and Content App?
1
Learn. Connect. Collaborate.
Goals
• Leverage as much existing work as sensible
• Ease deployment for ADF users
• Learn and embrace new technologies
Learn. Connect. Collaborate.
Goals
• Leverage as much existing work as sensible
• Ease deployment for ADF users
• Learn and embrace new technologies
Learn. Connect. Collaborate.
Goals
• Leverage as much existing work as sensible
• Ease deployment for ADF users
• Learn and embrace new technologies
Learn. Connect. Collaborate.
[…]
@Component({
selector: 'snbd-virtualviewer-alf',
templateUrl: './virtualviewer-alfresco.component.html'
})
export class VirtualViewerAlfrescoComponent implements OnInit {
@Input() node: MinimalNodeEntryEntity;
@Input() nodeId: string;
@Input() sharedLinkId: string;
documentId:string;
clientInstanceId: string;
constructor(private authService: AuthenticationService) {}
ngOnInit() {
if(this.node && this.node.id) {
this.documentId = this.node.id;
}
else {
this.documentId = this.sharedLinkId || this.nodeId;
}
this.clientInstanceId = this.generateClientInstanceId();
}
generateClientInstanceId():string {
var clientInstanceId = {
ticket: this.authService.getTicketEcm(),
username: this.authService.getEcmUsername()
};
return JSON.stringify(clientInstanceId);
}
}
Create ADF component
• Viewer component needs to
receive and process a
MinimalNodeEntryEntity.
From this we extract the node ID
for the document to be viewed.
• We extract the auth ticket and
EcmUserName from the
AuthenticationService
• This info is then passed to the VV
module so that the server can
retrieve the document from
Alfresco
2
Learn. Connect. Collaborate.
[…]
@Component({
selector: 'snbd-virtualviewer-alf',
templateUrl: './virtualviewer-alfresco.component.html'
})
export class VirtualViewerAlfrescoComponent implements OnInit {
@Input() node: MinimalNodeEntryEntity;
@Input() nodeId: string;
@Input() sharedLinkId: string;
documentId:string;
clientInstanceId: string;
constructor(private authService: AuthenticationService) {}
ngOnInit() {
if(this.node && this.node.id) {
this.documentId = this.node.id;
}
else {
this.documentId = this.sharedLinkId || this.nodeId;
}
this.clientInstanceId = this.generateClientInstanceId();
}
generateClientInstanceId():string {
var clientInstanceId = {
ticket: this.authService.getTicketEcm(),
username: this.authService.getEcmUsername()
};
return JSON.stringify(clientInstanceId);
}
}
Create ADF component
• Viewer component needs to
receive and process a
MinimalNodeEntryEntity.
From this we extract the node ID
for the document to be viewed.
• We extract the auth ticket and
EcmUserName from the
AuthenticationService
• This info is then passed to the VV
module so that the server can
retrieve the document from
Alfresco
Learn. Connect. Collaborate.
[…]
@Component({
selector: 'snbd-virtualviewer-alf',
templateUrl: './virtualviewer-alfresco.component.html'
})
export class VirtualViewerAlfrescoComponent implements OnInit {
@Input() node: MinimalNodeEntryEntity;
@Input() nodeId: string;
@Input() sharedLinkId: string;
documentId:string;
clientInstanceId: string;
constructor(private authService: AuthenticationService) {}
ngOnInit() {
if(this.node && this.node.id) {
this.documentId = this.node.id;
}
else {
this.documentId = this.sharedLinkId || this.nodeId;
}
this.clientInstanceId = this.generateClientInstanceId();
}
generateClientInstanceId():string {
var clientInstanceId = {
ticket: this.authService.getTicketEcm(),
username: this.authService.getEcmUsername()
};
return JSON.stringify(clientInstanceId);
}
}
Create ADF component
• Viewer component needs to
receive and process a
MinimalNodeEntryEntity.
From this we extract the node ID
for the document to be viewed.
• We extract the auth ticket and
EcmUserName from the
AuthenticationService
• This info is then passed to the VV
module so that the server can
retrieve the document from
Alfresco
Learn. Connect. Collaborate.
Register with Extension Service
• Let the system know there is a
new member of the namespace
• Set a custom ID for later
reference
import { ExtensionsModule, ExtensionService } from
'@alfresco/adf-extensions';
@NgModule({
imports: [ ExtensionsModule.forChild() ]
declarations: [ VirtualViewerAlfrescoComponent, MyLayout
],
entryComponents: [ VirtualViewerAlfrescoComponent,
MyLayout ]
})
export class MyExtensionModule {
constructor(extensions: ExtensionService) {
extensions.setComponents({
'snowbound.virtualviewer':
VirtualViewerAlfrescoComponent,
});
}
}
Learn. Connect. Collaborate.
Register with Extension Service
• Let the system know there is a
new member of the namespace
• Set a custom ID for later
reference
import { ExtensionsModule, ExtensionService } from
'@alfresco/adf-extensions';
@NgModule({
imports: [ ExtensionsModule.forChild() ]
declarations: [ VirtualViewerAlfrescoComponent, MyLayout
],
entryComponents: [ VirtualViewerAlfrescoComponent,
MyLayout ]
})
export class MyExtensionModule {
constructor(extensions: ExtensionService) {
extensions.setComponents({
'snowbound.virtualviewer':
VirtualViewerAlfrescoComponent,
});
}
}
3
Learn. Connect. Collaborate.
Viewer Extension Configuration
• While you could certainly include
your configuration values in the
app.extensions.json file,
don’t.
• Refer to an extension-specific
json configuration instead.
{
"$schema": "../../extension.schema.json",
"$id": "app.core",
"$name": "app.core",
"$version": "1.0.0",
"$vendor": "Alfresco Software, Ltd.",
"$license": "LGPL-3.0",
"$runtime": "1.5.0",
"$description": "Core application extensions and features",
"$references": ["virtualviewer.json"],
Learn. Connect. Collaborate.
Viewer Extension Configuration (Continued)
• You’ll need to associate at least
one filetype with your
component.
• To the right, we associate PDF
files with VV, but our actual
virtualviewer.json includes
scores of formats.
{
"$schema": "../extension.schema.json",
"$version": "0.1.0",
"$name": "virtualviewer",
"$description": "plugin for VirtualViewer in the content
app",
"features": {
"viewer": {
"content": [
{
"id": "snowbound",
"fileExtension": "pdf",
"component": "snowbound.virtualviewer"
}
]
}
}
}
Learn. Connect. Collaborate.
Viewer Extension Configuration (Continued)
• You’ll need to associate at least
one filetype with your
component.
• To the right, we associate PDF
files with VV, but our actual
virtualviewer.json includes
scores of formats.
{
"$schema": "../extension.schema.json",
"$version": "0.1.0",
"$name": "virtualviewer",
"$description": "plugin for VirtualViewer in the content
app",
"features": {
"viewer": {
"content": [
{
"id": "snowbound",
"fileExtension": "pdf",
"component": "snowbound.virtualviewer"
}
]
}
}
}
Learn. Connect. Collaborate.
The Whitespace Problem
• There seems to be a bug in the
current version of Content App
• A <span> is created for every
format you’ve registered support
for
• Those <span> are not zero-
height
4
Learn. Connect. Collaborate.
The Whitespace Problem
• There seems to be a bug in the
current version of Content App
• A <span> is created for every
format you’ve registered support
for
• Those <span> are not zero-
height
Learn. Connect. Collaborate.
The Whitespace Problem
• There seems to be a bug in the
current version of Content App
• A <span> is created for every
format you’ve registered support
for
• Those <span> are not zero-
height
Learn. Connect. Collaborate.
Questions
• Nathan and I will be at the Snowbound table during the 10:45a block on Thursday
• Alternatively, visit the table and coordinate a different time with JB
Learn. Connect. Collaborate.
Questions
• Nathan and I will be at the Snowbound table during the 10:45a block on Thursday
• Alternatively, visit the table and coordinate a different time with JB
How We Brought
Advanced HTML5 Viewing
To ADF
Sean Graham
Snowbound Software
Ad

More Related Content

What's hot (20)

Vincent biret azure functions and flow (toronto)
Vincent biret azure functions and flow (toronto)Vincent biret azure functions and flow (toronto)
Vincent biret azure functions and flow (toronto)
Vincent Biret
 
Vincent biret azure functions and flow (ottawa)
Vincent biret azure functions and flow (ottawa)Vincent biret azure functions and flow (ottawa)
Vincent biret azure functions and flow (ottawa)
Vincent Biret
 
APIs, APIs Everywhere!
APIs, APIs Everywhere!APIs, APIs Everywhere!
APIs, APIs Everywhere!
BIWUG
 
MS Insights Brazil 2015 containers and devops
MS Insights Brazil 2015   containers and devopsMS Insights Brazil 2015   containers and devops
MS Insights Brazil 2015 containers and devops
Damien Caro
 
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
NCCOMMS
 
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio StruyfO365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
NCCOMMS
 
Pros & Cons of Microservices Architecture
Pros & Cons of Microservices ArchitecturePros & Cons of Microservices Architecture
Pros & Cons of Microservices Architecture
Ashwini Kuntamukkala
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET Microservices
VMware Tanzu
 
Your Future HTML: The Evolution of Site Design with Web Components
Your Future HTML: The Evolution of Site Design with Web ComponentsYour Future HTML: The Evolution of Site Design with Web Components
Your Future HTML: The Evolution of Site Design with Web Components
Ken Tabor
 
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
BizTalk360
 
Microservices and Azure App Services
Microservices and Azure App ServicesMicroservices and Azure App Services
Microservices and Azure App Services
Damir Dobric
 
Building Push Triggers for Logic Apps
Building Push Triggers for Logic AppsBuilding Push Triggers for Logic Apps
Building Push Triggers for Logic Apps
BizTalk360
 
The hardest part of microservices: your data
The hardest part of microservices: your dataThe hardest part of microservices: your data
The hardest part of microservices: your data
Christian Posta
 
Introduction to Microservices
Introduction to MicroservicesIntroduction to Microservices
Introduction to Microservices
MahmoudZidan41
 
ECS 2018: Introduction to Azure Web Applications
ECS 2018: Introduction to Azure Web ApplicationsECS 2018: Introduction to Azure Web Applications
ECS 2018: Introduction to Azure Web Applications
Eric Shupps
 
Agile Development From A Developers Perspective
Agile Development From A Developers PerspectiveAgile Development From A Developers Perspective
Agile Development From A Developers Perspective
Richard Banks
 
2 Speed IT powered by Microsoft Azure and Minecraft
2 Speed IT powered by Microsoft Azure and Minecraft2 Speed IT powered by Microsoft Azure and Minecraft
2 Speed IT powered by Microsoft Azure and Minecraft
Sriram Hariharan
 
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
NCCOMMS
 
Windows Azure Active Directory
Windows Azure Active DirectoryWindows Azure Active Directory
Windows Azure Active Directory
Pavel Revenkov
 
Introduction to Azure Functions
Introduction to Azure FunctionsIntroduction to Azure Functions
Introduction to Azure Functions
Marco Parenzan
 
Vincent biret azure functions and flow (toronto)
Vincent biret azure functions and flow (toronto)Vincent biret azure functions and flow (toronto)
Vincent biret azure functions and flow (toronto)
Vincent Biret
 
Vincent biret azure functions and flow (ottawa)
Vincent biret azure functions and flow (ottawa)Vincent biret azure functions and flow (ottawa)
Vincent biret azure functions and flow (ottawa)
Vincent Biret
 
APIs, APIs Everywhere!
APIs, APIs Everywhere!APIs, APIs Everywhere!
APIs, APIs Everywhere!
BIWUG
 
MS Insights Brazil 2015 containers and devops
MS Insights Brazil 2015   containers and devopsMS Insights Brazil 2015   containers and devops
MS Insights Brazil 2015 containers and devops
Damien Caro
 
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
O365Con18 - Reach for the Cloud Build Solutions with the Power of Microsoft G...
NCCOMMS
 
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio StruyfO365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
NCCOMMS
 
Pros & Cons of Microservices Architecture
Pros & Cons of Microservices ArchitecturePros & Cons of Microservices Architecture
Pros & Cons of Microservices Architecture
Ashwini Kuntamukkala
 
Building .NET Microservices
Building .NET MicroservicesBuilding .NET Microservices
Building .NET Microservices
VMware Tanzu
 
Your Future HTML: The Evolution of Site Design with Web Components
Your Future HTML: The Evolution of Site Design with Web ComponentsYour Future HTML: The Evolution of Site Design with Web Components
Your Future HTML: The Evolution of Site Design with Web Components
Ken Tabor
 
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
Windows Azure Workflows Manager - Running Durable Workflows in the Cloud and ...
BizTalk360
 
Microservices and Azure App Services
Microservices and Azure App ServicesMicroservices and Azure App Services
Microservices and Azure App Services
Damir Dobric
 
Building Push Triggers for Logic Apps
Building Push Triggers for Logic AppsBuilding Push Triggers for Logic Apps
Building Push Triggers for Logic Apps
BizTalk360
 
The hardest part of microservices: your data
The hardest part of microservices: your dataThe hardest part of microservices: your data
The hardest part of microservices: your data
Christian Posta
 
Introduction to Microservices
Introduction to MicroservicesIntroduction to Microservices
Introduction to Microservices
MahmoudZidan41
 
ECS 2018: Introduction to Azure Web Applications
ECS 2018: Introduction to Azure Web ApplicationsECS 2018: Introduction to Azure Web Applications
ECS 2018: Introduction to Azure Web Applications
Eric Shupps
 
Agile Development From A Developers Perspective
Agile Development From A Developers PerspectiveAgile Development From A Developers Perspective
Agile Development From A Developers Perspective
Richard Banks
 
2 Speed IT powered by Microsoft Azure and Minecraft
2 Speed IT powered by Microsoft Azure and Minecraft2 Speed IT powered by Microsoft Azure and Minecraft
2 Speed IT powered by Microsoft Azure and Minecraft
Sriram Hariharan
 
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
O365Con18 - PowerApps build custom forms for SharePoint with Azure Maps - Bra...
NCCOMMS
 
Windows Azure Active Directory
Windows Azure Active DirectoryWindows Azure Active Directory
Windows Azure Active Directory
Pavel Revenkov
 
Introduction to Azure Functions
Introduction to Azure FunctionsIntroduction to Azure Functions
Introduction to Azure Functions
Marco Parenzan
 

Similar to How We Brought Advanced HTML5 Viewing to ADF (20)

A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
DataLeader.io
 
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDBMongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB
 
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
Sencha
 
Evolving your Data Access with MongoDB Stitch - Drew Di Palma
Evolving your Data Access with MongoDB Stitch - Drew Di PalmaEvolving your Data Access with MongoDB Stitch - Drew Di Palma
Evolving your Data Access with MongoDB Stitch - Drew Di Palma
MongoDB
 
MongoDB.local Berlin: App development in a Serverless World
MongoDB.local Berlin: App development in a Serverless WorldMongoDB.local Berlin: App development in a Serverless World
MongoDB.local Berlin: App development in a Serverless World
MongoDB
 
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
Obeo
 
Workshop: Building Vaadin add-ons
Workshop: Building Vaadin add-onsWorkshop: Building Vaadin add-ons
Workshop: Building Vaadin add-ons
Sami Ekblad
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
FIWARE
 
Integrating Jira Software Cloud With the AWS Code Suite
Integrating Jira Software Cloud With the AWS Code SuiteIntegrating Jira Software Cloud With the AWS Code Suite
Integrating Jira Software Cloud With the AWS Code Suite
Atlassian
 
Modular Web Applications With Netzke
Modular Web Applications With NetzkeModular Web Applications With Netzke
Modular Web Applications With Netzke
netzke
 
MongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
MongoDB.local Sydney: Evolving your Data Access with MongoDB StitchMongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
MongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
MongoDB
 
Google app engine by example
Google app engine by exampleGoogle app engine by example
Google app engine by example
Alexander Zamkovyi
 
Building a TV show with Angular, Bootstrap, and Web Services
Building a TV show with Angular, Bootstrap, and Web ServicesBuilding a TV show with Angular, Bootstrap, and Web Services
Building a TV show with Angular, Bootstrap, and Web Services
David Giard
 
Building and deploying React applications
Building and deploying React applicationsBuilding and deploying React applications
Building and deploying React applications
Astrails
 
Fire up your mobile app!
Fire up your mobile app!Fire up your mobile app!
Fire up your mobile app!
Suganthi Giridharan
 
Engineering the New LinkedIn Profile
Engineering the New LinkedIn ProfileEngineering the New LinkedIn Profile
Engineering the New LinkedIn Profile
Josh Clemm
 
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
JavaCro'14 - Building interactive web applications with Vaadin – Peter LehtoJavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
JavaCro'14 - Building interactive web applications with Vaadin – Peter Lehto
HUJAK - Hrvatska udruga Java korisnika / Croatian Java User Association
 
From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Again
jonknapp
 
8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated
8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated
8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated
dioduong345
 
Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event Handling
WebStackAcademy
 
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
A Microsoft Silverlight User Group Starter Kit Made Available for Everyone to...
DataLeader.io
 
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDBMongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB.local Atlanta: Introduction to Serverless MongoDB
MongoDB
 
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
SenchaCon 2016: Handle Real-World Data with Confidence - Fredric Berling
Sencha
 
Evolving your Data Access with MongoDB Stitch - Drew Di Palma
Evolving your Data Access with MongoDB Stitch - Drew Di PalmaEvolving your Data Access with MongoDB Stitch - Drew Di Palma
Evolving your Data Access with MongoDB Stitch - Drew Di Palma
MongoDB
 
MongoDB.local Berlin: App development in a Serverless World
MongoDB.local Berlin: App development in a Serverless WorldMongoDB.local Berlin: App development in a Serverless World
MongoDB.local Berlin: App development in a Serverless World
MongoDB
 
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
Zero to One : How to Integrate a Graphical Editor in a Cloud IDE (27.10.2021)
Obeo
 
Workshop: Building Vaadin add-ons
Workshop: Building Vaadin add-onsWorkshop: Building Vaadin add-ons
Workshop: Building Vaadin add-ons
Sami Ekblad
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
FIWARE
 
Integrating Jira Software Cloud With the AWS Code Suite
Integrating Jira Software Cloud With the AWS Code SuiteIntegrating Jira Software Cloud With the AWS Code Suite
Integrating Jira Software Cloud With the AWS Code Suite
Atlassian
 
Modular Web Applications With Netzke
Modular Web Applications With NetzkeModular Web Applications With Netzke
Modular Web Applications With Netzke
netzke
 
MongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
MongoDB.local Sydney: Evolving your Data Access with MongoDB StitchMongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
MongoDB.local Sydney: Evolving your Data Access with MongoDB Stitch
MongoDB
 
Building a TV show with Angular, Bootstrap, and Web Services
Building a TV show with Angular, Bootstrap, and Web ServicesBuilding a TV show with Angular, Bootstrap, and Web Services
Building a TV show with Angular, Bootstrap, and Web Services
David Giard
 
Building and deploying React applications
Building and deploying React applicationsBuilding and deploying React applications
Building and deploying React applications
Astrails
 
Engineering the New LinkedIn Profile
Engineering the New LinkedIn ProfileEngineering the New LinkedIn Profile
Engineering the New LinkedIn Profile
Josh Clemm
 
From Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) AgainFrom Backbone to Ember and Back(bone) Again
From Backbone to Ember and Back(bone) Again
jonknapp
 
8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated
8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated
8-9-10. ASP_updated8-9-10. ASP_updated8-9-10. ASP_updated
dioduong345
 
Angular - Chapter 4 - Data and Event Handling
 Angular - Chapter 4 - Data and Event Handling Angular - Chapter 4 - Data and Event Handling
Angular - Chapter 4 - Data and Event Handling
WebStackAcademy
 
Ad

Recently uploaded (20)

ATAL 6 Days Online FDP Scheme Document 2025-26.pdf
ATAL 6 Days Online FDP Scheme Document 2025-26.pdfATAL 6 Days Online FDP Scheme Document 2025-26.pdf
ATAL 6 Days Online FDP Scheme Document 2025-26.pdf
ssuserda39791
 
Autodesk Fusion 2025 Tutorial: User Interface
Autodesk Fusion 2025 Tutorial: User InterfaceAutodesk Fusion 2025 Tutorial: User Interface
Autodesk Fusion 2025 Tutorial: User Interface
Atif Razi
 
David Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry - Specializes In AWS, Microservices And Python.pdfDavid Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry
 
Slide share PPT of SOx control technologies.pptx
Slide share PPT of SOx control technologies.pptxSlide share PPT of SOx control technologies.pptx
Slide share PPT of SOx control technologies.pptx
vvsasane
 
Agents chapter of Artificial intelligence
Agents chapter of Artificial intelligenceAgents chapter of Artificial intelligence
Agents chapter of Artificial intelligence
DebdeepMukherjee9
 
seninarppt.pptx1bhjiikjhggghjykoirgjuyhhhjj
seninarppt.pptx1bhjiikjhggghjykoirgjuyhhhjjseninarppt.pptx1bhjiikjhggghjykoirgjuyhhhjj
seninarppt.pptx1bhjiikjhggghjykoirgjuyhhhjj
AjijahamadKhaji
 
Control Methods of Noise Pollutions.pptx
Control Methods of Noise Pollutions.pptxControl Methods of Noise Pollutions.pptx
Control Methods of Noise Pollutions.pptx
vvsasane
 
Applications of Centroid in Structural Engineering
Applications of Centroid in Structural EngineeringApplications of Centroid in Structural Engineering
Applications of Centroid in Structural Engineering
suvrojyotihalder2006
 
Mode-Wise Corridor Level Travel-Time Estimation Using Machine Learning Models
Mode-Wise Corridor Level Travel-Time Estimation Using Machine Learning ModelsMode-Wise Corridor Level Travel-Time Estimation Using Machine Learning Models
Mode-Wise Corridor Level Travel-Time Estimation Using Machine Learning Models
Journal of Soft Computing in Civil Engineering
 
2.3 Genetically Modified Organisms (1).ppt
2.3 Genetically Modified Organisms (1).ppt2.3 Genetically Modified Organisms (1).ppt
2.3 Genetically Modified Organisms (1).ppt
rakshaiya16
 
hypermedia_system_revisit_roy_fielding .
hypermedia_system_revisit_roy_fielding .hypermedia_system_revisit_roy_fielding .
hypermedia_system_revisit_roy_fielding .
NABLAS株式会社
 
Slide share PPT of NOx control technologies.pptx
Slide share PPT of  NOx control technologies.pptxSlide share PPT of  NOx control technologies.pptx
Slide share PPT of NOx control technologies.pptx
vvsasane
 
Design of Variable Depth Single-Span Post.pdf
Design of Variable Depth Single-Span Post.pdfDesign of Variable Depth Single-Span Post.pdf
Design of Variable Depth Single-Span Post.pdf
Kamel Farid
 
Evonik Overview Visiomer Specialty Methacrylates.pdf
Evonik Overview Visiomer Specialty Methacrylates.pdfEvonik Overview Visiomer Specialty Methacrylates.pdf
Evonik Overview Visiomer Specialty Methacrylates.pdf
szhang13
 
Design Optimization of Reinforced Concrete Waffle Slab Using Genetic Algorithm
Design Optimization of Reinforced Concrete Waffle Slab Using Genetic AlgorithmDesign Optimization of Reinforced Concrete Waffle Slab Using Genetic Algorithm
Design Optimization of Reinforced Concrete Waffle Slab Using Genetic Algorithm
Journal of Soft Computing in Civil Engineering
 
Smart City is the Future EN - 2024 Thailand Modify V1.0.pdf
Smart City is the Future EN - 2024 Thailand Modify V1.0.pdfSmart City is the Future EN - 2024 Thailand Modify V1.0.pdf
Smart City is the Future EN - 2024 Thailand Modify V1.0.pdf
PawachMetharattanara
 
Construction Materials (Paints) in Civil Engineering
Construction Materials (Paints) in Civil EngineeringConstruction Materials (Paints) in Civil Engineering
Construction Materials (Paints) in Civil Engineering
Lavish Kashyap
 
Modelling of Concrete Compressive Strength Admixed with GGBFS Using Gene Expr...
Modelling of Concrete Compressive Strength Admixed with GGBFS Using Gene Expr...Modelling of Concrete Compressive Strength Admixed with GGBFS Using Gene Expr...
Modelling of Concrete Compressive Strength Admixed with GGBFS Using Gene Expr...
Journal of Soft Computing in Civil Engineering
 
Machine foundation notes for civil engineering students
Machine foundation notes for civil engineering studentsMachine foundation notes for civil engineering students
Machine foundation notes for civil engineering students
DYPCET
 
Using the Artificial Neural Network to Predict the Axial Strength and Strain ...
Using the Artificial Neural Network to Predict the Axial Strength and Strain ...Using the Artificial Neural Network to Predict the Axial Strength and Strain ...
Using the Artificial Neural Network to Predict the Axial Strength and Strain ...
Journal of Soft Computing in Civil Engineering
 
ATAL 6 Days Online FDP Scheme Document 2025-26.pdf
ATAL 6 Days Online FDP Scheme Document 2025-26.pdfATAL 6 Days Online FDP Scheme Document 2025-26.pdf
ATAL 6 Days Online FDP Scheme Document 2025-26.pdf
ssuserda39791
 
Autodesk Fusion 2025 Tutorial: User Interface
Autodesk Fusion 2025 Tutorial: User InterfaceAutodesk Fusion 2025 Tutorial: User Interface
Autodesk Fusion 2025 Tutorial: User Interface
Atif Razi
 
David Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry - Specializes In AWS, Microservices And Python.pdfDavid Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry - Specializes In AWS, Microservices And Python.pdf
David Boutry
 
Slide share PPT of SOx control technologies.pptx
Slide share PPT of SOx control technologies.pptxSlide share PPT of SOx control technologies.pptx
Slide share PPT of SOx control technologies.pptx
vvsasane
 
Agents chapter of Artificial intelligence
Agents chapter of Artificial intelligenceAgents chapter of Artificial intelligence
Agents chapter of Artificial intelligence
DebdeepMukherjee9
 
seninarppt.pptx1bhjiikjhggghjykoirgjuyhhhjj
seninarppt.pptx1bhjiikjhggghjykoirgjuyhhhjjseninarppt.pptx1bhjiikjhggghjykoirgjuyhhhjj
seninarppt.pptx1bhjiikjhggghjykoirgjuyhhhjj
AjijahamadKhaji
 
Control Methods of Noise Pollutions.pptx
Control Methods of Noise Pollutions.pptxControl Methods of Noise Pollutions.pptx
Control Methods of Noise Pollutions.pptx
vvsasane
 
Applications of Centroid in Structural Engineering
Applications of Centroid in Structural EngineeringApplications of Centroid in Structural Engineering
Applications of Centroid in Structural Engineering
suvrojyotihalder2006
 
2.3 Genetically Modified Organisms (1).ppt
2.3 Genetically Modified Organisms (1).ppt2.3 Genetically Modified Organisms (1).ppt
2.3 Genetically Modified Organisms (1).ppt
rakshaiya16
 
hypermedia_system_revisit_roy_fielding .
hypermedia_system_revisit_roy_fielding .hypermedia_system_revisit_roy_fielding .
hypermedia_system_revisit_roy_fielding .
NABLAS株式会社
 
Slide share PPT of NOx control technologies.pptx
Slide share PPT of  NOx control technologies.pptxSlide share PPT of  NOx control technologies.pptx
Slide share PPT of NOx control technologies.pptx
vvsasane
 
Design of Variable Depth Single-Span Post.pdf
Design of Variable Depth Single-Span Post.pdfDesign of Variable Depth Single-Span Post.pdf
Design of Variable Depth Single-Span Post.pdf
Kamel Farid
 
Evonik Overview Visiomer Specialty Methacrylates.pdf
Evonik Overview Visiomer Specialty Methacrylates.pdfEvonik Overview Visiomer Specialty Methacrylates.pdf
Evonik Overview Visiomer Specialty Methacrylates.pdf
szhang13
 
Smart City is the Future EN - 2024 Thailand Modify V1.0.pdf
Smart City is the Future EN - 2024 Thailand Modify V1.0.pdfSmart City is the Future EN - 2024 Thailand Modify V1.0.pdf
Smart City is the Future EN - 2024 Thailand Modify V1.0.pdf
PawachMetharattanara
 
Construction Materials (Paints) in Civil Engineering
Construction Materials (Paints) in Civil EngineeringConstruction Materials (Paints) in Civil Engineering
Construction Materials (Paints) in Civil Engineering
Lavish Kashyap
 
Machine foundation notes for civil engineering students
Machine foundation notes for civil engineering studentsMachine foundation notes for civil engineering students
Machine foundation notes for civil engineering students
DYPCET
 
Ad

How We Brought Advanced HTML5 Viewing to ADF

  • 1. How We Brought Advanced HTML5 Viewing To ADF Sean Graham Snowbound Software
  • 2. Learn. Connect. Collaborate. What is Snowbound? • Over 20 years of document and imaging expertise • Two main products: – RasterMaster – Java and .NET document rendering and processing SDK – VirtualViewer – Java and .NET viewer
  • 3. Learn. Connect. Collaborate. What is Snowbound? • Over 20 years of document and imaging expertise • Two main products: – RasterMaster – Java and .NET document rendering and processing SDK – VirtualViewer – Java and .NET viewer
  • 4. Learn. Connect. Collaborate. What is VirtualViewer • VirtualViewer is a pure-browser document and image platform – No plugins required – Scores of formats – Annotation, manipulation, redaction, etc. • VirtualViewer has been integrated with Alfresco for years • What would it take to integrate with ADF and Content App?
  • 5. Learn. Connect. Collaborate. What is VirtualViewer • VirtualViewer is a pure-browser document and image platform – No plugins required – Scores of formats – Annotation, manipulation, redaction, etc. • VirtualViewer has been integrated with Alfresco for years • What would it take to integrate with ADF and Content App? 1
  • 6. Learn. Connect. Collaborate. Goals • Leverage as much existing work as sensible • Ease deployment for ADF users • Learn and embrace new technologies
  • 7. Learn. Connect. Collaborate. Goals • Leverage as much existing work as sensible • Ease deployment for ADF users • Learn and embrace new technologies
  • 8. Learn. Connect. Collaborate. Goals • Leverage as much existing work as sensible • Ease deployment for ADF users • Learn and embrace new technologies
  • 9. Learn. Connect. Collaborate. […] @Component({ selector: 'snbd-virtualviewer-alf', templateUrl: './virtualviewer-alfresco.component.html' }) export class VirtualViewerAlfrescoComponent implements OnInit { @Input() node: MinimalNodeEntryEntity; @Input() nodeId: string; @Input() sharedLinkId: string; documentId:string; clientInstanceId: string; constructor(private authService: AuthenticationService) {} ngOnInit() { if(this.node && this.node.id) { this.documentId = this.node.id; } else { this.documentId = this.sharedLinkId || this.nodeId; } this.clientInstanceId = this.generateClientInstanceId(); } generateClientInstanceId():string { var clientInstanceId = { ticket: this.authService.getTicketEcm(), username: this.authService.getEcmUsername() }; return JSON.stringify(clientInstanceId); } } Create ADF component • Viewer component needs to receive and process a MinimalNodeEntryEntity. From this we extract the node ID for the document to be viewed. • We extract the auth ticket and EcmUserName from the AuthenticationService • This info is then passed to the VV module so that the server can retrieve the document from Alfresco 2
  • 10. Learn. Connect. Collaborate. […] @Component({ selector: 'snbd-virtualviewer-alf', templateUrl: './virtualviewer-alfresco.component.html' }) export class VirtualViewerAlfrescoComponent implements OnInit { @Input() node: MinimalNodeEntryEntity; @Input() nodeId: string; @Input() sharedLinkId: string; documentId:string; clientInstanceId: string; constructor(private authService: AuthenticationService) {} ngOnInit() { if(this.node && this.node.id) { this.documentId = this.node.id; } else { this.documentId = this.sharedLinkId || this.nodeId; } this.clientInstanceId = this.generateClientInstanceId(); } generateClientInstanceId():string { var clientInstanceId = { ticket: this.authService.getTicketEcm(), username: this.authService.getEcmUsername() }; return JSON.stringify(clientInstanceId); } } Create ADF component • Viewer component needs to receive and process a MinimalNodeEntryEntity. From this we extract the node ID for the document to be viewed. • We extract the auth ticket and EcmUserName from the AuthenticationService • This info is then passed to the VV module so that the server can retrieve the document from Alfresco
  • 11. Learn. Connect. Collaborate. […] @Component({ selector: 'snbd-virtualviewer-alf', templateUrl: './virtualviewer-alfresco.component.html' }) export class VirtualViewerAlfrescoComponent implements OnInit { @Input() node: MinimalNodeEntryEntity; @Input() nodeId: string; @Input() sharedLinkId: string; documentId:string; clientInstanceId: string; constructor(private authService: AuthenticationService) {} ngOnInit() { if(this.node && this.node.id) { this.documentId = this.node.id; } else { this.documentId = this.sharedLinkId || this.nodeId; } this.clientInstanceId = this.generateClientInstanceId(); } generateClientInstanceId():string { var clientInstanceId = { ticket: this.authService.getTicketEcm(), username: this.authService.getEcmUsername() }; return JSON.stringify(clientInstanceId); } } Create ADF component • Viewer component needs to receive and process a MinimalNodeEntryEntity. From this we extract the node ID for the document to be viewed. • We extract the auth ticket and EcmUserName from the AuthenticationService • This info is then passed to the VV module so that the server can retrieve the document from Alfresco
  • 12. Learn. Connect. Collaborate. Register with Extension Service • Let the system know there is a new member of the namespace • Set a custom ID for later reference import { ExtensionsModule, ExtensionService } from '@alfresco/adf-extensions'; @NgModule({ imports: [ ExtensionsModule.forChild() ] declarations: [ VirtualViewerAlfrescoComponent, MyLayout ], entryComponents: [ VirtualViewerAlfrescoComponent, MyLayout ] }) export class MyExtensionModule { constructor(extensions: ExtensionService) { extensions.setComponents({ 'snowbound.virtualviewer': VirtualViewerAlfrescoComponent, }); } }
  • 13. Learn. Connect. Collaborate. Register with Extension Service • Let the system know there is a new member of the namespace • Set a custom ID for later reference import { ExtensionsModule, ExtensionService } from '@alfresco/adf-extensions'; @NgModule({ imports: [ ExtensionsModule.forChild() ] declarations: [ VirtualViewerAlfrescoComponent, MyLayout ], entryComponents: [ VirtualViewerAlfrescoComponent, MyLayout ] }) export class MyExtensionModule { constructor(extensions: ExtensionService) { extensions.setComponents({ 'snowbound.virtualviewer': VirtualViewerAlfrescoComponent, }); } } 3
  • 14. Learn. Connect. Collaborate. Viewer Extension Configuration • While you could certainly include your configuration values in the app.extensions.json file, don’t. • Refer to an extension-specific json configuration instead. { "$schema": "../../extension.schema.json", "$id": "app.core", "$name": "app.core", "$version": "1.0.0", "$vendor": "Alfresco Software, Ltd.", "$license": "LGPL-3.0", "$runtime": "1.5.0", "$description": "Core application extensions and features", "$references": ["virtualviewer.json"],
  • 15. Learn. Connect. Collaborate. Viewer Extension Configuration (Continued) • You’ll need to associate at least one filetype with your component. • To the right, we associate PDF files with VV, but our actual virtualviewer.json includes scores of formats. { "$schema": "../extension.schema.json", "$version": "0.1.0", "$name": "virtualviewer", "$description": "plugin for VirtualViewer in the content app", "features": { "viewer": { "content": [ { "id": "snowbound", "fileExtension": "pdf", "component": "snowbound.virtualviewer" } ] } } }
  • 16. Learn. Connect. Collaborate. Viewer Extension Configuration (Continued) • You’ll need to associate at least one filetype with your component. • To the right, we associate PDF files with VV, but our actual virtualviewer.json includes scores of formats. { "$schema": "../extension.schema.json", "$version": "0.1.0", "$name": "virtualviewer", "$description": "plugin for VirtualViewer in the content app", "features": { "viewer": { "content": [ { "id": "snowbound", "fileExtension": "pdf", "component": "snowbound.virtualviewer" } ] } } }
  • 17. Learn. Connect. Collaborate. The Whitespace Problem • There seems to be a bug in the current version of Content App • A <span> is created for every format you’ve registered support for • Those <span> are not zero- height 4
  • 18. Learn. Connect. Collaborate. The Whitespace Problem • There seems to be a bug in the current version of Content App • A <span> is created for every format you’ve registered support for • Those <span> are not zero- height
  • 19. Learn. Connect. Collaborate. The Whitespace Problem • There seems to be a bug in the current version of Content App • A <span> is created for every format you’ve registered support for • Those <span> are not zero- height
  • 20. Learn. Connect. Collaborate. Questions • Nathan and I will be at the Snowbound table during the 10:45a block on Thursday • Alternatively, visit the table and coordinate a different time with JB
  • 21. Learn. Connect. Collaborate. Questions • Nathan and I will be at the Snowbound table during the 10:45a block on Thursday • Alternatively, visit the table and coordinate a different time with JB
  • 22. How We Brought Advanced HTML5 Viewing To ADF Sean Graham Snowbound Software
  翻译: