Discussion in 'iPhone' started by Chaos Reigns, May 22, 2012.
I have an iPhone 4 on iOS 5.0.1 untethered jailbreak and unlocked.
The issue I'm running into is when I use the default Google search on the top right of Safari, it returns me to the main google.com page.
Yahoo and Bing work fine and this issue has only been happening recently.
Look where it says "View Google in: Mobile | Classic"
The issue is not the view. The issue is whatever I search for returns the google home page, not the search results.
a problem i have is that say i do a search, i type in something and hit the blue search button on the keyboard. I get my results but then i want to change the search. so i click the text field, change it, but for some reason the blue search button on the keyboard doesn't work. i have to instead click the spyglass next to the text field on the actual google page.
now i'm not sure if this is an apple keyboard problem or a google webpage problem, but its damn annoying.
Was wondering if someone could maybe test this out to see if its not just me?
If you have private browsing turned on, it does this. Disable it and it'll work fine.


Proflex 4mm Blue Speaker Cable 2m is rated 5.0 out of 5 by 1.
The Proflex 4mm Blue Speaker Cable 2m will fit your _VEHICLEYEAR_ _VEHICLEMAKE_ _VEHICLEMODEL_ Click here to Change vehicle and no additional parts are required for fitting.
Once you've added the Proflex 4mm Blue Speaker Cable 2m to your basket, the items you've selected above will also be added to your order.


text:
Amazon to open 1M sf distribution center on Staten Island: report
The "fulfillment facility" in the borough should open by summer
Jun.June 19, 2017 10:30 AM
Amazon's Jeff Bezos and 546 Gulf Avenue (Credit: Getty Images and Google Maps)
Amazon plans to open its first New York distribution center on the west shore of Staten Island, with the company set to take 975,000 square feet at a warehouse in the borough.
Sources told the New York Post that the Jeff Bezos-owned company will open a "fulfillment center" at Matrix Development Group's Matrix Global Logistics Park in Bloomfield on Staten Island's west shore. The warehouse will be open by the end of summer, according to the New York Post.
The New Jersey-based developer is building a commercial hub that will eventually span 3.5 million square feet, according to a report from New York York YIMBY. Last month, the firm filed plans for a 2.3 million-square-foot building at the park. The 671-acre site had been previously earmarked for a 82,500-seat NASCAR racetrack.
Amazon's center is expected to be the first of four warehouses on the site, according to the Post. "We think the sites could bring in 3,000 employees," Steve Grillo, first vice president of the Staten Island Economic Development Corporation, told the newspaper. "Matrix has been very secretive about the tenants, but the chatter is that Amazon is coming in."
A representative for the Matrix declined to comment. The notoriously press-shy Amazon said the proposed distribution center on Staten Island are "rumors and speculation."
Last week, Amazon agreed to pay $13.7 billion for Whole Foods, a move that sent shockwaves through the grocery industry. The online retail giant is also opening bricks-and-mortar stores and is said to be planning a bookstore in the Time Warner Center. [NYP] — Miriam Hall
amazonCommercial Real EstateDevelopmentmatrix development group
Northern Virginia's housing market is booming after Amazon's HQ2
The Real Deal celebrates 250 issues
TRD's founders share war stories from over the years
City's oldest bar, of "Goodfellas" fame, gets last-minute lifeline
Landlord to bar owner: You don't have to go home but you can't stay here
Airbnb hammers out partnership with carpenters' union
"Amazon killer" Gianaris wants to overhaul subsidy programs that could have net billions for HQ2

redpajama_set_name: RedPajamaCommonCrawl


