https://issues.apache.org/jira/browse/TOMEE-1578 used a mix between your
idea and mine, basically i load jaxb tree, check i need to add the
Deployments then do a replace if I need to add it (avoid to break the whole
formatting)

happy to get a review/test from you if possible


Romain Manni-Bucau
@rmannibucau <https://twitter.com/rmannibucau> |  Blog
<http://rmannibucau.wordpress.com> | Github <https://github.com/rmannibucau> |
LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
<http://www.tomitribe.com>

2015-05-05 17:05 GMT+02:00 Adam Cornett <[email protected]>:

> Sorry, by original I mean the one packaged in the original tomee zip file.
>
> On Tue, May 5, 2015 at 11:04 AM, Adam Cornett <[email protected]>
> wrote:
>
> > That won't work since the original file contains the tag but it is
> > commented out, so a simple string matching catches the value in the
> comment
> > and thinks its really there, that's why I opted for the 40-ton beast of
> dom
> > parsing.
> >
> > On Tue, May 5, 2015 at 11:00 AM, Romain Manni-Bucau <
> [email protected]
> > > wrote:
> >
> >> Ah ok, thought you were using tomee:build. Yes makes sense for
> tomee:run.
> >>
> >> About the patch we can also be brutal and use:
> >>
> >> String content = IO.slurp(tomeeXml);
> >> if (content.contains("<Deployments")) return; // user handles it
> >> content = content.replace("</tomee>", "<Deployments ...." +
> >> System.lineSeparator() + "</tomee>");
> >> IO.write(tomeeXml, content);
> >>
> >> would work as well and be more readable.
> >>
> >> wdyt?
> >>
> >>
> >>
> >>
> >> Romain Manni-Bucau
> >> @rmannibucau <https://twitter.com/rmannibucau> |  Blog
> >> <http://rmannibucau.wordpress.com> | Github <
> >> https://github.com/rmannibucau> |
> >> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
> >> <http://www.tomitribe.com>
> >>
> >> 2015-05-05 16:52 GMT+02:00 Adam Cornett <[email protected]>:
> >>
> >> > Perhaps I have not done a good job explaining how I'm using (abusing?)
> >> the
> >> > tomee plugin:
> >> >
> >> > I have a pom only project that uses the tomee maven plugin to
> generate a
> >> > tomee zip, adding in the conf, replacing openjpa with hibernate adding
> >> > several other libraries, adding the setenv.(bat|sh) files with the
> >> correct
> >> > java settings, etc.  We use classifiers to create one zip per
> >> environment
> >> > (dev, qa, prod, etc)
> >> > This zip file is attached to the project and published to our maven
> >> repo.
> >> >
> >> > The plugin configuration is then set in our top level pom's
> >> > pluginManagement and to use it in one of our projects we just have to
> >> > include the groupId and artifactId.
> >> >
> >> > in pluginManagment:
> >> > <plugin>
> >> > <groupId>org.apache.openejb.maven</groupId>
> >> > <artifactId>tomee-maven-plugin</artifactId>
> >> > <version>${tomee.version}</version>
> >> > <configuration>
> >> > <tomeeGroupId>com.example</tomeeGroupId>
> >> > <tomeeArtifactId>tomee</tomeeArtifactId>
> >> > <tomeeClassifier>dev</tomeeClassifier>
> >> > <tomeeVersion>${tomee.version}</tomeeVersion>
> >> > </configuration>
> >> > </plugin>
> >> >
> >> > in a project:
> >> >
> >> > <plugin>
> >> > <groupId>org.apache.openejb.maven</groupId>
> >> > <artifactId>tomee-maven-plugin</artifactId>
> >> > </plugin>
> >> >
> >> > Thus each app can use mvn tomee:run for dev testing, and use use the
> >> build
> >> > goal to publish a tomee zip fully bundled up and ready to deploy to a
> >> > server (we attach the zip to all of our EAR projects along with the
> ear)
> >> >
> >> > This keeps the poms and source trees sane, previously we had to keep
> >> > copies (using svn:externals, but still ugly) of the tomee config with
> >> each
> >> > ear.
> >> >
> >> > It also simplifies our Arquillian tests, since we are using such a
> >> heavily
> >> > modified version of TomEE we'd have to duplicate all of the changes in
> >> the
> >> > arquillian.xml, so a custom zip solves that problem too.
> >> >
> >> > Using a custom zip file I can keep up our internal tomee build and no
> >> one
> >> > else on the dev team has to worry about getting the right setup in
> their
> >> > checkout or pom to have it build and run correctly.
> >> >
> >> >
> >> > The patch was attached to the original email is inline below and
> >> > re-attached:
> >> >
> >> > diff --git
> >> >
> >>
> a/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
> >> >
> >>
> b/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
> >> > index 6c8b412..86b13e8 100644
> >> > ---
> >> >
> >>
> a/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
> >> > +++
> >> >
> >>
> b/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
> >> > @@ -78,6 +78,19 @@
> >> >  import java.util.zip.ZipEntry;
> >> >  import java.util.zip.ZipFile;
> >> >
> >> > +import javax.xml.parsers.DocumentBuilder;
> >> > +import javax.xml.parsers.DocumentBuilderFactory;
> >> > +import javax.xml.transform.OutputKeys;
> >> > +import javax.xml.transform.Transformer;
> >> > +import javax.xml.transform.TransformerFactory;
> >> > +import javax.xml.transform.dom.DOMSource;
> >> > +import javax.xml.transform.stream.StreamResult;
> >> > +
> >> > +import org.w3c.dom.Document;
> >> > +import org.w3c.dom.Element;
> >> > +import org.w3c.dom.NodeList;
> >> > +
> >> > +
> >> >  import static org.apache.maven.artifact.Artifact.SCOPE_COMPILE;
> >> >  import static
> >> >
> >>
> org.apache.maven.artifact.repository.ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN;
> >> >  import static
> >> >
> >>
> org.apache.maven.artifact.repository.ArtifactRepositoryPolicy.UPDATE_POLICY_DAILY;
> >> > @@ -1330,13 +1343,28 @@
> >> >                  && (
> >> >                  (apps != null && !apps.isEmpty())
> >> >                          || (!"pom".equals(packaging) &&
> >> > !"war".equals(packaging))))) { // webapps doesn't need apps folder in
> >> tomee
> >> > -            final FileWriter writer = new FileWriter(file);
> >> > -            final String rootTag =
> >> container.toLowerCase(Locale.ENGLISH);
> >> > -            writer.write("<?xml version=\"1.0\"?>\n" +
> >> > -                    "<" + rootTag + ">\n" +
> >> > -                    "  <Deployments dir=\"apps\" />\n" +
> >> > -                    "</" + rootTag + ">\n");
> >> > -            writer.close();
> >> > +            // check to see if there is already a Deployments tag in
> >> the
> >> > current file
> >> > +            // if there isn't one, add it to the document
> >> > +            try{
> >> > +                DocumentBuilder builder =
> >> > DocumentBuilderFactory.newInstance().newDocumentBuilder();
> >> > +                Document doc = builder.parse(file);
> >> > +
> >> > +
> if(doc.getElementsByTagName("Deployments").getLength()
> >> ==
> >> > 0){
> >> > +                    Element deploymentsElement =
> >> > doc.createElement("Deployments");
> >> > +                    deploymentsElement.setAttribute("dir", "apps");
> >> > +                    // get the 'tomee' or 'openejb' tag and add the
> >> > deployments element
> >> > +
> >> >
> >>
> doc.getElementsByTagName(container.toLowerCase(Locale.ENGLISH)).item(0).appendChild(deploymentsElement);
> >> > +
> >> > +                    // now write the new xml file
> >> > +                    Transformer transformer =
> >> > TransformerFactory.newInstance().newTransformer();
> >> > +                    transformer.setOutputProperty(OutputKeys.INDENT,
> >> > "yes");
> >> > +                    DOMSource source = new DOMSource(doc);
> >> > +                    StreamResult fileOut = new StreamResult(file);
> >> > +                    transformer.transform(source, fileOut);
> >> > +                }
> >> > +            }catch(Exception e){
> >> > +                getLog().error("Exception updating " +
> file.getName(),
> >> e);
> >> > +            }
> >> >
> >> >              final File appsFolder = new File(catalinaBase, "apps");
> >> >              if (!appsFolder.exists() && !appsFolder.mkdirs()) {
> >> >
> >> >
> >> >
> >> >
> >> >
> >> >
> >> > On Tue, May 5, 2015 at 10:29 AM, Romain Manni-Bucau <
> >> [email protected]
> >> > > wrote:
> >> >
> >> >> 2015-05-05 16:19 GMT+02:00 Adam Cornett <[email protected]>:
> >> >>
> >> >> > Like I said, there are many ways to work around this issue :-)
> >> >> >
> >> >> > I was just offering a change to the plugin to be more selective in
> >> how
> >> >> it
> >> >> > changes the built in file to keep our build process as simple as
> >> >> possible.
> >> >> > I found it odd that the plugin was careful to honor custom changes
> to
> >> >> the
> >> >> > server.xml file and only make selected changes to it, but it will
> >> >> wholesale
> >> >> > replace the tomee.xml file if you use 'ear' or 'ejb' packaging.
> >> When it
> >> >> > does this it also wipes out the documentation comments that ship
> with
> >> >> the
> >> >> > default file.  The patch I sent keeps the original file's contents
> >> and
> >> >> > simply appends the deployments tag when needed if it is not already
> >> >> > present, which is really the desired result of the method in
> >> question.
> >> >> >
> >> >> >
> >> >>
> >> >> Well server.xml is another story. We fully control tomee.xml but not
> >> >> server.xml and we try to not break tomcat update for this last one.
> >> ALso
> >> >> we
> >> >> update this last one once we setup everything which can mean a user
> can
> >> >> have overriden the file which shouldn't be the case for tomee.xml.
> >> >>
> >> >> The easiest fix for your case is surely a flag 'dontTouchMyTomeeXml'
> >> but
> >> >> it
> >> >> will not simplify your build. Alternative can be to support a
> >> config.jar
> >> >> but it is not simpler since you need to configure it again for all
> >> >> distributions.
> >> >>
> >> >> Also what I dont get is why using tomee-maven-plugin if you start
> from
> >> an
> >> >> existing tomee zip you provide. Doing it you loose the interest of
> >> tomee
> >> >> maven plugin build command which is to provide a standard layout.
> >> >>
> >> >> Just trying to see how to simplify the process without reimplementing
> >> >> other
> >> >> maven plugins
> >> >>
> >> >> Side note: not sure if gmail swallowed it but i didnt get any patch
> >> >>
> >> >>
> >> >> > On Tue, May 5, 2015 at 10:07 AM, Romain Manni-Bucau <
> >> >> [email protected]
> >> >> > >
> >> >> > wrote:
> >> >> >
> >> >> > > I see, why not executing maven dependency plugin before
> >> >> > tomee-maven-plugin
> >> >> > > and referencing the unpacked folder for the conf?
> >> >> > >
> >> >> > >
> >> >> > > Romain Manni-Bucau
> >> >> > > @rmannibucau <https://twitter.com/rmannibucau> |  Blog
> >> >> > > <http://rmannibucau.wordpress.com> | Github <
> >> >> > > https://github.com/rmannibucau> |
> >> >> > > LinkedIn <https://www.linkedin.com/in/rmannibucau> | Tomitriber
> >> >> > > <http://www.tomitribe.com>
> >> >> > >
> >> >> > > 2015-05-05 16:01 GMT+02:00 Adam Cornett <[email protected]
> >:
> >> >> > >
> >> >> > > > Since the conf is loaded into the zip file when we build it we
> >> are
> >> >> not
> >> >> > > > re-supplying the conf each time we use the plugin.  Since all
> of
> >> our
> >> >> > apps
> >> >> > > > use a common conf we wanted it in one place instead of having
> >> copies
> >> >> > > > attached to each project.
> >> >> > > >
> >> >> > > > On Tue, May 5, 2015 at 9:57 AM, Romain Manni-Bucau <
> >> >> > > [email protected]>
> >> >> > > > wrote:
> >> >> > > >
> >> >> > > > > Hi
> >> >> > > > >
> >> >> > > > >
> >> >> > > > > 2015-05-05 15:47 GMT+02:00 Adam Cornett <
> >> [email protected]>:
> >> >> > > > >
> >> >> > > > > > We use TomEE in several applications, and to speed up
> builds
> >> and
> >> >> > > > > > standardize our deployments, we use the Maven plugin to
> >> create a
> >> >> > > TomEE
> >> >> > > > > zip
> >> >> > > > > > already configured with our libraries and configuration
> files
> >> >> and
> >> >> > > > publish
> >> >> > > > > > it to our internal maven repo.
> >> >> > > > > >
> >> >> > > > > > We then use the TomEE maven plugin in each project to pull
> in
> >> >> this
> >> >> > > > custom
> >> >> > > > > > build and deploy our application into it.  However the
> >> current
> >> >> > maven
> >> >> > > > > plugin
> >> >> > > > > > will overwrite the conf/tomee.xml file that we have
> packaged.
> >> >> This
> >> >> > > > > happens
> >> >> > > > > > because the plugin is trying to be helpful by adding the
> >> >> > > '<Deployments
> >> >> > > > > > dir="apps" />' tag, which is not enabled in the file that
> >> ships
> >> >> > with
> >> >> > > > the
> >> >> > > > > > original zip, however it does this by writing out a whole
> new
> >> >> file
> >> >> > > with
> >> >> > > > > > this tag.
> >> >> > > > > >
> >> >> > > > > >
> >> >> > > > > it does it during tomee unzip phase which is before the
> >> >> > synchronization
> >> >> > > > > with conf folder so your file should override the forced one.
> >> >> > > > >
> >> >> > > > > What do I miss?
> >> >> > > > >
> >> >> > > > >
> >> >> > > > > > There are many ways to go about solving this issue, the
> one I
> >> >> came
> >> >> > up
> >> >> > > > > with
> >> >> > > > > > is in the attached patch, developed against 2.0.  This
> does a
> >> >> more
> >> >> > > > > surgical
> >> >> > > > > > update of an existing tomee.xml file without touching over
> >> any
> >> >> > > existing
> >> >> > > > > > changes.  If this needs further changes or refinement in
> >> order
> >> >> to
> >> >> > be
> >> >> > > > > > accepted into the project I'd be glad to continue to work
> on
> >> it
> >> >> > based
> >> >> > > > on
> >> >> > > > > > feedback.
> >> >> > > > > >
> >> >> > > > > >
> >> >> > > > > > - Adam Cornett
> >> >> > > > > >
> >> >> > > > > >
> >> >> > > > > >
> >> >> > > > > >
> >> >> > > > > >
> >> >> > > > >
> >> >> > > >
> >> >> > > >
> >> >> > > >
> >> >> > > > --
> >> >> > > > Adam Cornett
> >> >> > > > [email protected]
> >> >> > > > (678) 296-1150
> >> >> > > >
> >> >> > >
> >> >> >
> >> >> >
> >> >> >
> >> >> > --
> >> >> > Adam Cornett
> >> >> > [email protected]
> >> >> > (678) 296-1150
> >> >> >
> >> >>
> >> >
> >> >
> >> >
> >> > --
> >> > Adam Cornett
> >> > [email protected]
> >> > (678) 296-1150
> >> >
> >>
> >
> >
> >
> > --
> > Adam Cornett
> > [email protected]
> > (678) 296-1150
> >
>
>
>
> --
> Adam Cornett
> [email protected]
> (678) 296-1150
>

Reply via email to