CA2419056C - Syndication methodology to dynamically place digital assets on non-related web sites - Google Patents

Syndication methodology to dynamically place digital assets on non-related web sites Download PDF

Info

Publication number
CA2419056C
CA2419056C CA2419056A CA2419056A CA2419056C CA 2419056 C CA2419056 C CA 2419056C CA 2419056 A CA2419056 A CA 2419056A CA 2419056 A CA2419056 A CA 2419056A CA 2419056 C CA2419056 C CA 2419056C
Authority
CA
Canada
Prior art keywords
content
web page
script
string
blurb
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
CA2419056A
Other languages
French (fr)
Other versions
CA2419056A1 (en
Inventor
Richard D. Martin
John E. Wetzel
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Active Data Exchange Inc
Original Assignee
Active Data Exchange Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Active Data Exchange Inc filed Critical Active Data Exchange Inc
Publication of CA2419056A1 publication Critical patent/CA2419056A1/en
Application granted granted Critical
Publication of CA2419056C publication Critical patent/CA2419056C/en
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/958Organisation or management of web site content, e.g. publishing, maintaining pages or automatic linking
    • G06F16/972Access to data in other repository systems, e.g. legacy data or dynamic Web page generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/12Use of codes for handling textual entities
    • G06F40/14Tree-structured documents
    • G06F40/143Markup, e.g. Standard Generalized Markup Language [SGML] or Document Type Definition [DTD]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06QINFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
    • G06Q10/00Administration; Management
    • G06Q10/02Reservations, e.g. for tickets, services or events
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06QINFORMATION AND COMMUNICATION TECHNOLOGY [ICT] SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES; SYSTEMS OR METHODS SPECIALLY ADAPTED FOR ADMINISTRATIVE, COMMERCIAL, FINANCIAL, MANAGERIAL OR SUPERVISORY PURPOSES, NOT OTHERWISE PROVIDED FOR
    • G06Q30/00Commerce
    • G06Q30/06Buying, selling or leasing transactions
    • G06Q30/0601Electronic shopping [e-shopping]
    • G06Q30/0633Lists, e.g. purchase orders, compilation or processing

Abstract

Digital assets are syndicated by constructing a web page and inserting into the web page JavaScript associated with a digital asset that is desired to be part of a fully rendered web page. The content of the digital asset is not initially part of the web page. The script, when executed by a browser, requests the content of the digital asset from a remote site (1). The request includes a uniform resource identifier (URI) of the web page and a unique identifier of the selected content. The remote site receives the request and authenticates whether the URI is authorized to receive the selected content (3). If so, the remote site locates the selected content and sends the selected content to the web browser (3). The web browser assembles the initially requested web page using the selected content obtained from the remote site (2).

Description

TITLE OF THE INVENTION

SYNDICATION METHODOLOGY TO DYNAMICALLY PLACE
DIGITAL ASSETS ON NON-RELATED WEB SITES

COPYRIGHT NOTICE AND AUTHORIZATION
Portions of the documentation in this patent document contain material that is subject to copyright protection. The copyright owner has no objection to the facsimile reproduction by anyone of the patent document or the patent disclosure as it appears in the Patent and Trademark Office file or records, but otherwise reserves all copyright rights whatsoever.

BACKGROUND OF THE INVENTION
The presentinvention is directed to the process of Active Data Syndication and its use in web development and content management. More specifically, the present invention establishes the mechanism, the framework, the interfaces and the ancillary methodology to allow multiple content creators to offer for targeted syndication or network distribution and retrieval of digital assets across the web and to have those assets present within the constrains of the receiving web site, and to automate that process, where warranted.

Conventional web sites consist of a wide variety of articles and information compiled and entered independently by a webmaster. 'Tools abound to facilitate the production of such web sites, from textual HTML editors to visual page designers like Adobe*GoLive.
Programs like LiinkBOT exist to validate links among pages. However, the conventionality of this form of web site generation becomes merely a shell for the advent of the more advanced, dynamic and interactive web site.

* Trade-mark Site management tools allow for the collaborative efforts of site creation, but are significantly limited in their ability to share information and digital assets across the boundaries of web sites.

Syndication or distribution of digital assets across the web heretofore involved the direct replication of those assets to a database server under the control of the receiving web site manager, and away from the control of the supplier of the digital asset.
Examples of implementations where content replication is the primary form of asset syndication include * * * * *
those from Vignette, Kinecta, Interwoven, ICE, and ArcadiaOne.

Accordingly, there is a need for a system which (1) unifies the way digital assets, in any form, are shared from one site to another, (2) unifies the distribution of those digital assets across multiple platforms, (3) allows the owners of digital asset a management tool for tracking the business relationships surrounding the use of the digital assets, (4) establishes mechanisms, interfaces and methodology for the secure flow of information through information distribution networks, (5) facilitates the webmaster to have updated digital content present on the web site, and (6) automates the update of web content. The present invention fulfills these needs.

Prior to the present invention, it was not possible for web sites governed by any number of normal content management tools to proactively share information with independent and unrelated web sites. The lightweight and transportable tool of the present invention allows for a web site to be programmed to receive digital asset information in a multiplicity of formats, and to display those assets within the style and constraints of the receiving web site. The web sites need not be collocated, nor do they need to be created using the same tools. They simply need to render HTML in any web browser, capable of interpreting Java and JavaScript. The power of this tool is such that it can enhance, if not revolutionize, the bi-directional communications infrastructure using the web. These managed information distribution networks do for the Internet what faxes and overnight mail did for corporate correspondence two decades ago.

* Trade-mark SUMMARY OF THE INVENTION
The present invention provides a scheme of obtaining selected content for a web page, wherein the selected content itself is not initially part of the web page. The web page includes script, such as JavaScript, associated with the selected content. The scheme operates as follows:
1. A web browser requests a web page that includes script associated with the selected content. The selected content may be only a portion of the web page. The selected content may be a digital asset or an executable file. In the preferred embodiment, the web page is constructed using HTML, and the script is embedded therein.
2. The web browser interprets the script and formats a request to obtain the selected content from a remote site. The request includes a uniform resource identifier (URI) of the web page and a unique identifier of the selected content. The URI may be a URL.
3. A remote site, such as a web server, receives the request and authenticates whether the URI is authorized to receive the selected content. If so, then the remote site locates the selected content and sends the selected content to the web browser. The selected content may be stored in a content repository connected to the web server. If the URI is not authorized to receive the selected content, then the remote site sends a signal to the web browser that the selected content is not available, and the web browser assembles the web page without the selected content.
4. The web browser assembles the initially requested web page using the selected content obtained from the remote site.

The assembled web page may include one or more content sets from the syndicator, each having its own script for implementing the steps above.

In one preferred embodiment, the script includes a subscriber identifier and a content identifier which are both used to create the unique identifier of the selected content.
The present invention also provides a scheme for syndicating digital assets. A
web page is constructed, and script, such as JavaScript, associated with at least one digital asset that is desired to be part of the fully rendered web page is inserted into the web page. The script, when executed by a browser, performs modest authentication regarding the URI
and requests the content of the digital asset from content repository. The request includes a uniform resource identifier (URI) of the web page and a unique identifier of the selected content. In one preferred embodiment, the script includes a subscriber identifier and a content identifier, which.
together, create the unique identifier of the selected content. The selected content may be an executable file.

BRIEF DESCRIPTION OF THE DRAWINGS
The following detailed description of preferred embodiments of the present invention would be better understood when read in conjunction with the appended drawings.
For the purpose of illustrating the present invention, the drawings show embodiments of the present invention which are presently preferred. However, the present invention is not limited to the precise arrangements and instrumentalities shown. In the drawings:
Fig. 1 is a schematic block diagram that provides an overview of one preferred embodiment of the asset syndication scheme of the present invention;
Fig. 2 is a database schema for one preferred embodiment of the present invention;
Fig. 3 is an authentication schema for one preferred embodiment of the present invention;
Figs. 4-13B are user interface displays (administrative screen shots) for one preferred embodiment of the present invention;
Fig. 14 is a database schema for the second preferred embodiment of the present invention;
Figs. 15A and 15B, taken together, are overall, schemas for the second preferred embodiment of the present invention;
Fig. 16 is a schematic block diagram of the second preferred embodiment of the present invention;
Figs. 17-19 are JavaScript source code snippets for implementing a web application embodiment of the present invention; and Fig. 20 is a database schema for the web application embodiment of the present invention.

DETAILED DESCRIPTION OF THE INVENTION

Certain terminology is used herein for convenience only and is not to be taken as a limitation on the present invention. In the drawings, the same reference letters are employed for designating the same elements throughout the several figures.

5 1. DEFINITIONS
Content: Any textual, visual, and audio materials or the combination thereof, including animated images, video clips, executable files, or digital assets targeted for presentation.
Content Repository: a database of file structure which contains the syndicatable asset.
Syndicated Asset: Any content which is available to an authenticated receiver.

Authenticated Receiver: A receiver of content that is authorized to retrieve and present that content.

Subscriber: Synonym to Authenticated Receiver.

Domain: The name which appears in the URL between the "www" and the end of the three letter extension (e.g., com, net, .org). Example: www.regiononline.com, the domain is regiononline.com.

II. OVERVIEW OF PRESENT INVENTION
Referring to Fig. 1, the following steps are performed:
1. A request is made from a web appliance to a URL, which contains a web page that has embedded the syndication code.
2. The web page, while rendering other data present on the page, such as navigation, headers and footers, and other assets not related to the syndicated content, returns JavaScript which tests the appliance for the site URL requested. The JavaScript effectively functions as a dynamic content retrieval agent.
3. This information is then used to authenticate the content presence on the site as valid, and then to retrieve from the syndication database those assets for display, and render those syndicated assets through the appliance.
The present invention introduces the notion of web real estate and the apportionment of content sections to a particular web page. A visually unified site is substantially divided into sub-sites, or content sections, that are independently maintained by section managers or through syndicated content offerings. As a direct and targeted information management delivery tool, the present invention is useful to the large corporation, a community site, or any site which enables the sharing of targeted information. Any content or information rich, site will find this present invention very helpful.

The present invention may be used to complement web pages created in MS
Frontpage, or any number of content management tools. The present invention does not perform visual layout, and may be considered a post-design tool.

The present invention may be used with any number of programming languages such as Cold Fusion, ASP, C++, Java, Visual Basic or Perl. The present invention may serve as an extension to the web page, or an add-on component to any number of content management tools.

The present invention may be used on any site that renders HTML, and is intended to be programming language neutral, through the use of JavaScript, servlets, and Java features.
III. DETAILED DESCRIPTION OF ONE PREFERRED EMBODIMENT
In one preferred embodiment of the present invention as described herein, the user communicates through a browser with the necessary web site via an electronic network, such as the Internet. However, the scope of the invention includes other types of user interfaces and electronic networks that are capable of performing the desired fimctions.
The present invention is described in the context of a commercially available software product called Active Data Syndicator"M, available from Active Data Exchange, Inc., Bethlehem, Pennsylvania.

A. DETAILED EXPLANATION OF FIGURES AND APPENDICES
Fig. 2 is a self-explanatory database schema for one preferred embodiment of the present invention, and Fig. 3 is a self-explanatory authentication schema for one preferred embodiment of the present invention.
Fig. 4 is an administrative entry screen for beginning the process.
* Trade-mark Fig. 5 is a user interface display that allows for the selection from an existing syndication or the creation of a new syndication.
Referring to Fig. 6, if the administrator chooses the "go get it" button from the Fig. 5 display, then a listing of the syndication offers are presented. The "clickable" first field allows for the modification of that offering.
Figs. 7 and 8 are user interface displays a for a "New Setup." The administrator completes the fields shown in these displays.
Fig. 9 is a user interface display that allows for the viewing of the necessary syndication code for placement into the HTML of the subscriber/receiver web site.
Fig. 1 OA shows the actual code for placement on the subscriber/receiver HTML
page for the fictitious client Attorney at Law. This code allows for the one time insertion of the code, for presentation of information, news, events, or other digital assets on an ongoing basis.
Fig. I OB shows the same code, modified to present the latest asset, as well as the creation of several hypertext links for viewable archives of older digital assets. In this case, there is the ability to present for viewing up to 10 viewable archives from the database.
Figs. 11 and 12 show additional administrative functions for the deletion of a subscriber.
Figs. 13A and 13B show the list of subscribers/receivers for overall administrative purposes.
Appendix A is the syndication source code for the embodiment of the present invention shown in Figs. 2-13B.
Appendix B is the servlet package source code for the embodiment of the present invention shown in Figs. 2-13B.

B. INHERENT SECURITY
All web sites do not use the same syndication code. Subtle differences in the code are "keyed" to the receiving domain. It is through this "key" that the integrity of the business relationship and the placement of the digital asset are preserved. The process includes a security module that looks at the browser URL of the appliance to determine which URL
(domain) it is calling. If the domain does not match an existing client URL
(coupled with the content authorized for use), a message is returned to the appliance, which states that the content is unavailable.
C. WEB SITE SETUP FOR RECEIVING SYNDICATION OFFERINGS
To set up a web site page for syndication, a few parameters must be understood and defined:
1. The receiving URL, as authentication or validation of the receiver/subscriber is performed to the domain level.
2. The asset section to be syndicated. This refers to a content section in a content management system. One instant example would be to syndicate "What's News" from a company or organization. This section of the site is a hypothetical region where all information regarding press releases and latest organizational information is to be found. In this installation, the site only needs to be set up with the HTML snippet one time. Content changes occur dynamically.
3. The number of displayed archives the receiver would like to be able to view. This is a title listing of previously syndicated content for this section.
4. The database location of the digital asset.
5. The organizational name (for administrative purposes).
6. The start and end time for the syndication. This is important if the syndicated asset is time dependant or whether or not the subscription to the syndicated digital asset is on a monthly or other time dependent basis.
Through these parameters, metrics can be derived which display, from the syndication-offered standpoint, several management reports useful in understanding the offerings and their use. Metrics include:
1. Number of times a digital asset is accessed by a subscriber (useful in fee per use models as well as for tracking relative worth of the asset).
2. Places where the digital asset can be viewed/authorized domains.
3. Listing of the offerings available for release through the syndication model.
4. Through an oblique methodology, a measure of the physical overhead of the device housing that content.

D. DATABASE INTERRELATIONSHIPS
As discussed above, the present invention is platform independent and program neutral. It functions equally as well on operating systems written in Microsoft, as it does from that of Red Hat Linux* Furthermore, the database from which it pulls its content may either be MS SQL, Informix, Sybase or Oracle, as it uses command phrases which are non-vendor specific (ANSI SQL). The hardware, however, must be of sufficient strength to power databases that conceivably will receive hundreds of thousands of requests per second. Fig. 2, described above, illustrates one preferred database schema for the present invention.
E. ARCHITECTUAL OVERVIEW
The implementation of this business process and its underlying software is hardware independent, providing that the following applications/services are available:
An application server running a servlet engine such as Allaire's JRUN or TomCat, and a web server such as Internet Information Server (IIS) from Microsoft or an Apache web server should the operating system of the server be RedHat Linux or Unix. The database server should have a strong relational database such as MS SQL, Oracle, or Sybase, overtop of the appropriate operating system.

The location of the servers used in the present invention can be anywhere within the infrastructure of the existing client network. One suitable scheme is to locate the servers behind a redundant firewall.

The invention environment provides for all system hardware requisite to the invention work. It includes an application/web server that controls the look of web pages, serves content for the web pages, and provides the environment for the administration of those tasks. The standard operating system for this invention is Linux. However, a client may choose Windows NT or UNIX as an alternate operating system (OS). Coupled with the OS, a web server needs to be chosen. In the example of Red Hat Linux, one suitable choice would be Apache. However, a Windows NT environment would most likely use US. Since the present invention is a Java-based application, a servlet engine needs to be incorporated into the server operation. One suitable configuration to support the invention includes the following elements:
Operating System (Application Server) Windows NT 4.0 with Service Pack 6A
Red Hat Linux 6.2 Databases (Database Server) Sybase 11.02 [Windows NT, Linux]

Oracle 8i Server 8.1.5 [Windows NT, Solaris, Linux]
Microsoft SQL Server 6.5 with Service Pack 6A [Windows NT Only]
Microsoft SQL Server 7.0 [Windows NT Only]
JDBC Drivers 5 Microsoft SQL Server 6.5, 7.0: SPRINTA JDBC 2.0 Driver version 2000 [Type 4]
Oracle 8Ø5Ø Production release JDBC [Windows NT, Solaris, Linux]
HTTP Servers (Web Server Types) Operating JRUN 2.3.3 or greater Netscape Enterprise Server 3.0, 3.6 [Windows NT, Solaris, Linux, AIX]
Microsoft Internet Information Server Version 4.0 [Windows NT Only]
10 Apache and Stronghold Web Server 2.4.2 [NT, AIX, Solaris, Linux]
Java Development Kit (JDK) Recommendation: Sun Compliant JDK minimum version 1.2.2 Example Configurations:
1. Linux Application Server with NT OS running the Database server Application/Web Server: Red Hat Linux version 6.2 with an Apache web server.
Database Server: Microsoft NT 4.0 with Service Package 6A and MS SQL version 7 as the database.
2. Linux Application Server with Linux OS running the Database server Application/Web Server: Red Hat Linux version 6.2 with an Apache web server.
Database Server: Red Hat Linux version 6.2 with Oracle 8i as the database.
3. NT Application Server with NT OS running the Database server Application/Web Server: Microsoft NT 4.0 with Service Package 6A and IIS
version 4 with full options as the Web Server.
Database Server: Microsoft NT 4.0 with Service Package 6A and MS SQL version 7 as the database.

The Database Server becomes more critical as database size increases over time. It is feasible for an installation to use a different OS for the application server than that of the database server. Different database engines serve data at different rates (some faster than others) and some networks operate with corporate standards which mandate the use of certain configurations, to standardize application environments for ease of maintenance. For those reasons, the publishing database was developed platform independent. It is functionally transparent whether or not it is installed over Oracle, Sybase, MS SQL or Informix.

The present invention may be installed as part of a related product from Active Data Exchange, Inc., called Active Data PublisherTM/Web Server, or it may be a functionally independent device. The setup of the environment of the present invention is the same as the Application/Web server environment.

F. EXAMPLES OF SYNDICATION USE AND APPLICATION
Case One: Large organization with multiple web sites (Public and Private) A large organization has multiple web sites to manage, both public (visible to all) and private (internal and departmental in nature). The sites are repositories for a wide variety of information specific to their department of corporate division. There are, however, many assets which are frequently reproduced and shared among those sites. If a directive from Senior Management needs to be presented on each of the sites, conventional content management tools would require the HTML editors to re-post the directive on each and every site. This repetitive process creates organizational inefficiencies.

Using the present invention, an HTML snippet is placed on the page in the place where information bulletins will be seen. (See Figs. I OA and I OB which illustrate an HTML
snippet.) Every time a new information bulletin is released, the web page is automatically updated, without technology intervention. Furthermore, the bulletin is created in the native environment frequently used by the author or their assistant, and posted once through an intuitive, easy to use interface module which converts the document to HTML, enters the data into the syndication database, and prepares it for view on the site.

Case Two: Supply Chain Information Management A manufacturer manages information streams from raw materials suppliers (upstream providers) to distributors (end users). The management objective is to assure that the end user receives the completed goods at a fair price in a timely manner, and that the raw materials suppliers notify the manufacturer of delays in shipments, which, in turn, affect product availability. If one believes that the main differentiation between suppliers of similar materials is their ability to enhance communications with clients and vendors, and that issue singularly is what is going to set apart one from another, then the implementation of the tools provided by the present invention is the linchpin in corporate success. In this example, it is helpful from a supply management role to understand the needs of the client and the ability for the vendor to supply product to create the materials for the client.
Subscribing to the notion of apportioned web real estate, and having particular areas designated for information relevant to those in the supply chain, a new communications modality is created called a Digital Information Network that is linking the supplier and the end user in such a fashion as to be able to enhance the decision process, increase productivity, and enhance the digital economy.

IV. DETAILED DESCRIPTION OF A SECOND PREFERRED EMBODIMENT
The second preferred embodiment may be used with Active Data Syndicator v.3.
A. DETAILED EXPLANATION OF FIGURES AND APPENDIX
Fig. 14 is a self-explanatory database schema for the second preferred embodiment.
Fig. 14 shows only the portion of the database schema that relates to the present invention.
Figs. 15A and 15B, taken together, are self-explanatory overall schema for the second preferred embodiment.
Fig. 16 is a schematic block diagram of the second preferred embodiment.
Appendix C is the combined syndication and servlet package source code for the embodiment of the present invention shown in Figs. 14-16.

B. IMPLEMENTATION OF SECOND EMBODIMENT
Fig. 16 shows an overview of the second preferred embodiment. The basic elements include web pages located at a plurality of different URLs, a viewing browser, an application web server that hosts the syndication product, and a content repository. Each of these elements may be interconnected by any suitable communication medium, such as the Internet. The process operates as follows:
1. A user at the viewing browser requests a web page from a particular web site. The requested. web page contains HTML elements, as well as at least one snippet of JavaScript associated with the syndicated digital asset.
Alternatively, the requested web page does not have to reside on a web site. The requested web page may also be a simple HTML file stored on the hard drive of a user's local computer in cases where an authenticating URL is not required.
2. The snippet of JavaScript is received by the browser.
3. When the JavaScript is received, it is not immediately used by the browser on the part of the web page on which it resides. Instead, the "src" attribute of the JavaScript tag is used to make a call to a Java servlet. More specifically, the JavaScript forms an HTTP (or HTTPS) request that includes a URI (e.g., a URL) of the requested web page as obtained from the browser, and a unique identifier contained within the JavaScript. In one preferred embodiment, the unique identifier is a combination of a subscriber identifier (sub ID) and a content identifier (content ID). In effect, the HTTP request is saying that URI [xyz] is requesting content [123], and is asking if it is okay to deliver it. The HTTP request is sent to an application web server that is designated by an address located within the JavaScript.
4. At the application web server, the syndication product receives the URI
and the unique identifier, 5. The syndication product then looks in an authentication table to determine if there is a matching URI and unique identifier. If so, then the unique identifier is parsed to obtain the sub ID and content ID. The sub ID is used to check the current account status of the subscriber, and the content ID is used to locate the content in the content repository.
6. Assuming that a match is found in the authentication table, the subscriber ID is properly authorized, and the content is located in the content repository, -then the content is retrieved from the content repository and sent by the syndication product to the browser for insertion at the appropriate location during the rendering of the web page. To facilitate this process, the syndication product contains content filtering and parsing methods (called "parseContent" and "swapStrings" in the example source code) which are used to prepare the content so that it can be rendered appropriately in the web page via a JavaScript "document.write"
statement. If no match is found in the authentication table, and/or if the subscriber ID is not properly authorized, then a message is returned indicating that requested content cannot be received. Alternatively, no message is returned and the user merely does not receive the requested content. If the content is a text article, the web page may have a blank portion where the requested content would have appeared. If the content is multimedia-oriented, such as an audio file, then such content is not experienced.
7. The syndication content manager updates its records to reflect the activity.
The manager may track content retrievals and charge subscriber accounts (if any exist) for such content retrievals. The content manager may remove an entry from the authentication table based upon expiration dates, number of retrievals, or any other suitable factor.
The process described above preferably occurs seamlessly in near real-time.
Thus, the user is not aware that content (which is typically only a portion of the web page, but could be the entire content of the web page) is being requested and delivered from a remote content repository during the rendering of the web page.

The term "web application" as used herein refers to dynamic HTML web site content which varies depending upon user input, includes one or more interactive forms, involves the use of a web server programming/scripting language (e.g., Java, Perl, Cold Fusion, Active Server Pages, etc.), and may also make use of a backend database server for data storage. Some common examples of web applications include guestbooks, forums and shopping carts. Web applications typically execute on the same server as the hosting web server. This arrangement can place significant strain on the web server, especially when a large number of users are simultaneously requesting service and/or many web sites and applications are running concurrently on the same server. (This situation often occurs with ISP's.) The present invention leverages the JavaScript capabilities of the user's browser to execute the web application at a remote server independent of the subscriber's hosting web server, thereby reducing the potential load on the subscriber's web server and greatly simplifying the process by which a web application can be incorporated into a subscribing web site.
That is, simply include the JavaScript snippet of the application using the present invention's syndication methodology in the HTML on the subscriber's web site. No further programming is then needed on the subscriber's web server. The user's browser effectively invokes the remote web application that runs and makes the subscriber's web page dynamic.

The present invention may be used for flat (static) sites and flat sites having one or more dynamic sections, as well as for fully dynamic sites.

The present invention is further advantageous because the traffic for creating the web pages uses port 80 (for http traffic) and port 443 (for https traffic), and thereby can pass 5 through most server firewalls.

C. WEB APPLICATION EXAMPLE
*
Active Data Randomizer, available from Active Data Exchange, Inc., Bethlehem, Pennsylvania, is an example of a simple web application which incorporates the syndication methodology of the present invention. Randomizer produces two syndicated assets from two 10 different JavaScript snippets.

Fig. 17 shows the first JavaScript snippet which renders in the browser as an administrator area (see Fig. 18) for the subscribing web site administrator to use in the configuration and entry of groups of HTML blurbs.

Fig. 19 shows the second JavaScript snippet which is generated from the 15 administrative area and renders in the browser as a randomly selected HTML
blurb from a group of HTML blurbs specified during the generation of the snippet.

Appendix D is a User Guide for this embodiment, and Appendix E shows sample source code for this embodiment.
The present invention may be implemented with any combination of hardware and software. If implemented as a computer-implemented apparatus, the present invention is implemented using means for performing all of the steps and functions described above.

The present invention can be included in an article of manufacture (e.g., one or more computer program products) having, for instance, computer useable media. The media has embodied therein, for instance, computer readable program code means for providing and facilitating the mechanisms of the present invention. The article of manufacture can be included as part of a computer system or sold separately.

It will be appreciated by those skilled in the art that changes could be made to the embodiments described above without departing from the broad inventive concept thereof. It is understood, therefore, that this invention is not limited to the particular embodiments disclosed, * Trade-mark but it is intended to cover modifications within the spirit and scope of the present invention as defined by the appended claims.

What is claimed is:
Appendix A
Syndication Source Code import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*; _ import java. util. Vector; i/most methods of Vector are synchronized import java.net.*;
/**
* Servlet to retrieve content from Publisher server * Takes 7-9 parameters:
*
* db, cantentServer, linkBase; SectionlD, ArticlelD, PartID, mode, unit, number *
* @author Technology * @author ActivedataX.com, * Last changed 11/9/99 public class ContentNOWjs extends HttpServlet implements Constants private static int itemsToKeep = 100, minutesToLive.= 10; // ini ti may set the values later private static long lastModified;
private static Vector contents = hew Vector();
private Sentinel sentinel = new Sentinel(itemsToKeep, minutesToLive);
private static final ReadURL serverURL = new ReadURL();

-public void doGet(HttpServletRequest req, HttpServletResponse.resp) throws ServletException, IOException {
String contentlD, detail;
boolean newContent = false;
Content corit; //needed for lookup Params params = new Params(req); //decipher the request String ContentlD = params.contentServer //req.getParameter("Server") + "?db=" + params.db + "&SectionlD=" + params.SectionID
+ "&ArticlelD=" + params.ArticleID
+ "&PartID=" + params.PartID
+ "&ln=" + params.linkBase + "&mode=" + params.mode;
if= (params.unit != null) {ContentlD = ContentlD + "&unit=" + params.unit + "&number="=+ params.number;

if (params.templateuRL == null)( params.templateURL =
"http://www.lehighvalleynow.com/rol/template4.asp";
}

A-i ContentlD = ContentlD + "&tpl=" + params.templateURL;
II parameter tpl will be ignored by serverURL.getCoritent, used for internal ID only cont = lookup(ContentlD);
if (cont != null) detail = cont.detail;
else {
try { System. out.println(ContentlD);
detail = serverURL.getContent(ContentlD);
detail = convertTojs(detail, params);
newContent = true;
} catch (Exception ex) (detail = ex.tostring();) }

//PrintWriter out = resp.getWriter(); ServletOutputStream bombs with \u0018: CharConversionException //out.print(detail);
//System.out.println(detail);
OutputStream out == resp.getOutputStream();
out.write(detail.getBytes());
System. out.println(detail);
out.flush();
out.close();
if (newContent) {
lastModified = System.currentTimeMillis();
cont = new Content(ContentlD, detail, lastModified);
contents. addElement(cont);
}
}

public long getLastModified(HttpServletRequest req) {
return lastModified/1000*1000;
}

private String convertTojs(String htmlText, Params params){
htmlText = htmlText.replace('\r', htmlText = htmlText.replace('\n', htmlText = swapStrings(htmlText, backSlash);
htmlText = swapStrings(htmlText, apostrophe);
htmlText =. swapStrings(htmlText, "\"", doubleQuote);
if (params.ArticlelD.equals("0")){
htmlText = JavaScript.openArticle() + makeJavascriptHrefs(htmlText, params);
}
return "document.write (\"" + htmlText + "\"); 11 }
pre-pend JavaScript.expandHeader() here for use by all header items.//

the above line is skipped mysteriously II specific full article, just print parse out href=, get ArticlelD, replace with javascript: expandHeader(ArticlelD) private String makeJavascriptHrefs(String htmlText, Params params){
//find "<a", find "href=", find "Article==" find '>' //replace href= with javascript: expandHeader(ArticlelD) int indexBeginA, indexHref, indexArticlelD, ArticlelDEndsAt, indexEndA, indexClosingA;
String ArticlelD = null;
String htmlTextLowercase = htmlText.toLowerCase();
StringBuffer newHtml = new StringBuffer();
int indexStart = 0;
indexBeginA = htmlTextLowercase.indexOf("<a ", indexStart);
indexHref = htmlTextLowercase.indexOf("href=", indexBeginA + 2);
indexArticlelD = htmlTextLowercase.indexOf("articleid=", indexHref +
5) + 10;
indexEndA = htmlTextLowercase.indexOf(">", indexArticlelD);
indexClosingA = htmlTextLowercase.indexOf("</a>", indexEndA) + 4;
while (indexBeginA >= 0 && indexBeginA < indexHref && indexHref < indexArticlelD
&& indexArticleID < indexEndA
&& indexEndA < indexClosingA){
ArticlelDEndsAt = htmlTextLowercase.indexOf("&", indexArticlelD);
//ArticleID = 'a' + htmlTextLowercase.substring(indexArticleID, ArticlelDEndsAt);
ArticlelD = htmlTextLowercase.substring(indexArticlelD, ArticlelDEndsAt);
newHtml.append(htmlText.substring(indexStart, indexHref)).append("href=");

newHtml.append("\\\"javascript:openArticle(\\\'" +
params.templateURL + "?SectionlD="
+ params.SectionlD + "&ArticleID=" + ArticlelD +
"&PartID=2&db=" + params.db + "\\\');\\\"");
//newHtml.append("\\\"javascript:expandHeader(U + ArticlelD +
");M"");
newHtml.append(htmlText.substring(indexEndA, indexClosingA));
done with one anchor.

//newHtml.append(JavaScript.appendArticleMain(params.requestURL, params.db, params.SectionID, ArticlelD) );
//new loop starts over indexStart = indexClosingA;
indexBeginA = htmlTextLowercase.indexOf("<a ", indexStart);
indexHref = htmlTextLowercase.indexOf("href=", indexBeginA);
indexArticlelD = htmlTextLowercase.index0f("articleid=", indexHref + 5) + 10;
indexEndA = htmlTextLowercase.indexOf(">", indexArticlelD);
indexClosingA = htmlTextLowercase.indexOf("<la>", indexEndA)=+

4;
//else use old value to get. the tail.
//newHtml.append(htmlText.substring(indexClosingA));
return newHtml.toString();

}
Content lookup(String contentlD) { Content cont;
int index = -1;
for (int i=0; i<contents.size(); ++i) {
cont = (Content)contents.elementAt(i);
if (contentlD.equals(cont.contentlD)) {
return (Content)contents.elementAt(i);
}
}
return null;
}

public void destroy() {
sentinel.quit = true;
contents = null;
}
class Content {
String contentlD, detail;
long timestamp;
Content(String contentlD, String detail, long timestamp) {
this.contentlD = contentlD;
this.detail = detail;
this.timestamp = timestamp/60000; //converts millis to min }

/**
* Monitors the content collection, trims and freshes.
private class Sentinel extends Thread int itemsToKeep;
int minutesToLive;
boolean quit = false;

Sentinel(int itemsToKeep, int minutesToLive) {
this.itemsToKeep = itemsToKeep;
this.minutesToLive = minutesToLive;

setPriority(Thread.MIN PRIORITY);
start O ;
}

/**
* The only and single thread public void run() {
int itemsToRemove;
while( !quit this keeps cleanup alive until servlet is destroyed.
{
freshen(;
if (contents.size() > itemsToKeep) trim();
//System.gc();
try[
Thread.sleep(5000);
}catch (InterruptedException ex) {}
}
}
private void trim() {
int itemsToRemove = contents.size() - itemsToKeep;
int trimmed = 0;
for lint i=0; i<itemsToRemove; ++i) {
contents.removeElementAt(i);
Thread.yield();
trimmed++;
}
if (trimmed > 10) contents.trimToSize();
}

private void freshen() {
long currentTime = System.currentTimeMillis(}/60000;
Content cont;
for (int i=0; i<contents.size(}; ++i) {
cont = (Content) contents.elementAt(i);
if (cont.timestamp + minutesToLive < currentTime) contents.removeElementAt(i);
Thread.yield();
}
}

public String getServletInfo () {
return "Retrieves content from PublishNOW server";

public void init(ServletConfig config) throws ServietException {
super.init (config);
if ( getlnitParameter("itemsToKeep") != null {
try{
this.itemsToKeep- _ Integer.parselnt(getInitParameter("itemsToKeep"));
}
catch (NumberFormatException e){
this.itemsToKeep = 100;
}
}
else this.itemsToKeep = 100;

if ( getInitParameter("minutesToLive") null {
try{
this.minutesToLive =
Integer.parseInt(getInitParameter("minutesToLive"));
}
catch (NumberFormatException e){
this.minutesToLive = 15;
}
}
else this.minutesToLive = 15;
}

String swapStrings(String Textln, String OldString, String NewString) int OldStringStartAt;
int OldStringLength = OldString.length(};
int NewStringLength = NewString.length();
String TempText = Textln;
OldStringStartAt = indexOflgnoreCase(TempText, OldString, 0);
while (OldStringStartAt != -1) {
TempText = TempText.substring( 0, OldStringStartAt) +
NewString + TempText.substring(OldStringStartAt +
OldStringLength);
OldStringStartAt = indexOflgnoreCase(TempText, OldString, OldStringStartAt + NewStringLength);
}
return TempText;
}

int indexOfIgnoreCase(String TempText, String subString, int StartAt) {
return TempText.toLowerCase().index0f( subString.toLowerCase(, StartAt);
}
}

class ReadURL
{
public String getContent(String SourceURL) throws Exception {
URL page;
BufferedReader in;
int len;

page = new URL(SourceURL);
in = new BufferedReader(new InputStreamReader(page.openStream()));
long time = System.currentTimeMillis();
CharArrayWriter chbuffer= new CharArrayWriter();
char[] cbuf = new char[1024];
while ((len in.read(cbuf, 0, 1024)) != -1) {
chbuffer.write(cbuf, 0, len);
}
in.close();
time = (int)(System.currentTimeMillis() - time);
return chbuffer.toString() + "<etime " + time + "ms/>";
}
}
class JavaScript implements Constants{
static String expandHeader(){
return "<script language=\\\"JavaScript\\\">function expandHeader(ArticlelD)" +
"{ArticlelD.style.display = (ArticlelD.style.display \\\"none\\\")? \\\"\\\":\\\"none\\\")<\\/script>";
}
static String openArticle(){
return "<script language=\\\"JavaScript\\\">function openArticle(url)" +
"{var kk = window.open(url, \\\'Regiononline\\\',\\\'resizable=yes,menubar=yes, scrollbars=yes,width=
640,height=400\\\');}<\\/script>";

}
static String appendArticleMain(String contentServer, String db, String SectionID, String ArticlelD){
return "<div ID=\\\"" + ArticlelD + "\\\"
style=\\\"display:none\\\">"
+ "<script language=\\\"JavaScript\\\"
+ "src=\\\"" + contentServer //req.getParameter("Server") + "?db=" + db + "&SectionID=" +=.SectionlD
+ "&ArticleID=" + ArticleID.substring(1) + "&PartID=2\\\"><\\/script>"
.+ endDiv;
}
}
interface Constants{
static final String apostrophe = "\\\""; //used in document.write () static final String doubleQuote = \\\""; //used in document.write () static final String backSlash //used in document.write static final String beginScript = "<script language=\"javascript\">";
static final String endScript = "<\\/script>";
//static final String begin]iv = "<div static final String endDiv,="</div>";
static final String newline =."\r\n";
}

Appendix B

package com.rnci.products.PublishNow;
import- javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import java.net.*;
import com.rnci. products.DataModules.ePLCss;
import- com. rnci-. products. DataModules .HttpServletDb;
public class jSyndicate extends HttpServletDb {
private static String controlDb = "rolcontrol";
private static String controlServer =, "stoudt";
private static String defaultURL =
"http://jsyndicate.rnci.com/servlet/com.rnci.products.PublishNow.jcontent";
private static String defaultServer "stoudt";
private static String defaultDb = "epublish";
private static String defaultSectionlD = "bnews";
private static String defaultDocumentURL =
"http://www.lehighvalleynow.com/rol/template4.asp";
private static imt itemToKeep.= 200, minutesToLive = 3; //may be set by-init() later private static long lastModified;
private static Vector contents = new Vector();
private Sentinel sentinel = new Sentinel(itemsToKeep, minutesToLive);
public void init(ServletConfig config)' throws ServletException {
super.init(config);.
if (getlnitParameter("itemsToKeep") =!= null) {
try {
this. itemsToKeep = Integer. parselnt(getlnitPara-peter("itemsToKeep"));
catch (NumberFormatException e) {
this.itemsToKeep = 100;
}
}
else this.itemsToKeep = 100;
if (getlnitParameter("minutesToLive") null) {
try {
this .minutesToLive,= Integer. parselnt(getlnitParameter("minutesToLive"));
}
catch (NumberFormatException,e) {
this.minutesToLive = 5;
}
}
else this.minutesToLive = 5;
}
public void destroy() {
sentinel.quit = true;
'contents = null;
}
//Process the HTTP Get request public void doGet(HttpServletRequest req, Http5ervletResponse res) throws ServletException, IOException {
String HTMLtext, overRide, SectionlD, server, db, templateURL, refererURL, documentURL, redirectURL, unit, contentlD, newWindow;
int position, ArticlelD, PartID, mode, number;
boolean newContent = false, overrideDefaults = true;
Content cont;

refererURL = req. getHeader("REFERS!.");
/I default is to use URL params overRide = req.getParameter("overrideDefaults");
if (overRide != null) {
if (overRide.startsWith("f")) overrideDefaults = false;
I/Document URL
documentURL = req.getParameter("documentURL");
{. =
.else I/if (unit.length=() < 3) unit position = unit, lastIndexOf(",");
if (position >= 0) unit= (overrideDefaults)? unit.substring(0, position):
unit. substring(position +1);
}
//The 'number of teaser delimiters to count String numbers = req.getParameter("number");
if (numbers = null) numbers = "4";.
else {
position = numbers. lastlndexOf(",");
if (position >= 0) numbers = (overrideDefaults)? numbers.substring(0, position):
numbers.substring(position + 1);
}
try { number = Integer .parselnt(numbers) } catch (Exception e) { number = 4;
Connection cnn = null;
contentlD = newWindow + "," + server + "," + db +."," + SectionID + +
ArticleID + "," + mode +
+ unit +'"," + number + "," + templateURL;
String validated = validateRequest(templateURL, documentURL, refererURL, db, SectionID);
if (validated. equals ("R")) I
if (documentURL.indexOf ("?") redirectURL = documentURL + "&redirected=yes";
} else {
redirectURL = documentURL + "?redirected=yes";
}
HTMLtext = " location.href = \"" + redirectURL + "\";";
}
else if (validated. equals ("E")) HTMLtext== " document.write('<BR><B>A network error occurred in connecting to the database.
Please try again.</B>');
else if (validated. equals ("N")) HTMLtext = " document.write('<BR><B>This web site is not authorized to-display the content requested.</B>'); ;
}
else {
cunt = lookup (contentID);
if (cont != null) {. _ HTMLtext = cont.detail;
} else {
newContent = true;

if ((SectionID != null.) &&.(db != null) && (server != null)) {
try { . -cnn = dataConnMan.getConnection(server, db);
ePress thisOne = new ePress(cnn);
thisOne.setLink(templateURL); -thisOne.setDb(db);

if ((unit != null) && (number >.0)) { //getTeaser HTMLtext = thisOne.getTeasers(SectionlD,ArticleID,PartlD,mode,unit,number);
else { //getContent 'HTMLtext = thisOne.getContent(SectionlD,ArticleID,PartID,mode);
}
HTMLtext = swapStrings(HTMLtext,"&db=","&server=" + server + "&templateURL=" +
URI,Encoder.encode (templateURL) + "&db=");
if (newWindow.toLowerCase(.startsWith("y")) { // add the "target= blank"=to article Hrefs HTMLtext = makeArticleHrefs(HTMLtext);
}
.dataConnMan. f reeConnection (server, db, cnn);
}
catch (Exception e) {
HTMLtext = "<!--- Error connecting to database: " + e.toString() + "--" +
server +
}
} else {
HTMLtext = "<!--- The SectionlD, server, and db parameters are required, --->";
}
HTMLtext = convertToja(HTMLtext, documentURL, refererURL);
if (documentURL == null) documentURL = defaultDocumentURL;
/'/Should part 1 links bring up a new browser window?
newWindow = req.getP.arameter( newWindow");
if (newWindow == null) newWindow = "no";
position= newWind'ow.lastlhdexof(",") if (position >= 0) newWindow = (orerrideDefaults)? newWindow.substring(0, position):
newWindow.substring(position + 1);
//The Requested SectionlD
SectionlD = req.getParameter("SectionlD");
if. (SectionlD == null) SectionID = defaultSectionlD;
position = SectionlD.lastlndexOf(",");
if (position >= 0) SectionID = (overrideDefaults)? SectionlD.substring(0, position):
SectionlD.substring(pdsition + 1);
//The Requested ArticlelD (0 for most recent article) String ArticlelDs = req.getParameter("ArticlelD");
if (ArticlelDs == null) ArticleIDs = "0";
position = ArticlelDs.lastlndexOf(",");
if (position >= 0). {.
if (overrideDefaults) ArticleIDs = ArticlelDs.substring(0, position);
else ArticleIDs = ArticlelDs. substring (position + 1);
}
try { ArticleID = Integer. parselnt(ArticleIDS); } catch (Exception e).{
ArticleID = 0; }
//The Requested Part (1 for title,=2 for main content) String PartlDs = req.getParameter("PartID");
if (PartIDs == null) PartlDs ='"1";
position = PartlDs.lastlndexOf(",");
if (position >= 0) {
if (overrideDefaults) PartlDs = PartIbs.substring(0, position), else PartlDs = PartlDs.substring(position + 1); =
}
try { PartID = Integer.parselnt(PartlDs); } catch .(Exception e) PartID
//Database Server server = req.getParameter("server");
if (server == null) server = defaultServer;
position = server. lastlndexOf(",")-;. ' if (position >= 0) server = (overrideDefaults)? server.substring(0, position):
server. substring(position + 1);

//Publishiow Database db = req.getParameter("db");
if (db = null) db = defaultDb;
position = db.lastIndexOf(",");
if (position >= 0) db = (overrideDefaults)? db.substring(0, position):
db.substring(position + 1);
//Forward Link Template URL
templateURL = req.getParameter("templateURL");
if (templateURL == null) templateURL = documentURL; //if no templateURL is supplied, set templateURL equal to the current document position = templateURL.lastIndexof(",")';
if (position >= 0) templateURL = (overrideDefaults)? templateURL.substring(0, position):
templateURL.substring(position + 1);
//try { templateURL = URLDecoder.decode(templateURL); }
//catch (Exception e) { }
if (templateURL.indexOf("SectionID=") != -1) { //if article detail page is same as part 1 links page templateURL = templateURL.substring(0,documentURL.index0f("SectionID=") - 1);
}

//The iCount Parameter in ePress.java String modes = req.getParameter("mode");
if (modes == null) modes = "1";
position = modes. 1astIndexOf(",");
if (position >= 0) {
if (overrideDefaults) modes = modes.substring(0, position);
else modes = modes.substring(position + 1);
}
try { mode = Integer parselnt(modes); } catch (Exception e) { mode = 1; }
//The delimiting string for Teaser requests unit = req.getParameter("unit");
if (unit == null) {}

}
PrintWriter out = res.getWriterO;
res.setContentType("text/html");
//res.setHeader("Cache-Control","no cache"); //only seems to effect images out.println(HTMLtext);
if (newContent) {
lastModified = System. currentTimeMillis(};
cont = new Content(contentID, HTMLtext, lastModified);
contents.addElement(cont);
}
private-String validateRequest (String templateURLL, String documentURL, String refererURL, String db, String SectionID) {
//returns "Y", "N", Or-"E" (connection error) String documentHOST = "", SQL refererHOST retchar="N";
.if (refererURL != null) refererHOST = parseHostFromURL(refererURL);
if (documentURL != null) documentHOST - parseHostFiomURL(doc[uaenttiRL);
if (documentURL != null) {
SQL = "SELECT authorized url FROM Syndicated Content WHERE pubnow`section name + SectionID +
AND active-fig = 'Y' AND pubnow dbname + in. + "' AND authorized_url LIKE '%"
+ documentHOST +
"%' AND datetime up < getdateO' AND datetime down > getdate()";
Connection cnn = null;
try {
cnn = dataConnMan.getConnection(controlServer,controlDb);
Statement stmt cnn.createStatement(};
ResultSet rst = stmt.executeQuery(SQL);
retchax = "N";
while (rst.next())-retchar = "Y";
rst.close();
stmt.closeO;
dataConnMan.reeConnection(controlServer,controlDb,cnn);
}

catch (Exception e) {
retchar = "E", }
}
return retchar;
}

private String parseHostFromURL(String targetURL) {
StringTokenizer tokenizer = new StringTokenizer(targetURL, int tokencount = tokenizer.countTokens();
.int i ;
String returnHost if (tokencount > 1) {
for (i = 1; i < 3; i++) returnHost = tokenizer.nextTokenO;
} else ( returnHost }
return returnHost;
}
private String makeArticleHrefs(String HTMLtext) {
int i;
StringBuffer sb = new StringBuffer();
for (i = 0; i < HTMLtext.length(); i++) {
if ((HTMLtext.substring(i,i+l).equals("<")) && (HTMLtext.substring(i+l,i+2).equalslgnoreCase("a")) && (HTMLtext.substring(i+3,i+4).equals("H")) && (HTMLtext.substring(i+4,i+5).equals("r"))) {
sb.append("<a target=\" blank\-');
i++;
} else {
sb.append(HTMLtext.charAt(i));
}
}
return sb.toStringQ ;
}
public long getLastModified(HttpServletRequest req) {
return lastModified/1000*1000;

{
private string convertTojs(String HTMLtext, String documentURL,String.
refererURL) HTMLtext = HTMLtext.replace('\r', ' ');
HTMLtext = HTMLtext.replace('\n', ' try.{
HTMLtext = swapStrings(HTMLtext,"\\","\\\\") HTMLtext = swapStrings(HTMLtext,"\"',"\\\ "');
HTMLtext = swapStrings(HTMLtext,"\"","\\\"");.
}
catch(Exception e) {
System.out.println(e.getMessage());
if (refererURL t= null) {
HTMLtext if (location.href.indexOf(\"" + documentURL + "\") t= -1)={
document.write +
HTMLtext + "'); } else { document-write ('<BR><B>This web site is not authorized to display the content requested.</B>');
} else {
HTMLtext = " document.write ('" + HTMLtext + "');";
}
return HTMLtext;
}

String swapStrings(String TextIn,'String OldString, String NewString) int OldStringStartAt;
int OldStringLength = Oldstring.leingth();
jut NewStringLength = NewString.length(;
String TempText = Textln;
OldStringStaitAt = indexoflgnoreCase(TempText, OldString, b);
while (O1dStringStartAt != -1) {
TempText TempText.substring( 0, OldStringStartAt) +
NewString + TempText.substring(oldStringStartAt + OldStringLength);
OldStringStartAt = indexOflgnoreCase(TempText, OldString, OldstringStartAt + NewStringLength);
}
return TempText;
}
jut indexOflgnoreCase(String TempText, String subString, int StartAt) { return TempText.toLowerCase().indexof( subString.toLowerCase(), StartAt);
Content lookup(String contentlD) {
Content cont;
int index = -1;
for (int i=0; i<contents.sizeO; ++i) {
cont = (Content)contents.elementAt(i);
if (contentlD. equals (cont.contentlD)) return (Content) contents.elementAt(i);
}
return null;
class Content {
String contentiD, detail;
long timestamp;
Content(String contentlD, String detail, long timestamp) {
this.contentlD = contentlD;
this.detail = detail;
this.timestamp = timestamp/60000; //converts milliseconds to minutes }
}
private class Sentinel extends Thread {
int itemsToKeep;
int minutesToLive;
Boolean quit = false;

Sentinel (jut itemsToKeep, jut minutesToLive) this.itemsToKeep = item ToKeep, this.minutesToLive = minutesToLive;
setPriority(Thread.MIN PRIORITY);
start 0;

public void run() {
jut itemsToRemove;
while (!quit) this keeps cleanup alive until servlet.is destroyed freshen(;
if (contents.siae() > itemsToKeep) trim( //System.gc();
try {.
Thread.sleep(5000);
}
catch (InterruptedException ex) { }
//System.out.println("Sentinel ran at:" + System. cu rentTimeMillis{));
}

Private. void trim O {
.mast itemsToRemove = contents.size() - itemsToKeep;
mast trimmed = 0;
for (mast i=0; i<itemsToRemove; ++i) {
contentp.removeElementAt(1);
//System. out. println ("Removed: " + contents. elementAt(i)tostring());
Thread. yield();
trimmed+-+;.
}
if (trimmed > 10) contents.trimToSize();
}
private void freshen() {
long currentTime = System. currentTimeMillis/60000;
Content coast;
for (jut i=0; i<contents.size(); ++i) {
cont = (Content) contents. elementAt(i);
if (cont.timestamp.+ minutesToLive < currentTime) {
contents.reinoveElementAt(i);
//System.out.println("Expired: " + cont.contentlD);
Thread.yield();
}
}
}
//Get Servlet information public String getServletlnfo{) return "Retrieves content from PublishNow 2.x databases.";
}
}

Appendix C
/**
* Title: Active Data Syndicator - ADPExport Servlet * Description: Copyright (c) 2001 Active Data Exchange. All rights reserved.
* Any use without the express written permission of the copyright * owner is unlawful.
* All information contained in the file is confidential to Active Data Exchange * Copyright: Active Data Exchange * Company: Active Data Exchange * @author John E. Wetzel * @creation date 10 February 2001 * @last revision date 13 June 2001 * @version 3.01 package corn. activedatax. products. syndicator. export;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.sql.Connection;
import java.util.StringTokenizer;
import java.util.Properties;
import com. activedatax.utils.adxTools;
import java.net.URLEncoder;
import com. activedatax. sgl.HttpServletDb;
public class ADPExport extends HttpServletDb {
private static String sServer;
private static String sDbName;
private static String sNoAuthMsg;

private static final String CONTENT_TYPE _ "text/html";
/**Initialize global variables*/
public void init(ServletConfig config) throws ServletException {
super.init(config);
File f = new File("SyndicatorBG.properties");
if(!f.exists()) {
f = new File("I:/SyndicatorBG/SyndicatorBG.properties");
Properties dbProps = new Properties();
try {
InputStream is = new FileInputStream(f);
dbProps.load(is);
}
catch (Exception e) {
System.err.println("Can't read the properties file from ADPExport servlet. " +
"Make sure SyndicatorBG.properties is in the CLASSPATH");
return;
sServer = dbProps.getProperty("syndicator.database.server");
sDbName = dbProps.getProperty("syndicator.database.name");
sNoAuthMsg = dbProps.getProperty("syndicator.adp.noauthmsg");

/**Process the HTTP Get/Post request*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException String sServerRoot = adxTools.getServerRoot(request);
String sDocumentURL
String sTargetURL =
String sOfferContentSetIds = "0";
String sItemIds = "0";
String sFullNums = "0";
String sArcNums = "0";

long lOfferContentSetld = 0;
long 1Serial = 0;
long 1Subld = 0;

C-i long 11temId = 0;

int nFullNum = 0;
int nArcNum = 0;

boolean bNewWindow = false;
boolean bShowDates = false;

//Serial Number Parameter (required) try {
lSerial = Long. parseLong(request.getParameter("j3serial") } catch(Exception e) f lSerial = 0;
}

//Subscriber Id Parameter (required) try {
lSubld = Long.parseLong(request.getParameter("j3sub") } catch(Exception e) {
lSubld = 0;
}

//Offer Content Set Id Parameter (required) sOfferContentSetlds = request.getParameter("j3ocset");
if (sOfferContentSetlds == null) sOfferContentSetlds = "0";
//Document URL Parameter (required) sDocumentURL = request.getParameter("j3durl");
if (sDocumentURL == null) sDocumentURL
sDocumentURL =
ADPExporter.removeParamsFromURL(sDocumentURL,"j3serial,j3sub,j3ocset,j3durl,j3i temid,j3fullnum,j3 arcnum,j3turl,j3newwindow,j3showdates,j3rand");

//Target URL for Archive Links Parameter (optional) sTargetURL = request. getParameter ("j3turl ");
if (sTargetURL == null) sTargetURL = sDocumentURL; //defaults to the requesting document //Item Id Parameter per Content Set (optional) sltemlds = request.getParameter("j3itemid");
if (sltemlds == null) sitemlds = "0";

//Number of Full Articles to Display per Content Set Parameter (optional) sFullNums = request. getParameter("j3fullnum");
if (sFullNums == null) sFullNums = "1"; //default to 1 //Number of Article Archive Links to Display per Content Set Parameter (optional) sArcNums = request. getParameter ("j3arcnum");
if (sArcNums == null) sArcNums = "0"; //default to none //Popup new window when an- archive link is clicked? True or False (optional) try {
bNewWindow = (new Boolean (request.getParameter("j3newwindow"))).booleanValue();
} catch(Exception e) {
bNewWindow = false; //default to false }

//Show dates along with archive links? True or False (optional) try {
bShowDates = (new Boolean (request.getParameter("j3showdates"))).booleanValue( } catch(Exception e) {
bShowDates = false; //default to false }

response. setContentType(CONTENT TYPE);
PrintWriter out = response.getWriter();

//Expecting these tokenizers to have the same number of tokens.
StringTokenizer tokenizer = new StringTokenizer(sOfferContentSetlds,":");
StringTokenizer tFull = new StringTokenizer(sFullNums, ": ") ;
StringTokenizer tArc = new StringTokenizer(sArcNums,":");

StringTokenizer tItems = new StringTokenizer(sItemlds,":");
if(tltems.countTokens() != token izer.countTokens()) {
sltemlds = "0";
for(int a=1;a<tokenizer.countTokens();a++) {
sltemlds = sltemlds + ":0";
}
tItems = new StringTokenizer(sItemIds,":");
}

Connection cnn = dataConnMan.getConnection(this.sServer, this. sDbName);
ADPExporter ADP = new ADPExporter(cnn, sServerRoot, lSerial, lSubId, 0, 0, sDocumentURL, sTargetURL, 1, 0, bNewWindow, bShowDates, request. getRemoteAddr());
if(tokenizer.countTokens() > 1) {
ADP.setAtomicQueryString(sltemlds,"&j3ocset=" +
URLEncoder.encode(sOfferContentSetlds) +
"&j3arcnum=" + URLEncoder. encode (sArcNums) + "&j3fullnum=" +
URLEncoder.encode (sFullNums));
}
int nTk = 0;
while(tokenizer.hasMoreTokens()) {
try {
lOfferContentSetld = Long.parseLong(tokenizer.nextToken());
try { nFullNum = integer. parselnt(tFull.nextToken()); } catch(Exception ex) {
nFullNum =
1;) try { nArcNum = Integer. pars elnt(tArc.nextToken()); } catch(Exception ex) {
nArcNum =
0;) try { lltemld = Long.parseLong(tltems.nextToken()); } catch(Exception ex) {
lItemld =
0;) ADP. setOfferContentSetld(lOfferContentSetld);
ADP.setFullNum(nFullNum);
ADP. setArcNum(nArcNum);
ADP.setltemld(lltemld);
ADP. setAtomicPosition(nTk);
if(ADP.validateADPRequest()) {
out.println(ADP.getADPContent());
out.println("document.write('<P>');");
} else {
out. println ("document. write('" + this.sNoAuthMsg +
}
} catch(Exception e) {
out.println("document.write('<!--- An error occurred while parsing offer content set ids. --->');");
}
nTk++;
}

dataConnMan.freeConnection(this.sServer,this.sDbName,cnn);
ADP = null;
out.flush(;
out.close();
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

/**Clean up resources*/
public void destroy() {
}
}

/**
* Title: Active Data Syndicator - ADPExporter Class * Description: Copyright (c) 2001 Active Data Exchange. All rights reserved.
* Any use without the express written permission of the copyright * owner is unlawful.
* All information contained in the file is confidential to Active Data Exchange * Copyright: Active Data Exchange * Company: Active Data Exchange * @author John E. Wetzel * Mate 10 February 2001 * @last revision date 21 June 2001 * @version 3.01 package com.activedatax.products.syndicator. export;
import com.activedatax.utils.adxtRLParser;
import java.util.StringTokenizer;
import java.net.MalformedURLException;
//import com.imaginary.lwp.Identifier;
import com.activedatax.products.syndicator.content.OutputType;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.io.FileOutputStream;
import java.io.IoException;
import java.util.List;
import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.Date;
import java.util.Collection;
import java.util.StringTokenizer;
import java.util.Hashtable;
import java.sgl.*;
import java.text.SimpleDateFormat;
import javax.servlet.http.HttpServletResponse;
import com.activedatax.utils.DigraphEncrypt;
import com.activedatax.utils.adxTools;

import gnu.regexp.*;

* This class is a helper class for the ADPExport servlet.
class ADPExporter {

// class variables/objects private Hashtable hItems;
private Hashtable hltemContent;
private Connection cnn;
private-String sServerRoot, sDocumentURL, sTargetURL, sAtomicQueryString, sIPAddress, sItemTokens;
private long 1Serial, lSubId, lOfferContentSetld, 1ContentSetld, 1ltemld;
private int nPos;
private boolean bNewWindow, bShowDates;
int nFullNum, nArcNum, nItemHashSize;

ADPExporter(Connection pCnn, string psServerRoot, long plSerial, long plSubld, long plltemId, long plofferContentSetid, String psDocumentURL, String psTargetURL, int pnFullNum, int pnArcNum, boolean pbNewWindow, boolean pbShowDates, String pslPAddress) {

init class variables/objects this.cnn = pCnn;
this.lSerial = plSerial;
this.lSubId = plSubld;
this.lltemld = plltemld;
this.sServerRoot = psServerRoot;
this. lOfferContentSetld = plofferContentSetId;
this.lContentSetld = this. lofferContentSetld;
this.sDocumentURL = psDocumentURL;

this.sTargetURL = psTargetURL;
this.nFullNum = pnFullNum;
this.nArcNum = pnArcNum;
this.bNewWindow = pbNewWindow;
this.bShowDates = pbShowDates;
this.slPAddress = pslPAddress;
this.sAtomicQueryString this.sltemTokens this.nPos = -1;
}
public void setFullNum(int pnFullNum) {
this.nFullNum = pnFullNum;
}
public void setArcNum(int pnArcNum) {
this.nArcNum = pnArcNum;
}
public void setitemld(long plltemld) {
this.litemid = plltemld;
}
public void setofferContentSetid(long plOfferContentSetid) {
this. 10fferContentSetld = plofferContentSetid;
}
public void setAtomicQueryString(String psitemids, String psAtomicQueryString) {
this. sAtomicQueryString = psAtomicQueryString;
this.sltemTokens = psitemids;
}

public void setAtomicPosition(int pnPos) {
this.nPos = pnPos;
}
* This method will check to see if the web site making the content request is * authorized to receive the content.

public boolean validateADPRequest() {
String sSQL = " , String BURL = parseHostFromvRL(this.sDocumentURL);
boolean bAuthorized = false;
PreparedStatement stmt;
ResultSet rs;

//A non-subscriber is requesting the content.
//The value in pOfferContentsetid refers to the "content_set_id" column of the content-set :able.
i((this.lSerial == -1) && (this.lSubld == -1)) {
this.lContentSetid = this.10fferContentSetid;
sSQL = "SELECT DISTINCT url.url_id, url.crt_class FROM url, content-set + "WHERE content_set.content_set_id = ?
+ "AND UPPER(url.url) LIKE ? "
+ "AND url.url_id NOT IN (SELECT DISTINCT url_id FROM subscriber url) + "AND url.site id = content_set.site id try {
stmt = cnn.prepareStatement(sSQL);
stmt. clearParameters();
stmt.setLong(l,this.lContentSetld);
stmt.setString(2,"%" + sURL.toUpperCase() + "%");
stmt.setMaxRows(l);
rs = stmt.executeQuery();
while(rs.next()) {
bAuthorized = true;
}
rs.close();
stmt-close();
} catch(Exception e) {

e.printStackTrace();
}
//A subscriber is requesting the content.
} else {
sSQL = "SELECT DISTINCT url.url_id, url.crt_class FROM url, offer_content_set, + "subscription_subdetails, subscriber, subscriber_url + "WHERE (offer_content_set.offer contentset_id = ?
+ "AND subscription_subdetails.serial_no = ?
+ "AND subscriber.subscriber_id = ? "
+ "AND subscriber_url.subscriber_id = ?
+ "AND url.url like ?) "
+ "AND offer_content_set.ofer_id = subs cription_subdetaiIs.offer_id + "AND subscription_subdetails.subscriber_id = subscriber.subscriber_id + "AND subscriber.subscriber_id = subscriber_url.subscriber_id + "AND subscriber_url.url_id = url.url_id";
try {
stmt = cnn.prepareStatement(sSQL);
stmt.clearParameters(;
stmt.setLong(1,this.lOfferContentSetId);
stmt.setLong(2,this.lSerial);
stmt.setLong(3,this.lSubId);
stmt.setLong(4,this.lSubId);
stmt.setString(5,"%" + sURL.toUpperCase() + "%");
stmt.setMaxRows(1);
rs = stmt.executeQuery();
while(rs.next()) {
bAuthorized = true;
}
rs.close();
stmt.close();
} catch(Exception e) {
e.printStackTrace();
}
}
return bAuthorized;
}
/**
* This method retrieves the requested content as defined by this classes' parameters.
private void getItemHashData() {
this.nItemHashSize = Math. abs (this.nFullNum) + Math. abs(this.nArcNum);
this.hItems = new Hashtable(this.nItemHashSize);
this.hItemContent = new Hashtable(this.nltemHashSize);
PreparedStatement stmt;
ResultSet rs;
String sSQL = "", sItemReview = "N", sItemIds String[] sTemp = { " n , " " , long 1ThisItemId;
int nAllowedArcNum = 0;
int nFullCount = 0;
int nResultCount = 0;

if(!((this.lSerial == -1) && (this.lSubId == -1))) { // A subscriber has requested the content.
//get the necessary content-set-id with an additional query sSQL = "SELECT offer_content_set.content_set_id, subdetails_cs.archives, subdetails_cs.item review "
+ "FROM offer-content-set, subdetails_cs + "WHERE subdetails_cs.serial_no = ? "
+ "AND subdetails_cs.offer_content_set_id = ?
+ "AND subdetails_cs.output_type_id = ? "
+ "AND subdetails_cs.offer_content_set_id =
offer_content_set.offer_content_set_id";
try {
stmt = cnn.prepareStatement(sSQL);
stmt. clearParameters();
stmt. setLong(1,this.lSerial);

stmt.setLong(2,this.lOfferContentSetld);
stmt.setlnt(3,OutputType.ADP);
stmt.setMaxRows(l);
rs = stmt.executeQuery();
while(rs.next()) {
this.lContentSetld = rs.getLong(l);
nAllowedArcNum = rs.getInt(2);
sItemReview = rs.getString(3);
}
rs.close();
stmt.close();
} catch(Exception e) System. err.println("An ERROR ocurred in ADPExporter ...");
e.printStackTrace();
return;
}

//make sure the subscriber hasn't tried to request more archives than allowed if(nAllowedArcNum < this.nltemHashSize) this.nltemHashSize = nAllowedArcNum;
}

if(sltemReview.equals("Y")) {
return; //will need to code a block here when item-review feature is added }

String sCsld = "AND item_content_set.content_set_id = ?
if(this.lContentSetld == -1) sCsld = "AND item.item_id = ?

//now get the content set items (not including the actual content column) sSQL = "SELECT item.item_id, item.title, item.subtitle, item.author, item.byline, + "item.link_text, item.meta_data, item.comments, item.inctitle, item.last_updated_on + "FROM item, item content_set "
+ "WHERE UPPER(item.status) !_ ? AND item.timeup <= ?
+ "AND item.timedown >= ? "
+ "AND item.item id = item content_set.item id + sCsld + "ORDER BY item.timeup DESC ", try {
stmt = cnn.prepareStatement(sSQL);
stmt.clearParameters();
stmt.setString(l,"D");
stmt.setTimestamp(2,new Timestamp((new Date()).getTime()));
stmt.setTimestamp(3,new Timestamp((new Date()).getTime()));
if(this.lContentSetld > -1) stmt.setLong(4,this.lContentSetld);
else stmt.setLong(4,this.lltemld);
stmt.setMaxRows(this.nltemHashSize);
rs = stmt.executeQuery();
while(rs.next()) {
lThisltemld = rs.getLong(l);
System.out.println("FOUND ITEM ID: " + lThisltemld);
if(this.nFullNum > nFullCount) {
if(nFullCount > 0) sitemlds = sltemlds + "
sltemlds = sltemlds + String.valueOf(lThisltemld);
nFullCount++;
}
sTemp[0] = String.valueOf(lThisltemId); //item-id sTemp[l) = rs.getString(2); //title sTemp[2] = rs.getString(3); //subtitle if(sTemp[2] _= null) sTemp[2) = "
sTemp[3] = rs.getString(4); //author if(sTemp[3] == null) sTemp[3] = "
sTemp(4] = rs.getString(5); //byline if(sTemp[4] == null) sTemp[4] = "
sTemp(5] = rs.getString(6); //linktext if(sTemp[5] == null) sTemp[5] = "
sTemp[6] = rs.getString(7); //metadata if(sTemp[63 == null) sTemp[6} = "
sTemp[7] = rs.getString(8); //comments if(sTemp[7) == null) sTemp[7] = "
sTemp[8] = rs.getString(9); //inctitle sTemp[9] = rs.getTimestamp(10).toString(); //displaydate this. hItems.put(String.valueOf(nResultCount), sTemp.clone());
nResultCount++;
}
rs.closeO;
stmt.close();
} catch(Exception e) {
System. err. println ("An ERROR ocurred in ADPExporter ...");
e.printStackTrace();
}
//finally get nFullNum number of item "content" fields or a specific item if((sItemIds.length () > 0) 11 (this.lltemId > 0)) {
if(this.lltemld > 0) { //a specific item link was clicked on sSQL = "SELECT item id, content FROM item WHERE item id =" +
String.valueOf(this.lltemld);
} else {
sSQL = "SELECT item id, content FROM item WHERE item_id IN(" + sltemlds + ")";
}
try {
stmt = cnn.prepareStatement(sSQL);
stmt.clearParameters();
rs = stmt.executeQuery();
while(rs.next()) {
this.hltemContent.put(new Long(rs.getLong(1)), rs.getString(2));
}
rs. close stmt.close();
} catch(Exception e) {
System.err.println("An ERROR ocurred in ADPExporter e.printStackTrace();
}
}
}
public String getADPContent() {
getltemHashData();
String BURL = (this.sTargetl7RL.indexOf("?") ? "?' 11&";
String sNewWindow = (this.bNewWindow) ? " TARGET=\"_new\""
String sLink, sContent, sDisplayDate, sItemldParameter;
StringBuffer cb = new StringBuffer(""); //content buffer StringBuffer lb = new StringBuffer(""); //link buffer String[] sTemp;
int nFull = this.hltemContent.size();
int nltems = this.hltems.size();

boolean bNegativeArcNum = (this.nArcNum < 0);
j3serial,j3sub,j3ocset,j3durl,j3itemid,j3fullnum,j3arcnum,j3turl,i3newwindow,j3 showdates,j3rand if(this.sAtomicQueryString.length() > 0) {
sURL += "j3serial=" + URLEntoder.encode (String.valueOf(this.ISerial)) +
"&j3sub=" +
URLEncoder.encode(String.valueOf(this.lSubId)) +
this.sAtomicQueryString + "&j3newwindow=" +
URLEncoder.encode(String.valueOf(this.bNewWindow)) +
"&j3showdates=" + URLEncoder-encode (String.valueOf(this.bShowDates) } else {
sURL += "j3serial=" + URLEncoder.encode (String.valueOf(this _1Serial)) +
"&j3sub=" +
URLEncoder.encode (String.valueOf(this.lSubld)) +
"&j3ocset=" + URLEncoder.encode (String.valueOf(this.lOfferContentSetld)) +
"&j3arcnum="
URLEncoder.encode (String.valueOf(this.nArcNum)) + "&j3newwindow=" +
URLEncoder. encode (String. valueOf(this.bNewWindow)) +

"&j3showdates=" + URLEncoder.encode (String.valueOf(this.bShowDates));

for (int i=0; i<nltems; i++) {
sTemp = (String [])this. hltems.get(String.valueOf(i));
sContent = (String) this.hItemContent. get (new Long(sTemp[0]));
if(sContent != null) {
sContent = replaceltemBinaryRefs(sContent);
//sContent = adxTools.swapStrings(sContent,"\u00f3\u00f3", this.sServerRoot +
"com.activedatax.products.syndicator.export.ADPRetrieveltemBinary?binary id=");
} else {
sContent }
sLink = (sTemp[5]trim().length() > 0) ? sTemp[5].trim() : sTemp[l].trim();
sDisplayDate = sTemp[9];
if(this.bShowDates 11 bNegativeArcNum) {
sDisplayDate = sDisplayDate.substring(5,7) + + sDi splayDate. subs tring (8, 10) +
sDisplayDate.substring(2,4);
sLink += + sDisplayDate + ")";
}

//sTemp[O] = itemid //sTemp[l] = title //sTemp[2] = subtitle //sTemp[3] = author //sTemp[4] = byline //sTemp[5] = linktext //sTemp[6] = metadata //sTemp[7} = comments //sTemp[8] = inctitle //sTemp[9] = displaydate sItemIdParameter = sTemp[0]; //the current item id if(this.sAtomicQueryString.length() > 0) {
StringTokenizer tltems = new StringTokenizer(this.sItemTokens, if(this.nPos == 0) {
sltemIdParameter = sTemp[0];
tltems.nextToken();
else {
sltemldParameter = tItems.nextToken();
}
int nq = 1;
while(tItems.hasMoreTokens()) {
if(this.nPos == nq) {
sItemIdParameter += + sTemp[0];
tItems.nextToken();
} else { .
sItemIdParameter += + tItems.nextToken();
}
nq++;
}

if(sContent.length() > 0) {
cb.append(sContent + "<P>");
if(Math.abs(this.nArcNum) > 0) if((!this .bNewWindow) ((this.bNewWindow) && (this.lltemld==0))) lb.append(sLink +
<BR>");
} else {
if(Math.abs(this.nArcNum) > 0) if((!this .bNewWindow) 11 ((this.bNewWindow) && (this.lItemld==0))) lb.append("<A
HREF=\"" + this.sTargetURL + sURL + "&j3itemid=" + URLEncoder-encode (sltemldParameter) \""
sNewWindow + ">" + sLink + "</A><BR>");
}
end for return parseContent(cb.tostringO + "<P>" + lb.toStringO + "<P>
}

private String replaceltemBinaryRefs(String psContent) {
StringBuffar sb = new StringBuffer(psContent.length() + 300);

String sId;
int nPos = 0;
int nLoc = psContent.indexOf("\u003\u00f3");
while(nLoc != -1) {
sb.append(psContent.substring(nPos,nLoc));
sId =
adxTools.convertStringToHexString(DigraphEncrypt.encryptDiGraph(this.sIPAddress +
"TFB" + psContent.substring(nLoc+2,nLoc+22)).trim());
sb.append(this.sServerRoot +
"com.activedatax.products.syndicator.export.ADPRetrieveItemBinary?binary id="
+ sId);
nPos = nLoc + 22;
nLoc = psContent.indexOf("\u00f3\u00f3",nPos);
}
sb.append(psContent.substring(nPos));
return sb.toString(;
}
* This method will remove specified querystring parameters from a supplied URL
* and return the resulting URL
*
* Example: For the method parameters * psURL = "http://www.mysite.com/page.asp?paraml=x&param2=y&param3=z"
* psQueryStringParams = "paraml,param3"
*
* The returned URL will be:
* "http://www.mysite.com/page.asp?param2=y"

public static String removeParamsFromURL(String psURL, String psQueryStringParams) {
//System.out.println(URL);
String sTempURL = psURL;
StringTokenizer tokenizer = new StringTokenizer(psQueryStringParams,",");
adxURLParser myParser = new adxURLParser();
try {
while(tokenizer.hasMoreTokens()) {
myParser. setOriginalURL(sTempURL);
myParser.setParamToRemove(tokenizer.nextToken());
sTempURL = myParser. getRemovedParamURL(;
}
} catch (MalformedURLException mue) {
mue.printStackTrace();
//return an error string that will need to be handled by the calling method.
sTempURL = "error";
}
return sTempURL;
}

* This method will parse out and return the host/domain name from a supplied URL
*
* Example: For the URL:
* psURL = "http://www.mysite.com/page.asp?paraml=x&param2=y&param3=z"
*
* The returned String will be:
* "www.mysite.com"

public static String parseHostFromURL(String psURL) {
StringTokenizer tokenizer = new StringTokenizer(psURL, "/");
int tokencount = tokenizer.countTokens();
int i;
String sReturnHost try {
if (tokencount > 1) {
for (i = 1; i < 3; i++) sReturnHost = tokenizer.nextToken();
} else {
sReturnHost = "error";
}
} catch(Exception e) {

//return an error string that will need to be handled by the calling method.
sReturnHost = "error";
}
return sReturnHost;
}

public static int indexOfIgnoreCase(String sTempText, String sSubString, int nStartAt) {
return sTempText.toLowerCase().indexOf( sSubString.toLowerCase(), nStartAt);
}
public static String swapStrings(String sTextIn, String sOldString, String sNewString) {
int nOldStringStartAt;
int nOldStringLength = sOldString.length();
int nNewStringLength = sNewString.length();
String sTempText = sTextIn;
nOldStringStartAt = indexOflgnoreCase(sTempText, sOldString, 0);
while (nOldStringStartAt != -1) {
sTempText = sTempText. subs tring ( 0, nOldStringStartAt) + sNewString +
sTempText.substring(nOldStringStartAt + nOldStringLength);
nOldStringStartAt = indexOflgnoreCase(sTempText, sOldString, nOldStringStartAt +
nNewStringLength);
}
return sTempText;
}

public static String parseContent(String sContent, String sServerRoot) {
String sClientScripts = , int nStartSearchAt = 0;
int nScriptLoc = indexOfIgnoreCase(sContent,"<SCRIPT",nStartSearchAt);
if(nScriptLoc > -1) { //Check for client scripts and separate them from regular HTML
try {
int nEndScriptLoc;
int nArticleLength = sContent.length();
StringBuffer sbArticle = new StringBuffer(nArticleLength + 1);
StringBuffer sbScripts = new StringBuffer();
while(nScriptLoc > -1) {
nEndScriptLoc = indexOfIgnoreCase(sContent,"</SCRIPT>",nScriptLoc);
sbArticle.append(sContent.substring(nStartSearchAt,nScriptLoc));
sbScripts.append(sContent.substring((indexOfIgnoreCase(sContent,">",nScriptLoc) +l),nEndScriptLoc) sbScripts.append('\n');
sbScripts.append('\r');
//System.out.println("The HTML: " +
sContent.substring(nStartSearchAt,nScriptLoc));
//System.out.println("The Script: " +
sContent. substring( (indexOfIgnoreCase (sContent, "> ", nScriptLoc) +1) ,nEndScriptLoc));
nStartSearchAt = nEndScriptLoc + 9;
nScriptLoc = indexOfIgnoreCase(sContent,"<SCRIPT",nStartSearchAt);
}
//sbArticle.append(sContent.substring(nStartSearchAt,nArticleLength - 1));
sbArticle.append(sContent.substring(nStartSearchAt,nArticleLength)); //changed by JW
//System.out.println(sbArticle.toString());
//Systern. out. println(sbScripts_toString());
sClientScripts = sbScripts.toString(); //contains just the scripts' code sContent = sbArticle.toString(); //contains just the article HTML
}
catch(Exception e) {
System. err println (e. getHessage C) e. printStackTraceC);, }
}

sContent = sContent. replace (I \r sContent = sContent. replace (I \nl, try {
sContent = adxTools.swapStrings(sContent,"\\","\\\\");

sContent = adxTools.swapstrings(sContent,"\'","\\\'");
sContent = adxTools.swapstrings(sContent,"\"","\\\"");
}
catch(Exception e) {
System.err.println(e.getMessage());
e. printStackTrace();
}
return sClientScripts + document.write (I" + sContent + "'); " + '\r }

end class ADPExporter Appendix D

&tiverw YOUR CONTENT. ANYPLACE. ANY TIME.

ACTTVE DATA RANDOMIZER
User Guide Active Data Randomizer gives Users the power to keep a Website fresh and inviting to visitors.
This convenient, easy-to-use tool facilitates the collecting, grouping, modifying and removal of messages, either graphic or text, that are displayed within a page each a time it is loaded, reloaded or refreshed by the viewer.
This User Guide is an overview of how Active Data Randomizer works and what it does. For a complete demonstration, contact you Active Data Exchange representative.

active data + hange Active Data Exchange, Inc.
190 Brodhead Road, Suite 300 Bethlehem, PA
610.997.8100 www.activedatax.com Copyright 2001, Active Data Exchange, Inc. AJI rights reserved. Duplication, electronic or otherwise, is prohibited without written permission of the publisher.

n i:ive data ange YOUR CONTENT. ANY PLACE. ANY TIME.
Table of Contents Overview ...............................................................................
..................................................3 Step-by-step guide for Active Data Randomizer ....................................................................3 Getting Started ...............................................................................
.........................................3 Step 1 Site Set Up ...............................................................................
.... .4 .............................
To Set up a new site ...............................................................................
................................4 Step 2 Randomizer Groups ...............................................................................
....................4 Step 3 HTML Blurbs ...............................................................................
...............................6 To add another HTML blurb :..............................................................................
....................7 Step 4 Java Script Code ...............................................................................
.........................7 Step 5 Verify or Modify Blurb Groupings ...............................................................................
.9 Step 6 Rotating Blurbs for Preview ...............................................................................
........10 Step 7 Exit ...............................................................................
.............................................10 Table of Figures Figure 1 Site Configuration Screen ...............................................................................
..........3 Figure 2 Add a New Site Configuration ...............................................................................
....4 Figure 3 Add a New Group Name ...............................................................................
............5 Figure 4 New Group Confirmation Message ...........................................................................5 Figure 5 New Active Data Randomizer Blurb Group ..............................................................6 Figure 6 New Active Data Randomizer Blurb HTML Confirmation .........................................7 Figure 7 Active Data Randomizer Blurb Code ........................................................................8 Figure 8 Sample HTML Editor ...............................................................................
.................8 Figure 9 Confirmation and View Message Window ...............................................................9 active, daifa YOUR CONTENT. ANY PLACE. ANY TIME.
e thpnge Active Data Randomizer User Guide Active Data Randomizer Overview A practical tool, Active Data Randomizer gives Users the power to keep their Website viewers attentive to the screen by changing a specific part of a page message each time a viewer refreshes or returns to a previously viewed screen. An easy to use tool that requires no additional hardware or installation, Active Data Randomizer is platform independent and facilitates the grouping and presenting of graphic or text messages on a Website page.
The Active Data Randomizer allows for direct, targeted message updates, without the complexities of publishing completely new pages or documents, from any location with Internet access, at any time. Short, catchy visuals and text can be displayed on a page with little effort on the part of the client after setup is complete. The random display of messages keeps your page continually altering and fresh to viewers as they browse through a site. Using Active Data Randomizer to rotate images or messages will decrease the static look and feel of a Web page.
Step-by-step guide for Active Data Randomizer Getting Started The Active Data Randomizer is accessible through a Universal Resource Locator, URL. Open your Internet browser and enter this URL into the proper area:

http://publ isher3.activedatax.com/servlet(com.activedatax.products.
Blurb.AdminMenu You will be taken to the main screen for Active Data Randomizer.

Active Data Randomizer Site Configuration Options l i = Add a New Site Configurati on = Change a Site Configuration = Delete a Site Configuration = Generate a Site's Administration Code Site Blurb Functions for Blurb Demo _ _ 1 = Add a New Group = Delete a Group = View Groups = Add a New HTML Blurb = View, Modify or Delete HTML Blurbs = Generate Blurb Code Figure I Site Configuration Screen Active Data Exchange. Page 3 www.activedatax.com This document contains confidential information. No part of this document maybe be reproduced or transmitted, in any form or by any means without the express written permission of Active Data Exchange.
Copyright 2001, all rights reserved.

d6ta YouR CONTENT. ANY PLACE. ANY TIME.
e)qcdhxqnqe Active Data Randomizer User Guide The main screen for the Active Data Randomizer has links to each and every functionality offered by this time-saving tool. Once you have accessed the Active Data Randomizer tool, you will see all the site configuration options and functions that are usable for screen refresh messages. Click on any of the bulleted items to access that functionality.
Step 1 Site Set Up You will arrive at this window when Add a New Site Configuration is chosen from the Site Configuration Screen. From here you are able to set up a new location to display Active Data Randomizer messages or return to the Menu.

Active Data Randomizer Add a New Site Configuration Site Naive Blurbdemo - i Descxiption Demonstration of Active Data Randomizer SiteURL ~ htip//asppreview.active datax.comtblurbdemo W
Figure 2 Add a New Site Configuration To Set up a new site 1. Site Name-enter your new site name.
2. Descriptions-enter a brief explanation.
3. Enter the URL to locate the site and the page where you want your dynamic blurbs to be displayed 4. Select the Submit Configuration button The new site is automatically configured, and you will be returned to the Administration screen.
NOTE-the success of your new site set-up is confirmed and expressed by the red text in the upper portion of the screen.

Step 2 Randomizer Groups You will arrive at this window when Add a New Group is chosen from the Site Configuration screen.
From here you are able to set up a new group of Active Data Randomizer blurbs or return to the Menu.

Active Data Exchange. Page 4 www.activedatax.com This document contains confidential information. No part of this document maybe be reproduced or transmitted, in any form or by any means without the express written permission of Active Data Exchange.
Copyright 2001, all rights reserved.

.. YOUR CONTENT. ANY PLACE. ANY TIME.
activ+edofa e' 2hange Active Data Randomizer User Guide Active Data Randomizer Administration Add a NewBlurb Group to the Site Blurb Demo Group Name 02blurb Test _ _ -- __:^
Figure 3 Add a New Group Name 1. Enter a Group Name for your first collection of different blurbs that will be used for a specific location. These are the dynamic blurbs that will be rotated sequentially every time a viewer returns to that page and it is reloaded, or when the viewer selects the refresh icon. The blurbs you want to set up are virtually limitless and can be graphic or textual based. The sample group name in this case is 02blurb test.
2. Click Submit Group.

Active Data Randomizer Administration The new blurb group 02blurb test was added to the Blurb Demo site.
Site Configuration Options = Add a New Site Configuration = Change a Site Conflation = Delete a Site Configuration = Generate a Site's Administration Code Site Blurb Functions for _~ _ = Add a New Group = Delete a Group = View Groups = Add a New HTML Blurb = View, Modify or Delete HTML Blurbs = Generate Blurb Code A
Figure 4 New Group Confirmation Message 3. You will be returned to the main menu. A confirmation that your group has been created is shown in red text. It repeats the Group Name and the Site Name that it has been added to.
4. To continue click on Add a New HTML Blurb, located in the lower group of bulleted items.
Active Data Exchange. Page 5 www.activedatax.com This document contains confidential information. No part of this document maybe be reproduced or transmitted, in any form or by any means without the express written permission of Active Data Exchange.
@Copyright 2001, all rights reserved.

ictiv 'data YouR CONTENT. ANY PLACE. ANYTIME.
Ot-change Active Data Randomizer User Guide Step 3 HTML Blurbs You will arrive at this window when Add a New HTML Blurb is chosen from the New Group Confirmation screen. From here you are able to set up a new location to display Active Data Randomizer messages or return to the Menu.

Active Data Randomizer Administration Add a NewBlurb to the Site Blurb Demo Group Name j 02blurb test I
blurbl r 3i '1 (i Blurb HTMLj J .il {
s'r Figure 5 New Active Data Randomizer Blurb Group 1. From the Add a New randomizer screen, select the Group Name from the pull down menu you want this new HTML blurb added to.
2. Enter or Copy and Paste the HTML code for the picture or text or both that you want to show in the refreshed window. This information is retrieved from your original document's source code from whatever HTML editor program you are using.

Active Data Exchange. Page 6 www.activedatax.com This document contains confidential information. No part of this document maybe be reproduced or transmitted, in any form orby any means without the express written permission of Active Data Exchange.
Copyright 2001, all rights reserved.

(0cth a"data YOUR CONTENT. ANY PLACE. ANY TIME.
nge, Active Data Randomizer User Guide AdiveData RandomieerAdmintsfratioa Add aNewEbab to the Site Blurb Denw Gump Name blutbt e ~bttp ff spp evi Ct datar.
width24 blorbdemor alte--O .ltd' hrigh~112border?0'> p, 4 AdiveData RandomizerAdministration be bGatddea~cas~17 VI-, Modify or Deletemarbsfrua the croup O2bmb t t .BlurbiTTMi. .. [ - ppb Bhvb SlTML l Blurb 5rottew cIDeletel ib bd-. 6b oW m ~ dth=24 . 3 _- _ __ i . " j .

~ULEHR. M, Figure 6 New Active Data Randomizer Blurb HTML Confirmation 3. Click on Submit Blurb. A confirmation screen will show that the blurb has been added.
You are still able to modify or delete your blurb in the future if necessary.
Any action you take at this step will be confirmed within the next window in red text.

To add another HTML blurb:
1. Click on Cf ppyl and Randomizer will automatically duplicate your last HTML
blurb.
2. Either insert new HTML text or alter your HTML text, as in the case of changing the image only, you can just update the name of the source image, without having to re-enter all new HTML.
3. Select the Submit Blurb button after each entry. to save the changes Each entry will be confirmed and added to your list of HTML blurbs.
4. Repeat this process until you have added all your HTML blurbs.
5. Select Go Back to Menu.

Step 4 Java Script Code Once you have returned to the Site Configuration main screen, 1. Select Generate Blurb Code from the lower level bulleted options.
2. Active Data Blurb Admin will automatically write the Java Script needed to instruct your site to sequentially rotate the HTML sources. This Java will include all necessary instructions to refresh the image in the window each time it is reloaded or manually refreshed.

Active Data Exchange. Page 7 www.activedatax.com This document contains confidential information. No part of this document maybe be reproduced or transmitted, in any form or by any means without the express written permission of Active Data Exchange.
Copyright 2001, all rights reserved Jp~ YOUR CONTENT. ANY PLACE. ANY TIME.
,nq0 Active Data Randomizer User Guide Active Data Randomizer Administration Blurb Machine Code for the Group 02blurb test of the Site Blurb Demo (copy and paste into target site's HTML) <SCRIPT LANGTJAGE=I?javaseriptlr>document. write ('<SCR\IPT LANGUAGE='tjavascript"
SRC="http://pub1isher3.activedeLtax.com/servlet/coax activedatax.products. Blurb. JBlurb?
jbgid=860582&jbgid=271221&jbdurl=' + escape (location.href) + '&jbrand=' + escape(Nath.random O) + '"><\/SCR\IPT>');</SCRIPT> I i Figure 7 Active Data Randomiser Blurb Code 3. Highlight and copy this Java Script 4. Return to your primary source document using your HTML Editing program and select the HTML source view.

C; <TR>CID 3Pm=640 C'DLSPAF.'.3+U href..hone.htn"><IBG border=0 beigbt.27 src=^lmgea/logoa.gic^
Jp. - vldth-239X/e><iv b:ei="paesnevs.h ^.=<IHG al t=^" boOder=0 height-27 err.'ioagea/12paesnevs.git^
h:ef. poccfotianeva.hea'7<ICD alt' ' bordet.D bri ght.27 ail oidth.131Xh><2 ce-"images/l2poettolioneo6.glt" vidtb-13b</o><ICG bocdet-0 scc-"ineges/12oeea.git"></TD></TR+
t'Pa> D ltLlB.239 7ALEES.tnpXA brat. "hone.hn"><IHG alt.^PA Early Stage"
border-0 height -50 src-^ineges/logob.gIt" width-239 ><i%'<BID
f table nidt*~-"239" EE615P1C-:IG-0 CELLPADDIBG.O BO[LEF:-q<tt><td tALIhi. ctp SIDTR-38'XIBG sl bordat=l heightt275 s c="iaagea/Eade2. git" width-35 VALIGY."TOP"></t^<.<TD
gIDmm.201 VALIGE.top><BR><pbScRiFr LAIIWACE-^javesceipt^>dotvaent_arite ('<SLR\IP7 LAIDGUAGE-^javastript^
I-', SRC=^http://poblisher3.
ectivrAatas.cos/serolet/con.native,alas.ptoaoct,.Dlorb.m2orb?jhsidt3Sf28t jbgid=2 d1W6ajbdvr2-' + eacapa(Ioattion.href) + 'sjbtamt.' + escape(Mo th.
randon(J) +
"'X\/SCRIIPT>'1:</SCRIPIX/p>

<frh,/t:.lItable></lD>
<'ir t'il m.iD w.LzGv.top><2CG border-0 haigbe-1 arc."looyes/rleer.Qit" width-lOX/31'.>
<'ID PALIGB-tolo<DR><fSot face.^ACinl, lielveticn, sms-eecit^ size- I"XIRG
alt.^" bocdet-0 height.27 art-imago/b- QiE" 11dth.217XP>
<foot color-/2d4491-,<b <A htet=^paeeoeva.hta">PA Early Stage IDevs<)og/b>C/font <Pr <foat eoloc-^12d4491?December 4, 200D<B10<b><A bref.^pr ajunto120400.btn^>PA
Early Stage Company, Agents, Inc., Favs Strategic Allimce Vitt oarciramrt</e></fontX/B><bsXfont -1. 33 Figure 8 Sample HTML Editor 5. Paste the Active Data Randomizer Java script you have copied into your original source document for the Web page.

Active Data Exchange. Page 8 www.activedatax.com This document contains confidential information. No part of this document maybe be reproduced or transmitted, in any form or by any means without the express written permission of Active Data Exchange.
Copynght 2001, all rights reserved.

active, data YOUR CONTENT. ANYPLACE. ANY TIME.
tlitinge Active Data Randomizer User Guide NOTE-Make sure you are within the proper location on your Web page. Paste the script in the exact position where you want the message to be displayed on the page.
6. Exit (or close) your HTML editing program and return to the Active Data Randomizer Administration screen.
7. Click the Return to Menu button.

Step 5 Verify or Modify Blurb Groupings From the main Active Data Randomizer Administration window, you may view your group of messages. Active Data Randomizer presents both the HTML and a visual of the output.
1. Choose the View, Modify. Delete HTML Blurb to view and confirm your message or messages.
Active Data Randomizer Administration View, Mollify or Delete Blurbs from the Group In the News -O tsons ll Blurb HTNIL Blurb Preview Co <1mg 67 E ~I r. .1 [MMO y]!src='http:l/www.paearlystage.comfimages/logo_airput.Jpg"
~ [Delete] border--"O">_._ [-Copy] < 1 ,IA ' [Modify]Isrc='httpi/www.paearlystage.com/images/ogoõleadwyne.glf'l .." ~.
Delete]' border-O">
GL1.DWYNE
I [Conn] <il>
[MModify]; src="http://www.paearlystage.conl/images/pinthenews.jpg' ' # a [Delete] width=180 height--158 alt="" border="0"><BR><font face="Anal, Helvetica, sans-serif" size="-2">Charhe Clark !I
(VerticalNet), Michael Carter (Ajunto), Mary Naylor (VIP 11 Desk), Mike Bolton</font>

Charlie Cladc(Verticaltlet) Michael t(! Carter(Alunto) Mary Naylor (VIP _ - - - -------Figure ~DZ Mike Bolton [ I t ~.1Gfi t.

9 Confirmation and View Message Window 2. A preview image of the actual image that will be shown on a viewer's screen. Select Go Back to Menu to pretest the messages.

Active Data Exchange. Page 9 www.activedatax.com This document contains confidential information. No part of this document maybe be reproduced or transmitted, in any form or by any means without the express written permission ofActive Data Exchange.
Copyright 2001, all rights reserved.

YOUR CONTENT. ANY PLACE. ANY TIME.
~ctiv data CFl4iflge Active Data Randomizer User Guide Step 6 Rotating Blurbs for Preview It is best to always pretest the site to make sure your messages are being presented properly.
1. Open any separate browser window and point to the page you want to check.
2. Choose refresh to view the new message in the Group you have been assigned to that page.
Continue to choose refresh or move to another page and return to the original page to verify that your messages have changed. At times it is normal for Active Data Randomizer to repeat a message or image.
3. Exit Step 7 Exit Users may exit Active Data Randomizer Administration by simply leaving or closing your browser window.

About Active Data Exchange Active Data Exchange is a leader in syndication software solutions that empower companies to get the right content to the right place at the right time. Active Data Exchange helps create highly effective information delivery chains with partners, customers, vendors, distributors, investors, and other target groups and affects commerce with communications tools better than existing email technologies. The company is active in several industry standards committees including the Information and Content Exchange Authoring Group and the W3C XML Protocol Standards Committee. Clients include Crown, Cork and Seal, MainStreet Networks, Turner Construction, Penn Mutual Life Insurance, DeSales and Lehigh University.

Active Data Exchange. Page 10 www.activedatax.com This document contains confidential information. No part of this document maybe be reproduced or transmitted, in any form or by any means without the express written permission of Active Data Exchange.
Copyright 2001, all rights reserved.

Appendix E
/**
* Title: Active Data Blurb Machine<p>
* Description: Dynamic HTML content generation without the need for a client install.<p>
* Copyright: Copyright (c) John E. Wetzel<p>
* Company: Active Data Exchange, Inc.<p>
* @author: John E. Wetzel * @version: 1.0a package com. activedatax.products.Blurb;
import javax.servlet.*;
import javax.servlet.http.*;
import com.activedatax.products.Blurb.dbmodules.*;
import com.activedatax.products.Blurb.html.*;
import com.activedatax.sgl.HttpServletDb;
import com.activedatax.utils.HTMLQuoter;
import java.io.*;
import java.net.*;
import java.util.*;
import java.sgl.*;
import gnu.regexp.*;
import java.net.URL;

public class AdminNenu extends HttpServletDb {
private BlurbCommon mycommon;
private String server =
private String dbname =
private String thisServlet private String serverRoot private String fLink =
private String fPost =

Initialize global variables public void init(ServletConfig config) throws ServletException {
super.init(config);

//USE BlurbCommon.class TO GET PROPERTIES -- SERVER & DATABASE NAME
mycommon = new BlurbCommon ( ;
Properties p = mycommon.getProps(;
serverRoot = p.getProperty("server.root");
server = p.getProperty ("default.server");
dbname = p.getProperty ("default.dbname");
//store the alias in p = mycommon.getAliases();
thisServlet = p.getProperty("AdminMenu");
fLink = serverRoot + thisServlet;
fPost = serverRoot + thisServlet;
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String outputHTML = doBlurb(request, response, this.fLink, this.fPost, false);
response. setContentType("text/html");
PrintWriter out = response.getWriter(;
//System.out.println(request.getParameter("jbact"));
out.println(outputHTML);
return;
}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String outputHTML = doBlurb(request, response, this.fLink, this.fPost, false);
response. setContentType("text/html");
PrintWriter out = response.getWriter(;
out. println(outputHTML);
return;

public String doBlurb(HttpServletRequest request, HttpServletResponse response, String forwardLink, String forwardPost, boolean syndicated) throws ServletException, IOException {
int jbsid, jbgid, jbbid;
String outputHTML
String param = , String action = request. getParameter("jbact");
try {
jbsid = Integer.parselnt(request.getParameter("jbsid").trim());
} catch(Exception e) { jbsid = -1; }

try {
jbgid = Integer.parselnt(request.getParameter("jbgid").trim());
} catch(Exception e) { jbgid = -1; }

try {
jbbid = Integer.parselnt(request.getParameter("jbbid").trim());
} catch(Exception e) { jbbid = -1; }

if(jbsid == -1) { //get the blurb site_id of the first site in the drop-down list box jbsid = getFirstSiteld();
}
if ((action == null) 11 (action.length() == 0)) {
outputHTML =
AdminMenuHTML.getAdminMenu(jbsid, forwardLink,getSiteSelectList(jbsid, true, syndicated),"',syndicat ed);
}
else {
if (action.equalslgnoreCase("add")) {
outputHTML = AdminMenuHTML.siteAddorModify(forwardLink,-1,"","","http://","");
} else if (action.equalslgnoreCase("addpost")) {
outputHTML = doSiteAdd(request, response, syndicated);
) else if (action.equalslgnoreCase("getpostdata")) {
outputHTML =
AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid, true, syndicated),"",syndicat ed);
} else if (action.equalslgnoreCase("addbg")) {
outputHTML =
AdminMenuHTML.groupAdd(jbsid,-1,forwardLink,forwardPost,"",getSiteNameFromId(jbsid),"");
I else if (action.equalslgnoreCase("addbgpost")) {
outputHTML = doGroupAdd(request,response,forwardLink,forwardPost,syndicated);
} else if (action.equalslgnoreCase("addbb")) {
outputHTML = addBlurb(jbsid, forwardLink, forwardPost, syndicated);
} else if (action.equalslgnoreCase("copybb")) {
outputHTML = copyBlurb(jbsid,jbgid,jbbid,forwardLink,forwardPost, syndicated);
} else if (action.equalslgnoreCase("chgbb")) {
outputHTML = changeBlurb(jbsid, jbgid, jbbid, forwardLink, forwardPost, syndicated);
} else if (action.equalslgnoreCase("chgbbpost2")) {
outputHTML =
doBlurbChange(request,response,forwardLink,forwardPost,syndicated);
} else if (action.equalslgnoreCase("addbbpost")) {
outputHTML = doBlurbAdd(request,response,forwardLink,forwardPost,syndicated);
} else if (action.equalslgnoreCase("chg")) {
outputHTML = changeSiteSelect(syndicated);
} else if (action.equalslgnoreCase("gensitecode")) {
outputHTML = genSiteCodeSelect(syndicated);
} else if (action.equalslgnoreCase("gensitecodepostl")) {
outputHTML =
AdminMenuHTML.generateSiteAdminCode(jbsid,forwardLink,this.serverRoot,getSiteNa meFromld(jbsid));
I else if (action.equalslgnoreCase("chgpostl")) {
outputHTML = changeSiteDetails(request, response, syndicated);
} else if (action.equalslgnoreCase("chgpost2")) {
outputHTML = doSiteChange(request, response, syndicated);
} else if (action.equalslgnoreCase("del")) {
outputHTML = deleteSiteSelect(syndicated);

} else if (action.equalslgnoreCase("delbg")) {
outputHTML = del eteGroupSelect (jbsid, forwardLink, forwardPost, syndicated);

} else if (action.equalsIgnoreCase("delbb")) {
outputHTML = viewGroupBlurbs(jbsid,jbgid,jbbid,forwardLink,forwardPost,"Are you <B>sure</B> you want to delete the blurb shown?", syndicated);
} else if (action.equalsIgnoreCase("viewbb")) {
outputHTML = viewBlurbSelect(jbsid,forwardLink,forwardPost,syndicated);
} else if (action.equalsIgnoreCase("viewbbpostl")) {
outputHTML = viewGroupBlurbs(jbsid,jbgid,-1,forwardLink,forwardPost,"",syndicated);
} else if (action.equalsIgnoreCase("delbgpostl")) {
outputHTML =
deleteGroupDetails(jbsid,forwardLink,forwardPost,request,response,syndicated);
} else if (action.equalsIgnoreCase("delbgpost2")) {
outputHTML =
doGroupDelete(jbsid,forwardLink,forwardPost,request,response,syndicated);
} else if (action.equalslgnoreCase("delbbpostl")) {
outputHTML =
doBlurbDelete(jbsid,jbgid,jbbid,forwardLink,forwardPost,syndicated);
} else if (action.equalsIgnoreCase("delpostl")) {
outputHTML = deleteSiteDetails(request, response, syndicated);
} else if (action.equalsIgnoreCase("delpost2")) {
outputHTML = doSiteDelete(request, response, syndicated);
} else if (action.equalsIgnoreCase("genbcode")) {
outputHTML = generateBlurbCode(jbsid,forwardLink,forwardPost, syndicated);
} else if (action.equalsIgnoreCase("viewbg")) {
outputHTML = viewGroups(jbsid,forwardLink,forwardPost,syndicated);
} else if (action.equalslgnoreCase("genbcodepostl")) {
outputHTML =
AdminMenuHTML.generateBlurbCode(jbsid,jbgid,forwardLink,this.serverRoot,getSite NameFromId(jbsid), getGroupNameFromId(jbgid));
}
}

return outputHTML;
}

private synchronized String doSiteAdd(HttpServletRequest request, HttpServletResponse response, boolean syndicated) {
boolean errFlag = false;
int id = 0;
int count = 1;
double tempval;
Connection conn;
Vector rs = null;
BlurbSiteDB bs = new BlurbSiteDBO;
String blurb site name = request. getParameter("blurb_site_name").trim();
String description request.getParameter("description").trim();
String url = request. getParameter("url").trim ();
Test if site, desc, and http:// are valid try {
if (blurb_site_name.trimt).equalsIgnoreCase("")) {
return AdminMenuHTML.siteAddOrModify(this.serverRoot + this.thisServlet, -1, blurb_site_name, description, url, "An error occured. An invalid <B>Site Name or Site Description/B> was entered.") }
if (description.trim()=equalsIgnoreCase("")) {
return AdminMenuHTML.siteAddOrModify(this.serverRoot + this.thisServlet, -1, blurb site name, description, url, "An error occured. An invalid <B>Site Name or Site Description</B> was entered.") }
}
catch(Exception e) {
BlurbConmmon.handleException(a);
return AdminIenuHTML.siteAddorModify(this.serverRoot + this.thisServlet, -1, blurb site_name, description, url, "An error occured. An invalid <B>Site Name or Site Description</B> was entered.") }
Test for a valid URL

if (url.length O > 9) {
if (url.substring(0,7).equalsIgnoreCase("http://")) {
} else if(url.subs tring(0,8).equalsIgnoreCase("https://")) {
} else {
return AdminMenuHTML. siteAddOrModify (this. serverRoot +
this. thisServlet,-1,blurbsite name,description,url,"An error occurred. An invalid <B>Site URL</B> was entered.");
}
} else {
return AdminMenuHTML. siteAddOrModify (this. serverRoot +
this. thisServlet, -1,blurbsite_name,description,url,"An error occurred. An invalid <B>Site URL</B> was entered.");
}
if (!url.substring(0,5).equals IgnoreCase("https")) {
try ( TJRL testURL = new URL(url);
}
catch(Exception e) {
BlurbCommon.handleException(e);
return AdmihMenuHTML.siteAddOrModify(this.serverRoot +
this. thisServlet,-l,blurb_site_name,description, url,"An error occurred. An invalid <B>Site URL</B> was entered.");
}
}

Pick a random id for blurb site and make sure that a record with that id doesn't already exist.

conn = dataConnMan.getConnection(server, dbname);
while (count > 0) {
tempval = Math. floor (1000000 * Math.random()) id = (int)tempval;
try {
rs = bs.getAll(conn, "blurb_site_id + id);
} catch(Exception e) {
BlurbCommon.handleException(e);
break;
}
count = rs.size();
}
dataConnMan.freeConnection(server, dbname, conn);
if (count > 0) return AdminMenuHTML.getAdminRenu(getFirstSiteId(), this.serverRoot + this.
thisServlet, getSiteSelectList(getFirstSiteld(),true, syndicated) ,"An error occurred. The new site configuration was not added.",syndicated);

Make sure that blurb_sitename doesn't already exist in the database.
conn = dataConnMan.getConnection(server, dbname);
try {
//blurb site_name = new RE("'").substituteAll(blurb site_name, rs = bs.getAll(conn, "blurb_site_name = '" + new RE("'"). subs tituteAll(blurb_site_name, + ",");
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(rs.size() > 0) return AdminMenuHTML.siteAddOrModify(this.serverRoot +
this. thisServlet,-1,blurbsite name,description,url,"The site <B>" + blurb--site-name + "</B>
already exists. Please try again.");
if(errFlag) return AdminMenuHTML.getAdmipMenu(getFirstSiteId(), this.serverRoot +
this.thisServlet, getSiteSelectList (getFirstSiteld (),true, syndicated), "An error occurred.
The new site configuration was not added.",syndicated);

//attempt to do the database insert of the new blurb site record;
bs.blurb_site_id = id;
bs.blurb site_name = blurb site_name;
bs.description = description;
bs.url = url;
bs.status = "Y";
bs.created_on = new java.util.Date();
bs.last modified_on = new java.util.Date();

conn = dataConnMan. getConnection (server, dbname);
try {
bs.insert(conn);
} catch (Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan. freeConnection (server, dbname, conn);
if(errFlag) return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot + this.
thisServlet, getSiteSelectList(getFirstSiteId(), true, syndicated), "An error occurred. The new site configuration was not added.",syndicated);
else return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(), true, syndicated), "The new site configuration for <B>" +
blurb site_name + "</B> was added successfully. ,syndicated);
}
private synchronized String doGroupAdd(HttpServletRequest request, HttpServletResponse response, String forwardLink, String forwardPost, boolean syndicated) {
boolean errFlag = false;
int id = 0;
int count = 1;
double tempval;
Connection conn;
Vector rs = null;
BlurbGroupDB bg = new BlurbGroupDB();
int jbsid = integer. parselnt(request.getParameter("jbsid").trim());
String blurb_group name = request. getParameter("blurb_group name").trim();
//String description = request. getParameter("description").trim();

if (blurb-group-name == null) {
return AdminMenuHTML.groupAdd(jbsid,-1,forwardLink, forwardPost,blurbgroup_name,getSiteSelectList(jbsid, false, syndicated),"An Invalid blurb group name. Please try again.");
} else if (blurb group_name.trim().equalslgnoreCase("")) {
return AdminlenuHTML.groupAdd(jbsid,-l,forwardLink, forwardPost,blurb_group name,getSiteSelectList(jbsid, false, syndicated), "An Invalid blurb group name. Please try again.");
}
Pick a random id for blurb group and make sure that a record with that id doesn't already exist.

conn = dataConnMan.getConnection(server, dbname);
while (count > 0) {
tempval = Math.floor(1000000 * Math.random()) ;
id = (int)tempval;
try {
rs = bg.getAll(conn, "blurb_group_id + id);
} catch(Exception e) {
BlurbCommon.handleException(e);
break;
}
count = rs.size();
}
dataConnMan.freeConnection(server, dbname, conn);
if (count > 0) return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(getFirstSiteId() ,true,syndicated), "An error occurred. The new blurb group was not added.",syndicated);

Make sure that blurb_group name doesn't already exist in the database.
conn = dataConnMan.getConnection(server, dbname);
try {
rs = bg.getAll(conn, "blurb group_name = '" + new RE("'").substituteAll(blurb_group name, + ",");
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(rs.size() > 0) return AdminBenuHTML.groupAdd(jbsid,-1,forwardLink, forwardPost,blurb_group_name,getSiteSelectList(jbsid, false, syndicated),"The group <B>" + blurb_group name + "</B> already exists.
Please try again.");
if(errFlag) return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated), "An error occurred. The new blurb group was not added.",syndicated);

//attempt to do the database insert of the new blurb group record;
bg.blurb site_id = jbsid;
bg.blurb group id = id;
bg.blurb_group_name = blurb_group_name;
//bg.description = description;
bg.status = "Y";
bg.created_on = new java.util.Date();
bg.last_modified_on = new java.util.Date();

conn = dataConnMan.getConnection(server, dbname);
try {
bg.insert(conn);
} catch (Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return AdminMenuHTML. getAdminMenu (jbsid, forwardLink, getSiteSelectList (jbsid, true, syndicated), "An error occurred. The new blurb group was not added.",syndicated);
else return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated), "The new blurb group <B>" + blurb_group_name + "</B> was added to the <B>" +
getSiteNameFromId(jbsid) +
"</B> site.",syndicated);
}
private synchronized String doBlurbAdd(HttpServletRequest request, HttpServletResponse response, String forwardLink, String Ãorwardpost, boolean syndicated) {
boolean errFlag = false;
int id = 0;
int count = 1;
double tempval;
Connection conn;
Vector rs = null;
BlurbDB bb = new BlurbDB();
GregorianCalendar gc = new GregorianCalendar();
int jbsid = Integer.parseInt(request.getParameter("jbsid").trim());
int jbgid = Integer.parselnt(request.getParameter("jbgid").trim());
String html = request.getParameter("html").trim();

Pick a random id for blurb and make sure that a record with that id doesn't already exist.

conn = dataConnMan.getConnection(server, dbname);
while (count > 0) {
tempval = Math.floor(1000000 * Math.random()) id = (int)tempval;
try {
rs = bb.getAll(conn, "blurb id = " + id);
} catch(Exception e) {
BlurbCommon.handleException(e);
break;
}
count = rs.sizeO;
}
dataConnMan. freeConnection (server, dbname, conn);
if (count > 0) return AdminMenuHTML.getAdminNenu(jbsid,forwardLink,getSiteSelectList(jbsid,true,syndi cated),"An error occurred. The new blurb was not added.", syndicated);

//attempt to do the database insert of the new blurb record;
bb.blurb site_id = jbsid;
bb.blurb_group_id = jbgid;
bb.blurb id = id;
bb.html = html;
bb.status = "Y";

//bb.created_on = new java.util.Date();
bb.created_on = new Timestamp(gc.getTime()-getTime();
bb.last modified_on = new Timestamp(gc.getTime().getTime();
conn = dataConnMan.getConnection(server, dbname);
try {
bb.insert(conn);
} catch (Exception e) {
BlurbCommon.handleException(a);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return AdminmenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated), "An error occurred. The new blurb was not added.",syndicated);
else return viewGroupBlurbs(jbsid,jbgid,-1,forwardLink,forwardPost,"The new blurb was added successfully.",syndicated);
}
private String doSiteChange(HttpServletRequest request, HttpServletResponse response, boolean syndicated) {
boolean errFlag = false;
Connection conn;
Vector rs = null;
BlurbSiteDB bs = new BlurbSiteDBO;
int id = Integer.parseInt(request.getParameter("jbsid").trim());
int tempid = id;
String blurb site_name = request. getParameter("blurb site_name").trim();
String description = request.getParameter("description").trim(;
String url = request.getParameter("url").trim();
Test if site, desc, and http:// are valid try {
if (blurb_site_name.trim().equalsIgnoreCase("")) {

return AdminMenuHTML.siteAddOrModify(this.serverRoot + this.thisServlet, id, blurb_site_name, description, url, "An error occured. An invalid <B>Site Name or Site Description</B> was entered.") }
if (description.trim().equalslgnoreCase("")) {
return AdminMenuHTML.siteAddOrModify(this.serverRoot + this.thisServlet, id, blurb site_name, description, url, "An error occured. An invalid <B>Site Name or Site Description</B> was entered.") }
}
catch(Exception e) {
BlurbCommon.handleException(e);
return AdminMenuHTML.siteAddOrModify(this.serverRoot + this.thisServlet, id, blurb site name, description, url, "An error occured. An invalid <B>Site Name or Site Description</B> was entered.") }
Test for a valid URL
if (url.length O > 9) {
if (url.substring(0,7).equalslgnoreCase("http://")) {
} else if(url.substring(0,8).equalslgnoreCase("https://")) {
} else {
return AdminMenuHTML.siteAddOrModify(this.serverRoot +
this.thisServlet,id,blurb_site_name,description,url,"An error occurred. An invalid <B>Site URL</B> was entered.");
}
} else {
return AdminMenuHTML.siteAddOrModify(this.serverRoot +
this.thisServlet,id,blurb site_name,description,url,"An error occurred. An invalid <B>Site URL</B> was entered.");
}
if (!url.substring(0,5).equalsIgnoreCase("https")) {
try {
URL testURL = new URL(url);
}
catch(Exception e) {
BlurbCommon.handleException(e);
return AdminMenuHTML.siteAddOrModify(this.serverRoot +
this.thisServlet,id,blurb_site_name,description,url,"An error occurred. An invalid <B>Site URL</B> was entered.");
}
}

Make sure that the new blurb site_name doesn't already exist in the database.
conn = dataConnMan.getConnection(server, dbname);
try {
//blurb site_name = new RE("'").substituteAll(blurb site_name, rs = bs.getAll(conn, "blurb site_name = '" + new RE("'').subs tituteAll(blurb site_name, + ",");
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return AdminNenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteld(),true,syndicated), "An error occurred. The site configuration change was not completed.",syndicated);

if(rs.size() > 0) {
Enumeration e = rs.elements();
while (e.hasMoreElements()) {
BlurbSiteDB record = (BlurbSiteDB) e.nextElement();
tempid = record. blurb site-id;
}

if(tempid != id) return AdminMenuHTML.siteAddOrModify(this.serverRoot +
this. thisServlet,id,blurb_site_name,description, url,"The site <B>" + blurb site_name + "</B>
already exists. Please try again.");
}
//attempt to do the database update of the modified blurb site record;
bs.blurb site_id = id;
bs.blurb site_name = blurb site_name;
bs.description = description;
bs.url = url;
bs.status = "Y";
bs.created_on = new java.util.Date();
bs.last_modiied_on = new java.util.Date();

conn = dataConnMan.getConnection(server, dbname);
try {
bs.update(conn);
} catch (Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteld(), true, syndicated), "An error occurred. The site configuration was not changed.",syndicated);
else return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getsiteSelectList(getFirstSiteld(), true, syndicated), "The site configuration for <B>" +
blurb_site_name + "</B> was changed successfully.",syndicated);
}
private String doBlurbChange(HttpServletRequest request, HttpServletResponse response, String forwardLink, String forwardPost, boolean syndicated) {
boolean errFlag = false;
Connection conn;
Vector rs = null;
BlurbDB bb = new BlurbDB();
int jbsid = Integer.parselnt(request.getParameter("jbsid").trim());
int jbgid = Integer.parselnt(request.getParameter("jbgid").trim());
int id = Integer.parselnt(request.getParameter("jbgid").trim());
int tempid = id;
String html = request.getParameter("html").trim();

//attempt to do the database update of the modified blurb record;
bb.blurb id = id;
bb.blurb_group_id = jbgid;
bb.blurb site_id = jbsid;
bb.html = html;
bb.status = "Y";
bb.created_on = new java.util.Date();
bb.last_modified_on = new java.util.Date();

conn = dataConnMan.getConnection(server, dbname);
try {
bb.update(conn);
} catch (Exception e) {
BlurbConmlon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated), "An error occurred. The blurb was not changed.",syndicated);
else //return AdminNenuHTML.getAdminMenu(jbsid, this.serverRoot + this.thisServlet, getSiteSelectList(jbsid,true), "The blurb was changed successfully.");
return viewGroupBlurbs(jbsid,jbgid,-l,forwardLink,forwardPost,"The blurb was changed successfully.",syndicated);
}
private String doSiteDelete(HttpServletRequest request, HttpServletResponse response, boolean syndicated) {
boolean errFlag = false;
Connection conn;
Vector rg = null, rb = null;
BlurbSiteDB bs = new BlurbSiteDBO;
BlurbDB bb = new BlurbDBO;
BlurbGroupDB bg = new BlurbGroupDB(;
int id = Integer.parselnt(request.getParameter("jbsid").trim());

//attempt to delete the blurb_site record and all associated blurb_group and blurb records;
bs.blurb site_id = id;
conn = dataConnMan.getConnection(server, dbname);
try {
rb = bb.getAll(conn,"blurb_site_id=" + id);
rg = bb.getAll(conn,"blurb site_id=" + id);
if(rb.size() > 0) Enumeration q = rb.elements();
while (q.hasMoreElements()) {
BlurbDB b_record = (BlurbDB) q.nextElement();
b record.delete(conn);
}
}

if(rg.size() > 0) {
Enumeration x = rg.elements();
while (x.hasMoreElements()) {
BlurbGroupDB g_record = (BlurbGroupDB) x.nextElement();
g_record.delete(conn);
}
}
bs.delete(conn);
} catch (Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, cone);
if(errFlag) return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteld(),true,syndicated), "An error occurred. The site configuration was not deleted.",syndicated);
else return AdminMenuHTML.getAdminNenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteld(),true,syndicated), "The site configuration was deleted successfully.",syndicated);

private String doGroupDelete(int jbsid, String forwardLink, String forwardPost, HttpServletRequest request, HttpServletResponse response, boolean syndicated) {
boolean errFlag = false;
Connection conn;
Vector rb = null;
BlurbDB bb = new BlurbDB();
BlurbGroupDB bg = new BlurbGroupDB U ;
int id = Integer.parselnt(request.getParameter("jbgid").trim());

//attempt to delete the blurb_group record and all associated blurb records;
bg.blurb_group_id = id;
conn = dataConnMan.getConnection(server, dbname);
try ( rb = bb.getAll(conn,"blurb_site_id=" + jbsid + " and blurb--group-id + id);
if(rb.size() > 0) {

Enumeration q = rb.elements();
while (q.hasMoreElements()) {
BlurbDB b_record = (BlurbDB) q.nextElement();
b record.delete(conn);
}
}
bg.delete(conn);
} catch (Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, cone);
if(errFlag) return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated),"An error occurred. The group was not deleted.",syndicated);
else return AdminNenuHTML.getAdminNenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated),"The group was deleted successfully.",syndicated);
}
private String doBlurbDelete(int jbsid, int jbgid, int jbbid, String forwardLink, String forwardPost, boolean syndicated) {
boolean errFlag = false;
Connection conn;
Vector v = null;
BlurbDB bb = new BlurbDB();
//attempt to delete the blurb record bb.blurb_id = jbbid;
conn = dataConnMan.getConnection(server, dbname);
try {
bb.delete(conn);
} catch (Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated),"An error occurred. The blurb was not deleted.",syndicated);
else return viewGroupBlurbs(jbsid,jbgid,-1,forwardLink,forwardPost,"The blurb was deleted successfully.",syndicated);
}
//private String getSiteSelectList(int ibsid, boolean syndicated) {
//return getSiteSelectList(jbsid,false, syndicated);
//}
private int getFirstSiteld() {
boolean errFlag = false;
boolean first = true;
int id = -1;
BlurbSiteDB bs = new BlurbSiteDBO ;
Vector v = null;
Connection conn = dataConnMan.getConnection(server, dbname);
try {
v = bs.getAll(conn, "1=1 order by blurb site_name asc");
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);

if(errFlag) return -1;

Enumeration e = v.elements();
if(v.size O > 0) {
while (e.hasMoreElements() {
BlurbSiteDB record = (BlurbSiteDB) e.nextElement();
if(first) id = record.blurb_site_id;
first = false;
}
} else {
id = -1;
}
return id;

private String getSiteNameFromId(int jbsid) {
boolean errFlag = false;
String blurb_site_name = "
BlurbSiteDB bs = new BlurbSiteDB();
Vector v = null;
Connection conn = dataConnMan.getConnection(server, dbname);
try {
v = bs.getAll(conn, "blurb_site_id,=" + jbsid);
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return "error";
Enumeration e = v.elements();
if(v.size() > 0) {
while (e.hasMoreElements() {
BlurbSiteDB record = (BlurbSiteDB) e.nextElement();
blurb_site_name = record.blurb site_name;
}
} else {
blurb_site_name = "error";
}
return blurb_site_name;
}

private String getGroupNameFromId(int jbgid) {
boolean errFlag = false;
String blurb_group_name BlurbGroupDB bg = new BlurbGroupDB();
Vector v = null;
Connection conn = dataConnMan.getConnection(server, dbname);
try v = bg.getAll(conn, "blurb_group_id =" + jbgid);
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnNan.freeConnection(server, dbname, conn);
if(errFlag) return "error";
Enumeration e = v.elements();
if(v.size() > 0) {
while (e_hasMoreElements()) {
BlurbGroupDB record = (BlurbGroupDB) e.nextElement();
blurb_group_name = record.blurb group_name;
}

} else {
blurb_group_name = "error";
}
return blurb group name;

private String getBlurbHTMLFromId(int jbbid) {
boolean errFlag = false;
String html = , BlurbDB bb = new BlurbDBO;
Vector v = null;
Connection conn = dataConnMan.getConnection(server, dbname);
try {
v = bb.getAll(conn, "blurb--id =" + jbbid);
} catch(Exception e) {
B1urbCommon.handleException(e);
errFlag = true;
}
dataConnnan.freeConnection(server, dbname, Conn);
if(errFlag) return "error";
Enumeration e = v.elements();
if(v.size() > 0) {
while (e.hasNoreElements()) {
BlurbDB record = (BlurbDB) e.nextElement();
html = record.html;
}
} else {
html = "error";
}
return html;
}

private String getSiteSelectList(int jbsid, boolean includejavascript, boolean syndicated) {
boolean errFlag = false;
boolean first = true;
BlurbSiteDB bs = new BlurbSiteDBO;
Vector v = null;

if(syndicated) return getSiteNameFromId(jbsid);
else {
Connection conn = dataConnMan.getConnection(server, dbname);
try {
v = bb.getAll(conn, "1=1 order by blurb site name asc");
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return "error";
Enumeration e = v.elements();
StringBuffer sb = new StringBuffer(;
StringBuffer jParams = new StringBuffer();
StringBuffer js = new StringBuffer();
if(v.size() > 0) {
if(includeJavascript) sb.append("<SELECT NAME=\"jbsid\" onChange=\"jgo(this, 1, false)\">" + '\r');
else sb.append("<SELECT NAME=\"jbsid\">" + '\r');
while (e.hasNoreElements()) {
BlurbSiteDB record = (BlurbSiteDB) e.nextElement(;
if(first) jParams.append("\"\",\"" + this.serverRoot + this.thisServlet + "?jbsid=" +

record.blurb_site_id + "\"");
else jParams.append(",\"" + this.serverRoot + this. thisServlet + "?jbsid=" +
record.blurb_site_id + "\"");

if((first) && (includeJavascript)) sb. append ("<option value=\"\">Select a site >></option>" + '\r');
if(jbsid == record.blurb_site_id) sb. append ("<option value=\"" + record.blurb site_id + "\" selected>" +
record. blurb site_name + "</option" + '\r');
else sb.append ("<option value=\- + record. blurb site_id + "\">" +
record.blurb_site_name + "</option>" + '\r');
first = false;
}
ss.append("</SELECT>" + '\r");
if(includeJavascript) {
String redirParams = jParams.toString();
js.append("<SCRIPT language=\"JavaScriptl.2\">" + '\r');
j s. append ("function buildArray() {" + '\r");
js.append("var a = buildArray.arguments;" + '\r');
js.append("for (i=0; i<a.length; i++) {" + '\r');
js.append("this[i] = a[i]; + '\r');
js.append("}" + '\r');
js.append("this. length = a.length;" + '\r');
js.append(")" + '\r');
js.append("var urlsi = new buildArray(" + redirParams + ");" + '\r');
J/ System.out.println(redirParams);
js.append("function jgo(which, num, win) {" + '\r');
js.append("n = which.selectedIndex;" + '\r');
js.append("if (n != 0) {" + '\r');
js.append("var url = eval(\"urls\" + num + \"[n]\")" + '\r');
js.append("if (win) {" + '\r');
js.append("openWindow(url);" + '\r');
js.append(") else {" + '\r');
j s. append(" location. href = url;" + '\r');
js.append(")" + '\r');
js.append(")" + '\r');
js.append(")" + "\r');
js.append("</SCRIPT>" + '\r');
}

} else {
return "none";
}
return js.toString() + sb.toString();
}
}

{
private String getGroupSelectList(int jbsid, int jbgid) boolean errFlag = false;
boolean first = true;
BlurbGroupDB bg = new BlurbGroupDB();
Vector v = null;
Connection conn = dataConnMan.getConnection(server, dbname);
try {
v = bg.getAll(conn, "blurb site_id = " + jbsid + " order by blurb-group--name asc");
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.reeConnection(server, dbname, corn);
if(errFlag) return "error";
Enumeration e = v.elements();
StringBuffer sb = new StringBuffer() ;

if(v.size() > 0) {
sb. append ("<SELECT NAME= \"jbgid\ ">" + '\r');
while (e.hasMoreElements() {
BlurbGroupDB record = (BlurbGroupDB) e.nextElement U ;
//if(first) //sb.append("<option value=\"\">Select a site >></option>" + '\r');
if(jbgid == record.blurb_group_id) sb.append("<option value=\"" + record.blurb_group_id + "\" selected>" +
record. blurb group name + "</option>" + '\r');
else sb.append("<option value=\"" + record. blurb group-id + "\">" + record. blurb group_name + "</option>" + '\r');
first = false;
}
sb.append("</SELECT>" + '\r');
} else {
return "none", }
return sb.toString(;
}

private String viewGroups(int jbsid, String forwardLink, String forwardPost, boolean syndicated) ( boolean errFlag = false;
BlurbGroupDB bg = new BlurbGroupDB(;
BlurbDB bb = new BlurbDB();
Vector v = null, z = null;
Connection conn = dataConnMan.getConnection(server, dbname);
try {
v = bg.getAll(conn, "blurb_site_id = + jbsid + " order by blurb_group_name asc");
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
Enumeration e = v.elements();
StringBuffer sb = new StringBuffer(;
if(v.size() > 0) {
conn = dataConnMan.getConnection(server, dbname);
while (e.hasMoreElements()) {
BlurbGroupDB record = (BlurbGroupDB) e.nextElement();
try {
z = bb.getAll(conn,"blurb_site_id + jbsid + " and blurb group_id +
record.blurb_group_id);
sb.append ("<tr><td align=left>&nbsp;&nbsp;&nbsp;" + record.blurb_group_name +
"</td><td align=left>&nbsp;&nbsp;&nbsp;" + z.size() + "</td></tr>" + '\r');
} catch(Exception ex) {
BlurbCommon.handleException(ex);
errFlag = true;
}
}
dataConnMan.freeConnection(server, dbname, conn);
} else {
return AdminMenuHTMt.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated), "No groups are currently configured. Please add a new group.",syndicated);
}
if(errFlag) return AdminMenuHTNL.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true,syndi cated),"An error occurred in connecting to the database.",syndicated);
else return AdminMenuHTML.viewGroups(jbsid,forwardLink,forwardPost,sb.toString(),getSiteNam eFromId(jbsid));
}

private String changeSiteDetails(HttpServletRequest request, BttpServletResponse response, boolean syndicated) {

boolean errFlag = false;
int id = Integer.parselnt(request.getParameter("jbsid").trim();
String blurb site_name String description String url = " ' Vector rs = null;
B1urbSiteDB bs = new B1urbSiteDB();

Connection conn = dataConnMan.getConnection(server, dbname);
try {
rs = bs.getAll(conn,"blurb_site_id = " + id);
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(),true, syndicated), "An error occurred in connecting to the database.",syndicated);

if(rs.size() > 0) {
Enumeration e = rs.elements();
while (e.hasMoreElements()) {
BlurbSiteDB record = (BlurbSiteDB) e.nextElement();
blurb_site_name = record. blurb_site_name;
description = record.description;
url = record.url;
}
} else {
return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(),true, syndicated) , The site record selected no longer exists in the database.",syndicated);
}
return AdminMenuHTML.siteAddOrNodify(this.serverRoot +
this.thisServlet,id,blurb_site_name,description,url,"");
}

private String changeSiteSelect(boolean syndicated) {
String param = getSiteSelectList(-1, false, syndicated);
if(param.equals("error")) {
return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(), true, syndicated), "An error occurred in connecting to the database.",syndicated);
} else if(param.equals("none")) {
return AdminMenuHTML.getAdminMenu(getFirstSiteId(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(true, syndicated), No sites are currently configured. Please configure a new site.",syndicated);
} else {
return AdminMenuHTML. selectSite (this. serverRoot + this.
thisServlet,"chg",param);
}
}
private string genSiteCodeSelect(boolean syndicated) {
String param = getSiteSelectList(-1, false, syndicated);
if(param.equals("error")) {
return AdminMenuHTML.getAdminMenu(getFirstSiteId(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(), true, syndicated), "An error occurred in connecting to the database-",syndicated);
} else if(param.equals("none")) {
return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(), true, syndicated), "No sites are currently configured. Please configure a new site.",syndicated);
} else {
return AdminMenuHTML.selectSite(this.serverRoot +
this.thisServlet,"gensitecode",param);
}
}
1*
private String changeGroupSelect(boolean syndicated) {
String param = getSiteSelectList(-1, false, syndicated);

if(param.equals("error")) {
return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(),true,syndicated), "An error occurred in connecting to the database.",syndicated);
} else if(param.equals("none")) {
return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(),true,syndicated), "No sites are currently configured. Please configure a new site.",syndicated);
} else {
return AdminMenuHTML.selectSite(this.serverRoot + this.
thisServlet,"chg",param);
}
}
private String deleteSiteSelect(boolean syndicated) {
String param = getSiteSelectList(-l, false, syndicated);
if(param.equals("error")) {
return AdminMenuHTML.getAdminMenu(getFirstSiteId(), this.serverRoot + this.
thisServlet, getSiteSelectList(getFirstSiteId(,true,syndicated), "An error occurred in connecting to the database.",syndicated);
} else if(param.equals("none")) {
return AdminMenuHTML.getAdminMenu(getFirstSiteld(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(),true,syndicated), "No sites are currently configured. Please configure a new site.",syndicated);
} else {
return AdminMenuHTML.selectSite(this.serverRoot +
this.thisServlet,"del",param);
}
}
private String addBlurb(int jbsid, String forwardLink, String forwardPost, boolean syndicated) {
String param = getGroupSelectList(jbsid, -1);
if(param.equals("error")) {
return AdminnenuHTML.getAdminNenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated), "An error occurred in connecting to the database.",syndicated);
} else if(param.equals("none")) {
return AdminMenuHTML.getAdminMenu(jbsid,ÃorwardLink,getSiteSelectList(jbsid,true, syndicated), "No blurb groups exist for the current site. <BR>Please add a new blurb group before adding a blurb.",syndicated);
} else {
return AdminMenuHTML.blurbAddOrNodify(jbsid,-1,-1,forwardLink,forwardPost,getSiteNameFromld(jbsid),"",pa ram, }
}

private String copyBlurb(int jbsid, int jbgid, int jbbid, String forwardLink, String orwardPost, boolean syndicated) {
String param = getGroupSelectList(jbsid, jbgid);
String html = getBlurbHTMLFromld(jbbid);
if(param.equals("error")) {
return AdminBenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated), "An error occurred in connecting to the database.",syndicated);
} else if(param.equals("none")) {
return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated), "No blurb groups exist for the current site. <BR>Please add a new blurb group before adding a blurb.",syndicated);
} else {
return AdminMenuHTML.blurbAddOrModify(jbsid,jbgid,-1,forwardLink,forwardPost,getSiteNameFromld(jbsid),ht ml,param,"");
}
}
private String changeBlurb(int jbsid, int jbgid, int jbbid, String forwardLink, String forwardPost, boolean syndicated) {
String param = getGroupSelectList(jbsid, jbgid);

String html = getBlurbHTMLFromld(jbbid);
if(param.equals("error")) {
return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated), "An error occurred in connecting to the database.",syndicated);
} else if(param.equals("none")) {
return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true,syndi cated), "No blurb groups exist for the current site. <BR>Please add a new blurb group before adding a blurb.",syndicated);
} else {
return AdminMenuHTML.blurbAddOrModify(jbsid,jbgid,jbbid,forwardLink,forwardPost, getSiteNameFromld(jbsid) ,html,param,"");
}
}
private String deleteGroupSelect(int jbsid, String forwardLink, String forwardPost, boolean syndicated) {
String param = getGroupSelectList(jbsid, -1);
if(param.equals("error")) {
return AdminMenuBTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated),"An error occurred in connecting to the database.",syndicated);
} else if(param.equals("none")) {
return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated),"No groups are currently configured. Please add a new group.",syndicated);
} else {
return AdminMenuHTML.selectGroup(jbsid,forwardLink,forwardPost,"delbg",param, getSiteNameFromld(jbsid));
}
}
private String viewBlurbSelect(int jbsid, String forwardLink, String forwardPost, boolean syndicated) {
String param = getGroupSelectList(jbsid, -1);
if(param.equals'("error")) {
return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated),"An error occurred in connecting to the database.",syndicated);
} else if(param.equals("none")) {
return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true,syndi cated), "No groups are currently configured. Please add a new group.",syndicated);
} else {
return AdminMenuHTML.selectGroup(jbsid,forwardLink,forwardPost,"viewbb",param, getSiteNameFromld(jbsid));
}
}
private String viewGroupBlurbs(int jbsid, int jbgid, int jbbid, String forwardLink, String forwardPost, String message, boolean syndicated) {
boolean errFlag = false;
BlurbDB bb = new BlurbDB();
Vector v = null;
Connection conn = dataConnMan.getConnection(server, dbname);
String q = "?";
if(forwardLink.indexOf("?") > -1) q try {
if(jbbid > 0) v = bb.getAll(conn, "blurb_site_id = + jbsid + " and blurb_group_id = " +
jbgid +
and blurb id = " + jbbid + " order by created_on desc");
else v = bb.getAll(conn, "blurb_site_id = " + jbsid + " and blurb-group-id = " +
jbgid +
order by create(L_on desc");
} catch(Exception ex) {
BlurbCommon.handleException(ax);

errFlag = true;
}
dataConnNan.freeConnection(server, dbname, conn);
Enumeration e = v.elements();
StringBuffer sb = new StringBuffer();
if(v.size O > 0) {
conn = dataConnMan.getConnection(server, dbname);
while (e.hasMoreElements()) {
BlurbDB record = (BlurbDB) e.nextElement();
if(jbbid > 0) {
sb.append("<tr><td valign=top align=center>N/A</td>");
} else {
sb.append("<tr><td valign=top align=center>[<A HREF=\"" + forwardLink + q +
"jbact=copybb&jbsid=" + jbsid + "&jbgid=" + jbgid + "&jbbid=" +
record.blurb_id +
"\"><B>Copy</B></A>]<BR>");
sb.append("[<A HREF=\"" + forwardLink + q + "jbact=chgbb&jbsid=" + jbsid +
"&jbgid=" +
jbgid + "&jbbid=" + record.blurb_id + "\"><B>Modify</B></A>]<BR>");
sb.append("[<A HREF=\"" + forwardLink + q + "jbact=delbb&jbsid=" + jbsid +
"&jbgid=" +
jbgid + "&jbbid=" + record.blurb_id + "\"><B>Delete</B></A>j</td>");
}
sb.append("<td valign=top align=left>" + HTMLQuoter.toQuoted(record.html) +
"</td><td valign=top align=left>" + record.html + "</td></tr>" + '\r');
}
dataConnMan.freeConnection(server, dbname, conn);
} else {
return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true,syndi cated), "The group <B>" + getGroupNameFromId(jbgid) + "</B> doesn't contain any HTML
blurbs.",syndicated);
}
if(errFlag) return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true,syndi cated), "An error occurred in connecting to the database.",syndicated);
else if(jbbid > 0) return AdminMenuHTML.deleteBlurb(jbsid,jbgid,jbbid,forwardLink,forwardPost,sb.toString (),getSiteNameFrom Id(jbsid),getGroupNameFromld(jbgid), message);
else return AdminMenuHTML.viewGroupBlurbs(jbsid,jbgid,forwardLink,forwardPost,sb.toString() ,getSiteNameFromld (jbsid),getGroupNameFromld(jbgid), message);
}
private String generateBlurbCode(int jbsid, String forwardLink, String forwardPost, boolean syndicated) {
String param = getGroupSelectList(jbsid, -1);
if(param.equals("error")) {
return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true,syndi cated),"An error occurred in connecting to the database.",syndicated);
} else if(param.equals("none")) {
return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true,syndi cated),"No groups are currently configured. Please add a new group.",syndicated);
} else {
return AdminMenuHTML.selectGroup(jbsid,forwardLink,forwardPost,"genbcode",param, getSiteNameFromld(jbsid));
}
}

private String deleteSiteDetails(HttpServletRequest request, HttpServletResponse response, boolean syndicated) {
boolean errFlag = false;
());
int id = integer. parselnt(request.getParameter("jbsid").trim String blurb site_name String description String url Vector rs = null;
BlurbSiteDB bs = new BlurbSiteDB();

Connection conn = dataConnTan.getConnection(server, dbname);
try {
rs = bs.getAll(conn,"blurb_site_id = " + id);
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return AdminMenuHTML.getAdminMenu(getFirstSiteId(), this.serverRoot +
this.thisServlet, getSiteSelectList(getFirstSiteId(),true,syndicated), "An error occurred in connecting to the database.",syndicated);

if(rs.size() > 0) {
Enumeration e = rs.elements();
while (e.hasMoreElements()) {
BlurbSiteDB record = (BlurbSiteDB) e.nextElement();
blurb site_name = record. blurb_site_name;
description = record.description;
url = record.url;
}
} else {
return AdminMenuHTML.getAdminMenu(getFirstSiteId(), this.serverROot +
this.thisServlet, getSiteSelectList(getFirstSiteId(),true,syndicated), "The site record selected no longer exists in the database.",syndicated);
}
return AdminMenuHTNL.siteDelete(this.serverRoot +
this.thisServlet,id,blurb_site_name,description,url,"");
}

private String deleteGroupDetails(int jbsid, String forwardLink, String forwardPost, HttpServletRequest request, HttpServletResponse response, boolean syndicated) {
boolean errFlag = false;
int id = Integer.parseInt(request.getParameter("jbgid").trim());
String blurb group name Vector rs = null;
BlurbGroupDB bg = new BlurbGroupDB();

Connection conn = dataConnMan.getConnection(server, dbname);
try {
rs = bg.getAll(conn,"blurb_group_-id = " + id);
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(errFlag) return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList (jbsid, true, syndicated), "An error occurred in connecting to the database.",syndicated);

if(rs.size() > 0) {
Enumeration e = rs.elements();
while (e.hasMoreElements()) {
BlurbGroupDB record = (BlurbGroupDB) e.nextElement();
blurb--group--name = record.blurb_group_name;
}
} else {
return AdminMenuHTML.getAdminMenu(jbsid,forwardLink,getSiteSelectList(jbsid,true, syndicated),"The group record selected no longer exists in the database.",syndicated);
}
return AdminNenuHTML.groupDelete(jbsid,id,forwardLink,forwardPost,blurbgroup_name,"",g etSiteNameFromId( jbsid));
}

private void validateSite() {

) //a test comment package com.activedatax.products.Blurb;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import java.net.*;
import gnu.regexp.*;
import com.activedatax.sgl.HttpServletDb;
import com.activedatax.products.Blurb.dbmodules.BlurbDB;
/**
This is a rewrite of the PublishNow 2.x jSyndicate servlet for use with Active Data Publisher 3.0 and Community Exchange (AffiliateNow) @author John E. Wetzel @version 1.0 Mate 15-MAY-2000 public class JBlurb extends HttpServletDb implements SingleThreadModel {
private BlurbCommon mycommon;
private String server =
private String dbname =
private String thisServlet private String serverRoot public void init(ServletConfig config) throws ServletException {
super.init(config);

//USE BlurbCommon. class TO GET PROPERTIES -- SERVER & DATABASE NAME
mycommon = new BlurbCommon () ;
Properties p = mycommon.getProps();
serverRoot = p.getProperty("server.root");
server = p.getProperty ("default.server");
dbname = p.getProperty ("default.dbname");
//store the alias in p = mycommon.getAliases();
thisServlet = p.getProperty("JBlurb");
}

//Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String outputHTML
String param = " , String action = request.getParameter("jbact");
outputHTML =
convertTojs (getRandomBlurb (Integer. parseInt (request.getParameter("jbsid").trim()), Integer. parseInt(request.getParameter("jbgid").trim())));
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(outputHTML);
return;
}
public String getRandomBlurb(int blurb site_id, int blurb--group-id) {
boolean errFlag = false;
int count = 0;
int tempid, blurb id;
double tempval;
String blurbHTML tempStr BlurbDB bb = new B1urbDB(;
Vector rs = null;
Hashtable idHash = new Hashtable(;

Connection corn = dataConnMan.getConnection(server,dbname);
String sql = "select blurb.blurb_id id from blurb site, blurb--group, blurb + " where upper(blurb_site.status) = 'Y' and upper(blurb_group.status) = 'Y' and upper(blurb.status) _ 'Y'"
+ " and blurb.blurb_site_id = blurb group.blurb site_id and blurb.blurb_site_id =
blurb site.blurbsite_id"
+ " and blurb.blurb_group_id = blurb group.blurb group_id"
+ " and blurb. blurb site_id = ? and blurb. blurb--group-id try {
PreparedStatement stmt = conn.prepareStatement(sgl);
stmt. clearParameters();
stmt.setlnt(l, blurb_site_id);
stmt.setlnt(2, blurb_group_id);
ResultSet rr = stmt.executeQuery() while (rr.next() {
count++;
idHash.put(String.valueOf(count),rr.getString("id"));
}
rr.close();
stmt.close():
} catch (Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
if(count > 0) {
tempval = Math.floor(count * Math.random());
tempid = (int)tempval + 1;
System.out.println(tempid);
tempStr = idHash.get (String.valueOf(tempid)).toString(};
blurb id = Integer.parselnt(tempStr);
// System.out.println(blurb id);

conn = dataConnMan.getConnection(server, dbname);
try {
rs = bb.getAll(conn,"blurb_id =" + blurbid);
} catch(Exception e) {
BlurbCommon.handleException(a);
errFlag = true;
}
dataConnMan.freeConnection(server, dbname, conn);
Enumeration e = rs.elements(};
while (e.hasMoreElements()) {
BlurbDB record = (BlurbDB) e.nextElement();
blurbHTML = record.getHtml();
}
}
if(errFlag) return "<!--- database error --->";
else return blurbHTML;
}

public String convertTojs(String HTMLtext) {
try {
HTMLtext = new RE("\"com.activedatax.products.Affiliate.Datamodules.Retrievelmage").substitute All(HTMLtext, + serverRoot + Icom.activedatax.products.Affiliate.Datamodules.Retrievelmage") HTMLtext = new RE("[Ss)[Rr][CC] *_ *\"com.activedatax.products.Afiliate.DataModules.RetrieveImage").substituteAll (HTMLtext,"src=\""
+ serverRoot +
"com.activedatax.products.Affiliate.Datamodules.Retrievelmage");
HTMLtext = new RE("[Ss][Rr][Cc] *=
*\"com.rnci.products.DataModules.Retrievelmage").substituteAll(HTMLtext,"src=\"
" + serverRoot +
"com.rnci.products.DataModules.Retrievelmage");
HTMLtext = new RE("\"com.rnci.products.DataModules.RetrieveAttachment").substituteAll(HTMLtext ,"\"" +
serverRoot + "com.rnci.products.DataModules.RetrieveAttachment");
}
catch(Exception e) {
BlurbConsnon.handleException(e);
}

String scriptHTML =
int startSearchAt = 0;
int scriptLoc = indexOfIgnoreCase (HTMLtext, "<SCRIPT", startSearchAt);
if(scriptLoc > -1) { //Check for client scripts and separate them from regular HTML
try {
int endScriptLoc;
int articleLength = HTMLtext.length(;
StringBuffer sbArticle = new StringBuffer(articleLength + 1);
StringBuffer sbScripts = new StringBuffer();
while(scriptLoc > -1) {
endScriptLoc = indexOflgnoreCase(HTMLtext,"</SCRIPT>",scriptLoc);
sbArticl e. append (HTMLtext. subs tring (s tartSearchAt, scriptLoc) ) ;
sbScripts.append(HTMLtext.substring((indexOfIgnoreCase(HTMLtext,">",scriptLoc)+
1),endScriptLoc));
sbScripts. append('\n');
sbScripts.append('\r');
//System.out.println("The HTML: " +
HTMLtext.substring(startSearchAt,scriptLoc));
//System.out.println("The Script: " +
HTMLtext.substring((indexOfIgnoreCase(HTMLtext,">",scriptLoc)+1),endscriptLoc)) ;
startSearchAt = endScriptLoc + 9;
scriptLoc = indexOflgnoreCase(HTMLtext,"<SCRIPT",startSearchAt);
}
sbArticle.append(HTMLtext.substring(startSearchAt,articleLength - 1));
//System. out. println(sbArticle.toString());
//System.out.println(sbScripts.toString());
scriptHTML = sbScripts.toString(); //contains just the scripts' code HTMLtext = sbArticle.toString(); //contains just the article HTML
}
catch(Exception e) {
BlurbCommon.handleException(e);
}
}
HTMLtext = HTMLtext.replace('\r', ' ');
HTMLtext = HTMLtext.replace('\n', ' ');
try {
HTMLtext = swapStrings(HTMLtext,"\\","\\\\");
HTMLtext = swapStrings(HTMLtext,"\'","\\\'");
HTMLtext = swapStrings(HTMLtext,"\"","\\\"");
}
catch(Exception e) {
BlurbCommon.handleException(e);
}

return scriptHTML + " document.write ('" + HTMLtext + "');
}

public static String swapStrings(String Textln, String OldString, String NewString) {
int OldStringStartAt;
int OldStringLength = OldString.length();
int NewStringLength = NewString.length();

String TempText = Textln;
OldStringStartAt = indexOflgnoreCase(TempText, OldString, 0);
while (OldStringStartAt !_ -1) {
TempText = TempText.substring( 0, OldStringStartAt) + NewString +
TempText.substring(OldStringStartAt + OldStringLength);
OldStringStartAt = indexOflgnoreCase(TempText, OldString, OldStringStartAt +
NewStringLength);
}
return TempText;
}

public static int indexOfIgnoreCase(String TempText, String subString, int StartAt) {
return TempText.toLowerCase().indexOf( subString.toLowerCase(), StartAt);

}

//A simple comment package com. activedatax.products.Blurb;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;
import com. activedatax.products.Blurb.*;
import com.activedatax.products.Blurb.dbmodules.*;
import gnu.regexp.*;
import com.activedatax.net.url.Util;
import java.net.MalformedURLException;
import com.activedatax.utils.HTMLQuoter;
public class JBlurbAdmin extends AdminMenu {
private BlurbCommon mycommon;
private String server =
private String dbname =
private String thisServlet private String serverRoot private String fPost = , private static int itemsToKeep = 400, minutesToLive = 10; //will be set by init() later private static long lastModified;
private static Vector contents = new Vector();
private Sentinel sentinel = null ;

public void init(ServletConfig config) throws ServletException {
super.init(config);

System.out.println("Init Method executed");
sentinel = new Sentinel(itemsToKeep, minutesToLive);
//USE BlurbCommon.class TO GET PROPERTIES
mycommon = new B1urbCommon();
Properties p = mycommon.getProps();
serverRoot = p.getProperty("server.root");
server = p.getProperty ("default.server");
dbname = p.getProperty ("default.dbname");
try {
this.itemsToKeep = Integer.parseInt(p.getProperty("cache.items"));
} catch (NumberFormatException e) {
System.err.println(e.getMessage());
e.printStackTrace();
this.itemsToKeep = 400;
}
try {
this.minutesToLive = Integer.parseInt(p.getProperty("cache.minutes"));
} catch (NumberFormatException e) {
System.err.println(e.getMessage();
e.printStackTrace(;
this.minutesToLive = 10;
}
//store the alias in p = mycommon.getAliases(;
thisServlet = p.getProperty("JBlurbAdmin");
fPost = serverRoot + thisServlet;
}
/**Process the HTTP Get request*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String outputHTML documentURL documentHost jbact jpostbact jbts String contId;
boolean errFlag = false;
int jbsid = -1;
Content cont;

response. setContentType("text/html");
PrintWriter out = response.getWriter();
HttpSession session = request.getSession (false);
if (session == null) session = request.getSession(true);
documentURL = removeAllParams(request.getParameter("jbdurl").trim();
//get the blurb site id from the request parameters try {
jbsid = Integer.parselnt(request.getParameter("jbsid").trim());
} catch(Exception e) { errFlag = true; }
if(!errFlag) errFlag = validateHost(jbsid,parseHostFromURL(documentURL));
if (errFlag) outputHTML = "document.write('<B>This web site is not authorized to view the content requested.<\\/B>');
else {
jbact = request.getParameter("jbact");
.if(jbact != null) {
if(jbact.equalslgnoreCase("getpostdata")) {
jbts = request.getParameter("jbts").trim();
jpostbact = request.getParameter("jpostbact").trim();
contId = session.getId() + "," + jbsid + "," + documentURL + "," + jpostbact +
"," +
jbts;
//System.out.println(contld);
cont = lookup(contId);
if (cont != null) outputHTML = cont.detail;
else outputHTML = convertTojs(doBlurb(request, response, documentURL, this.fPost, true));
out.println(outputHTML);
return;
}
}
outputHTML = convertTojs(doBlurb(request, response, documentURL, this.fPost, true));
}
out.println(outputHTML);
return;

}
/**Process the HTTP Post request*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String outputHTML referringURL redirectURL jpostbact g = "?";
String contld;
boolean errFlag = false;
int jbsid = -1;
Content cont;
HttpSession session = request.getSession (false);
if (session == null) session = request.getSession(true);

//get the referring URL from the request header and use as the forward link referringURL = removeAllParams(request.getHeader("REFERER"));
if(referringURL.equals("error")) errFlag = true;

//get the blurb site id and the form post action from the request parameters try {
jbsid = Integer.parselnt(request.getParameter("jbsid").trim());
jpostbact = request.getParameter("jbact".trim());
} catch(Exception e) { errFlag = true; }

if(errFlag == false) errFlag =
validateHost(jbsid,parseHostFromURL(referringURL));
if(!errFlag) {

//process the posted form and convert to JS for output outputHTML = convertTojs(doBlurb(request, response, referringURL, this.fPost, true));
//store the resulting JS in a Vector for later retrieval via browser JavaScript HTTP GET
if(referringURL.indexOf("?") > -1) q = "&"
lastModified = System.currentTimeMillis(;
redirectURL = referringURL + q + "jbsid=" + jbsid +
"&jbact=getpostdata&jpostbact=" +
jpostbact + "&jbts=" + lastModified;

contld = session.getId() + "," + jbsid + "," + referringURL + "," + jpostbact + "," +
lastModified;
//System.out.println(contld);
cont = new Content(contId, outputHTML, lastModified);
contents. addElement(cont);

} else { //there has been an error or the referring URL is not allowed redirectURL = referringURL;
}
//redirect the browser to the referring page with the appropriate parameters needed to retrieve the JS from the Vector response.sendRedirect(redirectURL);
return;
}
/**Clean up resources*/
public void destroy() {
System.out.println("Destroy method running");
sentinel.quit = true;
contents = null;
}

public String convertTojs(String HTMLtext) {
try {
HTMLtext = new RE("\"com.activedatax.products.Affiliate.Datamodules.RetrieveImage").substitute All(HTMLtext, + serverRoot + "com.activedatax.products.Affiliate.Datamodules.Retrievelmage") HTMLtext = new RE("[Ss][Rr][Cc] *=
*\"com.activedatax.products.Affiliate.Datamodules.RetrieveImage").substituteAll (HTMLtext,"src=\""
+ serverRoot +
"com.activedatax.products.Affiliate.Datamodules.Retrievelmage");
HTMLtext = new RE("[Ss][Rr][Cc] *_ *\"com.rnci.products.DataModules.RetrieveImage").substituteAll(HTMLtext,"src=\"
" + serverRoot +
"com.rnci.products.DataModules.Retrievelmage");
HTMLtext = new RE("\"com.rnci.products. DataModules.RetrieveAttachment"). subs tituteAll(HTMLtext,+
serverRoot + "com.rnci.products.DataModules.RetrieveAttachment");
}
catch(Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
}

String scriptHTML =
int startSearchAt = 0;
int scriptLoc = indexOflgnoreCase(HTMLtext,"<SCRIPT", startSearchAt);
if(scriptLoc > -1) { //Check for client scripts and separate them from regular HTML
try {
int endScriptLoc;
int articleLength = HTMLtext.length();
StringBuffer sbArticle = new StringBuffer(articleLength + 1);
StringBuffer sbScripts = new StringBuffer(;
while(scriptLoc > -1) {
endScriptLoc = indexOflgnoreCase(HTMLtext,"</SCRIPT>",scriptLoc);
sbArticle. append (HTMLtext. substring (startSearchAt, scriptLoc) ) ;

sbScripts.
append(HTMLtext.substring((indexOflgnoreCase(HTMLtext,">",scriptLoc) +1),endScriptLoc));
sbScripts. append('\n');
SbScripts.append('\r');
//System.out.println("The HTML: " +
HTMLtext.substring(startSearchAt,scriptLoc));
//System.out.println("The Script: " +
HTMLtext.substring( (indexoflgnoreCase(HTMLtext,">",scriptLoc)+1) ,endScriptLoc));

startSearchAt = endScriptLoc + 9;
scriptLoc = indexOflgnoreCase(HTMLtext,"<SCRIPT",startSearchAt);
}
sbArticle.append(HTMLtext.substring(startSearchAt,articleLength - 1));
//System.out.println(sbArticle.toString());
//System.out.println(sbScripts.toString());
scriptHTML = sbScripts.toString(; //contains just the scripts' code HTMLtext = sbArticle.toString(); //contains just the article HTML
}
catch(Exception e) {
System.err.println(e.getHessage());
e.printStackTrace();
}
}
HTMLtext = HTMLtext.replace('\r', HTMLtext = HTMLtext.replace('\n', ' ');
try {
HTMLtext = swapStrings(HTMLtext,"\\","\\\\");
HTMLtext = swapStrings(HTMLtext,"\'","\\\'");
HTMLtext = swapStrings(HTMLtext,"\"","\\\"");
}
catch(Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
}

return scriptHTML + " document.write ('" + HTMLtext + "');
}

public static String swapStrings (String Textln, String OldString, String NewString) {
int OldStringStartAt;
int OldstringLength = OldString.length();
int NewStringLength = NewString.length();
String TempText = Textln;
OldStringStartAt = indexOflgnoreCase(TempText, OldString, 0);
while (OldStringStartAt !_ -1) {
TempText = TempText.substring( 0, OldStringstartAt) + NewString +
'empText.substring(OldStringstartAt + OldStringLength);
OldStringStartAt = indexOflgnoreCase(TempText, OldString, OldStringStartAt +
!ewStringLength);
}
return TempText;
}

public static int indexOflgnoreCase(String TempText, String subString, int StartAt) {
return TempText.toLowerCase().indexOf( subString.toLowerCase(), StartAt);
}
private String removeAllParams(String URL) {
String tempURL = URL;
Util myUtil = new Util();
try {
myUtil. setOriginalURL(URL);
myUtil. setParamToRemove("jbdurl");
tempURL = myUtil. getRemovedParamURL();
myUtil. setOriginalURL(tempURL);
myUtil. setParamToRemove("jbrand");
tempURL = myUtil. getRemovedParamURL();
myUtil. setOriginalURL(tempURL);
myUtil.setParamToRemove("jbact");
tempURL = myUtil. getRemovedParamURL();
myUtil_setOriginalURL(tempURL);
myUtil. setParamToRemove("jbsid");
tempURL = myUtil.getRemovedParamURL();
myUtil. setOriginalURL(tempURL);
myUtil.setParamToRemove("jbgid");
tempURL = myUtil.getRemovedParamURL();

myUtil. setOriginalURL(tempURL);
myUtil. setParamToRemove("jbsid");
tempURL = myUtil. getRemovedParamURL();
myUtil.setOriginalURL(tempURL);
myUtil.setParamToRemove("jpostbact");
tempURL = myUtil. getRemovedParamURL();
myUtil. setOriginalURL(tempURL);
myUtil.setParamToRemove("jbts");
tempURL = myUtil. getRemovedParamURL();

} catch (MalformedURLException mue) {
mue.printStackTrace();
//put in garbage URL that will never match JW 12/4/00 tempURL = "error";
}
//System.out.println(tempURL);
return tempURL;
}
private String parseHostFromURL(String targetURL) {
StringTokenizer tokenizer = new StringTokenizer(targetURL, int tokencount = tokenizer.countTokens();
int i;
String returnHost if (tokencount > 1) {
for (i = 1; i < 3; i++) returnHost = tokenizer.nextToken();
} else {
returnHost }
return returnHost;
}

private boolean validateHost(int jbsid, String targetHost) {
//false: TJRL - Site match found //true: bad URL
boolean errFlag = false;
BlurbSiteDB bs = new BlurbSiteDB();
Vector v = null;
Connection conn = dataConnMan.getConnection(server, dbname);
try {
v = bs.getAll(conn, "blurb_site_id =" + jbsid + " and upper(url) like '%" +
argetHost.toUpperCase() +
} catch(Exception e) {
BlurbCommon.handleException(e);
errFlag = true;
}
dataConnMan. freeConnection (server, dbname, Conn);
if(v.size() < 1) errFlag = true;

return errFlag;
}

Content lookup(String contentlD) {
Content cont;
int index = -1;
for (int i=0; i<contents.size(); ++i) {
cont = (Content) contents.elementAt(i);
if (contentlD. equals (cont.contentlD)) return (Content) contents.elementAt(i);
}
return null;
}

class Content {
String contentlD, detail;
long timestamp;
Content(String contentlD, String detail, long timestamp) {
this.contentlD = contentlD;
this.detail = detail;
this.timestamp = timestamp/60000; //converts milliseconds to minutes private class Sentinel extends Thread {
int itemsToKeep;
int minutesToLive;
boolean quit = false;

Sentinel(int itemsToKeep, int minutesToLive) {
System. out. println ("Sentinel Constructor ");
this.itemsToKeep = itemsToKeep;
this.minutesToLive = minutesToLive;
setPriority(Thread.MINPRIORITY);
start(;

public void run() {
int itemsToRemove;
while (!quit) { /I this keeps cleanup alive until servlet is destroyed freshen(;
if (contents. size() > itemsToKeep) trim(;
//System. out.println (contents. size //System.gc();
try {
Thread.sleep(5000);
}
catch (InterruptedException ex) {
System. err.println(ex.getMessage());
ex.printStackTrace();
}
//System. out. println ("Sentinel ran at:" + System. currentTimeMillis());
}
}
private void trim() {
int itemsToRemove = contents.size() - itemsToKeep;
int trimmed = 0;
for (int i=0; i<itemsToRemove; ++i) {
contents.removeElementAt(i);
//System.out.println("Removed: " + contents. elementAt(i).toString());
Thread.yield();
trimmed++;
}
if (trimmed > 10) contents. trimToSize();
}

private void freshen() {
long currentTime = System. currentTimeHillis()/60000;
Content cont;
for (int i=0; i<contents.size(); ++i) {
cont = (Content) contents.elementAt(i);
if (cont.timestamp + minutesToLive < currentTime) {
contents. removeElementAt(i);
//System.out. println("Expired: " + cont.contentlD);
Thread.yield(;
}
}
}
}

}

Claims (45)

WE CLAIM:
1. A method of obtaining selected content for a web page, wherein the selected content itself is not initially part of the web page, the web page including script associated with the selected content, the method comprising:

(a) a web browser requesting the web page that includes the script associated with the selected content; and (b) the web browser interpreting the script and formatting a request for obtaining the selected content from a remote site, the request including a uniform resource identifier (URI) of the web page and a unique identifier of the selected content.
2. A method of claim 1 further comprising:

(c) the remote site receiving the request and authenticating whether the URI
is authorized to receive the selected content, and, if so, the remote site locating the selected content, and sending the selected content to the web browser; and (d) the web browser assembling the initially requested web page using the selected content obtained from the remote site.
3. The method of claim 2 wherein the remote site is a web server, and the selected content is stored in a content repository connected to the web server.
4. The method of claim 2 wherein the selected content includes two or more different selected content, each selected content being used for different parts of the web page, wherein each selected content has its own script for implementing steps (b)-(d).
5. The method of claim 2 wherein in step (c), if the URI is not authorized to receive the selected content, the remote site sends a signal to the web browser that the selected content is not available, and the web browser assembles the web page without the selected content.
6. The method of claim 1 wherein the URI is a uniform resource locator (URL).
7. The method of claim 1 wherein the selected content is only a portion of the web page.
8. The method of claim 1 wherein the selected content is a digital asset.
9. The method of claim 1 wherein the selected content is an executable file.
10. The method of claim 1 wherein the script includes a subscriber identifier and a content identifier, and step (b) further comprises using the subscriber identifier and the content identifier to create the unique identifier of the selected content.
11. The method of claim 1 wherein the web page is constructed using HTML, and the script is embedded therein.
12. The method of claim 1 wherein the script is JavaScript.
13. A method of constructing the web page that allows for receipt of digital assets, the method comprising:

(a) electronically constructing the web page from source code; and (b) inserting script associated with at least one of the digital assets that is desired to be part of a fully rendered web page into the web page, the inserted script including code to request the content of the digital asset from a remote site when the code is executed by a browser, the code including:

(i) a uniform resource identifier (URI) of the web page for use by the remote site in authenticating whether the URI is authorized to receive the content of the digital asset, and (ii) a unique identifier of the content of the digital asset.
14. The method of claim 13 wherein the script is a scripting language.
15. A method of claim 14 wherein the scripting language is JavaScript.
16. A method of claim 13 wherein the content is an executable file.
17. A method of claim 13 wherein the script includes a subscriber identifier and a content identifier, which, together, create the unique identifier of the content.
18. An article of manufacture for constructing a web page that allows for receipt of digital assets, the article of manufacture comprising a computer-readable medium encoded with computer-executable instructions for performing a method comprising:

(a) electronically constructing the web page from source code; and (b) inserting script associated with at least one of the digital assets that is desired to be part of a fully rendered web page into the web page, the inserted script including code to request the content of the digital asset from a remote site when the code is executed by a browser, the code including:

(i) a uniform resource identifier (URI) of the web page for use by the remote site in authenticating whether the URI is authorized to receive the content of the digital asset, and (ii) a unique identifier of the content of the digital asset.
19. The article of manufacture of claim 18 wherein the script is a scripting language.
20. The article of manufacture of claim 19 wherein the scripting language is JavaScript.
21. The article of manufacture of claim 18 wherein the content is an executable file.
22. The article of manufacture of claim 18 wherein the script includes a subscriber identifier and a content identifier, which, together, create the unique identifier of the content.
23. A computer-implemented apparatus for constructing a web page that allows for receipt of digital assets, the apparatus comprising:

(a) means for electronically constructing the web page from source code; and (b) means for inserting script into the web page constructed by the means for constructing the web page, the script being associated with at least one of the digital assets that is desired to be part of a fully rendered web page, the inserted script including code to request the content of the digital asset from a remote site when the code is executed by a browser, the code including:

(i) a uniform resource identifier (URI) of the web page for use by the remote site in authenticating whether the URI is authorized to receive the content of the digital asset, and (ii) a unique identifier of the content of the digital asset.
24. The apparatus of claim 23 wherein the script is a scripting language.
25. The apparatus of claim 24 wherein the scripting language is JavaScript.
26. The apparatus of claim 23 wherein the content is an executable file.
27. The apparatus of claim 23 wherein the script includes a subscriber identifier and a content identifier, which, together, create the unique identifier of the content.
28. A method of constructing a web page that allows for receipt of digital assets, and sending of the digital assets to a web browser, the method comprising:

(a) electronically constructing, using a computer, the web page from source code;

(b) inserting, using the computer, script associated with at least one of the digital assets that is desired to be part of a fully rendered web page into the web page, the inserted script including code to request the content of the digital asset from a remote site when the code is executed by the browser, the code including:

(i) a uniform resource identifier (URI) of the web page for use by the remote site in authenticating whether the URI is authorized to receive the content of the digital asset, and (ii) a unique identifier of the content of the digital asset;

(c) subsequently receiving at the remote site a request from the web browser that has interpreted the code of the inserted script in the web page, the request including the URI of the web page and the unique identifier of the content of the digital asset; and (d) sending the content of the digital asset to the web browser if the URI is authorized to receive the content of the digital asset.
29. The method of claim 28 wherein the script is a scripting language.
30. A method of claim 29 wherein the scripting language is JavaScript.
31. A method of claim 28 wherein the content is an executable file.
32. A method of claim 28 wherein the script includes a subscriber identifier and a content identifier, which, together, create the unique identifier of the content.
33. The method of claim 28 wherein the remote site is a web server.
34. An article of manufacture for constructing a web page that allows for receipt of digital assets, and sending of the digital assets to a web browser, the article of manufacture comprising computer-usable media encoded with computer-executable instructions for performing a method comprising:

(a) electronically constructing, using a computer, the web page from source code;

(b) inserting, using a computer, script associated with at least one of the digital assets that is desired to be part of a fully rendered web page into the web page, the inserted script including code to request the content of the digital asset from a remote site when the code is executed by the browser, the code including:

(i) a uniform resource identifier (URI) of the web page for use by the remote site in authenticating whether the URI is authorized to receive the content of the digital asset, and (ii) a unique identifier of the content of the digital asset;

(c) subsequently receiving at the remote site a request from the web browser that has interpreted the code of the inserted script in the web page, the request including the URI of the web page and the unique identifier of the content of the digital asset; and (d) sending the content of the digital asset to the web browser if the URI is authorized to receive the content of the digital asset.
35. The article of manufacture of claim 34 wherein the script is a scripting language.
36. The article of manufacture of claim 35 wherein the scripting language is JavaScript.
37. The article of manufacture of claim 34 wherein the content is an executable file.
38. The article of manufacture of claim 34 wherein the script includes a subscriber identifier and a content identifier, which, together, create the unique identifier of the content.
39. The article of manufacture of claim 34 wherein the remote site is a web server.
40. A computer-implemented apparatus for constructing a web page that allows for receipt of digital assets, and sending of the digital assets to a web browser, the apparatus comprising:

(a) means for electronically constructing, using a computer, the web page from source code;

(b) means for inserting, using a computer, script into the web page constructed by the means for constructing the web page, the script being associated with at least one of the digital assets that is desired to be part of a fully rendered web page, the inserted script including code to request the content of the digital asset from a remote site when the code is executed by the browser, the code including:

(i) a uniform resource identifier (URI) of the web page for use by the remote site in authenticating whether the URI is authorized to receive the content of the digital asset, and (ii) a unique identifier of the content of the digital asset;

(c) means for subsequently receiving at the remote site a request from the web browser that has interpreted the code of the inserted script in the web page, the request including the URI of the web page and the unique identifier of the content of the digital asset; and (d) means for sending the content of the digital asset to the web browser if the URI is authorized to receive the content of the digital asset.
41. The apparatus of claim 40 wherein the script is a scripting language.
42. The apparatus of claim 41 wherein the scripting language is JavaScript.
43. The apparatus of claim 40 wherein the content is an executable file.
44. The apparatus of claim 40 wherein the script includes a subscriber identifier and a content identifier, which, together, create the unique identifier of the content.
45. The apparatus of claim 40 wherein the remote site is a web server.
CA2419056A 2000-08-07 2001-08-07 Syndication methodology to dynamically place digital assets on non-related web sites Expired - Fee Related CA2419056C (en)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US22339400P 2000-08-07 2000-08-07
US60/223,394 2000-08-07
PCT/US2001/024675 WO2002013035A1 (en) 2000-08-07 2001-08-07 Syndication methodology to dynamically place digital assets on non-related web sites

Publications (2)

Publication Number Publication Date
CA2419056A1 CA2419056A1 (en) 2002-02-14
CA2419056C true CA2419056C (en) 2012-07-24

Family

ID=22836305

Family Applications (1)

Application Number Title Priority Date Filing Date
CA2419056A Expired - Fee Related CA2419056C (en) 2000-08-07 2001-08-07 Syndication methodology to dynamically place digital assets on non-related web sites

Country Status (5)

Country Link
US (4) US7814172B2 (en)
EP (1) EP1323053A4 (en)
AU (1) AU2001288235A1 (en)
CA (1) CA2419056C (en)
WO (1) WO2002013035A1 (en)

Families Citing this family (55)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10361802B1 (en) 1999-02-01 2019-07-23 Blanding Hovenweep, Llc Adaptive pattern recognition based control system and method
US6151643A (en) 1996-06-07 2000-11-21 Networks Associates, Inc. Automatic updating of diverse software products on multiple client computer systems by downloading scanning application to client computer and generating software list on client computer
US6266774B1 (en) 1998-12-08 2001-07-24 Mcafee.Com Corporation Method and system for securing, managing or optimizing a personal computer
US6499109B1 (en) * 1998-12-08 2002-12-24 Networks Associates Technology, Inc. Method and apparatus for securing software distributed over a network
US7904187B2 (en) 1999-02-01 2011-03-08 Hoffberg Steven M Internet appliance system and method
EP1323053A4 (en) * 2000-08-07 2006-08-16 Active Data Exchange Syndication methodology to dynamically place digital assets on non-related web sites
US7681112B1 (en) * 2003-05-30 2010-03-16 Adobe Systems Incorporated Embedded reuse meta information
US20040260819A1 (en) * 2003-06-23 2004-12-23 Nokia Corporation Systems and methods for restricting event subscriptions through proxy-based filtering
US8473349B1 (en) 2004-05-21 2013-06-25 A9.Com, Inc. Ad server and syndication system
US7596571B2 (en) 2004-06-30 2009-09-29 Technorati, Inc. Ecosystem method of aggregation and search and related techniques
US7975000B2 (en) * 2005-01-27 2011-07-05 Fmr Llc A/B testing of a webpage
WO2006137760A1 (en) * 2005-06-22 2006-12-28 Costream Ab Method and system for enabling multipart communication in a computer network
US8260777B1 (en) 2005-09-09 2012-09-04 A9.Com, Inc. Server system and methods for matching listings to web pages and users
US8402357B1 (en) 2006-06-15 2013-03-19 Michael R. Norwood System and method for facilitating posting of public and private user comments at a web site
IL177904A0 (en) * 2006-09-05 2007-07-04 Worklight Ltd Secured web syndication
KR100834646B1 (en) 2006-09-05 2008-06-02 삼성전자주식회사 Method for transmitting software robot message
US8775603B2 (en) 2007-05-04 2014-07-08 Sitespect, Inc. Method and system for testing variations of website content
US20080288983A1 (en) 2007-05-18 2008-11-20 Johnson Bradley G System and Method for Providing Sequential Video and Interactive Content
US8156467B2 (en) 2007-08-27 2012-04-10 Adobe Systems Incorporated Reusing components in a running application
US8176466B2 (en) * 2007-10-01 2012-05-08 Adobe Systems Incorporated System and method for generating an application fragment
US8386387B2 (en) * 2007-12-21 2013-02-26 Utrom Processing Co. L.L.C. System and method for tracking syndication of internet content
US9619304B2 (en) 2008-02-05 2017-04-11 Adobe Systems Incorporated Automatic connections between application components
US20090199242A1 (en) * 2008-02-05 2009-08-06 Johnson Bradley G System and Method for Distributing Video Content via a Packet Based Network
US8265990B2 (en) 2008-05-15 2012-09-11 Utrom Processing Co. L.L.C. Method and system for selecting and delivering media content via the internet
US8656293B1 (en) 2008-07-29 2014-02-18 Adobe Systems Incorporated Configuring mobile devices
EP2329395A2 (en) * 2008-09-19 2011-06-08 Limelight Networks, Inc. Content delivery network stream server vignette distribution
AU2010276462B1 (en) 2010-12-27 2012-01-12 Limelight Networks, Inc. Partial object caching
AU2010202034B1 (en) 2010-04-07 2010-12-23 Limelight Networks, Inc. Partial object distribution in content delivery network
US8161099B2 (en) 2008-12-17 2012-04-17 Microsoft Corporation Techniques to automatically syndicate content over a network
CA2700030C (en) * 2009-04-16 2019-11-05 Accenture Global Services Gmbh Touchpoint customization system
US8131822B2 (en) * 2009-07-01 2012-03-06 Suresh Srinivasan Access of elements for a secure web page through a non-secure channel
US9058402B2 (en) 2012-05-29 2015-06-16 Limelight Networks, Inc. Chronological-progression access prioritization
US8346784B1 (en) 2012-05-29 2013-01-01 Limelight Networks, Inc. Java script reductor
US8495171B1 (en) 2012-05-29 2013-07-23 Limelight Networks, Inc. Indiscriminate virtual containers for prioritized content-object distribution
US8321533B2 (en) 2009-08-03 2012-11-27 Limelight Networks, Inc. Systems and methods thereto for acceleration of web pages access using next page optimization, caching and pre-fetching techniques
US8522203B1 (en) * 2009-08-28 2013-08-27 Adobe Systems Incorporated Dynamic script management
US8910247B2 (en) * 2010-10-06 2014-12-09 Microsoft Corporation Cross-site scripting prevention in dynamic content
US10733151B2 (en) 2011-10-27 2020-08-04 Microsoft Technology Licensing, Llc Techniques to share media files
US9547665B2 (en) 2011-10-27 2017-01-17 Microsoft Technology Licensing, Llc Techniques to determine network storage for sharing media files
US8683596B2 (en) * 2011-10-28 2014-03-25 International Business Machines Corporation Detection of DOM-based cross-site scripting vulnerabilities
WO2014078961A1 (en) * 2012-11-21 2014-05-30 Roofoveryourhead Marketing Ltd A browser extension for the collection and distribution of data and methods of use thereof
US10423701B1 (en) * 2012-12-13 2019-09-24 Trilibis, Inc. Web asset modification
US20140280480A1 (en) * 2013-03-15 2014-09-18 Edgecast Networks, Inc. Dynamic Tag Management for Optimizing Content Delivery
US9037643B2 (en) * 2013-03-15 2015-05-19 Edgecast Networks, Inc. Dynamic tag management for optimizing content delivery
US20140325349A1 (en) * 2013-04-30 2014-10-30 Adobe Systems Incorporated Real-time Representations of Edited Content
US9015348B2 (en) 2013-07-19 2015-04-21 Limelight Networks, Inc. Dynamically selecting between acceleration techniques based on content request attributes
US10223143B2 (en) 2015-04-03 2019-03-05 Oracle International Corporation System and method for supporting javascript as an expression language in a process defined by a process execution language for execution in a SOA middleware environment
US10268496B2 (en) * 2015-04-03 2019-04-23 Oracle International Corporation System and method for supporting object notation variables in a process defined by a process execution language for execution in a SOA middleware environment
US10223142B2 (en) 2015-04-03 2019-03-05 Oracle International Corporation System and method for supporting javascript activities in a process defined by a process execution language for execution in a SOA middleware environment
US10089084B2 (en) 2015-04-03 2018-10-02 Oracle International Corporation System and method for reusing JavaScript code available in a SOA middleware environment from a process defined by a process execution language
US10079831B1 (en) * 2016-03-10 2018-09-18 EMC IP Holding Company LLC Qualified web application security based on web application hierarchy
US10635828B2 (en) 2016-09-23 2020-04-28 Microsoft Technology Licensing, Llc Tokenized links with granular permissions
CN107194613B (en) * 2017-06-20 2020-12-08 无锡井通网络科技有限公司 Digital asset coding method
US11368477B2 (en) * 2019-05-13 2022-06-21 Securitymetrics, Inc. Webpage integrity monitoring
US11164039B2 (en) * 2019-10-23 2021-11-02 International Business Machines Corporation Framework for few-shot temporal action localization

Family Cites Families (64)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6625581B1 (en) * 1994-04-22 2003-09-23 Ipf, Inc. Method of and system for enabling the access of consumer product related information and the purchase of consumer products at points of consumer presence on the world wide web (www) at which consumer product information request (cpir) enabling servlet tags are embedded within html-encoded documents
US5640193A (en) * 1994-08-15 1997-06-17 Lucent Technologies Inc. Multimedia service access by reading marks on an object
US5617565A (en) * 1994-11-29 1997-04-01 Hitachi America, Ltd. Broadcast interactive multimedia system
JP3195190B2 (en) * 1995-05-10 2001-08-06 シャープ株式会社 Print output control device and network having the same
US5774670A (en) * 1995-10-06 1998-06-30 Netscape Communications Corporation Persistent client state in a hypertext transfer protocol based client-server system
US5835712A (en) * 1996-05-03 1998-11-10 Webmate Technologies, Inc. Client-server system using embedded hypertext tags for application and database development
US5819271A (en) * 1996-06-04 1998-10-06 Multex Systems, Inc. Corporate information communication and delivery system and method including entitlable hypertext links
US5864871A (en) * 1996-06-04 1999-01-26 Multex Systems Information delivery system and method including on-line entitlements
US6112242A (en) * 1996-07-10 2000-08-29 Uln Corporation System and method for dynamic data interaction in a hypertext data processing system
US5898835A (en) * 1996-08-16 1999-04-27 Electronic Data Systems Corporation System and method for remotely executing a command
US6151609A (en) * 1996-08-16 2000-11-21 Electronic Data Systems Corporation Remote editor system
US5933811A (en) * 1996-08-20 1999-08-03 Paul D. Angles System and method for delivering customized advertisements within interactive communication systems
US6385646B1 (en) * 1996-08-23 2002-05-07 At&T Corp. Method and system for establishing voice communications in an internet environment
US6076166A (en) * 1997-01-17 2000-06-13 Philips Electronics North America Corporation Personalizing hospital intranet web sites
US5796952A (en) * 1997-03-21 1998-08-18 Dot Com Development, Inc. Method and apparatus for tracking client interaction with a network resource and creating client profiles and resource database
US6643696B2 (en) * 1997-03-21 2003-11-04 Owen Davis Method and apparatus for tracking client interaction with a network resource and creating client profiles and resource database
WO1998044733A1 (en) * 1997-03-31 1998-10-08 Broadband Associates Method and system for providing a presentation on a network
US7143177B1 (en) * 1997-03-31 2006-11-28 West Corporation Providing a presentation on a network having a plurality of synchronized media types
US5987525A (en) * 1997-04-15 1999-11-16 Cddb, Inc. Network delivery of interactive entertainment synchronized to playback of audio recordings
US6118768A (en) * 1997-09-26 2000-09-12 3Com Corporation Apparatus and methods for use therein for an ISDN LAN modem utilizing browser-based configuration with adaptation of network parameters
US6631402B1 (en) * 1997-09-26 2003-10-07 Worldcom, Inc. Integrated proxy interface for web based report requester tool set
US6484149B1 (en) * 1997-10-10 2002-11-19 Microsoft Corporation Systems and methods for viewing product information, and methods for generating web pages
WO1999023623A1 (en) * 1997-11-03 1999-05-14 Hill-Rom, Inc. Personnel and asset tracking method and apparatus
US6226668B1 (en) * 1997-11-12 2001-05-01 At&T Corp. Method and apparatus for web messaging
US5999941A (en) * 1997-11-25 1999-12-07 Micron Electronics, Inc. Database access using active server pages
US6157933A (en) * 1997-11-26 2000-12-05 International Business Machines Corporation Method and apparatus for loading multiple animated images on a web-page with limited network throughput
US6094673A (en) * 1998-01-16 2000-07-25 Aspect Communications Method and apparatus for generating agent scripts
US6038598A (en) * 1998-02-23 2000-03-14 Intel Corporation Method of providing one of a plurality of web pages mapped to a single uniform resource locator (URL) based on evaluation of a condition
US6088698A (en) * 1998-02-27 2000-07-11 Oracle Corporation Method and apparatus for incrementally generating a virtual three-dimensional world
US6154738A (en) * 1998-03-27 2000-11-28 Call; Charles Gainor Methods and apparatus for disseminating product information via the internet using universal product codes
US6133912A (en) * 1998-05-04 2000-10-17 Montero; Frank J. Method of delivering information over a communication network
JP4064060B2 (en) * 1998-05-15 2008-03-19 ユニキャスト・コミュニケーションズ・コーポレイション Technology for implementing network-distributed interstitial web advertisements that are initiated by the browser and invisible to the user using ad tags embedded in reference web pages
US6185567B1 (en) * 1998-05-29 2001-02-06 The Trustees Of The University Of Pennsylvania Authenticated access to internet based research and data services
US6151599A (en) * 1998-07-17 2000-11-21 International Business Machines Corporation Web client scripting test architecture for web server-based authentication
AU6413899A (en) 1998-10-06 2000-04-26 Regional Network Communications, Inc. Generalized multi-interfaced extensible content management and delivery system, and on-line calendar
US6393605B1 (en) * 1998-11-18 2002-05-21 Siebel Systems, Inc. Apparatus and system for efficient delivery and deployment of an application
US8418131B2 (en) * 1998-11-25 2013-04-09 Helmut Emmelmann Interactive server side components
US6802042B2 (en) * 1999-06-01 2004-10-05 Yodlee.Com, Inc. Method and apparatus for providing calculated and solution-oriented personalized summary-reports to a user through a single user-interface
US6266690B1 (en) * 1999-01-27 2001-07-24 Adc Telecommunications, Inc. Enhanced service platform with secure system and method for subscriber profile customization
US6263064B1 (en) * 1999-01-29 2001-07-17 International Thinklink Corporation Centralized communication control center for visually and audibly updating communication options associated with communication services of a unified messaging system and methods therefor
US6625624B1 (en) * 1999-02-03 2003-09-23 At&T Corp. Information access system and method for archiving web pages
CA2363796A1 (en) * 1999-02-26 2000-08-31 Richard T. Box A system, method and article of manufacture for an electronic commerce interface to the government
US7730169B1 (en) * 1999-04-12 2010-06-01 Softricity, Inc. Business method and system for serving third party software applications
US6330719B1 (en) * 1999-06-30 2001-12-11 Webtv Networks, Inc. Interactive television receiver unit browser that waits to send requests
US6415438B1 (en) * 1999-10-05 2002-07-02 Webtv Networks, Inc. Trigger having a time attribute
US6668378B2 (en) * 1999-06-30 2003-12-23 Webtv Networks, Inc. Interactive television triggers having connected content/disconnected content attribute
US6550057B1 (en) * 1999-08-31 2003-04-15 Accenture Llp Piecemeal retrieval in an information services patterns environment
US6405364B1 (en) * 1999-08-31 2002-06-11 Accenture Llp Building techniques in a development architecture framework
US6941515B1 (en) * 1999-09-01 2005-09-06 Vertigoxmedia Inc. Method and apparatus for controlling a graphics engine
US6546397B1 (en) * 1999-12-02 2003-04-08 Steven H. Rempell Browser based web site generation tool and run time engine
US7054952B1 (en) * 1999-12-09 2006-05-30 International Business Machines Corp. Electronic document delivery system employing distributed document object model (DOM) based transcoding and providing interactive javascript support
US7010263B1 (en) * 1999-12-14 2006-03-07 Xm Satellite Radio, Inc. System and method for distributing music and data
US7373376B1 (en) * 1999-12-30 2008-05-13 Keynote Systems, Inc. Method and system for evaluating quality of service over the internet
US6496802B1 (en) * 2000-01-07 2002-12-17 Mp3.Com, Inc. System and method for providing access to electronic works
AU2001228215A1 (en) * 2000-01-24 2001-07-31 Newheights Software Corporation Improved method and system of state management for data communications
US7200551B1 (en) * 2000-02-28 2007-04-03 Telpay, Inc. Automated bill payment system
WO2001075549A2 (en) 2000-03-30 2001-10-11 Cygent, Inc. System and method for establishing electronic business systems for supporting communications services commerce
US6622168B1 (en) * 2000-04-10 2003-09-16 Chutney Technologies, Inc. Dynamic page generation acceleration using component-level caching
US7013340B1 (en) * 2000-05-18 2006-03-14 Microsoft Corporation Postback input handling by server-side control objects
US6493733B1 (en) * 2000-06-23 2002-12-10 Microsoft Corporation Method for inserting interactive HTML objects into an electronic file
US7076534B1 (en) * 2000-06-30 2006-07-11 Microsoft Corporation Server-side scripting that enables creation of customized documents for clients
US6826594B1 (en) * 2000-07-15 2004-11-30 Commission Junction Method and system for remote content management of a designated portion of a web page
US6829780B2 (en) * 2000-07-17 2004-12-07 International Business Machines Corporation System and method for dynamically optimizing a banner advertisement to counter competing advertisements
EP1323053A4 (en) 2000-08-07 2006-08-16 Active Data Exchange Syndication methodology to dynamically place digital assets on non-related web sites

Also Published As

Publication number Publication date
WO2002013035A1 (en) 2002-02-14
EP1323053A4 (en) 2006-08-16
US20150007017A1 (en) 2015-01-01
US20110093926A1 (en) 2011-04-21
EP1323053A1 (en) 2003-07-02
CA2419056A1 (en) 2002-02-14
US20120297287A1 (en) 2012-11-22
US7814172B2 (en) 2010-10-12
AU2001288235A1 (en) 2002-02-18
US20020087660A1 (en) 2002-07-04
US8166522B2 (en) 2012-04-24

Similar Documents

Publication Publication Date Title
CA2419056C (en) Syndication methodology to dynamically place digital assets on non-related web sites
US20050132207A1 (en) System and method for authoring learning material using digital ownership rights
US8200775B2 (en) Enhanced syndication
US7024391B2 (en) System, method and program product for sharing information
Bertino et al. Securing XML documents with Author-X
US9917827B2 (en) Internet server access control and monitoring systems
US6389541B1 (en) Regulating access to digital content
US7430587B2 (en) Distributed globally accessible information network
AU694367B2 (en) Internet server access control and monitoring systems
US6314425B1 (en) Apparatus and methods for use of access tokens in an internet document management system
US5727156A (en) Internet-based automatic publishing system
US20030023632A1 (en) System and method for editing web pages in a client/server architecture
US20040168066A1 (en) Web site management system and method
US8266242B2 (en) Method, system, and computer program product for propagating remotely configurable posters of host site content
US20020103737A1 (en) Marketing collateral repository and supporting data management and communication environment
US20020133492A1 (en) System and methods for web browser based document scanning, remote storage, and retrieval
US20020082997A1 (en) Controlling and managing digital assets
US20020049788A1 (en) Method and apparatus for a web content platform
US20090192847A1 (en) Method and apparatus for an improved security system mechanism in a business applications management system platform
GB2384581A (en) Reusing web session data
US20030120672A1 (en) Method and mechanism for managing content objects over a network
EP1410629A1 (en) System and method for receiving and storing a transport stream
Pitkow et al. Towards an intelligent publishing environment
Yu et al. Developing an XML framework for an electronic document delivery system
CA2302183A1 (en) Data dissemination system for computer networks

Legal Events

Date Code Title Description
EEER Examination request
MKLA Lapsed

Effective date: 20190807