text:
Closed 1h 0m View in admin
texts&beheadings/ ElizabethR
NYC: Brooklyn
Score it Scored!
texts&beheadings/ ElizabethR NYC Reviews and Tickets
Members say
Exquisite, Intelligent, Great staging
Part of the 2015 Next Wave Festival, Compagnia de' Colombari presents England's greatest queen through her various writings, to reveal the soul and ever-shifting essence of an icon.
In this new American play that explores the life and language of England's greatest queen, four actresses portray the resilient queen and allow us to marvel at her theatrical brilliance. Multi-lingual and insatiably curious, Elizabeth survived disinheritance, excommunication, and imprisonment to emerge triumphant. Her reign saw the rise of Shakespeare's theater, but what did she have to say herself? The play uses Elizabeth's own words to reveal her wit, courage, and extraordinary love of her people. Dissecting the persona of Elizabeth I through Joycean deconstructions of her letters, speeches, poems, and prayers, this production is Elizabethan drama in its most literal sense.
Member Reviews (1)
Standing in our community
Only positive
Only negative
Only mixed
210 Reviews | 35 Followers
See it if Beautiful production. Not enough expostion. Better if you already know the history.
Don't see it if you're not interested in details of Elizabethan history
View in admin
Ben Brantley
"This witty, hourlong performance piece was created by Karin Coonrod, a theater artist of far-reaching inventiveness...It deploys what might be called a style that deconstructs to reconstruct…This production provides a surprisingly graspable crash course in Elizabeth I and her times, clearly laying out archival evidence in different picturesque patterns. It's up to us to assemble the final portrait."
Benjamin Tomchik
For a previous production
"Coonrod's setup works, but is uneven....There's a lot of potential with this show. Expanding both the running time and material would not only strengthen this promising piece it would give the audience more of a chance to answer Coonrod's initial question...The show excels in its ability to present almost a case-study of one of history's earliest female leaders. Four gifted actresses bring her alive, but we're left wanting more."
Sophia Howes
"Director Karin Coonrod has a strikingly original approach to this complicated subject…The actresses each turn in excellent performances…For me, the switch from Elizabeth's words to modern slang is sometimes jarring. Because the actresses are essentially reciting, it is hard occasionally to get emotionally involved with Elizabeth…As a tribute to a great queen, 'texts and beheadings/ElizabethR' succeeds superbly."
Jennifer Clements
"'Texts&beheadings' is more like portraiture than plot…Smartly, the four representations of the queen could not be any more different in tone, or portrayed by more different performers…It works almost like a Picasso painting, full of attention to perspectives and angles...What it does attempt it does well, and it serves to show how biographical texts can granted life onstage in imaginative and innovative ways."
Kaley Beins
"Coonrod's biggest success in creating this work was her astuteness in combining the modern with the old in order to make something new…However, although the conception of 'texts&beheadings/ElizabethR' was appealing, parts of the performance were disjointed or lacking…Despite the complications in its execution the production captures the depth of Elizabeth's story in an interesting new light: the fractured light of Coonrod's kaleidoscope."
Sarah Anne Hughes
"The lack of a chronology can make the play a bit confusing for those not familiar with the virgin queen…But these moments pass quickly, giving way to some beautiful aural and visual moments, like when the four queens sing in harmony…The four women make their own Elizabeth and enhance it with their own gifts...'Texts&beheadings/ElizabethR' presents Elizabeth's words in as many ways as it can to immerse the audience in her life."
"'Texts & Beheadings/ElizabethR' brings to life this brilliant woman through her personal poems, prayers and private letters…While there are plenty of dark moments in this play it is certainly punctuated with hilarity…If you're a crazed Elizabethan fan you probably won't be able to separate your existing love from this play. Someone less familiar with the life and times of Elizabeth might not find the joy in it but it's definitely something to explore."
Karin Coonrod
Gina Leishman
Compagnia de' Colombari


text:
Palenica (624 m)  – wzgórze na północno-wschodnim końcu Pasma Pewelskiego. Znajduje się pomiędzy Wajdowym Groniem (677 m) a Łopuszniakiem (538 m). Według Jerzego Kondrackiego, autora regionalizacji fizycznogeograficznej Polski pasmo to należy do Beskidu Makowskiego.

Południowo-wschodnie stoki Palnicy, należące są w większości bezleśne, zajęte przez pola i zabudowania miejscowości Lachowice, natomiast należące do miejscowości Kuków stoki północno-zachodnie są zalesione i opadają do doliny Kocońki.

Przypisy

Szczyty Beskidu Makowskiego

redpajama_set_name: RedPajamaWikipedia


Join us at Cats Exotics on Sunday, July 15th for a chance to get an up-close-and-personal look at some amazing supercars.
Roy Cats and John Zuberek from Cats Exotics will go over some of the more unique cars in their collection, including a detailed look at the evolution of Lamborghini from the Countach to the Aventador.
Plus, one lucky Avants member will get to go for a ride in a surprise supercar (Saleen S7, Aventador SV, etc).
Roy and John will also announce a special discount for Avants members.
Food & drinks provided as always.


Tom Hanks lip syncs Carly Rae Jepsen's 'I Really Like You' — can you spot the film references?
Carly Rae Jepsen's new music video for her hit song "I Really Like You" will leave viewers something to, well, really like.
Actor Tom Hanks dominates the whole video, lip-syncing and goofing off through most of the song.
Hanks wasn't alone, though. The video also has a guest cameo by Jepsen's pal, Justin Bieber. It all culminates in a fun dance number at the end including Jepsen, Hanks and Bieber.
The video also features multiple references to Hanks' movies, including Forrest Gump and Cast Away (pay close attention to the emojis at 1:27).
According to reports Jepsen and Hanks met at the wedding of Bieber's manager, Scooter Braun, last year.


Tomy's Hospedaje, Cusco, Peru (September 2011 - 5 nights). Reasonably priced place to stay in central Cusco. I had a spacious room with tv and private bathroom. The man and woman running the hotel were friendly and it is secure with a locked gated door. Recommended.


They are also really affordable.
In 1996, Jason Feinsmith was earning his master's degree in business administration at Stanford University and his wife, Elana, was employed as a certified financial planner for Charles Schwab.
While the rest of their friends were contemplating how to pay for million-dollar homes, the Feinsmiths took out a $39,000 loan on a 1974 double-wide mobile home in Silicon Valley for which they paid a total of $47,000.
Today, they still live there with their 7-year-old son and 4-year-old daughter. Elana Feinsmith is a stay-at-home mom and Jason Feinsmith is an entrepreneur who has used some of their considerable savings to start his own software venture. They have a healthy retirement account and are socking away more money to send the kids to college.
On the other side of the country, in upstate New York, when Ron Hagelberger retired, he and his wife, Linda, sold their four-bedroom colonial and spent part of what they made on the sale to pay cash for a brand-new, 1,700-square-foot manufactured house in a development reserved for people older than 55.
"We moved here because you get a lot of value for the dollar — three bedrooms, two baths, a formal dining room, a large kitchen and a pretty good-sized yard. Because the management takes care of the maintenance, we can simply close the door and leave. We just got back from a cruise, and while we were on it, we didn't have to worry whether the basement was flooding or if somebody was maintaining the pool," Ron Hagelberger says.
In California, the Feinsmiths paid off the loan on the mobile home, so their housing expenses each month include $826 in rent for their lot, $22 for trash collection, $15 for sewer, and $78 for gas and electric, which adds up to $941. The Feinsmiths don't own the property, so they don't pay property taxes, and none of their expenses are tax-deductible. Still, less than $1,000 per month is pretty good for a home that has hardwood floors; a large, screened-in porch; a deck; and a small, private yard for the children to play in.
Elana Feinsmith says at one point they considered moving, but when they looked at the $800,000, 50-year-old tract homes that they could afford only if she went back to work, the idea lost its appeal.
The homes in the development where the Hagelbergers live are currently selling for $115,000. Land rent is $420 per month, which includes basic cable. Owners pay gas and electric, which on a year-round monthly billing cycle is about $85 per month, according to Noel Dill, vice president of Rock Oak, the company that developed the community. The residents also pay a quarterly water bill of about $25 and insurance on the contents of their homes, which could run $50 per month.
These expenses add up to about $563 monthly. If the Hagelbergers had put 20% down and borrowed the rest, they would be paying an additional mortgage of about $740 per month, assuming a 7.5% rate and 20-year term. Manufactured housing may not be prestigious, but the savings are impressive.
Fred was like most investors and entrepreneurs and had no idea that mobile homes could be a good investment and a great moneymaker. And what little he had heard about mobile homes wasn't very flattering. But Fred read a book called Deals On Wheels about how you could make money with them and called me to get some more information. He wanted to know if he could visit with me sometime, buy lunch and see first hand just what I was doing. At 9 o'clock one morning, Fred shows up at my door and we went on a park tour. The first park we drove through, I pointed to a mobile home and said, "Fred, take a look at that mobile home and tell me what you see." This was a 15 year old single wide home. The paint was ugly, one section of the skirting was missing, a window pane was broken, a dog was tied to the steps and the yard would never win a "Yard of the month award." I could sense that Fred wasn't real impressed at what he was seeing. He looked a little puzzled and said, " I see an old mobile home." And to the untrained eye, that's just what it looked like. There was nothing wrong with Fred's eyesight, he saw exactly what I just described. But what he didn't realize was that he was looking at money disguised to look like an old, ugly mobile home. Then I gave Fred the history on this home.
About two years before, I had bought this home for $2,700. I spent another $341 for advertising and minor repairs. My total cost in that home was $3,041. In less than two weeks, I had it sold for $6,950 to a young couple that needed an affordable place to live. This couple, like many couples, would never save enough to buy what they wanted, but they could make a payment every month for life. They paid $750 down and I took back a note at 12.75% interest (the industry standard) payable $191.07 monthly for 40 months. Now, let's run the numbers and see how I made out.
We had $3,041 invested, received $750 down, leaving $2,291 in the deal. We now have a note for $6,200 and will receive $191.07 for 40 months. If I punched the right buttons, that's a 95% yield. After 40 months, we will have collected $7,642. And also, it will only take 12 payments to recover the $2,291 we have left in the note. As you can see, this little deal provides very high yield, with minimum risk and was done in a very short time.
Note. If you don't know how to use a financial calculator, or understand how to punch the numbers to get these figures, then I recommend my book Taking The Mystery Out Of Money. It has a chapter explaining in complete detail on using a financial calculator for most any financial transaction.
Now, let me explain what I've really done with just a few hours of work. Some people will think I simply put a little deal together and made a good profit…which I have. But I've done much more than that. What some people fail to realize is that I've spent a few hours of work to create a note that now obligates somebody to send me a check every month for the next 40 months. Once the deal is done, what more do I have to do to get paid? Nothing but wait for the mail carrier to bring the checks. I don't even have to leave the house to get paid, but that nice couple living in that mobile home have to go to work every day so they can send me a check. And they get to do it 40 times. And it was done on an old, ugly mobile home that most investors wouldn't consider of any value or collateral.
After explaining all this to Fred, I asked him to take another look at that mobile home and tell me what he saw. What he saw the first time was something that looked ugly, but now, he realized he had been suffering from an optical illusion. You might say that Fred's vision had shown a remarkable improvement in a very short time. Now he could clearly see money. I then asked Fred to figure out how many little mobile home payments like this he would need each month to equal the checks he got from his job. I explained that if he did just one little deal a month, it wouldn't take that many months before somebody else would be sending him more money than his full time job was paying. And if he still enjoyed working a "job" when he reached that point, he could just keep the job as a hobby.
Now, I'd like to elaborate some more on this little deal to show how a little education and knowledge can make such a big difference in a person's life. Before I learned how to put my money to work, I was doing all the work. I was so uneducated back then that I thought the answer to financial freedom was working two jobs. And that's what I did for many years. Finally, I realized there wasn't enough hours in a day, and I couldn't work enough hours in a month, to reach financial security. There had to be a better way, and I started looking for that way. When I realized that education and knowledge was the answer, I made up my mind to get an education. You see, until then all I had was some "schooling". Now I realized I needed some education.
So I started learning who the people were that was successful and was doing what I wanted to do. I started attending seminars taught by those people. I paid money that I couldn't afford to pay to go to those seminars. I took time off from work that I couldn't afford to take. I bought books, tapes and courses that I couldn't afford. I spent many hours listening to those tapes and reading the books, when I could have been watching ball games on TV, or fishing, like a lot of folks were doing. I was doing all the things I couldn't afford to do, so that someday I would be able to afford to do all the things I wanted to do. And I soon learned that it wasn't a question of whether I could afford to attend seminars, I realized that I couldn't afford not to go.
Now I can look back and see that I didn't do all the easy things, and all the fun things like many people were doing, but I did all the right things. And today, we enjoy financial security and financial freedom and can do what we want to do, and we can do it when we want to do it. While some of our friends are still working "jobs" searching for financial security that they will never know. They had the same chance to make choices that I had, they just made the wrong choices. They all had "schooling" but they didn't have the necessary education that provides financial freedom. Now they tell me how lucky I am.
The best investment you can make is in yourself. So be willing to pay for your education now, or be prepared to pay a much bigger price for your lack of education later. The choices you make today will determine your financial future. Be sure you make the right choice, because you will have to live with the results of that choice.
Fred paid for lunch that day, which was a burger and fries. (I think I'm working too cheap.) Next time Fred it's going to be prime rib and good wine.
When it comes to real estate, the trailer park gets a bad rap. But some designers think that this forsaken corner of the market is worthy of reevaluation-and even resuscitation.
The design-inclined might wonder why all trailers don't celebrate the box in this way. Mobile homes boast the briefest history in housing, literally towed into existence by the automobile. For a time, they held an atomic-age chic—–Bing Crosby counted Lucille Ball and Desi Arnaz as tenants in his Blue Skies Village outside Palm Springs—–but somewhere along the line trailers became "manufactured housing." Design gave way to economy, and trailers wheeled into a rut of small windows, fake shutters, and bleak ribbed siding. The inherent beauty of the box was supplanted by icons borrowed from suburbia.
That design lapse persists. Tim Howard, president of Breckenridge Finer Living, says he builds "cottages." Deam's Glassic Flat joins a Brecken-ridge line that includes a peak-roofed trailer with "the natural beauty of a stone exterior" made from "a high-density synthetic stone product." When Deam first came into his office, Howard politely showed the architect the door. "I absolutely did not get it," Howard says. But when Target ordered a half-dozen trailers for New York Fashion Week, Breckenridge reconsidered.
and a pervasive stigma stack the deck. Wallis notes that cities have long discouraged housing that generates little in property taxes. MacTavish, who spends much of her career in the parks, calls mobile homes America's largest source of unsubsidized affordable housing, but explains that the economics work against the individual owners. They might pay usurious interest rates and face inevitable depreciation, divesting them of the single most important investment payoff most Americans will see: their homes.
MacTavish also asks, "Where are the dollars going to come from to upgrade these aging parks?" Many trailers are nearing the end of their useful lives and owners cannot sell their homes or even afford demolition. The new designs are nice but gentrification looms. She wonders if "you would end up with two kinds of parks": the standard lot of rusted siding, and that of elitist enclaves of design devotees keeping sleek pied-à-terres on wheels.
That wheeled oasis is Canadian designer Andy Thomson's vision. His miniHome packs off-the-grid ecofeatures into a segmented box, but at $119,000, it's not an affordable housing model. He shies from the "trailer park" term. "We have a contest to come up with a name, and we haven't thought of it yet." An investor exploring the concept of urbanites shopping for second homes, Thomson believes that "blue-collar and downtown" don't necessarily mix.
For Hughes, the positive attributes of the trailer park don't extend to the trailers themselves. While "the trailer park is built on good bones," he says, "the downfall is in the unit." Saving the trailer park means getting rid of the trailers. His alternative urbanism ideal would let owners buy the lots they rented and build efficient, permanent homes with traditional mortgages and the benefits of appreciation. A requirement that homes in the park remain "mobile" adds expensive retrofits to TrailerWrap—–this despite most mobile homes making only one trip, from factory to park.
Like MacTavish, Hughes holds an affection for the classic New Orleans shotgun house. He brings that restraint to a development planned for Fayetteville, where he teaches at the University of Arkansas. The idea, he says, is to "take the design ideas of TrailerWrap and ignore that it has a chassis," creating a community of courtyard houses affordable to police officers, his fellow faculty, and employees at nonprofits.
Taking lessons learned in the trailer park beyond the park gates may be the single greatest benefit of thinking inside the box. Small, efficient homes could define a new kind of neighborhood and fulfill a promise that mobile homes missed so conspicuously. Trailers could distribute the benefits of modernism beyond its moneyed devotees to serve a greater public. The question may be not what modern design can do for the trailer park but what the trailer park can do for modern design.


This is a nice, little pinnacle with four routes including a perfect, easy, handcrack. The rock faces south and does get a lot of sun. It is typical Clear Creek Canyon gneiss. You probably won't see a lot of people here, but the climbing is worth a visit. You can walk off the back or walk up to set up a toprope.
Park on the south side of the road directly across from the rock. I clocked this at 7.6 miles up the canyon. Darren Mabe calls it 8.0 miles in his excellent guide. Walk up the hill to the rock. This takes about 2 minutes.
A. Arety-ret Flakey Fest, 7, 1p, 70', gear.
B. Night Crawler, 8+, 1p, 80', gear.
C. Nightingale, 8, 1p, 80', gear.
D. Unknown 11 (AKA Worm Skin), 11-, 1p, 80', bolts & pins.
View of Night Worm from the road.
Andrea on the left side of Nightworm.
Nightworm Pinnacle. The handcrack is obvious.
The three routes on the front.


Egham, 23rd February 2016 – Businesses in Europe have a critical need for 'anytime and anywhere' secure access to information to maintain and boost workplace productivity, a new IDC whitepaper sponsored by OKI Europe Ltd has revealed.
Faced with access to greater volumes of digitised information, the research warns that companies need to pay close attention to data access and security. However, according to its latest findings, a massive 75% of European SMBs have no document security system in place such as user ID, potentially leaving them exposed to security threats.
The research, which is entitled 'Are your business processes stifling your market opportunity? Cost-efficient print and document management through smart MFPs', written by Jacqui Hendriks, IDC's Head of European Managed Print Services and Document Solutions research and consulting practice, confirms that a growing mobile workforce and shifting employee work patterns are having a transformational impact on print and document management. By 2018, it predicts that 75% of the workforce will be working from mobile devices away from the office.
Looking at the role of smart MFPs in the changing modern workplace, it points to the fact that the flexible devices can be programmed to provide customised tools for employees and departments which can be accessed using a secure ID card, secure PIN code and mobile devices such as smartphones and tablets. If a print task is sent to a smart MFP with a 'pull printing' feature, it can be programmed only to release the document when the user is physically at the device and has swiped a security card or entered a PIN code.
"The growing mobile workforce and demand for 'anytime, anywhere' working is having a profound impact on today's businesses," says Tetsuya Kuri, vice president marketing, EMEA, OKI Europe Ltd.
OKI Europe's portfolio of smart, mobile print-ready MFPs feature a range of advanced security controls. These include authentication tools to control access to sensitive information and permission-based access to protect business, employee and customer or patient data and help ensure document confidentiality.


While equipment corrosion is inevitable, there are a few ways customers can prevent and lessen the effects of corrosion over time. The best way to prolong the longevity of your equipment is regular pool maintenance. Pool maintenance often emphasizes the importance of balancing pool chemicals to ensure your pool is safe and runs effectively. All of the chemicals required to operate your pool every day takes a toll on your pool's structure and equipment. Over time these chemicals will erode the pool's mechanics such as the heater and filter leading to expensive replacements. Focusing on each piece of equipment connected to the pool is essential for maintaining your pool.
Corrosion can also pose serious threats to your facility's physical structure explains Dave Schwartz of Aquatics International. Chloride-induced stress corrosion cracking (SCC) is often the culprit of structural failures surrounding your pool. As water vapor rises from the pool, the damage is seen on the surrounding stainless steel structures potentially leading to collapsing ceilings and injury. Filter rooms and water treatment systems are also subject to chemical damage and corrosion. The metal components within these systems quickly deteriorate due to regular chemical and acid exposure.
Proper ventilation and properly balanced chemicals are the best way to fight corrosion. A dehumidifier is essential. The installers should make sure that the materials the dehumidifier is made of are corrosion resistant. If you're building a pool, it's important to understand those comfort ventilation units should not be merged with those for swimming pool ventilation. Comfort units are not manufactured to withstand the aggressive environment of a swimming pool. Systems should be designed so that up to 30 percent of the recirculation rate can be brought in as fresh air, at a recommended capacity of 50- to 100 percent. Treating the water with too much chlorine will increase the risk of corrosion especially to the pool room and technical room. Not to mention excessive chlorine can result in poor air quality which can irritate the eyes and cause breathing difficulties.
Stainless Steel and Stainless Steel alloys are not resistant to SCC due to water vapor from a pool. Even metals like carbon steel and cast iron will corrode, and copper will turn green with chlorine. Yet it's common to find these materials in pool environments. The best way to protect these metal surfaces is to use galvanized metal where possible. Builders should consider using fiberglass doors and PVC piping where appropriate. PVC electrical conduit is corrosion resistant and can be painted for better aesthetics. Aluminum alloys can also be used above water as door and window framing. Materials like plastic, glass, tile, stone, masonry, and concrete typically resist corrosion quite well. Red brass and bronze typically resist pool corrosion well.
Equipment corrosion shouldn't keep facility managers up at night! An experienced pool technician can help make sure your chemicals are balanced correctly and that your filter rooms and water treatment systems are checked for signs of corrosion often. A maintenance contract with American Pool covers all the bases. If something goes wrong, we'll be there with a smart repair, and if you want to upgrade your existing pool, we're ready and experienced.


Check out a portfolio of our made-to-order cakes and desserts that we can create for any event.
Whether you're hosting a birthday party, a private dinner, or a wedding, we've got you covered. The only limitation is your imagination.


text:
package org.dspace.event;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.BitSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.log4j.Logger;
import org.dspace.content.DSpaceObject;
import org.dspace.core.Constants;
import org.dspace.core.Context;

/**
 * An Event object represents a single action that changed one object in the
 * DSpace data model. An "atomic" action at the application or business-logic
 * API level may spawn many of these events.
 *

 * This class includes tools to help set and use the contents of the event. Note
 * that it describes DSpace data object types in two ways: by the type
 * identifiers in the Constants class, and also by an Event-specific bitmask
 * (used by its internal filters). All public API calls use the Constants
 * version of the data model types.
 *

 * Note that the type of the event itself is actually descriptive of the
 * action it performs: ADD, MODIFY, etc. The most significant
 * elements of the event are:
 *

 *
(Action) Type

 *
Subject -- DSpace object to which the action applies, e.g. the Collection
 * to which an ADD adds a member.

 *
Object -- optional, when present it is the other object effected by an
 * action, e.g. the Item ADDed to a Collection by an ADD.

 *
detail -- a textual summary of what changed.  Content and its
 * significance varies by the combination of action and subject type.

 *
 - timestamp -- exact millisecond timestamp at which event was logged.

 *

 *
 * @version $Revision$
 */
public class Event implements Serializable
{
    private static final long serialVersionUID = 1L;

    /** ---------- Constants ------------- * */

    /** Event (Action) types */
    public static final int CREATE = 1 << 0; // create new object

    public static final int MODIFY = 1 << 1; // modify object

    public static final int MODIFY_METADATA = 1 << 2; // modify object

    public static final int ADD = 1 << 3; // add content to container

    public static final int REMOVE = 1 << 4; // remove content from container

    public static final int DELETE = 1 << 5; // destroy object

    public static final int INSTALL = 1 << 6; // object exits workspace/flow

    /** Index of filter parts in their array: */
    public static final int SUBJECT_MASK = 0; // mask of subject types

    public static final int EVENT_MASK = 1; // mask of event type

    // XXX NOTE: keep this up to date with any changes to event (action) types.
    private static final String eventTypeText[] = { "CREATE", "MODIFY",
            "MODIFY_METADATA", "ADD", "REMOVE", "DELETE", "INSTALL" };

    /** XXX NOTE: These constants must be kept synchronized * */
    /** XXX NOTE: with ALL_OBJECTS_MASK *AND* objTypeToMask hash * */
    private static final int NONE = 0;

    private static final int BITSTREAM = 1 << Constants.BITSTREAM; // 0

    private static final int BUNDLE = 1 << Constants.BUNDLE; // 1

    private static final int ITEM = 1 << Constants.ITEM; // 2

    private static final int COLLECTION = 1 << Constants.COLLECTION; // 3

    private static final int COMMUNITY = 1 << Constants.COMMUNITY; // 4

    private static final int SITE = 1 << Constants.SITE; // 5

    private static final int GROUP = 1 << Constants.GROUP; // 6

    private static final int EPERSON = 1 << Constants.EPERSON; // 7

    private static final int ALL_OBJECTS_MASK = BITSTREAM | BUNDLE | ITEM
            | COLLECTION | COMMUNITY | SITE | GROUP | EPERSON;

    private static Map<Integer, Integer> objTypeToMask = new HashMap<Integer, Integer>();

    private static Map<Integer, Integer> objMaskToType = new HashMap<Integer, Integer>();
    static
    {
        objTypeToMask.put(Constants.BITSTREAM, BITSTREAM);
        objMaskToType.put(BITSTREAM, Constants.BITSTREAM);

        objTypeToMask.put(Constants.BUNDLE, BUNDLE);
        objMaskToType.put(BUNDLE, Constants.BUNDLE);

        objTypeToMask.put(Constants.ITEM, ITEM);
        objMaskToType.put(ITEM, Constants.ITEM);

        objTypeToMask.put(Constants.COLLECTION, COLLECTION);
        objMaskToType.put(COLLECTION, Constants.COLLECTION);

        objTypeToMask.put(Constants.COMMUNITY, COMMUNITY);
        objMaskToType.put(COMMUNITY, Constants.COMMUNITY);

        objTypeToMask.put(Constants.SITE, SITE);
        objMaskToType.put(SITE, Constants.SITE);

        objTypeToMask.put(Constants.GROUP, GROUP);
        objMaskToType.put(GROUP, Constants.GROUP);

        objTypeToMask.put(Constants.EPERSON, EPERSON);
        objMaskToType.put(EPERSON, Constants.EPERSON);
    }

    /** ---------- Event Fields ------------- * */

    /** identifier of Dispatcher that created this event (hash of its name) */
    private int dispatcher;

    /** event (action) type - above enumeration */
    private int eventType;

    /** object-type of SUBJECT - see above enumeration */
    private int subjectType;

    /** content model identifier */
    private int subjectID;

    /** object-type of SUBJECT - see above enumeration */
    private int objectType = NONE;

    /** content model identifier */
    private int objectID = -1;

    /** timestamp */
    private long timeStamp;

    /** "detail" - arbitrary field for relevant detail, */
    /** e.g. former handle for DELETE event since obj is no longer available. */
    /**
     * FIXME This field is not a complete view of the DSpaceObject that was
     * modified. Providing these objects to the consumer (e.g. by storing
     * lifecycle versions of the changed objects in the context) would provide
     * for more complex consumer abilities that are beyond our purview.
     */
    private String detail;

    /** unique key to bind together events from one context's transaction */
    private String transactionID;

    /** identity of authenticated user, i.e. context.getCurrentUser(). */
    /** Only needed in the event for marshalling for asynch event messages */
    private int currentUser = -1;

    /** copy of context's "extraLogInfo" field.  Used only for */
    /** marshalling for asynch event messages. */
    private String extraLogInfo = null;

    private BitSet consumedBy = new BitSet();

    /** log4j category */
    private static Logger log = Logger.getLogger(Event.class);

    /**
     * Constructor.
     *
     * @param eventType
     *            action type, e.g. Event.ADD.
     * @param subjectType
     *            DSpace Object Type of subject e.g. Constants.ITEM.
     * @param subjectID
     *            database ID of subject instance.
     * @param detail
     *            detail information that depends on context.
     */
    public Event(int eventType, int subjectType, int subjectID, String detail)
    {
        this.eventType = eventType;
        this.subjectType = coreTypeToMask(subjectType);
        this.subjectID = subjectID;
        timeStamp = System.currentTimeMillis();
        this.detail = detail;
    }

    /**
     * Constructor.
     *
     * @param eventType
     *            action type, e.g. Event.ADD.
     * @param subjectType
     *            DSpace Object Type of subject e.g. Constants.ITEM.
     * @param subjectID
     *            database ID of subject instance.
     * @param objectType
     *            DSpace Object Type of object e.g. Constants.BUNDLE.
     * @param objectID
     *            database ID of object instance.
     * @param detail
     *            detail information that depends on context.
     */
    public Event(int eventType, int subjectType, int subjectID, int objectType,
            int objectID, String detail)
    {
        this.eventType = eventType;
        this.subjectType = coreTypeToMask(subjectType);
        this.subjectID = subjectID;
        this.objectType = coreTypeToMask(objectType);
        this.objectID = objectID;
        timeStamp = System.currentTimeMillis();
        this.detail = detail;
    }

    /**
     * Compare two events. Ignore any difference in the timestamps. Also ignore
     * transactionID since that is not always set initially.
     *
     * @param other
     *            the event to compare this one to
     * @return true if events are "equal", false otherwise.
     */
    public boolean equals(Object other)
    {
        if (other instanceof Event)
        {
            Event otherEvent = (Event)other;
            return (this.detail == null ? otherEvent.detail == null : this.detail
                    .equals(otherEvent.detail))
                    && this.eventType == otherEvent.eventType
                    && this.subjectType == otherEvent.subjectType
                    && this.subjectID == otherEvent.subjectID
                    && this.objectType == otherEvent.objectType
                    && this.objectID == otherEvent.objectID;
        }

        return false;
    }

    public int hashCode()
    {
        return new HashCodeBuilder().append(this.detail)
                                    .append(eventType)
                                    .append(subjectType)
                                    .append(subjectID)
                                    .append(objectType)
                                    .append(objectID)
                                    .toHashCode();
    }

    /**
     * Set the identifier of the dispatcher that first processed this event.
     *
     * @param id
     *            the unique (hash code) value characteristic of the dispatcher.
     */
    public void setDispatcher(int id)
    {
        dispatcher = id;
    }

    // translate a "core.Constants" object type value to local bitmask value.
    private static int coreTypeToMask(int core)
    {
        Integer mask = objTypeToMask.get(core);
        if (mask == null)
        {
            return -1;
        }
        else
        {
            return mask.intValue();
        }
    }

    // translate bitmask object-type to "core.Constants" object type.
    private static int maskTypeToCore(int mask)
    {
        Integer core = objMaskToType.get(mask);
        if (core == null)
        {
            return -1;
        }
        else
        {
            return core.intValue();
        }
    }

    /**
     * Get the DSpace object which is the "object" of an event.
     *
     * @return DSpaceObject or null if none can be found or no object was set.
     */
    public DSpaceObject getObject(Context context) throws SQLException
    {
        int type = getObjectType();
        int id = getObjectID();
        if (type < 0 || id < 0)
        {
            return null;
        }
        else
        {
            return DSpaceObject.find(context, type, id);
        }
    }

    /**
     * Syntactic sugar to get the DSpace object which is the "subject" of an
     * event.
     *
     * @return DSpaceObject or null if none can be found.
     */
    public DSpaceObject getSubject(Context context) throws SQLException
    {
        return DSpaceObject.find(context, getSubjectType(), getSubjectID());
    }

    /**
     * @return database ID of subject of this event.
     */
    public int getSubjectID()
    {
        return subjectID;
    }

    /**
     * @return database ID of object of this event, or -1 if none was set.
     */
    public int getObjectID()
    {
        return objectID;
    }

    /**
     * @return type number (e.g. Constants.ITEM) of subject of this event.
     */
    public int getSubjectType()
    {
        return maskTypeToCore(subjectType);
    }

    /**
     * @return type number (e.g. Constants.ITEM) of object of this event, or -1
     *          if none was set.
     */
    public int getObjectType()
    {
        return maskTypeToCore(objectType);
    }

    /**
     * @return type of subject of this event as a String, e.g. for logging.
     */
    public String getSubjectTypeAsString()
    {
        int i = log2(subjectType);
        if (i >= 0 && i < Constants.typeText.length)
        {
            return Constants.typeText[i];
        }
        else
        {
            return "(Unknown)";
        }
    }

    /**
     * @return type of object of this event as a String, e.g. for logging.
     */
    public String getObjectTypeAsString()
    {
        int i = log2(objectType);
        if (i >= 0 && i < Constants.typeText.length)
        {
            return Constants.typeText[i];
        }
        else
        {
            return "(Unknown)";
        }
    }

    /**
     * Translate a textual DSpace Object type name into an event subject-type
     * mask. NOTE: This returns a BIT-MASK, not a numeric type value; the mask
     * is only used within the event system.
     *
     * @param s
     *            text name of object type.
     * @return numeric value of object type or 0 for error.
     */
    public static int parseObjectType(String s)
    {
        if ("*".equals(s) || "all".equalsIgnoreCase(s))
        {
            return ALL_OBJECTS_MASK;
        }
        else
        {
            int id = Constants.getTypeID(s.toUpperCase());
            if (id >= 0)
            {
                return 1 << id;
            }
        }
        return 0;
    }

    /**
     * @return event-type (i.e. action) this event, one of the masks like
     *          Event.ADD defined above.
     */
    public int getEventType()
    {
        return eventType;
    }

    /**
     * Get the text name of event (action) type.
     *
     * @return event-type (i.e. action) this event as a String, e.g. for
     *          logging.
     */
    public String getEventTypeAsString()
    {
        int i = log2(eventType);
        if (i >= 0 && i < eventTypeText.length)
        {
            return eventTypeText[i];
        }
        else
        {
            return "(Unknown)";
        }
    }

    /**
     * Interpret named event type.
     *
     * @param s
     *            name of event type.
     * @return numeric value of event type or 0 for error.
     */
    public static int parseEventType(String s)
    {
        if ("*".equals(s) || "all".equalsIgnoreCase(s))
        {
            int result = 0;
            for (int i = 0; i < eventTypeText.length; ++i)
            {
                result |= (1 << i);
            }
            return result;
        }

        for (int i = 0; i < eventTypeText.length; ++i)
        {
            if (eventTypeText[i].equalsIgnoreCase(s))
            {
                return 1 << i;
            }
        }
        return 0;
    }

    /**
     * @return timestamp at which event occurred, as a count of milliseconds
     *         since the epoch (standard Java format).
     */
    public long getTimeStamp()
    {
        return timeStamp;
    }

    /**
     * @return hashcode identifier of name of Dispatcher which first dispatched
     *         this event. (Needed by asynch dispatch code.)
     */
    public int getDispatcher()
    {
        return dispatcher;
    }

    /**
     * @return value of detail element of the event.
     */
    public String getDetail()
    {
        return detail;
    }

    /**
     * @return value of transactionID element of the event.
     */
    public String getTransactionID()
    {
        return transactionID;
    }

    /**
     * Sets value of transactionID element of the event.
     *
     * @param tid
     *            new value of transactionID.
     */
    public void setTransactionID(String tid)
    {
        transactionID = tid;
    }

    public void setCurrentUser(int uid)
    {
        currentUser = uid;
    }

    public int getCurrentUser()
    {
        return currentUser;
    }

    public void setExtraLogInfo(String info)
    {
        extraLogInfo = info;
    }

    public String getExtraLogInfo()
    {
        return extraLogInfo;
    }

    /**
     * Test whether this event would pass through a list of filters.
     *
     * @param filters
     *            list of filter masks; each one is an Array of two ints.
     * @return true if this event would be passed through the given filter
     *         list.
     */
    public boolean pass(List<int[]> filters)
    {
        boolean result = false;

        for (int filter[] : filters)
        {
            if ((subjectType & filter[SUBJECT_MASK]) != 0 && (eventType & filter[EVENT_MASK]) != 0)
            {
                result = true;
            }
        }

        if (log.isDebugEnabled())
        {
            log.debug("Filtering event: " + "eventType="
                    + String.valueOf(eventType) + ", subjectType="
                    + String.valueOf(subjectType) + ", result="
                    + String.valueOf(result));
        }

        return result;
    }

    // dumb integer "log base 2", returns -1 if there are no 1's in number.
    private static int log2(int n)
    {
        for (int i = 0; i < 32; ++i)
        {
            if (n == 1)
            {
                return i;
            }
            else
            {
                n = n >> 1;
            }
        }
        return -1;
    }

    /**
     * Keeps track of which consumers the event has been consumed by. Should be
     * called by a dispatcher when calling consume(Context ctx, String name,
     * Event event) on an event.
     *
     * @param consumerName
     */
    public void setBitSet(String consumerName)
    {
        consumedBy.set(EventManager.getConsumerIndex(consumerName));
    }

    /**
     * @return the set of consumers which have consumed this Event.
     */
    public BitSet getBitSet()
    {
        return consumedBy;
    }

    /**
     * @return Detailed string representation of contents of this event, to
     *          help in logging and debugging.
     */
    public String toString()
    {
        return "org.dspace.event.Event(eventType="
                + this.getEventTypeAsString()
                + ", SubjectType="
                + this.getSubjectTypeAsString()
                + ", SubjectID="
                + String.valueOf(subjectID)
                + ", ObjectType="
                + this.getObjectTypeAsString()
                + ", ObjectID="
                + String.valueOf(objectID)
                + ", TimeStamp="
                + String.valueOf(timeStamp)
                + ", dispatcher="
                + String.valueOf(dispatcher)
                + ", detail="
                + (detail == null ? "[null]" : "\"" + detail + "\"")
                + ", transactionID="
                + (transactionID == null ? "[null]" : "\"" + transactionID
                        + "\"") + ")";
    }
}

redpajama_set_name: RedPajamaGithub